Merge "Change "permissions errors" message to "permission error""
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Mon, 1 Jul 2013 16:40:25 +0000 (16:40 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Mon, 1 Jul 2013 16:40:25 +0000 (16:40 +0000)
1369 files changed:
.gitignore
.jshintignore
.jshintrc
CREDITS
RELEASE-NOTES-1.21 [deleted file]
RELEASE-NOTES-1.22
api.php
docs/hooks.txt
docs/maintenance.txt
docs/php-memcached/Documentation
docs/skin.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/Article.php
includes/AutoLoader.php
includes/Autopromote.php
includes/Block.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/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/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 [deleted file]
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
includes/Status.php
includes/StringUtils.php
includes/StubObject.php
includes/Timestamp.php
includes/Title.php
includes/UIDGenerator.php
includes/User.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/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/ApiDelete.php
includes/api/ApiEditPage.php
includes/api/ApiExpandTemplates.php
includes/api/ApiFeedContributions.php
includes/api/ApiFeedWatchlist.php
includes/api/ApiFormatBase.php
includes/api/ApiFormatXml.php
includes/api/ApiImageRotate.php
includes/api/ApiImport.php
includes/api/ApiMain.php
includes/api/ApiMove.php
includes/api/ApiPageSet.php
includes/api/ApiParamInfo.php
includes/api/ApiParse.php
includes/api/ApiPatrol.php
includes/api/ApiProtect.php
includes/api/ApiPurge.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllCategories.php
includes/api/ApiQueryAllImages.php
includes/api/ApiQueryAllLinks.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/ApiSetNotificationTimestamp.php
includes/api/ApiUpload.php
includes/api/ApiUserrights.php
includes/api/ApiWatch.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/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/CloneDatabase.php
includes/db/Database.php
includes/db/DatabaseError.php
includes/db/DatabaseMssql.php
includes/db/DatabaseMysql.php
includes/db/DatabaseMysqlBase.php [new file with mode: 0644]
includes/db/DatabaseOracle.php
includes/db/DatabasePostgres.php
includes/db/DatabaseSqlite.php
includes/db/IORMRow.php
includes/db/LBFactory.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/externalstore/ExternalStore.php
includes/externalstore/ExternalStoreDB.php
includes/filebackend/FSFile.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/FileOpBatch.php
includes/filebackend/README
includes/filebackend/SwiftFileBackend.php
includes/filebackend/TempFSFile.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/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/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/libs/CSSJanus.php
includes/libs/HttpStatus.php
includes/logging/DeleteLogFormatter.php
includes/logging/LogEntry.php
includes/logging/LogEventsList.php
includes/logging/LogFormatter.php
includes/logging/LogPage.php
includes/logging/LogPager.php
includes/logging/MoveLogFormatter.php
includes/logging/NewUsersLogFormatter.php
includes/logging/PatrolLog.php
includes/logging/PatrolLogFormatter.php
includes/logging/RightsLogFormatter.php
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/UtfNormalTest2.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/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/ResourceLoaderSiteModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php
includes/resourceloader/ResourceLoaderUserGroupsModule.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 [new file with mode: 0644]
includes/specials/SpecialAllmessages.php
includes/specials/SpecialAllpages.php
includes/specials/SpecialAncientpages.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/Userlogin.php
includes/templates/UserloginVForm.php [deleted file]
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/LanguageMt.php
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/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/MessagesKg.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/MessagesQug.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/MessagesUdm.php
languages/messages/MessagesUg_arab.php
languages/messages/MessagesUk.php
languages/messages/MessagesUr.php
languages/messages/MessagesUz.php
languages/messages/MessagesVec.php
languages/messages/MessagesVep.php
languages/messages/MessagesVi.php
languages/messages/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/upgradeLogging.php
maintenance/attachLatest.php
maintenance/backup.inc
maintenance/backupPrefetch.inc
maintenance/backupTextPass.inc
maintenance/benchmarks/Benchmarker.php
maintenance/benchmarks/README [new file with mode: 0644]
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
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
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/categories.json
maintenance/jsduck/config.json
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/mwdoc-filter.php
maintenance/mwdocgen.php
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/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/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
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.tipsy/images/tipsy.png
resources/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.png
resources/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.png
resources/jquery.ui/themes/default/images/ui-icons_222222_256x240.png
resources/jquery.ui/themes/default/images/ui-icons_2e83ff_256x240.png
resources/jquery.ui/themes/default/images/ui-icons_454545_256x240.png
resources/jquery.ui/themes/default/images/ui-icons_888888_256x240.png
resources/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.png
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.client.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.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.edit.js
resources/mediawiki.api/mediawiki.api.login.js [new file with mode: 0644]
resources/mediawiki.api/mediawiki.api.parse.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
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
resources/mediawiki.special/images/icon-pages.png [new file with mode: 0644]
resources/mediawiki.special/mediawiki.special.changeslist.css
resources/mediawiki.special/mediawiki.special.changeslist.enhanced.css [new file with mode: 0644]
resources/mediawiki.special/mediawiki.special.createAccount.css [new file with mode: 0644]
resources/mediawiki.special/mediawiki.special.createAccount.js [new file with mode: 0644]
resources/mediawiki.special/mediawiki.special.preferences.css
resources/mediawiki.special/mediawiki.special.userLogin.css [new file with mode: 0644]
resources/mediawiki.special/mediawiki.special.userLogin.signup.js [deleted file]
resources/mediawiki.special/mediawiki.special.userLogin.vform.css [deleted file]
resources/mediawiki.special/mediawiki.special.vforms.css
resources/mediawiki.ui/mediawiki.ui.default.css
resources/mediawiki.ui/mediawiki.ui.vector.css
resources/mediawiki.ui/sourcefiles/config.rb
resources/mediawiki.ui/sourcefiles/scss/components/_vector.scss
resources/mediawiki.ui/sourcefiles/scss/components/default/_buttons.scss
resources/mediawiki.ui/sourcefiles/scss/components/default/_forms.scss
resources/mediawiki.ui/sourcefiles/scss/components/vector/_containers.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/mixins/_forms.scss
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.htmlform.js
resources/mediawiki/mediawiki.icon.css [new file with mode: 0644]
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/CologneBlue.php
skins/Modern.php
skins/MonoBook.php
skins/Vector.php
skins/cologneblue/print.css [new file with mode: 0644]
skins/cologneblue/screen.css
skins/common/ajax.js
skins/common/commonElements.css
skins/common/commonPrint.css
skins/common/images/icons/fileicon-psd.png
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/monobook/wiki-indexed.png
skins/vector/collapsibleTabs.js [new file with mode: 0644]
skins/vector/images/arrow-down-focus-icon.svg [new file with mode: 0644]
skins/vector/images/arrow-down-icon.svg [new file with mode: 0644]
skins/vector/screen.css
skins/vector/vector.js
tests/RunSeleniumTests.php [deleted file]
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/xmp/7.result.php
tests/phpunit/includes/ArticleTablesTest.php
tests/phpunit/includes/BlockTest.php
tests/phpunit/includes/CdbTest.php
tests/phpunit/includes/CollationTest.php
tests/phpunit/includes/DiffHistoryBlobTest.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/wfBaseConvertTest.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/LanguageConverterTest.php
tests/phpunit/includes/LinksUpdateTest.php
tests/phpunit/includes/MWFunctionTest.php
tests/phpunit/includes/MWNamespaceTest.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 [deleted file]
tests/phpunit/includes/SiteConfigurationTest.php
tests/phpunit/includes/StringUtilsTest.php
tests/phpunit/includes/TemplateCategoriesTest.php
tests/phpunit/includes/TestUser.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/XmlTypeCheckTest.php [new file with mode: 0644]
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/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 [new file with mode: 0644]
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/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/OracleInstallerTest.php [new file with mode: 0644]
tests/phpunit/includes/jobqueue/JobQueueTest.php
tests/phpunit/includes/json/FormatJsonTest.php
tests/phpunit/includes/libs/CSSJanusTest.php
tests/phpunit/includes/libs/GenericArrayObjectTest.php
tests/phpunit/includes/media/BitmapMetadataHandlerTest.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/objectcache/BagOStuffTest.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/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/UploadTest.php [deleted file]
tests/phpunit/languages/LanguageClassesTestCase.php
tests/phpunit/languages/LanguageSrTest.php
tests/phpunit/languages/LanguageTest.php
tests/phpunit/languages/LanguageTrTest.php
tests/phpunit/languages/LanguageUzTest.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/ExtensionsParserTestSuite.php [new file with mode: 0644]
tests/phpunit/suites/UploadFromUrlTestSuite.php
tests/qunit/data/generateJqueryMsgData.php
tests/qunit/data/testrunner.js
tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js
tests/qunit/suites/resources/jquery/jquery.client.test.js
tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js
tests/qunit/suites/resources/jquery/jquery.tablesorter.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
tests/selenium/Selenium.php [deleted file]
tests/selenium/SeleniumConfig.php [deleted file]
tests/selenium/SeleniumLoader.php [deleted file]
tests/selenium/SeleniumServerManager.php [deleted file]
tests/selenium/SeleniumTestCase.php [deleted file]
tests/selenium/SeleniumTestConsoleLogger.php [deleted file]
tests/selenium/SeleniumTestConstants.php [deleted file]
tests/selenium/SeleniumTestHTMLLogger.php [deleted file]
tests/selenium/SeleniumTestListener.php [deleted file]
tests/selenium/SeleniumTestSuite.php [deleted file]
tests/selenium/data/SimpleSeleniumTestDB.sql [deleted file]
tests/selenium/data/SimpleSeleniumTestImages.zip [deleted file]
tests/selenium/data/Wikipedia-logo-v2-de.png [deleted file]
tests/selenium/data/mediawiki118_fresh_installation.sql [deleted file]
tests/selenium/installer/MediaWikiButtonsAvailabilityTestCase.php [deleted file]
tests/selenium/installer/MediaWikiDifferentDatabaseAccountTestCase.php [deleted file]
tests/selenium/installer/MediaWikiDifferntDatabasePrefixTestCase.php [deleted file]
tests/selenium/installer/MediaWikiErrorsConnectToDatabasePageTestCase.php [deleted file]
tests/selenium/installer/MediaWikiErrorsNamepageTestCase.php [deleted file]
tests/selenium/installer/MediaWikiHelpFieldHintTestCase.php [deleted file]
tests/selenium/installer/MediaWikiInstallationCommonFunction.php [deleted file]
tests/selenium/installer/MediaWikiInstallationConfig.php [deleted file]
tests/selenium/installer/MediaWikiInstallationMessage.php [deleted file]
tests/selenium/installer/MediaWikiInstallationVariables.php [deleted file]
tests/selenium/installer/MediaWikiInstallerTestSuite.php [deleted file]
tests/selenium/installer/MediaWikiMySQLDataBaseTestCase.php [deleted file]
tests/selenium/installer/MediaWikiMySQLiteDataBaseTestCase.php [deleted file]
tests/selenium/installer/MediaWikiOnAlreadyInstalledTestCase.php [deleted file]
tests/selenium/installer/MediaWikiRestartInstallationTestCase.php [deleted file]
tests/selenium/installer/MediaWikiRightFrameworkLinksTestCase.php [deleted file]
tests/selenium/installer/MediaWikiUpgradeExistingDatabaseTestCase.php [deleted file]
tests/selenium/installer/MediaWikiUserInterfaceTestCase.php [deleted file]
tests/selenium/installer/README.txt [deleted file]
tests/selenium/selenium_settings.ini.sample [deleted file]
tests/selenium/selenium_settings_grid.ini.sample [deleted file]
tests/selenium/suites/AddContentToNewPageTestCase.php [deleted file]
tests/selenium/suites/AddNewPageTestCase.php [deleted file]
tests/selenium/suites/CreateAccountTestCase.php [deleted file]
tests/selenium/suites/DeletePageAdminTestCase.php [deleted file]
tests/selenium/suites/EmailPasswordTestCase.php [deleted file]
tests/selenium/suites/MediaWikiEditorConfig.php [deleted file]
tests/selenium/suites/MediaWikiEditorTestSuite.php [deleted file]
tests/selenium/suites/MediaWikiExtraTestSuite.php [deleted file]
tests/selenium/suites/MediawikiCoreSmokeTestCase.php [deleted file]
tests/selenium/suites/MediawikiCoreSmokeTestSuite.php [deleted file]
tests/selenium/suites/MovePageTestCase.php [deleted file]
tests/selenium/suites/MyContributionsTestCase.php [deleted file]
tests/selenium/suites/MyWatchListTestCase.php [deleted file]
tests/selenium/suites/PageDeleteTestSuite.php [deleted file]
tests/selenium/suites/PageSearchTestCase.php [deleted file]
tests/selenium/suites/PreviewPageTestCase.php [deleted file]
tests/selenium/suites/SavePageTestCase.php [deleted file]
tests/selenium/suites/SimpleSeleniumConfig.php [deleted file]
tests/selenium/suites/SimpleSeleniumTestCase.php [deleted file]
tests/selenium/suites/SimpleSeleniumTestSuite.php [deleted file]
tests/selenium/suites/UserPreferencesTestCase.php [deleted file]
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 30b6ee1..ad5e959 100644 (file)
@@ -23,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 6cc28c1..417bec3 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -160,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/RELEASE-NOTES-1.21 b/RELEASE-NOTES-1.21
deleted file mode 100644 (file)
index 2ab652b..0000000
+++ /dev/null
@@ -1,425 +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.
-* $wgVectorUseIconWatch is now enabled by default.
-
-=== 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 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).
-
-=== Bug fixes in 1.21 ===
-* (bug 40617) Installer can now customize the logo in LocalSettings.php
-* (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.
-* The JSON output formatter now leaves forward slashes unescaped to improve human
-  readability of URLs and similar strings. Also, a "utf8" option is now provided
-  to use UTF-8 encoding instead of hex escape codes for most non-ASCII characters.
-* action=opensearch no longer silently ignores the format parameter.
-* action=opensearch now supports format=jsonfm.
-
-=== 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.
-* The Special:ActiveUsers special page was removed.
-* BREAKING CHANGE: Implementation of MediaWiki's JS and JSON value encoding
-  has changed:
-** MediaWiki no longer supports PHP installations in which the native JSON
-   extension is missing or disabled.
-** XmlJsCode objects can no longer be nested inside objects or arrays.
-   (For Xml::encodeJsCall(), this individually applies to each argument.)
-** The sets of characters escaped by default, along with the precise escape
-   sequences used, have changed (except for the Xml::escapeJsString()
-   function, which is now deprecated).
-* BREAKING CHANGE: The Services_JSON class has been removed. If necessary,
-  be sure to upgrade affected extensions at the same time (e.g. Collection).
-* Calling Linker methods using a skin will now output deprecation warnings.
-* Pages with a returnto (such as the page when you login or logout), no
-  longer have a rel="next" link tag.
-
-== 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.
index c0d4951..3e12e92 100644 (file)
@@ -11,8 +11,26 @@ 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.
+* $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.
+* The 'edit' right no longer allows for editing a user's own CSS and JS.
+* New rights 'editmyusercss', 'editmyuserjs', 'viewmywatchlist',
+  and 'editmywatchlist' restrict actions that were formerly allowed by default.
+  They have been added to the default for $wgGroupPermissions['*'].
 
 === New features in 1.22 ===
 * (bug 44525) mediawiki.jqueryMsg can now parse (whitelisted) HTML elements and attributes.
@@ -23,18 +41,164 @@ production.
   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 version of Special:UserLogin form. It is opt-in for now, controlled by
-  the $wgUseVFormUserLogin setting or a 'useNew' URL parameter trigger.
+* 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 using the "vform" compact vertical form layout.
+  These forms use new messages that assume a "Help logging in" link, see
+  https://www.mediawiki.org/wiki/Manual:Page_customizations;
+  https://www.mediawiki.org/wiki/Account_creation_user_experience/Strings lists the
+  message key changes.
+* (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
+* A new hook TitleQuickPermissions was added to allow overriding of quick
+  permissions in the Title class.
+* LinkCache singleton can now be altered or cleared, letting one to specify
+  another instance that does not rely on a database backend.
+* MediaWiki's PHPUnit tests can now use PHPUnit installed using composer --dev.
+* New user rights have been added to increase granularity in rights management
+  for extensions such as OAuth:
+** editmyusercss controls whether a user may edit their own CSS subpages.
+** editmyuserjs controls whether a user may edit their own JS subpages.
+** viewmywatchlist controls whether a user may view their watchlist.
+** editmywatchlist controls whether a user may edit their watchlist.
+* Add new hook AbortTalkPageEmailNotification, this will be used to determine
+  whether to send the regular talk page email notification
+* (bug 46513) Vector: Add the collapsibleTabs script from the Vector extension.
+* Added $wgRecentChangesFlags for defining new flags for RecentChanges and
+  watchlists.
 
 === Bug fixes in 1.22 ===
-* Disable Special:PasswordReset when $wgEnableEmail. Previously one could still
-  navigate to the page by entering the URL directly.
-
+* 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.
+* (bug 46749) Broken files tracking category removed from pages if an image
+  with that name is uploaded.
+* (bug 14176) System messages that are empty were previously incorrectly treated
+  as non-existent, causing a fallback to the default. This stopped users from
+  overriding system messages to make them blank.
+* (bug 48319) action=parse no longer returns an error if passed none of 'oldid',
+  'pageid', 'page', 'title', and 'text' (e.g. if only passed 'summary'). A
+  warning will instead be issued if 'title' is non-default, unless no props are
+  requested.
+* Special:Recentchangeslinked will now include upload log entries
+* (bug 41281) Fixed ugly output if file size could not be extracted for multi-page media.
+* (bug 50315) list=logevents API module will now output log entries by anonymous users.
+* (bug 38911) Handle headers with rowspan in jquery.tablesorter
 
 === API changes in 1.22 ===
+* (bug 25553) The JSON output formatter now leaves forward slashes unescaped
+  to improve human readability of URLs and similar strings. Also, a "utf8"
+  option is now provided to use UTF-8 encoding instead of hex escape codes
+  for most non-ASCII characters.
 * (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 relevant
+  image (sha1 and timestamp).
+* (bug 49239) action=parse now can parse in preview and section preview modes.
+* (bug 49259) action=patrol now accepts revision ids.
+* (bug 48129) list=blocks&bkip= now correctly handles IPv6 CIDR ranges and
+  honors $wgBlockCIDRLimit. Note any clients passing invalid values to bkip
+  will now receive an error, rather than the previous behavior listing all
+  user blocks.
+* (bug 48201) action=parse&text=foo now assumes wikitext if no title is given,
+  rather than using the content model of the page "API".
+* action=watch may now return errors.
 
 === Languages updated in 1.22===
 
@@ -42,12 +206,28 @@ MediaWiki supports over 350 languages. Many localisations are updated
 regularly. Below only new and removed languages are listed, as well as
 changes to languages because of Bugzilla reports.
 
+* Batak Toba (bbc-latn) added.
+* (bug 46751) Made Buryat (Russia) (буряад) (bxr) fallback to Russian.
+
 === Other changes in 1.22 ===
+* BREAKING CHANGE: Implementation of MediaWiki's JS and JSON value encoding
+  has changed:
+** MediaWiki no longer supports PHP installations in which the native JSON
+   extension is missing or disabled.
+** XmlJsCode objects can no longer be nested inside objects or arrays.
+   (For Xml::encodeJsCall(), this individually applies to each argument.)
+** The sets of characters escaped by default, along with the precise escape
+   sequences used, have changed (except for the Xml::escapeJsString()
+   function, which is now deprecated).
+* BREAKING CHANGE: The Services_JSON class has been removed. If necessary,
+  be sure to upgrade affected extensions at the same time (e.g. Collection).
 * 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 and Standard were all removed.
-  Nostalgia was moved to an extension.
+* 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
@@ -58,6 +238,36 @@ changes to languages because of Bugzilla reports.
   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.
+* BREAKING CHANGE: meta keywords are no longer supported. A <meta name="keywords"
+  will no longer be output and OutputPage::addKeyword no longer exists.
+* Methods Title::userCanEditCssSubpage and Title::userCanEditJsSubpage,
+  deprecated since 1.19, have been removed.
+* (bug 50134) Hook functions are no longer required to return a value. When a
+  hook function does not return a value (or when it returns an explicit null),
+  processing continues. To abort the hook, a hook function must return an
+  explicit, boolean false or a string error message. Other falsey values are
+  tantamount to a 'return true' in earlier versions of MediaWiki.
 
 == Compatibility ==
 
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..f2c10ce 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,16 @@ $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
 
+'AbortTalkPageEmailNotification': Return false to cancel talk page email notification
+$targetUser: the user whom to send talk page email notification
+$title: the page title
+
+'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 +381,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 +497,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 +619,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.
@@ -1132,6 +1149,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 +1198,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 +1403,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
@@ -1905,11 +1949,12 @@ $data: the data stored in old_text.  The meaning depends on $flags: if external
 $flags: a comma-delimited list of strings representing the options used.  May
   include: utf8 (this will always be set for new revisions); gzip; external.
 
-'SearchUpdate': Prior to search update completion.
+'SearchUpdate': Prior to search update completion. Return false to stop any
+further text/content processing
 $id : Page id
-$namespace : Page namespace
-$title : Page title
+$title : Title object
 $text : Current text being indexed
+$content : Content object for text being indexed.
 
 'SearchGetNearMatchBefore': Perform exact-title-matches in "go" searches before
 the normal operations.
@@ -1946,8 +1991,6 @@ $title : Current Title object being displayed in search results.
 'SearchableNamespaces': An option to modify which namespaces are searchable.
 &$arr : Array of namespaces ($nsId => $name) which will be used.
 
-'SeleniumSettings': TODO
-
 'SetupAfterCache': Called in Setup.php, after cache objects are set
 
 'ShowMissingArticle': Called when generating the output for a non-existent page.
@@ -2072,8 +2115,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 +2334,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 +2390,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
@@ -2372,6 +2426,7 @@ $article: article "acted on"
 'UnwatchArticle': Before a watch is removed from an article.
 $user: user watching
 $page: WikiPage object to be removed
+&$status: Status object to be returned if the hook returns false
 
 'UnwatchArticleComplete': After a watch is removed from an article.
 $user: user that watched
@@ -2621,6 +2676,7 @@ used to alter the SQL query which gets the list of wanted pages.
 'WatchArticle': Before a watch is added to an article.
 $user: user that will watch
 $page: WikiPage object to be watched
+&$status: Status object to be returned if the hook returns false
 
 'WatchArticleComplete': After a watch is added to an article.
 $user: user that watched
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 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 dff3803..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() {
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 d2f52bc..732b1c2 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'
                        );
                }
@@ -1036,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 ) );
 
        }
 
@@ -1050,21 +1050,85 @@ 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() {
-               $request = $this->getContext()->getRequest();
+               global $wgUseNPPatrol, $wgUseRCPatrol, $wgEnableAPI, $wgEnableWriteAPI;
+
                $outputPage = $this->getContext()->getOutput();
                $user = $this->getContext()->getUser();
-               $rcid = $request->getVal( 'rcid' );
+               $cache = wfGetMainCache();
+               $rc = false;
 
-               if ( !$rcid || !$this->getTitle()->quickUserCan( 'patrol', $user ) ) {
-                       return;
+               if ( !$this->getTitle()->quickUserCan( 'patrol', $user ) || !( $wgUseRCPatrol || $wgUseNPPatrol ) ) {
+                       // Patrolling is disabled or the user isn't allowed to
+                       return false;
+               }
+
+               wfProfileIn( __METHOD__ );
+
+               // New page patrol: Get the timestamp of the oldest revison which
+               // 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;
                }
 
+               if ( $this->mRevision && !RecentChange::isInRCLifespan( $this->mRevision->getTimestamp(), 21600 ) ) {
+                       // The current revision is already older than what could be in the RC table
+                       // 6h tolerance because the RC might not be cleaned out regularly
+                       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 ) ) {
+                       // 6h tolerance because the RC might not be cleaned out regularly
+                       $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' )
+                       );
+               }
+
+               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
+                       $cache->set( wfMemcKey( 'NotPatrollablePage', $this->getTitle()->getArticleID() ), '1' );
+
+                       wfProfileOut( __METHOD__ );
+                       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(),
@@ -1082,6 +1146,9 @@ class Article implements Page {
                                wfMessage( 'markaspatrolledlink' )->rawParams( $link )->escaped() .
                        '</div>'
                );
+
+               wfProfileOut( __METHOD__ );
+               return true;
        }
 
        /**
@@ -1091,6 +1158,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?
@@ -1100,7 +1168,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
@@ -1118,9 +1186,9 @@ class Article implements Page {
                                                )
                                        )
                                );
-                               $validUserPage = true;
+                               $validUserPage = !$this->getTitle()->isSubpage();
                        } else {
-                               $validUserPage = true;
+                               $validUserPage = !$this->getTitle()->isSubpage();
                        }
                }
 
@@ -1140,6 +1208,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 ) {
@@ -1471,13 +1546,7 @@ class Article implements Page {
 
                        $this->doDelete( $reason, $suppress );
 
-                       if ( $user->isLoggedIn() && $request->getCheck( 'wpWatch' ) != $user->isWatched( $title ) ) {
-                               if ( $request->getCheck( 'wpWatch' ) ) {
-                                       WatchAction::doWatch( $title, $user );
-                               } else {
-                                       WatchAction::doUnwatch( $title, $user );
-                               }
-                       }
+                       WatchAction::doWatchOrUnwatch( $request->getCheck( 'wpWatch' ), $title, $user );
 
                        return;
                }
index 88bb21b..6f8cd4b 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,11 +89,6 @@ $wgAutoloadLocalClasses = array(
        'EnhancedChangesList' => 'includes/ChangesList.php',
        'ErrorPageError' => 'includes/Exception.php',
        'ExplodeIterator' => 'includes/StringUtils.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',
        'FakeTitle' => 'includes/FakeTitle.php',
        'Fallback' => 'includes/Fallback.php',
        'FatalError' => 'includes/Exception.php',
@@ -109,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',
@@ -116,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',
@@ -171,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',
@@ -476,6 +475,7 @@ $wgAutoloadLocalClasses = array(
        'DatabaseBase' => 'includes/db/Database.php',
        'DatabaseMssql' => 'includes/db/DatabaseMssql.php',
        'DatabaseMysql' => 'includes/db/DatabaseMysql.php',
+       'DatabaseMysqlBase' => 'includes/db/DatabaseMysqlBase.php',
        'DatabaseOracle' => 'includes/db/DatabaseOracle.php',
        'DatabasePostgres' => 'includes/db/DatabasePostgres.php',
        'DatabaseSqlite' => 'includes/db/DatabaseSqlite.php',
@@ -505,8 +505,8 @@ $wgAutoloadLocalClasses = array(
        'LoadMonitor_Null' => 'includes/db/LoadMonitor.php',
        'MssqlField' => 'includes/db/DatabaseMssql.php',
        'MssqlResult' => 'includes/db/DatabaseMssql.php',
-       'MySQLField' => 'includes/db/DatabaseMysql.php',
-       'MySQLMasterPos' => 'includes/db/DatabaseMysql.php',
+       'MySQLField' => 'includes/db/DatabaseMysqlBase.php',
+       'MySQLMasterPos' => 'includes/db/DatabaseMysqlBase.php',
        'ORAField' => 'includes/db/DatabaseOracle.php',
        'ORAResult' => 'includes/db/DatabaseOracle.php',
        'ORMIterator' => 'includes/db/ORMIterator.php',
@@ -541,9 +541,17 @@ $wgAutoloadLocalClasses = array(
        'WikiDiff3' => 'includes/diff/WikiDiff3.php',
        'WordLevelDiff' => 'includes/diff/DairikiDiff.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',
        'FileBackend' => 'includes/filebackend/FileBackend.php',
+       'FileBackendError' => 'includes/filebackend/FileBackend.php',
        'FileBackendStore' => 'includes/filebackend/FileBackendStore.php',
        'FileBackendStoreShardListIterator' => 'includes/filebackend/FileBackendStore.php',
        'FileBackendStoreShardDirIterator' => 'includes/filebackend/FileBackendStore.php',
@@ -575,6 +583,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',
@@ -650,11 +659,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
@@ -767,12 +777,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',
@@ -800,7 +808,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',
@@ -813,6 +820,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',
@@ -866,7 +874,6 @@ $wgAutoloadLocalClasses = array(
        'SearchResultTooMany' => 'includes/search/SearchEngine.php',
        'SearchSqlite' => 'includes/search/SearchSqlite.php',
        'SearchUpdate' => 'includes/search/SearchUpdate.php',
-       'SearchUpdateMyISAM' => 'includes/search/SearchUpdate.php',
        'SqliteSearchResultSet' => 'includes/search/SearchSqlite.php',
        'SqlSearchResultSet' => 'includes/search/SearchEngine.php',
 
@@ -881,6 +888,7 @@ $wgAutoloadLocalClasses = array(
        'SiteStore' => 'includes/site/SiteStore.php',
 
        # includes/specials
+       'ActiveUsersPager' => 'includes/specials/SpecialActiveusers.php',
        'AllmessagesTablePager' => 'includes/specials/SpecialAllmessages.php',
        'AncientPagesPage' => 'includes/specials/SpecialAncientpages.php',
        'BlockListPager' => 'includes/specials/SpecialBlockList.php',
@@ -925,6 +933,7 @@ $wgAutoloadLocalClasses = array(
        'ProtectedTitlesPager' => 'includes/specials/SpecialProtectedtitles.php',
        'RandomPage' => 'includes/specials/SpecialRandompage.php',
        'ShortPagesPage' => 'includes/specials/SpecialShortpages.php',
+       'SpecialActiveUsers' => 'includes/specials/SpecialActiveusers.php',
        'SpecialAllmessages' => 'includes/specials/SpecialAllmessages.php',
        'SpecialAllpages' => 'includes/specials/SpecialAllpages.php',
        'SpecialBlankpage' => 'includes/specials/SpecialBlankpage.php',
@@ -962,6 +971,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',
@@ -987,6 +997,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',
@@ -1000,7 +1011,6 @@ $wgAutoloadLocalClasses = array(
 
        # includes/templates
        'UserloginTemplate' => 'includes/templates/Userlogin.php',
-       'UserloginTemplateVForm' => 'includes/templates/UserloginVForm.php',
        'UsercreateTemplate' => 'includes/templates/Usercreate.php',
 
        # includes/upload
@@ -1011,6 +1021,7 @@ $wgAutoloadLocalClasses = array(
        'UploadFromUrl' => 'includes/upload/UploadFromUrl.php',
        'UploadStash' => 'includes/upload/UploadStash.php',
        'UploadStashBadPathException' => 'includes/upload/UploadStash.php',
+       'UploadStashException' => 'includes/upload/UploadStash.php',
        'UploadStashFile' => 'includes/upload/UploadStash.php',
        'UploadStashFileException' => 'includes/upload/UploadStash.php',
        'UploadStashFileNotFoundException' => 'includes/upload/UploadStash.php',
@@ -1140,7 +1151,7 @@ class AutoLoader {
                        $filename = "$IP/$filename";
                }
 
-               require( $filename );
+               require $filename;
 
                return true;
        }
@@ -1158,12 +1169,4 @@ class AutoLoader {
        }
 }
 
-if ( function_exists( 'spl_autoload_register' ) ) {
-       spl_autoload_register( array( 'AutoLoader', 'autoload' ) );
-} else {
-       function __autoload( $class ) {
-               AutoLoader::autoload( $class );
-       }
-
-       ini_set( 'unserialize_callback_func', '__autoload' );
-}
+spl_autoload_register( array( 'AutoLoader', 'autoload' ) );
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 1d98a29..34b89e7 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:
@@ -807,12 +809,12 @@ class Block {
        }
 
        /**
-        * Get the IP address at the start of the range in Hex form
+        * Get the IP address at the end of the range in Hex form
         * @throws MWException
         * @return String IP in Hex form
         */
        public function getRangeEnd() {
-               switch( $this->type ) {
+               switch ( $this->type ) {
                        case self::TYPE_USER:
                                return '';
                        case self::TYPE_IP:
@@ -909,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;
@@ -999,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 );
+               } );
        }
 
        /**
@@ -1052,24 +1059,24 @@ 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;
                        }
                }
@@ -1085,7 +1092,7 @@ class Block {
         * @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
+        * @since 1.22
         */
        public static function getBlocksForIPList( array $ipChain, $isAnon, $fromMaster = false ) {
                if ( !count( $ipChain ) ) {
@@ -1166,7 +1173,7 @@ class Block {
         * @param Array $block Array of blocks
         * @return Block|null the "best" block from the list
         */
-       public static function chooseBlock( array $blocks, array $ipChain  ) {
+       public static function chooseBlock( array $blocks, array $ipChain ) {
                if ( !count( $blocks ) ) {
                        return null;
                } elseif ( count( $blocks ) == 1 ) {
@@ -1273,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 );
                }
 
@@ -1300,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];
@@ -1386,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 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 e16397b..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 ) ) {
@@ -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 8b8b94e..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() : '';
                        // 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 0c4d69e..ab851fa 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();
                        }
                }
@@ -134,9 +136,10 @@ class ChangesList extends ContextSource {
         * @param string $nothing to use for empty space
         * @return String
         */
-       protected function recentChangesFlags( $flags, $nothing = '&#160;' ) {
+       public function recentChangesFlags( $flags, $nothing = '&#160;' ) {
+               global $wgRecentChangesFlags;
                $f = '';
-               foreach( array( 'newpage', 'minor', 'bot', 'unpatrolled' ) as $flag ) {
+               foreach ( array_keys( $wgRecentChangesFlags ) as $flag ) {
                        $f .= isset( $flags[$flag] ) && $flags[$flag]
                                ? self::flag( $flag )
                                : $nothing;
@@ -150,36 +153,35 @@ class ChangesList extends ContextSource {
         * unpatrolled edit.  By default in English it will contain "N", "m", "b",
         * "!" respectively, plus it will have an appropriate title and class.
         *
-        * @param string $flag 'newpage', 'unpatrolled', 'minor', or 'bot'
+        * @param string $flag One key of $wgRecentChangesFlags
         * @return String: Raw HTML
         */
        public static function flag( $flag ) {
-               static $messages = null;
-               if ( is_null( $messages ) ) {
-                       $messages = array(
-                               'newpage' => array( 'newpageletter', 'recentchanges-label-newpage' ),
-                               'minoredit' => array( 'minoreditletter', 'recentchanges-label-minor' ),
-                               'botedit' => array( 'boteditletter', 'recentchanges-label-bot' ),
-                               'unpatrolled' => array( 'unpatrolledletter', 'recentchanges-label-unpatrolled' ),
-                       );
-                       foreach( $messages as &$value ) {
-                               $value[0] = wfMessage( $value[0] )->escaped();
-                               $value[1] = wfMessage( $value[1] )->escaped();
+               static $flagInfos = null;
+               if ( is_null( $flagInfos ) ) {
+                       global $wgRecentChangesFlags;
+                       $flagInfos = array();
+                       foreach ( $wgRecentChangesFlags as $key => $value ) {
+                               $flagInfos[$key]['letter'] = wfMessage( $value['letter'] )->escaped();
+                               $flagInfos[$key]['title'] = wfMessage( $value['title'] )->escaped();
+                               // Allow customized class name, fall back to flag name
+                               $flagInfos[$key]['class'] = Sanitizer::escapeClass(
+                                       isset( $value['class'] ) ? $value['class'] : $key );
                        }
                }
 
-               # Inconsistent naming, bleh
+               // Inconsistent naming, bleh, kepted for b/c
                $map = array(
-                       'newpage' => 'newpage',
-                       'minor' => 'minoredit',
-                       'bot' => 'botedit',
-                       'unpatrolled' => 'unpatrolled',
-                       'minoredit' => 'minoredit',
-                       'botedit' => 'botedit',
+                       'minoredit' => 'minor',
+                       'botedit' => 'bot',
                );
-               $flag = $map[$flag];
+               if ( isset( $map[$flag] ) ) {
+                       $flag = $map[$flag];
+               }
 
-               return "<abbr class='$flag' title='" . $messages[$flag][1] . "'>" . $messages[$flag][0] . '</abbr>';
+               return "<abbr class='" . $flagInfos[$flag]['class'] . "' title='" . $flagInfos[$flag]['title'] . "'>" .
+                       $flagInfos[$flag]['letter'] .
+                       '</abbr>';
        }
 
        /**
@@ -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,13 +362,9 @@ 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
-               $params = array();
+               global $wgUseRCPatrol;
 
-               if ( $unpatrolled && $rc->mAttribs['rc_type'] == RC_NEW ) {
-                       $params['rcid'] = $rc->mAttribs['rc_id'];
-               }
+               $params = array();
 
                $articlelink = Linker::linkKnown(
                        $rc->getTitle(),
@@ -378,7 +372,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 +415,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 +444,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 +469,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 +498,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 +511,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 +524,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_EDIT && $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 +537,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 +548,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 +600,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 +668,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 +703,14 @@ class EnhancedChangesList extends ChangesList {
                $this->rcCacheIndex = 0;
                $this->lastdate = '';
                $this->rclistOpen = false;
-               $this->getOutput()->addModuleStyles( 'mediawiki.special.changeslist' );
+               $this->getOutput()->addModuleStyles( array(
+                       'mediawiki.special.changeslist',
+                       'mediawiki.special.changeslist.enhanced',
+               ) );
+               $this->getOutput()->addModules( array(
+                       'jquery.makeCollapsible',
+                       'mediawiki.icon',
+               ) );
                return '';
        }
        /**
@@ -730,7 +732,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 +748,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 +764,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 +787,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 +810,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 +835,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 +874,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 +890,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 +933,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 +947,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 +962,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 +982,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 +1003,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 +1020,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 +1051,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 +1070,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 +1088,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 +1189,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,14 +1197,15 @@ 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 ) {
-                       $r .= '&#160;&#160;&#160;&#160;'; // 4 flags -> 4 spaces
+               if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
+                       $r .= $this->recentChangesFlags( array() ); // no flags, but need the placeholders
                } else {
                        $r .= $this->recentChangesFlags( array(
                                'newpage' => $type == RC_NEW,
@@ -1218,7 +1216,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 +1270,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 21448f7..b0252c7 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':
@@ -49,7 +49,7 @@ abstract class Collation {
                                return new IcuCollation( 'root' );
                        default:
                                $match = array();
-                               if ( preg_match( '/^uca-([a-z-]+)$/', $collationName, $match ) ) {
+                               if ( preg_match( '/^uca-([a-z@=-]+)$/', $collationName, $match ) ) {
                                        return new IcuCollation( $match[1] );
                                }
 
@@ -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\"" );
                }
        }
 
@@ -214,6 +214,7 @@ class IcuCollation extends Collation {
                'pt' => array(),
                'ru' => array(),
                'sv' => array( "Å", "Ä", "Ö" ),
+               'sv@collation=standard' => array( "Å", "Ä", "Ö" ),
                'uk' => array( "Ґ", "Ь" ),
                'vi' => array( "Ă", "Â", "Đ", "Ê", "Ô", "Ơ", "Ư" ),
                // Not verified, but likely correct
@@ -235,6 +236,7 @@ class IcuCollation extends Collation {
                'es' => array( "Ñ" ),
                'et' => array( "Š", "Ž", "Õ", "Ä", "Ö", "Ü" ),
                'eu' => array( "Ñ" ),
+               'fa' => array( "آ", "ء", "ه" ),
                'fo' => array( "Á", "Ð", "Í", "Ó", "Ú", "Ý", "Æ", "Ø", "Å" ),
                'fr' => array(),
                'fur' => array( "À", "Á", "Â", "È", "Ì", "Ò", "Ù" ),
@@ -349,15 +351,15 @@ 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] );
@@ -430,7 +432,7 @@ class IcuCollation extends Collation {
 
                $prev = false;
                $duplicatePrefixes = array();
-               foreach( $letterMap as $key => $value ) {
+               foreach ( $letterMap as $key => $value ) {
                        // Remove terminator byte. Otherwise the prefix
                        // comparison will get hung up on that.
                        $trimmedKey = rtrim( $key, "\0" );
@@ -456,7 +458,7 @@ class IcuCollation extends Collation {
                        }
                        $prev = $trimmedKey;
                }
-               foreach( $duplicatePrefixes as $badKey ) {
+               foreach ( $duplicatePrefixes as $badKey ) {
                        wfDebug( "Removing '{$letterMap[$badKey]}' from first letters." );
                        unset( $letterMap[$badKey] );
                        // This code assumes that unsetting does not change sort order.
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 0a193df..31659f3 100644 (file)
@@ -496,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
@@ -848,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';
@@ -1589,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.
@@ -1873,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
@@ -2518,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).
- */
-$wgJsMimeType = 'text/javascript';
-
-/**
- * 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.
- */
-$wgDocType = '-//W3C//DTD XHTML 1.0 Transitional//EN';
-
-/**
- * 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.
+ * 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
  */
-$wgDTD = 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd';
+$wgJsMimeType = null;
 
 /**
- * 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?
+ * 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
  */
-$wgXhtmlDefaultNamespace = 'http://www.w3.org/1999/xhtml';
+$wgXhtmlDefaultNamespace = null;
 
 /**
- * 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;
 
@@ -2570,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;
 
@@ -2604,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();
 
@@ -2658,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
@@ -2828,13 +2820,6 @@ $wgVectorUseSimpleSearch = true;
  */
 $wgVectorUseIconWatch = true;
 
-/**
- * Use 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.
- */
-$wgUseVFormUserLogin = false;
-
 /**
  * Display user edit counts in various prominent places.
  */
@@ -3295,7 +3280,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 }
 
@@ -3367,17 +3352,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
 );
 
@@ -3500,8 +3497,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;
 
@@ -3573,7 +3571,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.
  */
@@ -3872,6 +3871,10 @@ $wgGroupPermissions['*']['edit'] = true;
 $wgGroupPermissions['*']['createpage'] = true;
 $wgGroupPermissions['*']['createtalk'] = true;
 $wgGroupPermissions['*']['writeapi'] = true;
+$wgGroupPermissions['*']['editmyusercss'] = true;
+$wgGroupPermissions['*']['editmyuserjs'] = true;
+$wgGroupPermissions['*']['viewmywatchlist'] = true;
+$wgGroupPermissions['*']['editmywatchlist'] = true;
 #$wgGroupPermissions['*']['patrolmarks'] = false; // let anons see what was patrolled
 
 // Implicit group for all logged-in accounts
@@ -4033,6 +4036,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
@@ -4290,7 +4308,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,
@@ -5009,6 +5027,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
  *
@@ -5017,12 +5040,13 @@ $wgUpgradeKey = false;
  * The value is the replacement for the key (it can contain $1, etc.)
  * %h will be replaced by the short SHA-1 (7 first chars) and %H by the
  * full SHA-1 of the HEAD revision.
+ * %r will be replaced with a URL-encoded version of $1.
  *
  * @since 1.20
  */
 $wgGitRepositoryViewers = array(
-       'https://gerrit.wikimedia.org/r/p/(.*)' => 'https://gerrit.wikimedia.org/r/gitweb?p=$1;h=%H',
-       'ssh://(?:[a-z0-9_]+@)?gerrit.wikimedia.org:29418/(.*)' => 'https://gerrit.wikimedia.org/r/gitweb?p=$1;h=%H',
+       'https://gerrit.wikimedia.org/r/p/(.*)' => 'https://git.wikimedia.org/commit/%r/%H',
+       'ssh://(?:[a-z0-9_]+@)?gerrit.wikimedia.org:29418/(.*)' => 'https://git.wikimedia.org/commit/%r/%H',
 );
 
 /** @} */ # End of maintenance }
@@ -5099,6 +5123,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;
 
@@ -5193,6 +5220,26 @@ $wgUseTagFilter = true;
  */
 $wgUnwatchedPageThreshold = false;
 
+/**
+ * Recent changes flag, shown in Recentchanges and watchlist
+ *
+ * Adding a new one:
+ *   $wgRecentChangesFlags['flag'] => array( 'letter-msg', 'tooltip-msg' );
+ * 'class' allows to set a css class different than the flag name
+ *
+ * @since 1.22
+ */
+$wgRecentChangesFlags = array(
+       'newpage' => array( 'letter' => 'newpageletter',
+               'title' => 'recentchanges-label-newpage' ),
+       'minor' => array( 'letter' => 'minoreditletter',
+               'title' => 'recentchanges-label-minor', 'class' => 'minoredit' ),
+       'bot' => array( 'letter' => 'boteditletter',
+               'title' => 'recentchanges-label-bot', 'class' => 'botedit' ),
+       'unpatrolled' => array( 'letter' => 'unpatrolledletter',
+               'title' => 'recentchanges-label-unpatrolled' ),
+);
+
 /** @} */ # end RC/watchlist }
 
 /************************************************************************//**
@@ -5462,7 +5509,6 @@ $wgJobClasses = array(
        'refreshLinks' => 'RefreshLinksJob',
        'refreshLinks2' => 'RefreshLinksJob2',
        'htmlCacheUpdate' => 'HTMLCacheUpdateJob',
-       'html_cache_update' => 'HTMLCacheUpdateJob', // backwards-compatible
        'sendMail' => 'EmaillingJob',
        'enotifNotify' => 'EnotifNotifyJob',
        'fixDoubleRedirect' => 'DoubleRedirectJob',
@@ -5762,7 +5808,7 @@ $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();
 
@@ -6129,6 +6175,12 @@ $wgAsyncHTTPTimeout = 25;
  */
 $wgHTTPProxy = false;
 
+/**
+ * Timeout for connections done internally (in seconds)
+ * Only works for curl
+ */
+$wgHTTPConnectTimeout = 5e0;
+
 /** @} */ # End HTTP client }
 
 /************************************************************************//**
@@ -6166,56 +6218,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
  * @{
@@ -6290,15 +6292,6 @@ $wgPoolCounterConf = null;
  */
 $wgUploadMaintenance = false;
 
-/**
- * Allows running of selenium tests via maintenance/tests/RunSeleniumTests.php
- */
-$wgEnableSelenium = false;
-$wgSeleniumTestConfigs = array();
-$wgSeleniumConfigFile = null;
-$wgDBtestuser = ''; //db user that has permission to create and drop the test databases only
-$wgDBtestpassword = '';
-
 /**
  * Associative array mapping namespace IDs to the name of the content model pages in that namespace should have by
  * default (use the CONTENT_MODEL_XXX constants). If no special content type is defined for a given namespace,
@@ -6339,7 +6332,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
@@ -6366,6 +6359,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 28847db..86c5520 100644 (file)
@@ -204,7 +204,7 @@ 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 86a7a77..84bb493 100644 (file)
@@ -898,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' );
@@ -933,7 +935,19 @@ class EditPage {
                                                        # If we just undid one rev, use an autosummary
                                                        $firstrev = $oldrev->getNext();
                                                        if ( $firstrev && $firstrev->getId() == $undo ) {
-                                                               $undoSummary = wfMessage( 'undo-summary', $undo, $undorev->getUserText() )->inContentLanguage()->text();
+                                                               $userText = $undorev->getUserText();
+                                                               if ( $userText === '' ) {
+                                                                       $undoSummary = wfMessage(
+                                                                               'undo-summary-username-hidden',
+                                                                               $undo
+                                                                       )->inContentLanguage()->text();
+                                                               } else {
+                                                                       $undoSummary = wfMessage(
+                                                                               'undo-summary',
+                                                                               $undo,
+                                                                               $userText
+                                                                       )->inContentLanguage()->text();
+                                                               }
                                                                if ( $this->summary === '' ) {
                                                                        $this->summary = $undoSummary;
                                                                } else {
@@ -986,7 +1000,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();
@@ -1008,7 +1024,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();
@@ -1214,7 +1232,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;
 
@@ -1737,7 +1755,9 @@ class EditPage {
        protected function updateWatchlist() {
                global $wgUser;
 
-               if ( $wgUser->isLoggedIn() && $this->watchthis != $wgUser->isWatched( $this->mTitle ) ) {
+               if ( $wgUser->isLoggedIn()
+                       && $this->watchthis != $wgUser->isWatched( $this->mTitle, WatchedItem::IGNORE_USER_RIGHTS )
+               ) {
                        $fname = __METHOD__;
                        $title = $this->mTitle;
                        $watch = $this->watchthis;
@@ -1746,11 +1766,7 @@ class EditPage {
                        $dbw = wfGetDB( DB_MASTER );
                        $dbw->onTransactionIdle( function() use ( $dbw, $title, $watch, $wgUser, $fname ) {
                                $dbw->begin( $fname );
-                               if ( $watch ) {
-                                       WatchAction::doWatch( $title, $wgUser );
-                               } else {
-                                       WatchAction::doUnwatch( $title, $wgUser );
-                               }
+                               WatchAction::doWatchOrUnwatch( $watch, $title, $wgUser );
                                $dbw->commit( $fname );
                        } );
                }
@@ -1934,15 +1950,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 {
@@ -2132,7 +2148,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() ),
@@ -2167,7 +2183,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 ) );
                }
 
@@ -2632,7 +2648,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
@@ -2708,9 +2724,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 {
@@ -3034,9 +3050,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;
@@ -3052,7 +3068,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>";
                                }
                        }
@@ -3320,9 +3336,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 ) .
@@ -3336,9 +3352,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 ) .
@@ -3362,37 +3378,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, '' );
 
@@ -3512,7 +3528,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 661d03d..dc1208a 100644 (file)
@@ -333,7 +333,7 @@ class ErrorPageError extends MWException {
                // customized by the local wiki. So get the default English version for
                // passing to the parent constructor. Our overridden report() below
                // makes sure that the page shown to the user is not forced to English.
-               if( $msg instanceof Message ) {
+               if ( $msg instanceof Message ) {
                        $enMsg = clone( $msg );
                } else {
                        $enMsg = wfMessage( $msg, $params );
@@ -467,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 );
        }
 }
 
@@ -617,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";
        }
@@ -698,7 +668,7 @@ class MWExceptionHandler {
                if ( defined( 'STDERR' ) ) {
                        fwrite( STDERR, $message );
                } else {
-                       echo( $message );
+                       echo $message;
                }
        }
 
index 996c14b..98de4c0 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' );
 
@@ -595,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 );
@@ -638,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";
                }
 
@@ -685,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 );
                }
@@ -696,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();
                }
@@ -820,10 +824,13 @@ class XmlDumpWriter {
                        $archiveName = '';
                }
                if ( $dumpContents ) {
+                       $be = $file->getRepo()->getBackend();
                        # Dump file as base64
                        # Uses only XML-safe characters, so does not need escaping
+                       # @TODO: too bad this loads the contents into memory (script might swap)
                        $contents = '      <contents encoding="base64">' .
-                               chunk_split( base64_encode( file_get_contents( $file->getPath() ) ) ) .
+                               chunk_split( base64_encode(
+                                       $be->getFileContents( array( 'src' => $file->getPath() ) ) ) ) .
                                "      </contents>\n";
                } else {
                        $contents = '';
@@ -1187,7 +1194,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;
        }
 
        /**
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 57d8c0b..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,9 +220,10 @@ class FeedUtils {
         * @return string
         */
        protected static function getDiffLink( Title $title, $newid, $oldid = null ) {
-               $queryParameters = ($oldid == null)
-                       ? "diff={$newid}"
-                       : "diff={$newid}&oldid={$oldid}";
+               $queryParameters = array( 'diff' => $newid );
+               if ( $oldid != null ) {
+                       $queryParameters['oldid'] = $oldid;
+               }
                $diffUrl = $title->getFullURL( $queryParameters );
 
                $diffLink = Html::element( 'a', array( 'href' => $diffUrl ),
@@ -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 9ce2f76..65d82b8 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,24 +109,18 @@ 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
                                // file, otherwise go back to the description page
                                $wgOut->addReturnTo( $this->oldimage ? $this->title : Title::newMainPage() );
 
-                               if ( $wgUser->isLoggedIn() && $wgRequest->getCheck( 'wpWatch' ) != $wgUser->isWatched( $this->title ) ) {
-                                       if ( $wgRequest->getCheck( 'wpWatch' ) ) {
-                                               WatchAction::doWatch( $this->title, $wgUser );
-                                       } else {
-                                               WatchAction::doUnwatch( $this->title, $wgUser );
-                                       }
-                               }
+                               WatchAction::doWatchOrUnwatch( $wgRequest->getCheck( 'wpWatch' ), $this->title, $wgUser );
                        }
                        return;
                }
@@ -153,13 +147,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 +181,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 +207,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 +252,7 @@ class FileDeleteForm {
                                "</td>
                        </tr>
                        {$suppress}";
-               if( $wgUser->isLoggedIn() ) {
+               if ( $wgUser->isLoggedIn() ) {
                        $form .= "
                        <tr>
                                <td></td>
@@ -314,7 +308,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,7 +369,7 @@ class FileDeleteForm {
                $q = array();
                $q['action'] = 'delete';
 
-               if( $this->oldimage ) {
+               if ( $this->oldimage ) {
                        $q['oldimage'] = $this->oldimage;
                }
 
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..407b3cb 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,14 +192,15 @@ 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 ) ) {
+                       if ( preg_match( $pattern, $url, $matches ) ) {
                                $viewerUrl = preg_replace( $pattern, $viewer, $url );
                                $headSHA1 = $this->getHeadSHA1();
                                $replacements = array(
                                        '%h' => substr( $headSHA1, 0, 7 ),
-                                       '%H' => $headSHA1
+                                       '%H' => $headSHA1,
+                                       '%r' => urlencode( $matches[1] ),
                                );
                                return strtr( $viewerUrl, $replacements );
                        }
@@ -212,7 +239,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 751f4af..a44e45b 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();
@@ -1039,7 +1001,7 @@ function wfDebugLog( $logGroup, $text, $public = true ) {
                        wfErrorLog( "$time $host $wiki: $text", $wgDebugLogGroups[$logGroup] );
                }
        } elseif ( $public === true ) {
-               wfDebug( "[$logGroup] $text", true );
+               wfDebug( "[$logGroup] $text", false );
        }
 }
 
@@ -1310,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 );
        }
@@ -1463,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;
@@ -1486,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;
@@ -1535,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 );
@@ -1562,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 );
@@ -1646,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
@@ -1658,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;
@@ -1674,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();
@@ -1688,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];
                        }
                }
@@ -1703,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 );
        }
 
@@ -1712,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().
@@ -1750,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;
@@ -1762,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
@@ -1809,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();
        }
@@ -1849,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 = '-';
@@ -1866,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'] . '()';
@@ -1964,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;
                }
        }
@@ -2004,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;
                                }
@@ -2166,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.
                        //
@@ -2181,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' );
@@ -2223,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 );
        }
 
@@ -2231,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();
@@ -2258,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;
@@ -2288,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];
                        }
                }
@@ -2311,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];
                }
@@ -2418,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;
        }
@@ -2433,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 );
@@ -2504,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;
                }
        }
@@ -2532,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;
        }
 
@@ -2547,7 +2509,7 @@ 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.
                wfLogWarning( sprintf( "failed to mkdir \"%s\" mode 0%o", $dir, $mode ) );
        }
@@ -2600,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;
 }
@@ -2629,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
 }
 
@@ -2647,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();
@@ -2734,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 {
@@ -2765,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' ?
@@ -2775,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
@@ -2900,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;
        }
@@ -2929,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;
@@ -2981,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();
@@ -3095,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 '';
@@ -3123,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 );
        }
@@ -3176,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 ||
@@ -3189,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',
@@ -3204,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;
@@ -3253,7 +3227,7 @@ function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1, $lowercase = t
                $result = strrev( $result );
        }
 
-       if( !$lowercase ) {
+       if ( !$lowercase ) {
                $result = strtoupper( $result );
        }
 
@@ -3279,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;
                        }
                }
@@ -3333,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 );
@@ -3558,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}";
@@ -3571,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.
                #
@@ -3716,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 );
@@ -3743,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;
@@ -3778,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 ) ) {
@@ -3856,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 );
 }
 
@@ -3874,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 ) {
@@ -3916,19 +3890,19 @@ function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
 
        # Handle redirects
        $redirectTitle = RepoGroup::singleton()->checkRedirect( Title::makeTitle( NS_FILE, $name ) );
-       if( $redirectTitle ) {
+       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 ) {
@@ -3937,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 e204087..5af081b 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 :(
@@ -141,6 +140,7 @@ class HTMLForm extends ContextSource {
        protected $mSectionFooters = array();
        protected $mPost = '';
        protected $mId;
+       protected $mTableId = '';
 
        protected $mSubmitID;
        protected $mSubmitName;
@@ -201,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.
@@ -277,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
@@ -586,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
@@ -741,7 +743,7 @@ class HTMLForm extends ContextSource {
         * @return String
         */
        function getBody() {
-               return $this->displaySection( $this->mFieldTree );
+               return $this->displaySection( $this->mFieldTree, $this->mTableId );
        }
 
        /**
@@ -870,6 +872,18 @@ class HTMLForm extends ContextSource {
                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)
@@ -878,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.
@@ -976,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;
@@ -1004,7 +1019,7 @@ class HTMLForm extends ContextSource {
                        );
 
                        if ( $sectionName ) {
-                               $attribs['id'] = Sanitizer::escapeId( "mw-htmlform-$sectionName" );
+                               $attribs['id'] = Sanitizer::escapeId( $sectionName );
                        }
 
                        if ( $displayFormat === 'table' ) {
@@ -1092,7 +1107,6 @@ class HTMLForm extends ContextSource {
                $this->mAction = $action;
                return $this;
        }
-
 }
 
 /**
@@ -1110,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
         */
@@ -1202,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 ) {
@@ -1220,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']}";
@@ -1265,6 +1294,10 @@ abstract class HTMLFormField {
                if ( isset( $params['flatlist'] ) ) {
                        $this->mClass .= ' mw-htmlform-flatlist';
                }
+
+               if ( isset( $params['hidelabel'] ) ) {
+                       $this->mShowEmptyLabels = false;
+               }
        }
 
        /**
@@ -1325,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',
@@ -1456,7 +1494,7 @@ abstract class HTMLFormField {
        }
 
        function getLabel() {
-               return $this->mLabel;
+               return is_null( $this->mLabel ) ? '' : $this->mLabel;
        }
 
        function getLabelHtml( $cellAttributes = array() ) {
@@ -1468,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() )
+               if ( $displayFormat === 'table' ) {
+                       $html = Html::rawElement( 'td', array( 'class' => 'mw-label' ) + $cellAttributes,
+                               Html::rawElement( 'label', $for, $labelValue )
                        );
-               } elseif ( $displayFormat == 'div' ) {
-                       return Html::rawElement( 'div', array( 'class' => 'mw-label' ) + $cellAttributes,
-                               Html::rawElement( 'label', $for, $this->getLabel() )
-                       );
-               } 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() {
@@ -1621,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 ) {
@@ -1805,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 new HTMLFormFieldRequiredOptionsException( $this, $missing );
+               }
+               parent::__construct( $params );
+       }
 
        function validate( $value, $alldata ) {
                $rows = $this->mParams['rows'];
@@ -1867,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" );
                }
@@ -1899,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.
@@ -1963,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;
+       }
 }
 
 /**
@@ -1978,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 ) {
@@ -2103,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 );
@@ -2196,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;
        }
@@ -2530,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;
@@ -2547,7 +2702,6 @@ class HTMLSubmitField extends HTMLFormField {
        public function getInputHTML( $value ) {
                $attr = array(
                        'class' => 'mw-htmlform-submit ' . $this->mClass,
-                       'name' => $this->mName,
                        'id' => $this->mID,
                );
 
@@ -2555,7 +2709,12 @@ class HTMLSubmitField extends HTMLFormField {
                        $attr['disabled'] = 'disabled';
                }
 
-               return Xml::submitButton( $value, $attr );
+               return Html::input(
+                       $this->mName,
+                       $value,
+                       $this->buttonType,
+                       $attr
+               );
        }
 
        protected function needsLabel() {
@@ -2633,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 {
+       public function __construct( HTMLFormField $field, array $missing ) {
+               parent::__construct( 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 740abf7..396e360 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,221 +83,139 @@ 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
+        *
+        * @since 1.22 A hook function is not required to return a value for
+        *   processing to continue. Not returning a value (or explicitly
+        *   returning null) is equivalent to returning true.
         * @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 ) {
-                                       wfProfileOut( 'hook: ' . $event );
-                                       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 {
-                                       wfProfileOut( 'hook: ' . $event );
-                                       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 {
-                               wfProfileOut( 'hook: ' . $event );
-                               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 ) {
-                                       wfProfileOut( 'hook: ' . $event );
-                                       throw new MWException(
-                                               'Detected bug in an extension! ' .
-                                               "Hook $prettyFunc has invalid call signature; " . $badhookmsg
-                                       );
-                               } else {
-                                       wfProfileOut( 'hook: ' . $event );
-                                       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 ( !$retval ) {
+                       } 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 === false ) {
                                wfProfileOut( 'hook: ' . $event );
+                               // False was returned. Stop processing, but no error.
                                return false;
                        }
                }
@@ -303,18 +225,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..1d45e6a 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.
@@ -185,7 +172,7 @@ class Html {
 
                // In text/html, initial <html> and <head> tags can be omitted under
                // pretty much any sane circumstances, if they have no attributes.  See:
-               // <http://www.whatwg.org/specs/web-apps/current-work/multipage/syntax.html#optional-tags>
+               // <http://www.whatwg.org/html/syntax.html#optional-tags>
                if ( !$wgWellFormedXml && !$attribs
                && in_array( $element, array( 'html', 'head' ) ) ) {
                        return '';
@@ -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".
@@ -259,7 +238,7 @@ class Html {
                $element = strtolower( $element );
 
                // Reference:
-               // http://www.whatwg.org/specs/web-apps/current-work/multipage/syntax.html#optional-tags
+               // http://www.whatwg.org/html/syntax.html#optional-tags
                if ( !$wgWellFormedXml && in_array( $element, array(
                        'html',
                        'head',
@@ -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/html/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,9 +900,9 @@ 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
+                       // http://www.whatwg.org/html/embedded-content-1.html#attr-img-srcset
                        $candidates[] = "{$url} {$density}x";
                }
                return implode( ", ", $candidates );
index acf9baa..444857a 100644 (file)
@@ -40,14 +40,15 @@ 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)
         *                          Otherwise it will use the environment variable "http_proxy" (if set)
         *    - noProxy             Don't use any proxy at all. Takes precedence over proxy value(s).
-        *    - sslVerifyHost       (curl only) Verify hostname against certificate
-        *    - sslVerifyCert       (curl only) Verify SSL certificate
-        *    - caInfo              (curl only) Provide CA information
+        *    - sslVerifyHost       Verify hostname against certificate
+        *    - sslVerifyCert       Verify SSL certificate
+        *    - caInfo              Provide CA information
         *    - maxRedirects        Maximum number of redirects to follow (defaults to 5)
         *    - followRedirects     Whether to follow redirects (defaults to false).
         *                                  Note: this should only be used when the target URL is trusted,
@@ -65,6 +66,9 @@ class Http {
                if ( !isset( $options['timeout'] ) ) {
                        $options['timeout'] = 'default';
                }
+               if( !isset( $options['connectTimeout'] ) ) {
+                       $options['connectTimeout'] = 'default';
+               }
 
                $req = MWHttpRequest::factory( $url, $options );
                $status = $req->execute();
@@ -216,7 +220,7 @@ class MWHttpRequest {
         * @param array $options (optional) extra params to pass (see Http::request())
         */
        protected function __construct( $url, $options = array() ) {
-               global $wgHTTPTimeout;
+               global $wgHTTPTimeout, $wgHTTPConnectTimeout;
 
                $this->url = wfExpandUrl( $url, PROTO_HTTP );
                $this->parsedUrl = wfParseUrl( $this->url );
@@ -232,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'] );
                }
 
@@ -280,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':
@@ -721,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" );
@@ -774,7 +784,10 @@ class CurlHttpRequest extends MWHttpRequest {
                        wfRestoreWarnings();
                }
 
-               if ( false === curl_exec( $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 );
@@ -838,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";
                        }
                }
@@ -872,7 +885,23 @@ class PhpHttpRequest extends MWHttpRequest {
 
                $options['timeout'] = $this->timeout;
 
-               $context = stream_context_create( array( 'http' => $options ) );
+               if ( $this->sslVerifyHost ) {
+                       $options['CN_match'] = $this->parsedUrl['host'];
+               }
+               if ( $this->sslVerifyCert ) {
+                       $options['verify_peer'] = true;
+               }
+
+               if ( is_dir( $this->caInfo ) ) {
+                       $options['capath'] = $this->caInfo;
+               } elseif ( is_file( $this->caInfo ) ) {
+                       $options['cafile'] = $this->caInfo;
+               } elseif ( $this->caInfo ) {
+                       throw new MWException( "Invalid CA info passed: {$this->caInfo}" );
+               }
+
+               $scheme = $this->parsedUrl['scheme'];
+               $context = stream_context_create( array( "$scheme" => $options ) );
 
                $this->headerList = array();
                $reqCount = 0;
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..5b45404 100644 (file)
@@ -282,11 +282,15 @@ 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() ) ) {
+
+                               if ( $this->mParser instanceof Parser ) {
+                                       $this->mParser->addTrackingCategory( 'broken-file-category' );
+                               }
+                       } 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 +301,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 +338,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 5e51878..8cfbc73 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 ) {
@@ -311,6 +311,12 @@ class ImagePage extends Article {
                        } else {
                                $params = array( 'page' => $page );
                        }
+
+                       $renderLang = $request->getVal( 'lang' );
+                       if ( !is_null( $renderLang ) ) {
+                               $params['lang'] = $renderLang;
+                       }
+
                        $width_orig = $this->displayImg->getWidth( $page );
                        $width = $width_orig;
                        $height_orig = $this->displayImg->getHeight( $page );
@@ -597,7 +603,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 );
                }
 
@@ -753,7 +759,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 04d99e1..8b7af02 100644 (file)
@@ -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,17 +1713,23 @@ 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;
+                       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 3e8a3c9..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 );
@@ -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
@@ -970,12 +978,13 @@ class Linker {
        protected static function getUploadUrl( $destFile, $query = '' ) {
                global $wgUploadMissingFileUrl, $wgUploadNavigationUrl;
                $q = 'wpDestFile=' . $destFile->getPartialURL();
-               if ( $query != '' )
+               if ( $query != '' ) {
                        $q .= '&' . $query;
+               }
 
                if ( $wgUploadMissingFileUrl ) {
                        return wfAppendQuery( $wgUploadMissingFileUrl, $q );
-               } elseif( $wgUploadNavigationUrl ) {
+               } elseif ( $wgUploadNavigationUrl ) {
                        return wfAppendQuery( $wgUploadNavigationUrl, $q );
                } else {
                        $upload = SpecialPage::getTitleFor( 'Upload' );
@@ -1450,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;
@@ -1695,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'],
@@ -1729,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";
@@ -1895,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 f79b423..0b7393a 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
@@ -237,22 +237,36 @@ class LinksUpdate extends SqlDataUpdate {
                wfProfileOut( __METHOD__ );
        }
 
+       /**
+        * Queue recursive jobs for this page
+        *
+        * Which means do LinksUpdate on all templates
+        * that include the current page, using the job queue.
+        */
        function queueRecursiveJobs() {
-               wfProfileIn( __METHOD__ );
+               self::queueRecursiveJobsForTable( $this->mTitle, 'templatelinks' );
+       }
 
-               if ( $this->mTitle->getBacklinkCache()->hasLinks( 'templatelinks' ) ) {
+       /**
+        * Queue a RefreshLinks job for any table.
+        *
+        * @param Title $title Title to do job for
+        * @param String $table Table to use (e.g. 'templatelinks')
+        */
+       public static function queueRecursiveJobsForTable( Title $title, $table ) {
+               wfProfileIn( __METHOD__ );
+               if ( $title->getBacklinkCache()->hasLinks( $table ) ) {
                        $job = new RefreshLinksJob2(
-                               $this->mTitle,
+                               $title,
                                array(
-                                       'table' => 'templatelinks',
+                                       'table' => $table,
                                ) + Job::newRootJobParams( // "overall" refresh links job info
-                                       "refreshlinks:templatelinks:{$this->mTitle->getPrefixedText()}"
+                                       "refreshlinks:{$table}:{$title->getPrefixedText()}"
                                )
                        );
                        JobQueueGroup::singleton()->push( $job );
                        JobQueueGroup::singleton()->deduplicateRootJob( $job );
                }
-
                wfProfileOut( __METHOD__ );
        }
 
@@ -354,7 +368,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 +390,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 +412,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 +429,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 +495,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 +531,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,7 +854,7 @@ 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();
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 240a6d3..3eaa8fe 100644 (file)
@@ -28,7 +28,7 @@ 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' ) )
@@ -36,7 +36,7 @@ class MWFunction {
                        }
                }
 
-               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 41c7cb9..adb2ab7 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,
@@ -308,10 +310,9 @@ class MagicWord {
                $this->mId = $id;
                $wgContLang->getMagic( $this );
                if ( !$this->mSynonyms ) {
-                       $this->mSynonyms = array( 'dkjsagfjsgashfajsh' );
+                       $this->mSynonyms = array( 'brionmademeputthishere' );
                        wfProfileOut( __METHOD__ );
                        throw new MWException( "Error: invalid magic word '$id'" );
-                       #wfDebugLog( 'exception', "Error: invalid magic word '$id'\n" );
                }
                wfProfileOut( __METHOD__ );
        }
@@ -327,9 +328,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';
@@ -382,8 +384,9 @@ class MagicWord {
         * @return string
         */
        function getRegexCase() {
-               if ( $this->mRegex === '' )
+               if ( $this->mRegex === '' ) {
                        $this->initRegex();
+               }
 
                return $this->mCaseSensitive ? '' : 'iu';
        }
@@ -510,7 +513,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;
        }
 
@@ -526,7 +529,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;
        }
 
@@ -598,14 +601,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 96d00ae..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 );
@@ -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 7592530..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;
@@ -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";
                }
@@ -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" );
                }
@@ -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" ) {
                                $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 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 4e4b739..96a503e 100644 (file)
@@ -39,9 +39,6 @@ class OutputPage extends ContextSource {
        /// Should be private. Used with addMeta() which adds "<meta>"
        var $mMetatags = array();
 
-       /// "<meta keywords='stuff'>" most of the time the first 10 links to an article
-       var $mKeywords = array();
-
        var $mLinktags = array();
        var $mCanonicalUrl = false;
 
@@ -313,19 +310,6 @@ class OutputPage extends ContextSource {
                array_push( $this->mMetatags, array( $name, $val ) );
        }
 
-       /**
-        * Add a keyword or a list of keywords in the page header
-        *
-        * @param string $text or array of strings
-        */
-       function addKeyword( $text ) {
-               if( is_array( $text ) ) {
-                       $this->mKeywords = array_merge( $this->mKeywords, $text );
-               } else {
-                       array_push( $this->mKeywords, $text );
-               }
-       }
-
        /**
         * Add a new \<link\> tag to the page header.
         *
@@ -413,13 +397,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 ) ) );
        }
 
@@ -452,9 +437,9 @@ 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 )
                                && ( !$this->mTarget || in_array( $this->mTarget, $module->getTargets() ) ) )
@@ -687,17 +672,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;
                }
@@ -708,6 +693,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 );
@@ -746,7 +735,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;
                }
@@ -788,10 +777,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'] );
                }
        }
@@ -805,7 +794,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;
                }
        }
@@ -819,7 +808,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;
                }
        }
@@ -1291,7 +1280,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() {
@@ -1306,7 +1294,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] )
@@ -1604,6 +1592,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 ) );
        }
 
@@ -1648,7 +1640,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__ );
                }
 
@@ -1772,8 +1764,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;
@@ -1807,7 +1799,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 );
@@ -1829,11 +1821,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;
@@ -1914,12 +1906,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.
@@ -1946,7 +1937,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 {
@@ -1979,9 +1970,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;
                }
 
@@ -1996,9 +1988,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" );
                                        }
@@ -2010,7 +2002,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";
@@ -2042,11 +2034,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.
@@ -2068,11 +2083,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.22 Use echo yourself.
         */
        public function out( $ins ) {
+               wfDeprecated( __METHOD__, '1.22' );
                print $ins;
        }
 
@@ -2119,7 +2136,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 );
                }
 
@@ -2260,7 +2277,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";
@@ -2308,7 +2325,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 {
@@ -2321,7 +2338,7 @@ class OutputPage extends ContextSource {
                }
 
                // Show source, if supplied
-               if( is_string( $source ) ) {
+               if ( is_string( $source ) ) {
                        $this->addWikiMsg( 'viewsourcetext' );
 
                        $pageLang = $this->getTitle()->getPageLanguage();
@@ -2347,7 +2364,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() );
                }
        }
@@ -2371,7 +2388,7 @@ $templates
         */
        public function showLagWarning( $lag ) {
                global $wgSlaveLagWarning, $wgSlaveLagCritical;
-               if( $lag >= $wgSlaveLagWarning ) {
+               if ( $lag >= $wgSlaveLagWarning ) {
                        $message = $lag < $wgSlaveLagCritical
                                ? 'lag-warn-normal'
                                : 'lag-warn-high';
@@ -2415,9 +2432,9 @@ $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;
@@ -2467,7 +2484,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();
@@ -2488,10 +2505,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/html/semantics.html#attr-meta-http-equiv-content-type
+                       // http://www.whatwg.org/html/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()
@@ -2502,20 +2531,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";
@@ -2523,59 +2561,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
         *
@@ -2672,7 +2657,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';
@@ -2752,7 +2737,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 ) )
@@ -2763,7 +2748,7 @@ $templates
                                }
                        }
 
-                       if( $group == 'noscript' ) {
+                       if ( $group == 'noscript' ) {
                                $links .= Html::rawElement( 'noscript', array(), $link ) . "\n";
                        } else {
                                $links .= $link . "\n";
@@ -2874,7 +2859,7 @@ $templates
                // 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)
@@ -2946,11 +2931,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;
        }
 
        /**
@@ -3038,6 +3030,7 @@ $templates
                        'wgCategories' => $this->getCategories(),
                        'wgBreakFrames' => $this->getFrameOptions() == 'DENY',
                        'wgPageContentLanguage' => $lang->getCode(),
+                       'wgPageContentModel' => $title->getContentModel(),
                        'wgSeparatorTransformTable' => $compactSeparatorTransTable,
                        'wgDigitTransformTable' => $compactDigitTransTable,
                        'wgDefaultDateFormat' => $lang->getDefaultDateFormat(),
@@ -3050,6 +3043,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();
@@ -3099,13 +3096,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;
@@ -3114,30 +3109,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(
@@ -3146,21 +3124,6 @@ $templates
                        ) );
                }
 
-               if ( count( $this->mKeywords ) > 0 ) {
-                       $strip = array(
-                               "/<.*?" . ">/" => '',
-                               "/_/" => ' '
-                       );
-                       $tags['meta-keywords'] = Html::element( 'meta', array(
-                               'name' => 'keywords',
-                               'content' => preg_replace(
-                                       array_keys( $strip ),
-                                       array_values( $strip ),
-                                       implode( ',', $this->mKeywords )
-                               )
-                       ) );
-               }
-
                foreach ( $this->mMetatags as $tag ) {
                        if ( 0 == strcasecmp( 'http:', substr( $tag[0], 0, 5 ) ) ) {
                                $a = 'http-equiv';
@@ -3252,7 +3215,7 @@ $templates
                                        foreach ( $variants as $_v ) {
                                                $tags["variant-$_v"] = Html::element( 'link', array(
                                                        'rel' => 'alternate',
-                                                       'hreflang' => $_v,
+                                                       'hreflang' => wfBCP47( $_v ),
                                                        'href' => $this->getTitle()->getLocalURL( array( 'variant' => $_v ) ) )
                                                );
                                        }
@@ -3285,7 +3248,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
@@ -3320,7 +3283,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'.
                                        );
                                }
@@ -3348,13 +3311,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() );
        }
 
        /**
@@ -3387,13 +3347,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;
@@ -3405,7 +3365,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 );
                }
@@ -3435,7 +3395,7 @@ $templates
                if ( $wgUseSiteCss ) {
                        $moduleStyles[] = 'site';
                        $moduleStyles[] = 'noscript';
-                       if( $this->getUser()->isLoggedIn() ) {
+                       if ( $this->getUser()->isLoggedIn() ) {
                                $moduleStyles[] = 'user.groups';
                        }
                }
@@ -3516,9 +3476,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;
                        }
                }
@@ -3534,22 +3494,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;
@@ -3560,7 +3520,7 @@ $templates
 
                $link = Html::linkedStyle( $url, $media );
 
-               if( isset( $options['condition'] ) ) {
+               if ( isset( $options['condition'] ) ) {
                        $condition = htmlspecialchars( $options['condition'] );
                        $link = "<!--[if $condition]>$link<![endif]-->";
                }
@@ -3575,7 +3535,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';
@@ -3585,11 +3545,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)' ),
@@ -3600,25 +3560,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 e8ecf6d..02d3546 100644 (file)
@@ -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..c7f51a3 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,49 +1152,67 @@ 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;
        }
 
        /**
         * Get a "<select>" element which has options for each of the allowed limits
         *
+        * @param $attribs String: Extra attributes to set
         * @return String: HTML fragment
         */
-       public function getLimitSelect() {
+       public function getLimitSelect( $attribs = array() ) {
+               $select = new XmlSelect( 'limit', false, $this->mLimit );
+               $select->addOptions( $this->getLimitSelectList() );
+               foreach ( $attribs as $name => $value ) {
+                       $select->setAttribute( $name, $value );
+               }
+               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 +1231,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 +1244,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 38c6f04..2dac938 100644 (file)
@@ -190,9 +190,19 @@ abstract class PoolCounterWork {
        }
 
        /**
-        * 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
         */
        public function execute( $skipcache = false ) {
                if ( $this->cacheable && !$skipcache ) {
index 6d6e581..8f784bb 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(
@@ -674,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 ) {
@@ -724,25 +732,28 @@ class Preferences {
                global $wgAllowUserCssPrefs;
 
                ## Editing #####################################
-               $defaultPreferences['cols'] = array(
-                       'type' => 'int',
-                       'label-message' => 'columns',
-                       'section' => 'editing/textboxsize',
-                       'min' => 4,
-                       'max' => 1000,
+               if ( $wgAllowUserCssPrefs ) {
+                       $defaultPreferences['editsection'] = array(
+                               'type' => 'toggle',
+                               'section' => 'editing/advancedediting',
+                               'label-message' => 'tog-editsection',
+                       );
+               }
+               $defaultPreferences['editsectiononrightclick'] = array(
+                       'type' => 'toggle',
+                       'section' => 'editing/advancedediting',
+                       'label-message' => 'tog-editsectiononrightclick',
                );
-               $defaultPreferences['rows'] = array(
-                       'type' => 'int',
-                       'label-message' => 'rows',
-                       'section' => 'editing/textboxsize',
-                       'min' => 4,
-                       'max' => 1000,
+               $defaultPreferences['editondblclick'] = array(
+                       'type' => 'toggle',
+                       'section' => 'editing/advancedediting',
+                       'label-message' => 'tog-editondblclick',
                );
 
                if ( $wgAllowUserCssPrefs ) {
                        $defaultPreferences['editfont'] = array(
                                'type' => 'select',
-                               'section' => 'editing/advancedediting',
+                               'section' => 'editing/editor',
                                'label-message' => 'editfont-style',
                                'options' => array(
                                        $context->msg( 'editfont-default' )->text() => 'default',
@@ -752,64 +763,57 @@ class Preferences {
                                )
                        );
                }
-               $defaultPreferences['previewontop'] = array(
-                       'type' => 'toggle',
-                       'section' => 'editing/advancedediting',
-                       'label-message' => 'tog-previewontop',
+               $defaultPreferences['cols'] = array(
+                       'type' => 'int',
+                       'label-message' => 'columns',
+                       'section' => 'editing/editor',
+                       'min' => 4,
+                       'max' => 1000,
                );
-               $defaultPreferences['previewonfirst'] = array(
-                       'type' => 'toggle',
-                       'section' => 'editing/advancedediting',
-                       'label-message' => 'tog-previewonfirst',
+               $defaultPreferences['rows'] = array(
+                       'type' => 'int',
+                       'label-message' => 'rows',
+                       'section' => 'editing/editor',
+                       'min' => 4,
+                       'max' => 1000,
                );
-
-               if ( $wgAllowUserCssPrefs ) {
-                       $defaultPreferences['editsection'] = array(
+               if ( $user->isAllowed( 'minoredit' ) ) {
+                       $defaultPreferences['minordefault'] = array(
                                'type' => 'toggle',
-                               'section' => 'editing/advancedediting',
-                               'label-message' => 'tog-editsection',
+                               'section' => 'editing/editor',
+                               'label-message' => 'tog-minordefault',
                        );
                }
-               $defaultPreferences['editsectiononrightclick'] = array(
+               $defaultPreferences['forceeditsummary'] = array(
                        'type' => 'toggle',
-                       'section' => 'editing/advancedediting',
-                       'label-message' => 'tog-editsectiononrightclick',
+                       'section' => 'editing/editor',
+                       'label-message' => 'tog-forceeditsummary',
                );
-               $defaultPreferences['editondblclick'] = array(
+               $defaultPreferences['useeditwarning'] = array(
                        'type' => 'toggle',
-                       'section' => 'editing/advancedediting',
-                       'label-message' => 'tog-editondblclick',
+                       'section' => 'editing/editor',
+                       'label-message' => 'tog-useeditwarning',
                );
                $defaultPreferences['showtoolbar'] = array(
                        'type' => 'toggle',
-                       'section' => 'editing/advancedediting',
+                       'section' => 'editing/editor',
                        'label-message' => 'tog-showtoolbar',
                );
 
-               if ( $user->isAllowed( 'minoredit' ) ) {
-                       $defaultPreferences['minordefault'] = array(
-                               'type' => 'toggle',
-                               'section' => 'editing/advancedediting',
-                               'label-message' => 'tog-minordefault',
-                       );
-               }
-
-               $defaultPreferences['forceeditsummary'] = array(
+               $defaultPreferences['previewonfirst'] = array(
                        'type' => 'toggle',
-                       'section' => 'editing/advancedediting',
-                       'label-message' => 'tog-forceeditsummary',
+                       'section' => 'editing/preview',
+                       'label-message' => 'tog-previewonfirst',
                );
-
-               $defaultPreferences['uselivepreview'] = array(
+               $defaultPreferences['previewontop'] = array(
                        'type' => 'toggle',
-                       'section' => 'editing/advancedediting',
-                       'label-message' => 'tog-uselivepreview',
+                       'section' => 'editing/preview',
+                       'label-message' => 'tog-previewontop',
                );
-
-               $defaultPreferences['useeditwarning'] = array(
+               $defaultPreferences['uselivepreview'] = array(
                        'type' => 'toggle',
-                       'section' => 'editing/advancedediting',
-                       'label-message' => 'tog-useeditwarning',
+                       'section' => 'editing/preview',
+                       'label-message' => 'tog-uselivepreview',
                );
 
        }
@@ -1012,8 +1016,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(
@@ -1092,7 +1097,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
@@ -1351,7 +1356,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;
                                }
@@ -1406,7 +1413,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 );
@@ -1473,7 +1480,7 @@ class Preferences {
        }
 
        /**
-        * @deprecated in 1.19; will be removed in 1.20.
+        * @deprecated in 1.19
         * @param $user User
         * @return array
         */
@@ -1555,40 +1562,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 7ebefec..2f6b65d 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,8 +188,8 @@ 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 ) );
                        }
@@ -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,23 +320,18 @@ 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;
                }
 
-               if ( $wgUser->isLoggedIn() && $wgRequest->getCheck( 'mwProtectWatch' ) != $wgUser->isWatched( $this->mTitle ) ) {
-                       if ( $wgRequest->getCheck( 'mwProtectWatch' ) ) {
-                               WatchAction::doWatch( $this->mTitle, $wgUser );
-                       } else {
-                               WatchAction::doUnwatch( $this->mTitle, $wgUser );
-                       }
-               }
+               WatchAction::doWatchOrUnwatch( $wgRequest->getCheck( 'mwProtectWatch' ), $this->mTitle, $wgUser );
+
                return true;
        }
 
@@ -356,7 +353,7 @@ 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' ),
@@ -368,10 +365,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 +381,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 +409,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 +420,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 +460,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 +478,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 +503,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 +559,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 +583,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 +597,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 +609,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 faad391..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 {
@@ -328,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 ) );
        }
 
        /**
@@ -409,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();
        }
 
@@ -653,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,
@@ -825,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 ) {
@@ -839,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 3ea5da4..b3b971b 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;
@@ -867,24 +867,37 @@ class Revision implements IDBAccessObject {
        }
 
        /**
-        * @return Integer rcid of the unpatrolled row, zero if there isn't one
+        * @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;
                }
+               $rc = $this->getRecentChange();
+               if ( $rc && $rc->getAttribute( 'rc_patrolled' ) == 0 ) {
+                       $this->mUnpatrolled = $rc->getAttribute( 'rc_id' );
+               } else {
+                       $this->mUnpatrolled = 0;
+               }
+               return $this->mUnpatrolled;
+       }
+
+       /**
+        * Get the RC object belonging to the current revision, if there's one
+        *
+        * @since 1.22
+        * @return RecentChange|null
+        */
+       public function getRecentChange() {
                $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_this_oldid' => $this->getId(),
-                               'rc_patrolled'  => 0
+               return RecentChange::newFromConds(
+                       array(
+                               'rc_user_text' => $this->getRawUserText(),
+                               'rc_timestamp' => $dbr->timestamp( $this->getTimestamp() ),
+                               'rc_this_oldid' => $this->getId()
                        ),
                        __METHOD__
                );
-               return (int)$this->mUnpatrolled;
        }
 
        /**
@@ -918,7 +931,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 +956,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 +1009,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 +1110,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 +1125,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 +1142,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 +1179,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 +1196,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 +1205,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 +1224,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 +1257,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,33 +1287,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 )
@@ -1424,9 +1439,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;
@@ -1441,7 +1456,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',
@@ -1450,7 +1465,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',
@@ -1462,7 +1477,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 );
                }
 
@@ -1507,7 +1522,7 @@ class Revision implements IDBAccessObject {
                                ),
                        __METHOD__ );
 
-               if( $current ) {
+               if ( $current ) {
                        $row = array(
                                'page'       => $pageId,
                                'comment'    => $summary,
@@ -1560,7 +1575,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 ) {
@@ -1613,7 +1628,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;
@@ -1628,7 +1643,7 @@ class Revision implements IDBAccessObject {
         */
        static function countByTitle( $db, $title ) {
                $id = $title->getArticleID();
-               if( $id ) {
+               if ( $id ) {
                        return self::countByPageId( $db, $id );
                }
                return 0;
@@ -1650,7 +1665,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 666df96..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();
index 3acb740..7400a5a 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;
@@ -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 ) );
                                                }
 
@@ -572,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 ) );
                                        }
 
@@ -606,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
@@ -623,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.
@@ -708,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 ) ) {
@@ -724,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 );
                        }
 
@@ -741,7 +740,7 @@ class Sanitizer {
 
                        # WAI-ARIA
                        # http://www.w3.org/TR/wai-aria/
-                       # http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#wai-aria
+                       # http://www.whatwg.org/html/elements.html#wai-aria
                        # For now we only support role="presentation" until we work out what roles should be
                        # usable by content and we ensure that our code explicitly rejects patterns that
                        # violate HTML5's ARIA restrictions.
@@ -800,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 ) );
@@ -813,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.
         *
@@ -856,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
@@ -925,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 );
        }
 
        /**
@@ -1012,7 +1011,7 @@ class Sanitizer {
         *                                                          in the id and
         *                                                          name attributes
         * @see http://www.w3.org/TR/html401/struct/links.html#h-12.2.3 Anchors with the id attribute
-        * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#the-id-attribute
+        * @see http://www.whatwg.org/html/elements.html#the-id-attribute
         *   HTML5 definition of id attribute
         *
         * @param string $id id to escape
@@ -1027,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, '_' );
@@ -1111,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,
@@ -1125,7 +1124,7 @@ class Sanitizer {
                        return $attribs;
                }
 
-               foreach( $pairs as $set ) {
+               foreach ( $pairs as $set ) {
                        $attribute = strtolower( $set[1] );
                        $value = Sanitizer::getTagAttributeCallback( $set );
 
@@ -1139,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.
@@ -1148,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];
@@ -1236,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;
@@ -1279,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;
@@ -1292,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;
@@ -1305,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 );
        }
 
        /**
@@ -1356,11 +1373,11 @@ class Sanitizer {
         * @return String
         */
        static function decodeCharReferencesCallback( $matches ) {
-               if( $matches[1] != '' ) {
+               if ( $matches[1] != '' ) {
                        return Sanitizer::decodeEntity( $matches[1] );
-               } elseif( $matches[2] != '' ) {
+               } elseif ( $matches[2] != '' ) {
                        return Sanitizer::decodeChar( intval( $matches[2] ) );
-               } elseif( $matches[3] != '' ) {
+               } elseif ( $matches[3] != '' ) {
                        return Sanitizer::decodeChar( hexdec( $matches[3] ) );
                }
                # Last case should be an ampersand by itself
@@ -1375,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;
@@ -1394,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;";
@@ -1420,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;
@@ -1449,8 +1466,8 @@ class Sanitizer {
                        ) );
                }
 
-               if ( $wgHtml5 && $wgAllowMicrodataAttributes ) {
-                       # add HTML5 microdata tags as specified by http://www.whatwg.org/specs/web-apps/current-work/multipage/microdata.html#the-microdata-model
+               if ( $wgAllowMicrodataAttributes ) {
+                       # add HTML5 microdata tags as specified by http://www.whatwg.org/html/microdata.html#the-microdata-model
                        $common = array_merge( $common, array(
                                'itemid', 'itemprop', 'itemref', 'itemscope', 'itemtype'
                        ) );
@@ -1588,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/html/text-level-semantics.html#the-ruby-element
                        'ruby'       => $common,
                        # rbc
                        # rtc
@@ -1605,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' ),
-                       );
-               }
+                       # http://www.whatwg.org/html/
+                       '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;
 
@@ -1662,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";
@@ -1684,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.
@@ -1728,7 +1740,7 @@ class Sanitizer {
         * Does a string look like an e-mail address?
         *
         * This validates an email address using an HTML5 specification found at:
-        * http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#valid-e-mail-address
+        * http://www.whatwg.org/html/states-of-the-type-attribute.html#valid-e-mail-address
         * Which as of 2011-01-24 says:
         *
         *   A valid e-mail address is a string that matches the ABNF production
@@ -1754,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;
        }
 
diff --git a/includes/SeleniumWebSettings.php b/includes/SeleniumWebSettings.php
deleted file mode 100644 (file)
index 26c2df5..0000000
+++ /dev/null
@@ -1,221 +0,0 @@
-<?php
-/**
- * Dynamically change configuration variables based on the test suite name and a cookie value.
- *
- * For details on how to configure a wiki for a Selenium test, see:
- * http://www.mediawiki.org/wiki/SeleniumFramework#Test_Wiki_configuration
- *
- * 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 ( !defined( 'MEDIAWIKI' ) ) {
-       die( 1 );
-}
-
-require_once( "$IP/includes/GlobalFunctions.php" );
-
-$fname = 'SeleniumWebSettings.php';
-wfProfileIn( $fname );
-
-$cookiePrefix = $wgSitename . '-';
-$cookieName = $cookiePrefix . 'Selenium';
-
-// this is a fallback SQL file
-$testSqlFile = false;
-$testImageZip = false;
-
-// if we find a request parameter containing the test name, set a cookie with the test name
-if ( isset( $_GET['setupTestSuite'] ) ) {
-       $setupTestSuiteName = $_GET['setupTestSuite'];
-
-       if (
-               preg_match( '/[^a-zA-Z0-9_-]/', $setupTestSuiteName ) ||
-               !isset( $wgSeleniumTestConfigs[$setupTestSuiteName] )
-       )
-       {
-               return;
-       }
-       if ( strlen( $setupTestSuiteName ) > 0 ) {
-               $expire = time() + 600;
-               setcookie(
-                       $cookieName,
-                       $setupTestSuiteName,
-                       $expire,
-                       $wgCookiePath,
-                       $wgCookieDomain,
-                       $wgCookieSecure,
-                       true
-               );
-       }
-
-       $testIncludes = array(); // array containing all the includes needed for this test
-       $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 ) );
-
-       if ( isset( $testResourceFiles['images'] ) ) {
-               $testImageZip = $testResourceFiles['images'];
-       }
-
-       if ( isset( $testResourceFiles['db'] ) ) {
-               $testSqlFile = $testResourceFiles['db'];
-               $testResourceName = getTestResourceNameFromTestSuiteName( $setupTestSuiteName );
-
-               switchToTestResources( $testResourceName, false ); // false means do not switch database yet
-               setupTestResources( $testResourceName, $testSqlFile, $testImageZip );
-       }
-}
-
-// clear the cookie based on a request param
-if ( isset( $_GET['clearTestSuite'] ) ) {
-       $testSuiteName = getTestSuiteNameFromCookie( $cookieName );
-
-       $expire = time() - 600;
-       setcookie(
-               $cookieName,
-               '',
-               $expire,
-               $wgCookiePath,
-               $wgCookieDomain,
-               $wgCookieSecure,
-               true
-       );
-
-       $testResourceName = getTestResourceNameFromTestSuiteName( $testSuiteName );
-       teardownTestResources( $testResourceName );
-}
-
-// if a cookie is found, run the appropriate callback to get the config params.
-if ( isset( $_COOKIE[$cookieName] ) ) {
-       $testSuiteName = getTestSuiteNameFromCookie( $cookieName );
-       if ( !isset( $wgSeleniumTestConfigs[$testSuiteName] ) ) {
-               return;
-       }
-
-       $testIncludes = array(); // array containing all the includes needed for this test
-       $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 ) );
-
-       if ( isset( $testResourceFiles['db'] ) ) {
-               $testResourceName = getTestResourceNameFromTestSuiteName( $testSuiteName );
-               switchToTestResources( $testResourceName );
-       }
-       foreach ( $testIncludes as $includeFile ) {
-               $file = $IP . '/' . $includeFile;
-               require_once( $file );
-       }
-       foreach ( $testGlobalConfigs as $key => $value ) {
-               if ( is_array( $value ) ) {
-                       $GLOBALS[$key] = array_merge( $GLOBALS[$key], $value );
-               } else {
-                       $GLOBALS[$key] = $value;
-               }
-       }
-}
-
-wfProfileOut( $fname );
-
-function getTestSuiteNameFromCookie( $cookieName ) {
-       $testSuiteName = null;
-       if ( isset( $_COOKIE[$cookieName] ) ) {
-               $testSuiteName = $_COOKIE[$cookieName];
-       }
-       return $testSuiteName;
-}
-
-function getTestResourceNameFromTestSuiteName( $testSuiteName ) {
-       $testResourceName = null;
-       if ( isset( $testSuiteName ) ) {
-               $testResourceName = $testSuiteName;
-       }
-       return $testResourceName;
-}
-
-function getTestUploadPathFromResourceName( $testResourceName ) {
-       global $IP;
-       $testUploadPath = "$IP/images/$testResourceName";
-       return $testUploadPath;
-}
-
-function setupTestResources( $testResourceName, $testSqlFile, $testImageZip ) {
-       global $wgDBname;
-
-       // Basic security. Do not allow to drop productive database.
-       if ( $testResourceName == $wgDBname ) {
-               die( 'Cannot override productive database.' );
-       }
-       if ( $testResourceName == '' ) {
-               die( 'Cannot identify a test the resources should be installed for.' );
-       }
-
-       // create tables
-       $dbw = wfGetDB( DB_MASTER );
-       $dbw->query( 'DROP DATABASE IF EXISTS ' . $testResourceName );
-       $dbw->query( 'CREATE DATABASE ' . $testResourceName );
-
-       // do not set the new DB name before database is setup
-       $wgDBname = $testResourceName;
-       $dbw->selectDB( $testResourceName );
-       // populate from SQL file
-       if ( $testSqlFile ) {
-               $dbw->sourceFile( $testSqlFile );
-       }
-
-       // create test image dir
-       $testUploadPath = getTestUploadPathFromResourceName( $testResourceName );
-       if ( !file_exists( $testUploadPath ) ) {
-               mkdir( $testUploadPath );
-       }
-
-       if ( $testImageZip ) {
-               $zip = new ZipArchive();
-               $zip->open( $testImageZip );
-               $zip->extractTo( $testUploadPath );
-               $zip->close();
-       }
-}
-
-function teardownTestResources( $testResourceName ) {
-       // remove test database
-       $dbw = wfGetDB( DB_MASTER );
-       $dbw->query( 'DROP DATABASE IF EXISTS ' . $testResourceName );
-
-       $testUploadPath = getTestUploadPathFromResourceName( $testResourceName );
-       // remove test image dir
-       if ( file_exists( $testUploadPath ) ) {
-               wfRecursiveRemoveDir( $testUploadPath );
-       }
-}
-
-function switchToTestResources( $testResourceName, $switchDB = true ) {
-       global $wgDBuser, $wgDBpassword, $wgDBname;
-       global $wgDBtestuser, $wgDBtestpassword;
-       global $wgUploadPath;
-
-       if ( $switchDB ) {
-               $wgDBname = $testResourceName;
-       }
-       $wgDBuser = $wgDBtestuser;
-       $wgDBpassword = $wgDBtestpassword;
-
-       $testUploadPath = getTestUploadPathFromResourceName( $testResourceName );
-       $wgUploadPath = $testUploadPath;
-}
index 08ab143..d8c9180 100644 (file)
@@ -44,8 +44,12 @@ if ( !isset( $wgVersion ) ) {
 }
 
 // Set various default paths sensibly...
-if ( $wgScript === false ) $wgScript = "$wgScriptPath/index$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 ) {
@@ -61,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'];
@@ -129,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',
 );
 
 /**
@@ -201,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,
        );
 }
 /*
@@ -300,7 +318,7 @@ $wgCanonicalNamespaceNames = array(
 );
 
 /// @todo UGLY UGLY
-if( is_array( $wgExtraNamespaces ) ) {
+if ( is_array( $wgExtraNamespaces ) ) {
        $wgCanonicalNamespaceNames = $wgCanonicalNamespaceNames + $wgExtraNamespaces;
 }
 
@@ -322,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';
@@ -373,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;
@@ -432,7 +454,7 @@ if ( is_null( $wgLocaltimezone ) ) {
 }
 
 date_default_timezone_set( $wgLocaltimezone );
-if( is_null( $wgLocalTZoffset ) ) {
+if ( is_null( $wgLocalTZoffset ) ) {
        $wgLocalTZoffset = date( 'Z' ) / 60;
 }
 
@@ -538,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 2d250df..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,8 +220,8 @@ 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 {
@@ -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 117e6e2..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.
@@ -81,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
@@ -96,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;
        }
 
        /**
@@ -162,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 );
@@ -201,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
         */
@@ -291,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 );
@@ -668,7 +726,7 @@ abstract class Skin extends ContextSource {
 
                                                if ( $c > 1 ) {
                                                        $subpages .= $wgLang->getDirMarkEntity() . $this->msg( 'pipe-separator' )->escaped();
-                                               } else  {
+                                               } else {
                                                        $subpages .= '&lt; ';
                                                }
 
@@ -1015,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 );
@@ -1294,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;
@@ -1343,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 ) {
@@ -1372,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;
        }
 
        /**
@@ -1392,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;
                        }
@@ -1412,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;
@@ -1533,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;
diff --git a/includes/SkinLegacy.php b/includes/SkinLegacy.php
deleted file mode 100644 (file)
index 9d657f7..0000000
+++ /dev/null
@@ -1,842 +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;
-       }
-}
-
-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 fee3058..8e41b5a 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' => wfBCP47( $ilInterwikiCode ),
+                                               'hreflang' => wfBCP47( $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'],
@@ -599,12 +613,15 @@ class SkinTemplate extends Skin {
                                'href' => $href,
                                'active' => ( $href == $pageurl )
                        );
-                       $href = self::makeSpecialUrl( 'Watchlist' );
-                       $personal_urls['watchlist'] = array(
-                               'text' => $this->msg( 'mywatchlist' )->text(),
-                               'href' => $href,
-                               'active' => ( $href == $pageurl )
-                       );
+
+                       if ( $this->getUser()->isAllowed( 'viewmywatchlist' ) ) {
+                               $href = self::makeSpecialUrl( 'Watchlist' );
+                               $personal_urls['watchlist'] = array(
+                                       'text' => $this->msg( 'mywatchlist' )->text(),
+                                       'href' => $href,
+                                       'active' => ( $href == $pageurl )
+                               );
+                       }
 
                        # We need to do an explicit check for Special:Contributions, as we
                        # have to match both the title, and the target, which could come
@@ -614,7 +631,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 +679,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 +722,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 +750,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;
@@ -748,7 +765,7 @@ class SkinTemplate extends Skin {
 
        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 +778,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 +848,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();
@@ -978,7 +995,7 @@ class SkinTemplate extends Skin {
                                wfProfileOut( __METHOD__ . '-live' );
 
                                // Checks if the user is logged in
-                               if ( $this->loggedin ) {
+                               if ( $this->loggedin && $user->isAllowedAll( 'viewmywatchlist', 'editmywatchlist' ) ) {
                                        /**
                                         * The following actions use messages which, if made particular to
                                         * the any specific skins, would break the Ajax code which makes this
@@ -1018,21 +1035,16 @@ 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,
                                                        'text' => $varname,
                                                        'href' => $title->getLocalURL( array( 'variant' => $code ) + $params ),
-                                                       'lang' => $code,
-                                                       'hreflang' => $code
+                                                       'lang' => wfBCP47( $code ),
+                                                       'hreflang' => wfBCP47( $code ),
                                                );
                                        }
                                }
@@ -1156,9 +1168,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;
@@ -1178,15 +1190,15 @@ class SkinTemplate extends Skin {
 
                // A print stylesheet is attached to all pages, but nobody ever
                // figures that out. :)  Add a link...
-               if ( $out->isArticle() ) {
-                       if ( !$out->isPrintable() ) {
-                               $nav_urls['print'] = array(
-                                       'text' => $this->msg( 'printableversion' )->text(),
-                                       'href' => $this->getTitle()->getLocalURL(
-                                               $request->appendQueryValue( 'printable', 'yes', true ) )
-                               );
-                       }
+               if ( !$out->isPrintable() && ( $out->isArticle() || $this->getTitle()->isSpecialPage() ) ) {
+                       $nav_urls['print'] = array(
+                               'text' => $this->msg( 'printableversion' )->text(),
+                               'href' => $this->getTitle()->getLocalURL(
+                                       $request->appendQueryValue( 'printable', 'yes', true ) )
+                       );
+               }
 
+               if ( $out->isArticle() ) {
                        // Also add a "permalink" while we're at it
                        $revid = $this->getRevisionId();
                        if ( $revid ) {
@@ -1244,6 +1256,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 )
@@ -1508,8 +1521,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;
                }
@@ -1548,39 +1562,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;
                        }
@@ -1620,10 +1634,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();
@@ -1809,6 +1823,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 );
@@ -1816,7 +1831,7 @@ abstract class BaseTemplate extends QuickTemplate {
        }
 
        function makeSearchButton( $mode, $attrs = array() ) {
-               switch( $mode ) {
+               switch ( $mode ) {
                        case 'go':
                        case 'fulltext':
                                $realAttrs = array(
@@ -1872,10 +1887,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 d8f6fd9..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
         */
@@ -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
@@ -949,8 +983,11 @@ abstract class FormSpecialPage extends SpecialPage {
                $form = new HTMLForm( $this->fields, $this->getContext(), $this->getMessagePrefix() );
                $form->setSubmitCallback( array( $this, 'onSubmit' ) );
                $form->setWrapperLegendMsg( $this->getMessagePrefix() . '-legend' );
-               $form->addHeaderText(
-                       $this->msg( $this->getMessagePrefix() . '-text' )->parseAsBlock() );
+
+               $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.
@@ -1139,6 +1180,7 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage {
 }
 
 abstract class SpecialRedirectToSpecial extends RedirectSpecialPage {
+       // @todo FIXME: Visibility must be declared
        var $redirName, $redirSubpage;
 
        function __construct(
@@ -1215,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:
index a53b901..4d63553 100644 (file)
@@ -99,6 +99,7 @@ class SpecialPageFactory {
                'Listusers'                 => 'SpecialListUsers',
                'Listadmins'                => 'SpecialListAdmins',
                'Listbots'                  => 'SpecialListBots',
+               'Activeusers'               => 'SpecialActiveUsers',
                'Userrights'                => 'UserrightsPage',
                'EditWatchlist'             => 'SpecialEditWatchlist',
 
@@ -161,6 +162,7 @@ class SpecialPageFactory {
                'Mytalk'                    => 'SpecialMytalk',
                'Myuploads'                 => 'SpecialMyuploads',
                'PermanentLink'             => 'SpecialPermanentLink',
+               'Redirect'                  => 'SpecialRedirect',
                'Revisiondelete'            => 'SpecialRevisionDelete',
                'Specialpages'              => 'SpecialSpecialpages',
                'Userlogout'                => 'SpecialUserlogout',
@@ -199,7 +201,7 @@ class SpecialPageFactory {
                                self::$mList['ChangeEmail'] = 'SpecialChangeEmail';
                        }
 
-                       if( $wgEnableJavaScriptTest ) {
+                       if ( $wgEnableJavaScriptTest ) {
                                self::$mList['JavaScriptTest'] = 'SpecialJavaScriptTest';
                        }
 
@@ -285,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' );
@@ -300,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' );
@@ -463,7 +465,6 @@ 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 );
                                $context->getOutput()->redirect( $url );
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;
index 23a4e2b..374d5ca 100644 (file)
@@ -26,6 +26,7 @@
  *
  * @file
  * @ingroup StatCounter
+ * @author Aaron Schulz
  */
 
 /**
@@ -85,6 +86,10 @@ class StatCounter {
                $this->deltas = array();
        }
 
+       /**
+        * @param array $deltas
+        * @return void
+        */
        protected function sendDeltasUDP( array $deltas ) {
                global $wgUDPProfilerHost, $wgUDPProfilerPort, $wgAggregateStatsID;
 
@@ -128,6 +133,10 @@ class StatCounter {
                }
        }
 
+       /**
+        * @param array $deltas
+        * @return void
+        */
        protected function sendDeltasMemc( array $deltas ) {
                global $wgMemc;
 
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 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 5b26d45..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.
                }
 
index 7dbfabf..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 aa8fb93..56c2ed4 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;
@@ -689,7 +694,7 @@ class Title {
                        $this->mContentModel = ContentHandler::getDefaultModelFor( $this );
                }
 
-               if( !$this->mContentModel ) {
+               if ( !$this->mContentModel ) {
                        throw new MWException( 'Failed to determine content model!' );
                }
 
@@ -752,7 +757,7 @@ class Title {
         */
        public function getTalkNsText() {
                global $wgContLang;
-               return( $wgContLang->getNsText( MWNamespace::getTalk( $this->mNamespace ) ) );
+               return $wgContLang->getNsText( MWNamespace::getTalk( $this->mNamespace ) );
        }
 
        /**
@@ -761,7 +766,7 @@ class Title {
         * @return Bool TRUE or FALSE
         */
        public function canTalk() {
-               return( MWNamespace::canTalk( $this->mNamespace ) );
+               return MWNamespace::canTalk( $this->mNamespace );
        }
 
        /**
@@ -939,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;
@@ -997,8 +1002,9 @@ class Title {
                $subpage = explode( '/', $this->mTextform );
                $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 );
        }
 
@@ -1269,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];
        }
 
        /**
@@ -1312,7 +1318,7 @@ class Title {
        public function getSubpageUrlForm() {
                $text = $this->getSubpageText();
                $text = wfUrlencode( str_replace( ' ', '_', $text ) );
-               return( $text );
+               return $text;
        }
 
        /**
@@ -1340,7 +1346,7 @@ class Title {
         * @return String
         */
        private static function fixUrlQueryArgs( $query, $query2 = false ) {
-               if( $query2 !== false ) {
+               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" );
@@ -1733,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' ) ) ||
@@ -1881,12 +1891,19 @@ class Title {
                # Protect css/js subpages of user pages
                # XXX: this might be better using restrictions
                # XXX: right 'editusercssjs' is deprecated, for backward compatibility only
-               if ( $action != 'patrol' && !$user->isAllowed( 'editusercssjs' )
-                               && !preg_match( '/^' . preg_quote( $user->getName(), '/' ) . '\//', $this->mTextform ) ) {
-                       if ( $this->isCssSubpage() && !$user->isAllowed( 'editusercss' ) ) {
-                               $errors[] = array( 'customcssprotected' );
-                       } elseif ( $this->isJsSubpage() && !$user->isAllowed( 'edituserjs' ) ) {
-                               $errors[] = array( 'customjsprotected' );
+               if ( $action != 'patrol' && !$user->isAllowed( 'editusercssjs' ) ) {
+                       if ( preg_match( '/^' . preg_quote( $user->getName(), '/' ) . '\//', $this->mTextform ) ) {
+                               if ( $this->isCssSubpage() && !$user->isAllowedAny( 'editmyusercss', 'editusercss' ) ) {
+                                       $errors[] = array( 'mycustomcssprotected' );
+                               } elseif ( $this->isJsSubpage() && !$user->isAllowedAny( 'editmyuserjs', 'edituserjs' ) ) {
+                                       $errors[] = array( 'mycustomjsprotected' );
+                               }
+                       } else {
+                               if ( $this->isCssSubpage() && !$user->isAllowed( 'editusercss' ) ) {
+                                       $errors[] = array( 'customcssprotected' );
+                               } elseif ( $this->isJsSubpage() && !$user->isAllowed( 'edituserjs' ) ) {
+                                       $errors[] = array( 'customjsprotected' );
+                               }
                        }
                }
 
@@ -1954,8 +1971,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 );
                                        }
                                }
@@ -1986,11 +2004,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'] );
@@ -2035,11 +2053,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' );
@@ -2048,39 +2066,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;
@@ -2166,7 +2154,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 ) {
@@ -2251,7 +2239,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 );
@@ -2261,36 +2249,6 @@ class Title {
                return $errors;
        }
 
-       /**
-        * Protect css subpages of user pages: can $wgUser edit
-        * this page?
-        *
-        * @deprecated in 1.19; will be removed in 1.20. Use getUserPermissionsErrors() instead.
-        * @return Bool
-        */
-       public function userCanEditCssSubpage() {
-               global $wgUser;
-               wfDeprecated( __METHOD__, '1.19' );
-               return ( ( $wgUser->isAllowedAll( 'editusercssjs', 'editusercss' ) )
-                       || preg_match( '/^' . preg_quote( $wgUser->getName(), '/' ) . '\//', $this->mTextform ) );
-       }
-
-       /**
-        * Protect js subpages of user pages: can $wgUser edit
-        * this page?
-        *
-        * @deprecated in 1.19; will be removed in 1.20. Use getUserPermissionsErrors() instead.
-        * @return Bool
-        */
-       public function userCanEditJsSubpage() {
-               global $wgUser;
-               wfDeprecated( __METHOD__, '1.19' );
-               return (
-                       ( $wgUser->isAllowedAll( 'editusercssjs', 'edituserjs' ) )
-                       || preg_match( '/^' . preg_quote( $wgUser->getName(), '/' ) . '\//', $this->mTextform )
-               );
-       }
-
        /**
         * Get a filtered list of all restriction types supported by this wiki.
         * @param bool $exists True to get all restriction types that apply to
@@ -2372,7 +2330,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
@@ -2446,7 +2404,7 @@ class Title {
                $restrictionTypes = $this->getRestrictionTypes();
 
                # Special pages have inherent protection
-               if( $this->isSpecialPage() ) {
+               if ( $this->isSpecialPage() ) {
                        return true;
                }
 
@@ -2693,7 +2651,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 );
                                        }
                                }
@@ -2712,8 +2670,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
@@ -2799,18 +2758,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
+                       );
+               } );
        }
 
        /**
@@ -2961,11 +2922,13 @@ class Title {
                $linkCache = LinkCache::singleton();
                $cached = $linkCache->getGoodLinkFieldObj( $this, 'redirect' );
                if ( $cached === null ) {
-                       // 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() );
+                       # Trust LinkCache's state over our own
+                       # LinkCache is telling us that the page doesn't exist, despite there being cached
+                       # data relating to an existing page in $this->mArticleID. Updaters should clear
+                       # LinkCache as appropriate, or use $flags = Title::GAID_FOR_UPDATE. If that flag is
+                       # set, then LinkCache will definitely be up to date here, since getArticleID() forces
+                       # LinkCache to refresh its data from the master.
+                       return $this->mRedirect = false;
                }
 
                $this->mRedirect = (bool)$cached;
@@ -2990,11 +2953,9 @@ class Title {
                }
                $linkCache = LinkCache::singleton();
                $cached = $linkCache->getGoodLinkFieldObj( $this, 'length' );
-               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() );
+               if ( $cached === null ) {
+                       # Trust LinkCache's state over our own, as for isRedirect()
+                       return $this->mLength = 0;
                }
 
                $this->mLength = intval( $cached );
@@ -3006,7 +2967,6 @@ class Title {
         * What is the page_latest field for this page?
         *
         * @param int $flags a bit field; may be Title::GAID_FOR_UPDATE to select for update
-        * @throws MWException
         * @return Int or 0 if the page doesn't exist
         */
        public function getLatestRevID( $flags = 0 ) {
@@ -3020,10 +2980,9 @@ class Title {
                $linkCache = LinkCache::singleton();
                $linkCache->addLinkObj( $this );
                $cached = $linkCache->getGoodLinkFieldObj( $this, 'revision' );
-               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() );
+               if ( $cached === null ) {
+                       # Trust LinkCache's state over our own, as for isRedirect()
+                       return $this->mLatestID = 0;
                }
 
                $this->mLatestID = intval( $cached );
@@ -3302,7 +3261,7 @@ class Title {
                        array(
                                "{$prefix}_from=page_id",
                                "{$prefix}_namespace" => $this->getNamespace(),
-                               "{$prefix}_title"     => $this->getDBkey() ),
+                               "{$prefix}_title" => $this->getDBkey() ),
                        __METHOD__,
                        $options
                );
@@ -3367,7 +3326,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' ),
@@ -3466,6 +3427,7 @@ class Title {
                        }
                }
 
+               wfRunHooks( 'TitleSquidURLs', array( $this, &$urls ) );
                return $urls;
        }
 
@@ -3712,12 +3674,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__,
@@ -3831,7 +3793,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__
@@ -3861,10 +3823,10 @@ class Title {
                        $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 );
 
@@ -3966,7 +3928,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,
@@ -4020,7 +3984,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();
@@ -4322,7 +4286,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;
                        }
@@ -4417,7 +4381,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
@@ -4503,34 +4467,23 @@ class Title {
         * @return Bool true if the update succeeded
         */
        public function invalidateCache() {
-               global $wgMemc;
-
                if ( wfReadOnly() ) {
                        return false;
                }
 
+               $method = __METHOD__;
                $dbw = wfGetDB( DB_MASTER );
                $conds = $this->pageCond();
-               $dbw->onTransactionIdle( function() use ( $dbw, $conds ) {
+               $dbw->onTransactionIdle( function() use ( $dbw, $conds, $method ) {
                        $dbw->update(
                                'page',
                                array( 'page_touched' => $dbw->timestamp() ),
                                $conds,
-                               __METHOD__
+                               $method
                        );
                } );
-               HTMLFileCache::clearFileCache( $this );
 
-               // Clear page info.
-               $revision = WikiPage::factory( $this )->getRevision();
-               if ( $revision !== null ) {
-                       $memcKey = wfMemcKey( 'infoaction', $this->getPrefixedText(), $revision->getId() );
-                       $success = $wgMemc->delete( $memcKey );
-               } else {
-                       $success = true;
-               }
-
-               return $success;
+               return true;
        }
 
        /**
@@ -4578,7 +4531,7 @@ class Title {
                if ( array_key_exists( $uid, $this->mNotificationTimestamp ) ) {
                        return $this->mNotificationTimestamp[$uid];
                }
-               if ( !$uid || !$wgShowUpdatedMarker ) {
+               if ( !$uid || !$wgShowUpdatedMarker || !$user->isAllowed( 'viewmywatchlist' ) ) {
                        return $this->mNotificationTimestamp[$uid] = false;
                }
                // Don't cache too much!
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 5b7cbf2..685fe96 100644 (file)
@@ -124,6 +124,9 @@ class User {
                'edit',
                'editinterface',
                'editprotected',
+               'editmyusercss',
+               'editmyuserjs',
+               'editmywatchlist',
                'editusercssjs', #deprecated
                'editusercss',
                'edituserjs',
@@ -164,6 +167,7 @@ class User {
                'upload_by_url',
                'userrights',
                'userrights-interwiki',
+               'viewmywatchlist',
                'writeapi',
        );
        /**
@@ -251,7 +255,7 @@ class User {
        }
 
        /**
-        * @return String
+        * @return string
         */
        function __toString() {
                return $this->getName();
@@ -266,7 +270,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 +280,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 +290,7 @@ class User {
                                $this->loadFromId();
                                break;
                        case 'session':
-                               if( !$this->loadFromSession() ) {
+                               if ( !$this->loadFromSession() ) {
                                        // Loading from session failed. Load defaults.
                                        $this->loadDefaults();
                                }
@@ -301,7 +305,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 +314,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 +374,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 +391,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 +422,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 +430,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 +441,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 +476,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 +486,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 +495,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 +546,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 +561,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 +580,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 +598,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 +615,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 +653,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 +661,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 +683,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,11 +706,12 @@ 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';
@@ -719,7 +724,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
@@ -730,7 +735,7 @@ class User {
         * Does a string look like an e-mail address?
         *
         * This validates an email address using an HTML5 specification found at:
-        * http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#valid-e-mail-address
+        * http://www.whatwg.org/html/states-of-the-type-attribute.html#valid-e-mail-address
         * Which as of 2011-01-24 says:
         *
         *     A valid e-mail address is a string that matches the ABNF production
@@ -750,7 +755,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 +767,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 +777,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 +828,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 +841,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 +876,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 +904,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 +914,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,7 +924,7 @@ 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() {
                $result = null;
@@ -934,7 +940,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;
@@ -957,13 +963,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;
                }
 
@@ -977,7 +983,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;
                }
 
@@ -987,7 +993,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;
                }
@@ -997,14 +1003,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;
                }
@@ -1015,13 +1021,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;
@@ -1184,7 +1190,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.
         */
@@ -1225,11 +1231,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;
 
@@ -1242,11 +1247,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;
@@ -1268,7 +1273,7 @@ class User {
                }
 
                wfProfileIn( __METHOD__ );
-               wfDebug( __METHOD__.": checking...\n" );
+               wfDebug( __METHOD__ . ": checking...\n" );
 
                // Initialize data...
                // Otherwise something ends up stomping on $this->mBlockedby when
@@ -1286,14 +1291,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() );
@@ -1307,7 +1312,7 @@ class User {
                        }
                }
 
-               # (bug 23343) Apply IP blocks to the contents of XFF headers, if enabled
+               // (bug 23343) Apply IP blocks to the contents of XFF headers, if enabled
                if ( !$block instanceof Block
                        && $wgApplyIpBlocksToXff
                        && $ip !== null
@@ -1350,17 +1355,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 );
@@ -1371,23 +1378,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]}";
@@ -1396,10 +1403,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;
@@ -1429,7 +1436,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 ) );
                }
 
@@ -1438,7 +1445,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;
@@ -1450,11 +1457,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.
@@ -1471,23 +1478,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__ );
@@ -1495,27 +1503,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
@@ -1529,20 +1547,21 @@ class User {
                }
                // Set the user limit key
                if ( $userLimit !== false ) {
-                       wfDebug( __METHOD__ . ": effective user limit: $userLimit\n" );
+                       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();
@@ -1566,7 +1585,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' );
@@ -1586,9 +1605,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;
@@ -1596,7 +1615,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;
@@ -1611,7 +1630,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();
@@ -1620,7 +1639,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();
@@ -1629,7 +1648,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();
@@ -1642,16 +1661,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;
@@ -1663,10 +1682,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;
@@ -1678,14 +1697,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();
@@ -1695,14 +1714,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();
                }
@@ -1720,16 +1738,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;
@@ -1756,7 +1774,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() );
@@ -1764,27 +1782,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
@@ -1802,14 +1820,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();
@@ -1823,14 +1844,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 ) {
@@ -1846,9 +1889,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
@@ -1872,8 +1915,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 );
@@ -1895,14 +1938,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 {
@@ -1911,13 +1954,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 );
@@ -1931,7 +1974,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;
@@ -1947,7 +1990,7 @@ class User {
         */
        private function clearSharedCache() {
                $this->load();
-               if( $this->mId ) {
+               if ( $this->mId ) {
                        global $wgMemc;
                        $wgMemc->delete( wfMemcKey( 'user', 'id', $this->mId ) );
                }
@@ -1969,7 +2012,8 @@ class User {
                        $dbw = wfGetDB( DB_MASTER );
                        $userid = $this->mId;
                        $touched = $this->mTouched;
-                       $dbw->onTransactionIdle( function() use ( $dbw, $userid, $touched ) {
+                       $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',
@@ -1978,7 +2022,7 @@ class User {
                                        $dbw->update( 'user',
                                                array( 'user_touched' => $dbw->timestamp( $touched ) ),
                                                array( 'user_id' => $userid, 'user_touched < ' . $encTouched ),
-                                               __METHOD__
+                                               $method
                                        );
                                }
                        } );
@@ -1989,7 +2033,6 @@ class User {
        /**
         * Validate the cache for this account.
         * @param string $timestamp A timestamp in TS_MW format
-        *
         * @return bool
         */
        public function validateCache( $timestamp ) {
@@ -1999,7 +2042,7 @@ class User {
 
        /**
         * Get the user touched timestamp
-        * @return String timestamp
+        * @return string timestamp
         */
        public function getTouched() {
                $this->load();
@@ -2025,12 +2068,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 ) ) {
@@ -2044,7 +2087,7 @@ class User {
                        }
                }
 
-               if( !$wgAuth->setPassword( $this, $str ) ) {
+               if ( !$wgAuth->setPassword( $this, $str ) ) {
                        throw new PasswordError( wfMessage( 'externaldberror' )->text() );
                }
 
@@ -2057,14 +2100,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 {
@@ -2077,7 +2120,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();
@@ -2119,7 +2162,7 @@ class User {
        /**
         * Has password reminder email been sent within the last
         * $wgPasswordReminderResendTime hours?
-        * @return Bool
+        * @return bool
         */
        public function isPasswordReminderThrottled() {
                global $wgPasswordReminderResendTime;
@@ -2133,7 +2176,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();
@@ -2143,7 +2186,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();
@@ -2157,7 +2200,7 @@ class User {
         */
        public function setEmail( $str ) {
                $this->load();
-               if( $str == $this->mEmail ) {
+               if ( $str == $this->mEmail ) {
                        return;
                }
                $this->mEmail = $str;
@@ -2187,11 +2230,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 {
@@ -2203,7 +2246,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' ) ) {
@@ -2227,8 +2270,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()
         */
@@ -2241,7 +2284,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 );
                }
 
@@ -2267,9 +2310,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;
                        }
                }
@@ -2281,7 +2324,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 ) {
@@ -2293,12 +2336,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 );
@@ -2308,13 +2351,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 );
                }
 
@@ -2410,9 +2453,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';
@@ -2432,11 +2475,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' ),
@@ -2479,7 +2522,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
@@ -2504,8 +2547,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;
@@ -2550,7 +2593,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 ) );
@@ -2579,8 +2622,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__ );
@@ -2598,14 +2641,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;
                        }
                }
@@ -2614,7 +2657,7 @@ class User {
 
        /**
         * Get the user's edit count.
-        * @return Int
+        * @return int
         */
        public function getEditCount() {
                if ( !$this->getId() ) {
@@ -2632,7 +2675,7 @@ class User {
                                __METHOD__
                        );
 
-                       if( $count === null ) {
+                       if ( $count === null ) {
                                // it has not been initialized. do so.
                                $count = $this->initEditCount();
                        }
@@ -2648,9 +2691,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(),
@@ -2662,6 +2705,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();
@@ -2674,7 +2720,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(
@@ -2699,7 +2745,7 @@ class User {
 
        /**
         * Get whether the user is logged in
-        * @return Bool
+        * @return bool
         */
        public function isLoggedIn() {
                return $this->getID() != 0;
@@ -2707,7 +2753,7 @@ class User {
 
        /**
         * Get whether the user is anonymous
-        * @return Bool
+        * @return bool
         */
        public function isAnon() {
                return !$this->isLoggedIn();
@@ -2717,14 +2763,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;
                        }
                }
@@ -2738,8 +2784,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;
                        }
                }
@@ -2748,27 +2794,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;
@@ -2777,11 +2824,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' ) )
+               );
        }
 
        /**
@@ -2812,11 +2862,14 @@ class User {
        /**
         * Get a WatchedItem for this user and $title.
         *
+        * @since 1.22 $checkRights parameter added
         * @param $title Title
+        * @param $checkRights int Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
+        *     Pass WatchedItem::CHECK_USER_RIGHTS or WatchedItem::IGNORE_USER_RIGHTS.
         * @return WatchedItem
         */
-       public function getWatchedItem( $title ) {
-               $key = $title->getNamespace() . ':' . $title->getDBkey();
+       public function getWatchedItem( $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
+               $key = $checkRights . ':' . $title->getNamespace() . ':' . $title->getDBkey();
 
                if ( isset( $this->mWatchedItems[$key] ) ) {
                        return $this->mWatchedItems[$key];
@@ -2826,34 +2879,43 @@ class User {
                        $this->mWatchedItems = array();
                }
 
-               $this->mWatchedItems[$key] = WatchedItem::fromUserTitle( $this, $title );
+               $this->mWatchedItems[$key] = WatchedItem::fromUserTitle( $this, $title, $checkRights );
                return $this->mWatchedItems[$key];
        }
 
        /**
         * Check the watched status of an article.
+        * @since 1.22 $checkRights parameter added
         * @param $title Title of the article to look at
-        * @return Bool
+        * @param $checkRights int Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
+        *     Pass WatchedItem::CHECK_USER_RIGHTS or WatchedItem::IGNORE_USER_RIGHTS.
+        * @return bool
         */
-       public function isWatched( $title ) {
-               return $this->getWatchedItem( $title )->isWatched();
+       public function isWatched( $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
+               return $this->getWatchedItem( $title, $checkRights )->isWatched();
        }
 
        /**
         * Watch an article.
+        * @since 1.22 $checkRights parameter added
         * @param $title Title of the article to look at
+        * @param $checkRights int Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
+        *     Pass WatchedItem::CHECK_USER_RIGHTS or WatchedItem::IGNORE_USER_RIGHTS.
         */
-       public function addWatch( $title ) {
-               $this->getWatchedItem( $title )->addWatch();
+       public function addWatch( $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
+               $this->getWatchedItem( $title, $checkRights )->addWatch();
                $this->invalidateCache();
        }
 
        /**
         * Stop watching an article.
+        * @since 1.22 $checkRights parameter added
         * @param $title Title of the article to look at
+        * @param $checkRights int Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
+        *     Pass WatchedItem::CHECK_USER_RIGHTS or WatchedItem::IGNORE_USER_RIGHTS.
         */
-       public function removeWatch( $title ) {
-               $this->getWatchedItem( $title )->removeWatch();
+       public function removeWatch( $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
+               $this->getWatchedItem( $title, $checkRights )->removeWatch();
                $this->invalidateCache();
        }
 
@@ -2861,28 +2923,35 @@ class User {
         * Clear the user's notification timestamp for the given title.
         * If e-notif e-mails are on, they will receive notification mails on
         * the next change of the page if it's watched etc.
+        * @note If the user doesn't have 'editmywatchlist', this will do nothing.
         * @param $title Title of the article to look at
         */
        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;
+               }
+
+               // Do nothing if not allowed to edit the watchlist
+               if ( !$this->isAllowed( 'editmywatchlist' ) ) {
                        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;
                }
@@ -2905,19 +2974,25 @@ class User {
         * Resets all of the given user's page-change notification timestamps.
         * If e-notif e-mails are on, they will receive notification mails on
         * the next change of any watched page.
+        * @note If the user doesn't have 'editmywatchlist', this will do nothing.
         */
        public function clearAllNotifications() {
                if ( wfReadOnly() ) {
                        return;
                }
 
+               // Do nothing if not allowed to edit the watchlist
+               if ( !$this->isAllowed( 'editmywatchlist' ) ) {
+                       return;
+               }
+
                global $wgUseEnotif, $wgShowUpdatedMarker;
                if ( !$wgUseEnotif && !$wgShowUpdatedMarker ) {
                        $this->setNewtalk( false );
                        return;
                }
                $id = $this->getId();
-               if( $id != 0 ) {
+               if ( $id != 0 ) {
                        $dbw = wfGetDB( DB_MASTER );
                        $dbw->update( 'watchlist',
                                array( /* SET */
@@ -2939,8 +3014,9 @@ class User {
         */
        private function decodeOptions( $str ) {
                wfDeprecated( __METHOD__, '1.19' );
-               if( !$str )
+               if ( !$str ) {
                        return;
+               }
 
                $this->mOptionsLoaded = true;
                $this->mOptionOverrides = array();
@@ -2965,7 +3041,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
@@ -3048,7 +3124,7 @@ class User {
         * Log this user out.
         */
        public function logout() {
-               if( wfRunHooks( 'UserLogout', array( &$this ) ) ) {
+               if ( wfRunHooks( 'UserLogout', array( &$this ) ) ) {
                        $this->doLogout();
                }
        }
@@ -3066,7 +3142,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 );
        }
 
@@ -3078,8 +3154,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() ) {
@@ -3114,11 +3194,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__ );
@@ -3216,6 +3298,7 @@ class User {
                $this->mTouched = self::newTouchedTimestamp();
 
                $dbw = wfGetDB( DB_MASTER );
+               $inWrite = $dbw->writesOrCallbacksPending();
                $seqVal = $dbw->nextSequenceValue( 'user_user_id_seq' );
                $dbw->insert( 'user',
                        array(
@@ -3235,6 +3318,12 @@ class User {
                        array( 'IGNORE' )
                );
                if ( !$dbw->affectedRows() ) {
+                       if ( !$inWrite ) {
+                               // XXX: Get out of REPEATABLE-READ so the SELECT below works.
+                               // Often this case happens early in views before any writes.
+                               // This shows up at least with CentralAuth.
+                               $dbw->commit( __METHOD__, 'flush' );
+                       }
                        $this->mId = $dbw->selectField( 'user', 'user_id',
                                array( 'user_name' => $this->mName ), __METHOD__ );
                        $loaded = false;
@@ -3244,8 +3333,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' );
                }
@@ -3302,13 +3391,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;
                }
 
@@ -3342,11 +3431,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;
                }
 
@@ -3363,7 +3452,7 @@ class User {
 
        /**
         * Get whether the user is blocked from using Special:Emailuser.
-        * @return Bool
+        * @return bool
         */
        public function isBlockedFromEmailuser() {
                $this->getBlockedStatus();
@@ -3372,7 +3461,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();
@@ -3400,7 +3489,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' );
@@ -3409,7 +3498,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;
@@ -3420,24 +3509,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 ) )
@@ -3454,13 +3543,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;
                        }
@@ -3477,7 +3566,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' );
@@ -3494,7 +3583,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 ) {
@@ -3509,7 +3598,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;
@@ -3519,8 +3608,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 );
@@ -3534,8 +3623,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 );
@@ -3551,8 +3640,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 );
@@ -3604,7 +3693,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 {
@@ -3623,9 +3712,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;
@@ -3641,18 +3730,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 );
        }
 
@@ -3668,7 +3757,7 @@ 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:'
@@ -3722,11 +3811,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();
@@ -3737,7 +3826,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' );
@@ -3751,20 +3840,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;
@@ -3775,7 +3864,7 @@ class User {
 
        /**
         * Check whether there is an outstanding request for e-mail confirmation.
-        * @return Bool
+        * @return bool
         */
        public function isEmailConfirmationPending() {
                global $wgEmailAuthentication;
@@ -3788,9 +3877,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() ) {
@@ -3803,11 +3892,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 );
@@ -3816,7 +3905,7 @@ class User {
                        __METHOD__,
                        array( 'ORDER BY' => 'rev_timestamp ASC' )
                );
-               if( !$time ) {
+               if ( !$time ) {
                        return false; // no edits
                }
                return wfTimestamp( TS_MW, $time );
@@ -3832,16 +3921,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] ) ) );
                        }
@@ -3884,7 +3973,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" );
@@ -3896,7 +3985,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 );
@@ -3949,14 +4038,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;
        }
@@ -3967,14 +4057,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;
@@ -3987,14 +4077,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 {
@@ -4015,53 +4105,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];
                }
 
@@ -4076,7 +4166,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")
@@ -4099,7 +4189,7 @@ class User {
                );
                $addergroups = $this->getEffectiveGroups();
 
-               foreach( $addergroups as $addergroup ) {
+               foreach ( $addergroups as $addergroup ) {
                        $groups = array_merge_recursive(
                                $groups, $this->changeableByGroup( $addergroup )
                        );
@@ -4116,7 +4206,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',
@@ -4126,10 +4216,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.
@@ -4150,7 +4240,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
@@ -4179,7 +4269,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";
@@ -4192,7 +4282,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;
@@ -4208,19 +4298,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 );
                        }
@@ -4238,25 +4327,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;
                }
        }
@@ -4272,6 +4361,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
@@ -4283,7 +4373,7 @@ class User {
         */
        public function addNewUserLogEntry( $action = false, $reason = '' ) {
                global $wgUser, $wgNewUserLog;
-               if( empty( $wgNewUserLog ) ) {
+               if ( empty( $wgNewUserLog ) ) {
                        return true; // disabled
                }
 
@@ -4363,11 +4453,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 );
@@ -4407,14 +4497,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;
                }
 
                $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 ) ) ) ||
@@ -4428,8 +4518,18 @@ class User {
                }
 
                $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' ) );
        }
 
        /**
@@ -4453,8 +4553,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;
@@ -4514,4 +4613,26 @@ class User {
                        'user_editcount',
                );
        }
+
+       /**
+        * Factory function for fatal permission-denied errors
+        *
+        * @since 1.22
+        * @param string $permission User right required
+        * @return Status
+        */
+       static function newFatalPermissionDeniedStatus( $permission ) {
+               global $wgLang;
+
+               $groups = array_map(
+                       array( 'User', 'makeGroupLinkWiki' ),
+                       User::getGroupsWithPermission( $permission )
+               );
+
+               if ( $groups ) {
+                       return Status::newFatal( 'badaccess-groups', $wgLang->commaList( $groups ), count( $groups ) );
+               } else {
+                       return Status::newFatal( 'badaccess-group0' );
+               }
+       }
 }
index 2eb8429..8e3f048 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 );
@@ -258,9 +258,11 @@ class UserMailer {
                        wfDebug( "Assembling multipart mime email\n" );
                        if ( !stream_resolve_include_path( 'Mail/mime.php' ) ) {
                                wfDebug( "PEAR Mail_Mime package is not installed. Falling back to text email.\n" );
+                               // remove the html body for text email fall back
+                               $body = $body['text'];
                        }
                        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 +302,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 +340,7 @@ class UserMailer {
                        #
                        # PHP mail()
                        #
-                       if( count( $to ) > 1 ) {
+                       if ( count( $to ) > 1 ) {
                                $headers['To'] = 'undisclosed-recipients:;';
                        }
                        $headers = self::arrayToHeaderString( $headers, $endl );
@@ -409,7 +411,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 +419,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?";
@@ -668,11 +670,13 @@ class EmailNotification {
                        } elseif ( $targetUser->getOption( 'enotifusertalkpages' ) &&
                                ( !$minorEdit || $targetUser->getOption( 'enotifminoredits' ) ) )
                        {
-                               if ( $targetUser->isEmailConfirmed() ) {
+                               if ( !$targetUser->isEmailConfirmed() ) {
+                                       wfDebug( __METHOD__ . ": talk page owner doesn't have validated email\n" );
+                               } elseif ( !wfRunHooks( 'AbortTalkPageEmailNotification', array( $targetUser, $title ) ) ) {
+                                       wfDebug( __METHOD__ . ": talk page update notification is aborted for this user\n" );
+                               } else {
                                        wfDebug( __METHOD__ . ": sending talk page update notification\n" );
                                        return true;
-                               } else {
-                                       wfDebug( __METHOD__ . ": talk page owner doesn't have validated email\n" );
                                }
                        } else {
                                wfDebug( __METHOD__ . ": talk page owner doesn't want notifications\n" );
@@ -703,14 +707,14 @@ class EmailNotification {
                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;
@@ -791,8 +795,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..1e07e7c 100644 (file)
  * @ingroup Watchlist
  */
 class WatchedItem {
-       var $mTitle, $mUser;
+       /**
+        * Constant to specify that user rights 'editmywatchlist' and
+        * 'viewmywatchlist' should not be checked.
+        * @since 1.22
+        */
+       const IGNORE_USER_RIGHTS = 0;
+
+       /**
+        * Constant to specify that user rights 'editmywatchlist' and
+        * 'viewmywatchlist' should be checked.
+        * @since 1.22
+        */
+       const CHECK_USER_RIGHTS = 1;
+
+       var $mTitle, $mUser, $mCheckRights;
        private $loaded = false, $watched, $timestamp;
 
        /**
         * Create a WatchedItem object with the given user and title
+        * @since 1.22 $checkRights parameter added
         * @param $user User: the user to use for (un)watching
         * @param $title Title: the title we're going to (un)watch
+        * @param $checkRights int: Whether to check the 'viewmywatchlist' and 'editmywatchlist' rights.
+        *     Pass either WatchedItem::IGNORE_USER_RIGHTS or WatchedItem::CHECK_USER_RIGHTS.
         * @return WatchedItem object
         */
-       public static function fromUserTitle( $user, $title ) {
+       public static function fromUserTitle( $user, $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
                $wl = new WatchedItem;
                $wl->mUser = $user;
                $wl->mTitle = $title;
+               $wl->mCheckRights = $checkRights;
 
                return $wl;
        }
@@ -89,6 +107,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.
 
@@ -104,11 +128,23 @@ class WatchedItem {
                }
        }
 
+       /**
+        * Check permissions
+        * @param $what string: 'viewmywatchlist' or 'editmywatchlist'
+        */
+       private function isAllowed( $what ) {
+               return !$this->mCheckRights || $this->mUser->isAllowed( $what );
+       }
+
        /**
         * Is mTitle being watched by mUser?
         * @return bool
         */
        public function isWatched() {
+               if ( !$this->isAllowed( 'viewmywatchlist' ) ) {
+                       return false;
+               }
+
                $this->load();
                return $this->watched;
        }
@@ -120,6 +156,10 @@ class WatchedItem {
         *         the wl_notificationtimestamp field otherwise
         */
        public function getNotificationTimestamp() {
+               if ( !$this->isAllowed( 'viewmywatchlist' ) ) {
+                       return false;
+               }
+
                $this->load();
                if ( $this->watched ) {
                        return $this->timestamp;
@@ -135,6 +175,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() || !$this->isAllowed( 'editmywatchlist' ) ) {
+                       return;
+               }
+
                if ( $force != 'force' ) {
                        $this->load();
                        if ( !$this->watched || $this->timestamp === null ) {
@@ -153,11 +198,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() || !$this->isAllowed( 'editmywatchlist' ) ) {
+                       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 +243,12 @@ class WatchedItem {
        public function removeWatch() {
                wfProfileIn( __METHOD__ );
 
+               // Only loggedin user can have a watchlist
+               if ( wfReadOnly() || $this->mUser->isAnon() || !$this->isAllowed( 'editmywatchlist' ) ) {
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+
                $success = false;
                $dbw = wfGetDB( DB_MASTER );
                $dbw->delete( 'watchlist',
@@ -268,7 +325,7 @@ class WatchedItem {
                        );
                }
 
-               if( empty( $values ) ) {
+               if ( empty( $values ) ) {
                        // Nothing to do
                        return true;
                }
index 3bdf645..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;
@@ -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,11 +650,11 @@ 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] == '/' ) {
+               if ( $base[0] == '/' ) {
                        // More than one slash will look like it is protocol relative
                        return preg_replace( '!^/+!', '/', $base );
                } else {
@@ -739,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;
                }
 
@@ -893,7 +892,7 @@ class WebRequest {
         * @return Mixed
         */
        public function getSessionData( $key ) {
-               if( !isset( $_SESSION[$key] ) ) {
+               if ( !isset( $_SESSION[$key] ) ) {
                        return null;
                }
                return $_SESSION[$key];
@@ -1099,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;
                        }
                }
 
@@ -1268,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;
                }
        }
@@ -1339,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;
        }
 
@@ -1351,6 +1353,7 @@ class FauxRequest extends WebRequest {
         * @param $val string
         */
        public function setHeader( $name, $val ) {
+               $name = strtoupper( $name );
                $this->headers[$name] = $val;
        }
 
@@ -1359,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..901b1e8 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,59 @@ 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" );
+# Load composer's autoloader if present
+if ( is_readable( "$IP/vendor/autoload.php" ) ) {
+       require_once "$IP/vendor/autoload.php";
+}
 
-       # Start the autoloader, so that extensions can derive classes from core files
-       require_once( "$IP/includes/AutoLoader.php" );
+# Get MWInit class
+require_once "$IP/includes/Init.php";
 
-       # Load the profiler
-       require_once( "$IP/includes/profiler/Profiler.php" );
+# Start the autoloader, so that extensions can derive classes from core files
+require_once "$IP/includes/AutoLoader.php";
 
-       # Load up some global defines.
-       require_once( "$IP/includes/Defines.php" );
-}
+# Load the profiler
+require_once "$IP/includes/profiler/Profiler.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 );
-}
-
-if ( $wgEnableSelenium ) {
-       require_once( MWInit::compiledPath( "includes/SeleniumWebSettings.php" ) );
+       require_once MW_CONFIG_FILE;
 }
 
 wfProfileOut( 'WebStart.php-conf' );
@@ -150,13 +147,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..cb0f60a 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,43 @@ 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";
-                               }
-                               wfDebugLog( 'jobqueue', $output );
+               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 {
+                       try {
+                               // 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 );
+                                       }
+                               } while ( --$n && $job );
+                       } catch ( MWException $e ) {
+                               // We don't want exceptions thrown during job execution to
+                               // be reported to the user since the output is already sent.
+                               // Instead we just log them.
+                               wfDebugLog( 'exception', $e->getLogMessage() );
                        }
-               } 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 a1dbbfc..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;
                }
index c016b18..398a424 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,7 +1157,7 @@ class WikiPage implements Page, IDBAccessObject {
        public function doPurge() {
                global $wgUseSquid;
 
-               if( !wfRunHooks( 'ArticlePurge', array( &$this ) ) ) {
+               if ( !wfRunHooks( 'ArticlePurge', array( &$this ) ) ) {
                        return false;
                }
 
@@ -1173,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.
@@ -1182,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;
                        }
@@ -1455,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();
@@ -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 );
                }
 
@@ -1950,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();
                }
 
@@ -2047,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 );
@@ -2074,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,8 +2109,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
+               DeferredUpdates::addUpdate( new SearchUpdate( $id, $title, $content ) );
 
                // If this is another user's talk page, update newtalk.
                // Don't do this if $options['changed'] = false (null-edits) nor if
@@ -2121,17 +2119,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" );
+                                       }
                                }
                        }
                }
@@ -2139,12 +2140,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 );
@@ -2217,7 +2220,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() );
@@ -2340,12 +2343,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;
                        }
 
@@ -2434,6 +2442,7 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                $this->mTitle->flushRestrictions();
+               InfoAction::invalidateCache( $this->mTitle );
 
                if ( $logAction == 'unprotect' ) {
                        $logParams = array();
@@ -2638,7 +2647,7 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Do some database updates after deletion
         *
-        * @param int $id page_id value of the page being deleted (B/C, currently unused)
+        * @param int $id page_id value of the page being deleted
         * @param $content Content: optional page content to be used when determining the required updates.
         *        This may be needed because $this->getContent() may already return null when the page proper was deleted.
         */
@@ -2655,6 +2664,9 @@ class WikiPage implements Page, IDBAccessObject {
 
                // Reset this object and the Title object
                $this->loadFromRow( false, self::READ_LATEST );
+
+               // Search engine
+               DeferredUpdates::addUpdate( new SearchUpdate( $id, $this->mTitle ) );
        }
 
        /**
@@ -2664,7 +2676,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.
@@ -2808,7 +2820,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 );
@@ -2849,8 +2861,8 @@ class WikiPage implements Page, IDBAccessObject {
                $resultDetails = array(
                        'summary' => $summary,
                        'current' => $current,
-                       'target'  => $target,
-                       'newid'   => $revId
+                       'target' => $target,
+                       'newid' => $revId
                );
 
                return array();
@@ -2904,6 +2916,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                // File cache
                HTMLFileCache::clearFileCache( $title );
+               InfoAction::invalidateCache( $title );
 
                // Messages
                if ( $title->getNamespace() == NS_MEDIAWIKI ) {
@@ -2932,7 +2945,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
@@ -2946,6 +2959,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                // Clear file cache for this page only
                HTMLFileCache::clearFileCache( $title );
+               InfoAction::invalidateCache( $title );
        }
 
        /**#@-*/
@@ -3019,69 +3033,65 @@ 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;
-               }
-
-               $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' );
+               // 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();
+
+                               $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 ( count( $added ) ) {
+                                       $insertRows = array();
+                                       foreach ( $added as $cat ) {
+                                               $insertRows[] = array(
+                                                       'cat_title'   => $cat,
+                                                       'cat_pages'   => 1,
+                                                       'cat_subcats' => ( $ns == NS_CATEGORY ) ? 1 : 0,
+                                                       'cat_files'   => ( $ns == NS_FILE ) ? 1 : 0,
+                                               );
+                                       }
+                                       $dbw->upsert(
+                                               'category',
+                                               $insertRows,
+                                               array( 'cat_title' ),
+                                               $addFields,
+                                               $method
+                                       );
+                               }
 
-               if ( $added ) {
-                       $dbw->update(
-                               'category',
-                               $addFields,
-                               array( 'cat_title' => $added ),
-                               __METHOD__
-                       );
-               }
+                               if ( count( $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, $that ) );
+                               }
 
-               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 ( $deleted as $catName ) {
+                                       $cat = Category::newFromName( $catName );
+                                       wfRunHooks( 'CategoryAfterPageRemoved', array( $cat, $that ) );
+                               }
+                       }
+               );
        }
 
        /**
@@ -3387,7 +3397,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 7cecf3a..d5501fe 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;
        }
@@ -466,12 +471,12 @@ class Xml {
         * @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,7 +493,7 @@ 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' );
@@ -500,7 +505,9 @@ class Xml {
                                } 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 ) == '**' ) {
@@ -509,26 +516,30 @@ class Xml {
                                        $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;
                }
 
@@ -679,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 );
@@ -728,26 +739,32 @@ 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.
+        * @param array $submitAttribs The attributes to add to the submit button
         * @return string HTML form.
         */
-       public static function buildForm( $fields, $submitLabel = null ) {
+       public static function buildForm( $fields, $submitLabel = null, $submitAttribs = array() ) {
                $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' );
+                       $form .= Xml::openElement( 'td', array( 'class' => 'mw-submit' ) ) . Xml::submitButton( wfMessage( $submitLabel )->text(), $submitAttribs ) . Xml::closeElement( 'td' );
                        $form .= Xml::closeElement( 'tr' );
                }
 
@@ -769,7 +786,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 ) ) {
@@ -781,7 +798,7 @@ class Xml {
                        $s .= Xml::closeElement( 'thead' );
                }
 
-               foreach( $rows as $id => $row ) {
+               foreach ( $rows as $id => $row ) {
                        $attribs = array();
 
                        if ( is_string( $id ) ) {
@@ -805,8 +822,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 ) ) {
@@ -874,7 +890,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 );
        }
@@ -902,7 +918,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";
index 2e18460..92ca7d8 100644 (file)
@@ -40,16 +40,52 @@ class XmlTypeCheck {
        public $rootElement = '';
 
        /**
-        * @param string $file filename
-        * @param $filterCallback callable (optional)
+        * @param string $input a filename or string containing the XML element
+        * @param callable $filterCallback (optional)
         *        Function to call to do additional custom validity checks from the
         *        SAX element handler event. This gives you access to the element
         *        namespace, name, and attributes, but not to text contents.
         *        Filter should return 'true' to toggle on $this->filterMatch
+        * @param boolean $isFile (optional) indicates if the first parameter is a
+        *        filename (default, true) or if it is a string (false)
         */
-       function __construct( $file, $filterCallback=null ) {
+       function __construct( $input, $filterCallback = null, $isFile = true ) {
                $this->filterCallback = $filterCallback;
-               $this->run( $file );
+               if ( $isFile ) {
+                       $this->validateFromFile( $input );
+               } else {
+                       $this->validateFromString( $input );
+               }
+       }
+
+       /**
+        * Alternative constructor: from filename
+        *
+        * @param string $fname the filename of an XML document
+        * @param callable $filterCallback (optional)
+        *        Function to call to do additional custom validity checks from the
+        *        SAX element handler event. This gives you access to the element
+        *        namespace, name, and attributes, but not to text contents.
+        *        Filter should return 'true' to toggle on $this->filterMatch
+        * @return XmlTypeCheck
+        */
+       public static function newFromFilename( $fname, $filterCallback = null ) {
+               return new self( $fname, $filterCallback, true );
+       }
+
+       /**
+        * Alternative constructor: from string
+        *
+        * @param string $string a string containing an XML element
+        * @param callable $filterCallback (optional)
+        *        Function to call to do additional custom validity checks from the
+        *        SAX element handler event. This gives you access to the element
+        *        namespace, name, and attributes, but not to text contents.
+        *        Filter should return 'true' to toggle on $this->filterMatch
+        * @return XmlTypeCheck
+        */
+       public static function newFromString( $string, $filterCallback = null ) {
+               return new self( $string, $filterCallback, false );
        }
 
        /**
@@ -62,15 +98,23 @@ class XmlTypeCheck {
        }
 
        /**
-        * @param $fname
+        * Get an XML parser with the root element handler.
+        * @see XmlTypeCheck::rootElementOpen()
+        * @return resource a resource handle for the XML parser
         */
-       private function run( $fname ) {
+       private function getParser() {
                $parser = xml_parser_create_ns( 'UTF-8' );
-
                // case folding violates XML standard, turn it off
                xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false );
-
                xml_set_element_handler( $parser, array( $this, 'rootElementOpen' ), false );
+               return $parser;
+       }
+
+       /**
+        * @param string $fname the filename
+        */
+       private function validateFromFile( $fname ) {
+               $parser = $this->getParser();
 
                if ( file_exists( $fname ) ) {
                        $file = fopen( $fname, "rb" );
@@ -78,23 +122,37 @@ class XmlTypeCheck {
                                do {
                                        $chunk = fread( $file, 32768 );
                                        $ret = xml_parse( $parser, $chunk, feof( $file ) );
-                                       if( $ret == 0 ) {
-                                               // XML isn't well-formed!
+                                       if ( $ret == 0 ) {
+                                               $this->wellFormed = false;
                                                fclose( $file );
                                                xml_parser_free( $parser );
                                                return;
                                        }
-                               } while( !feof( $file ) );
+                               } while ( !feof( $file ) );
 
                                fclose( $file );
                        }
                }
-
                $this->wellFormed = true;
 
                xml_parser_free( $parser );
        }
 
+       /**
+        *
+        * @param string $string the XML-input-string to be checked.
+        */
+       private function validateFromString( $string ) {
+               $parser = $this->getParser();
+               $ret = xml_parse( $parser, $string, true );
+               xml_parser_free( $parser );
+               if ( $ret == 0 ) {
+                       $this->wellFormed = false;
+                       return;
+               }
+               $this->wellFormed = true;
+       }
+
        /**
         * @param $parser
         * @param $name
@@ -103,7 +161,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 +176,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 895f3d3..0a2bf30 100644 (file)
@@ -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 8729426..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() );
                }
 
@@ -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 55fa108..012a655 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 ) {
+                       $key = wfMemcKey( 'infoaction', sha1( $title->getPrefixedText() ), $revision->getId() );
+                       $wgMemc->delete( $key );
+               }
+       }
+
        /**
         * Shows page information on GET request.
         *
@@ -105,7 +121,8 @@ class InfoAction extends FormlessAction {
                        foreach ( $infoTable as $infoRow ) {
                                $name = ( $infoRow[0] instanceof Message ) ? $infoRow[0]->escaped() : $infoRow[0];
                                $value = ( $infoRow[1] instanceof Message ) ? $infoRow[1]->escaped() : $infoRow[1];
-                               $table = $this->addRow( $table, $name, $value ) . "\n";
+                               $id = ( $infoRow[0] instanceof Message ) ? $infoRow[0]->getKey() : null;
+                               $table = $this->addRow( $table, $name, $value, $id ) . "\n";
                        }
                        $content = $this->addTable( $content, $table ) . "\n";
                }
@@ -140,10 +157,11 @@ class InfoAction extends FormlessAction {
         * @param string $table The table that will be added to the content
         * @param string $name The name of the row
         * @param string $value The value of the row
+        * @param string $id The ID to use for the 'tr' element
         * @return string The table with the row added
         */
-       protected function addRow( $table, $name, $value ) {
-               return $table . Html::rawElement( 'tr', array(),
+       protected function addRow( $table, $name, $value, $id ) {
+               return $table . Html::rawElement( 'tr', $id === null ? array() : array( 'id' => 'mw-' . $id ),
                        Html::rawElement( 'td', array( 'style' => 'vertical-align: top;' ), $name ) .
                        Html::rawElement( 'td', array(), $value )
                );
@@ -169,14 +187,16 @@ class InfoAction extends FormlessAction {
         * @return array
         */
        protected function pageInfo() {
-               global $wgContLang, $wgRCMaxAge, $wgMemc, $wgUnwatchedPageThreshold, $wgPageInfoTransclusionLimit;
+               global $wgContLang, $wgRCMaxAge, $wgMemc,
+                       $wgUnwatchedPageThreshold, $wgPageInfoTransclusionLimit;
 
                $user = $this->getUser();
                $lang = $this->getLanguage();
                $title = $this->getTitle();
                $id = $title->getArticleID();
 
-               $memcKey = wfMemcKey( 'infoaction', sha1( $title->getPrefixedText() ), $this->page->getLatest() );
+               $memcKey = wfMemcKey( 'infoaction',
+                       sha1( $title->getPrefixedText() ), $this->page->getLatest() );
                $pageCounts = $wgMemc->get( $memcKey );
                if ( $pageCounts === false ) {
                        // Get page information that would be too "expensive" to retrieve by normal means
@@ -602,7 +622,7 @@ class InfoAction extends FormlessAction {
                        'COUNT(*)',
                        array(
                                'wl_namespace' => $title->getNamespace(),
-                               'wl_title'     => $title->getDBkey(),
+                               'wl_title' => $title->getDBkey(),
                        ),
                        __METHOD__
                );
index 82cdc79..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 {
index 23db874..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,14 +194,14 @@ class RawAction extends FormlessAction {
                switch ( $this->getRequest()->getText( 'direction' ) ) {
                        case 'next':
                                # output next revision, or nothing if there isn't one
-                               if( $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();
                                }
@@ -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';
                }
index ae5f76c..929c1b5 100644 (file)
@@ -87,24 +87,72 @@ class WatchAction extends FormAction {
                return parent::checkCanExecute( $user );
        }
 
-       public static function doWatch( Title $title, User $user  ) {
+       /**
+        * Watch or unwatch a page
+        * @since 1.22
+        * @param bool $watch Whether to watch or unwatch the page
+        * @param Title $title Page to watch/unwatch
+        * @param User $user User who is watching/unwatching
+        * @return Status
+        */
+       public static function doWatchOrUnwatch( $watch, Title $title, User $user ) {
+               if ( $user->isLoggedIn() && $user->isWatched( $title, WatchedItem::IGNORE_USER_RIGHTS ) != $watch ) {
+                       // If the user doesn't have 'editmywatchlist', we still want to
+                       // allow them to add but not remove items via edits and such.
+                       if ( $watch ) {
+                               return self::doWatch( $title, $user, WatchedItem::IGNORE_USER_RIGHTS );
+                       } else {
+                               return self::doUnwatch( $title, $user );
+                       }
+               }
+               return Status::newGood();
+       }
+
+       /**
+        * Watch a page
+        * @since 1.22 Returns Status, $checkRights parameter added
+        * @param Title $title Page to watch/unwatch
+        * @param User $user User who is watching/unwatching
+        * @param int $checkRights Passed through to $user->addWatch()
+        * @return Status
+        */
+       public static function doWatch( Title $title, User $user, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
+               if ( $checkRights !== WatchedItem::IGNORE_USER_RIGHTS && !$user->isAllowed( 'editmywatchlist' ) ) {
+                       return User::newFatalPermissionDeniedStatus( 'editmywatchlist' );
+               }
+
                $page = WikiPage::factory( $title );
 
-               if ( wfRunHooks( 'WatchArticle', array( &$user, &$page ) ) ) {
-                       $user->addWatch( $title );
+               $status = Status::newFatal( 'hookaborted' );
+               if ( wfRunHooks( 'WatchArticle', array( &$user, &$page, &$status ) ) ) {
+                       $status = Status::newGood();
+                       $user->addWatch( $title, $checkRights );
                        wfRunHooks( 'WatchArticleComplete', array( &$user, &$page ) );
                }
-               return true;
+               return $status;
        }
 
-       public static function doUnwatch( Title $title, User $user  ) {
+       /**
+        * Unwatch a page
+        * @since 1.22 Returns Status
+        * @param Title $title Page to watch/unwatch
+        * @param User $user User who is watching/unwatching
+        * @return Status
+        */
+       public static function doUnwatch( Title $title, User $user ) {
+               if ( !$user->isAllowed( 'editmywatchlist' ) ) {
+                       return User::newFatalPermissionDeniedStatus( 'editmywatchlist' );
+               }
+
                $page = WikiPage::factory( $title );
 
-               if ( wfRunHooks( 'UnwatchArticle', array( &$user, &$page ) ) ) {
+               $status = Status::newFatal( 'hookaborted' );
+               if ( wfRunHooks( 'UnwatchArticle', array( &$user, &$page, &$status ) ) ) {
+                       $status = Status::newGood();
                        $user->removeWatch( $title );
                        wfRunHooks( 'UnwatchArticleComplete', array( &$user, &$page ) );
                }
-               return true;
+               return $status;
        }
 
        /**
index f386a8a..8f5185a 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 {
@@ -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' );
                }
        }
 
@@ -824,7 +823,7 @@ abstract class ApiBase extends ContextSource {
         */
        protected function getWatchlistValue( $watchlist, $titleObj, $userOption = null ) {
 
-               $userWatching = $this->getUser()->isWatched( $titleObj );
+               $userWatching = $this->getUser()->isWatched( $titleObj, WatchedItem::IGNORE_USER_RIGHTS );
 
                switch ( $watchlist ) {
                        case 'watch':
@@ -866,12 +865,7 @@ abstract class ApiBase extends ContextSource {
                        return;
                }
 
-               $user = $this->getUser();
-               if ( $value ) {
-                       WatchAction::doWatch( $titleObj, $user );
-               } else {
-                       WatchAction::doUnwatch( $titleObj, $user );
-               }
+               WatchAction::doWatchOrUnwatch( $value, $titleObj, $this->getUser() );
        }
 
        /**
@@ -967,9 +961,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 ) ) {
@@ -1222,6 +1216,44 @@ abstract class ApiBase extends ContextSource {
                throw new UsageException( $description, $this->encodeParamName( $errorCode ), $httpRespCode, $extradata );
        }
 
+       /**
+        * Throw a UsageException based on the errors in the Status object.
+        *
+        * @since 1.22
+        * @param Status $status Status object
+        * @throws UsageException
+        */
+       public function dieStatus( $status ) {
+               if ( $status->isGood() ) {
+                       throw new MWException( 'Successful status passed to ApiBase::dieStatus' );
+               }
+
+               $errors = $status->getErrorsArray();
+               if ( !$errors ) {
+                       // No errors? Assume the warnings should be treated as errors
+                       $errors = $status->getWarningsArray();
+               }
+               if ( !$errors ) {
+                       // Still no errors? Punt
+                       $errors = array( array( 'unknownerror-nocode' ) );
+               }
+
+               // Cannot use dieUsageMsg() because extensions might return custom
+               // error messages.
+               if ( $errors[0] instanceof Message ) {
+                       $msg = $errors[0];
+                       $code = $msg->getKey();
+               } else {
+                       $code = array_shift( $errors[0] );
+                       $msg = wfMessage( $code, $errors[0] );
+               }
+               if ( isset( ApiBase::$messageMap[$code] ) ) {
+                       // Translate message to code, for backwards compatability
+                       $code = ApiBase::$messageMap[$code]['code'];
+               }
+               $this->dieUsage( $msg->inLanguage( 'en' )->useDatabase( false )->plain(), $code );
+       }
+
        /**
         * Array that maps message keys to error messages. $1 and friends are replaced.
         */
@@ -1397,7 +1429,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 +1444,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 +1480,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 );
                }
@@ -1546,6 +1578,9 @@ abstract class ApiBase extends ContextSource {
                        if ( !$this->getUser()->isLoggedIn() ) {
                                $this->dieUsage( 'You must be logged-in to have a watchlist', 'notloggedin' );
                        }
+                       if ( !$this->getUser()->isAllowed( 'viewmywatchlist' ) ) {
+                               $this->dieUsage( 'You don\'t have permission to view your watchlist', 'permissiondenied' );
+                       }
                        $user = $this->getUser();
                }
                return $user;
@@ -1560,6 +1595,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 +1613,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'
+                               );
                        }
                }
 
@@ -1595,13 +1633,31 @@ abstract class ApiBase extends ContextSource {
                }
 
                if ( $this->needsToken() ) {
-                       $ret[] = array( 'missingparam', 'token' );
+                       if ( !isset( $params['token'][ApiBase::PARAM_REQUIRED] )
+                               || !$params['token'][ApiBase::PARAM_REQUIRED]
+                       ) {
+                               // Add token as possible missing parameter, if not already done
+                               $ret[] = array( 'missingparam', 'token' );
+                       }
                        $ret[] = array( 'sessionfailure' );
                }
 
                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 278ea29..9464d49 100644 (file)
@@ -48,7 +48,7 @@ class ApiCreateAccount extends ApiBase {
                        wfSetupSession();
                }
 
-               if( $params['mailpassword'] && !$params['email'] ) {
+               if ( $params['mailpassword'] && !$params['email'] ) {
                        $this->dieUsageMsg( 'noemail' );
                }
 
@@ -80,20 +80,20 @@ class ApiCreateAccount extends ApiBase {
 
                $status = $loginForm->addNewaccountInternal();
                $result = array();
-               if( $status->isGood() ) {
+               if ( $status->isGood() ) {
                        // Success!
                        global $wgEmailAuthentication;
                        $user = $status->getValue();
 
-                       if( $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,33 +120,23 @@ 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 ) {
-                               $code = 'aborted';
-                               $desc = $errors[0];
-                       } else {
-                               $code = array_shift( $errors[0] );
-                               $desc = wfMessage( $code, $errors[0] );
-                       }
-                       $this->dieUsage( $desc, $code );
-               } elseif( !$status->isGood() ) {
+                       $this->dieStatus( $status );
+               } 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 +249,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() );
                }
 
index d1f0806..aea1048 100644 (file)
@@ -61,8 +61,7 @@ class ApiDelete extends ApiBase {
                        $this->dieUsageMsg( $status[0] );
                }
                if ( !$status->isGood() ) {
-                       $errors = $status->getErrorsArray();
-                       $this->dieUsageMsg( $errors[0] ); // We don't care about multiple errors, just report one of them
+                       $this->dieStatus( $status );
                }
 
                // Deprecated parameters
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 b96ea37..9f6b8b4 100644 (file)
@@ -56,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' );
                        }
 
@@ -91,6 +91,9 @@ class ApiFeedWatchlist extends ApiBase {
                        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'] ) {
@@ -222,12 +225,14 @@ class ApiFeedWatchlist extends ApiBase {
                        $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;
@@ -244,6 +249,7 @@ class ApiFeedWatchlist extends ApiBase {
                        '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 f9b85ef..4ec149c 100644 (file)
@@ -155,7 +155,7 @@ class ApiFormatXml extends ApiFormatBase {
                                        unset( $elemValue[$subElemId] );
                                } elseif ( is_array( $subElemValue ) ) {
                                        $subElements[$subElemId] = $subElemValue;
-                                       unset ( $elemValue[$subElemId] );
+                                       unset( $elemValue[$subElemId] );
                                }
                        }
 
index e4642dd..7a60e83 100644 (file)
@@ -37,15 +37,15 @@ 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;
@@ -218,7 +218,7 @@ class ApiImageRotate extends ApiBase {
                $pageSet = $this->getPageSet();
                return array_merge(
                        parent::getPossibleErrors(),
-                       $pageSet->getPossibleErrors()
+                       $pageSet->getFinalPossibleErrors()
                );
        }
 
index 1f0a5fa..f48a822 100644 (file)
@@ -57,7 +57,7 @@ class ApiImport extends ApiBase {
                        $source = ImportStreamSource::newFromUpload( 'xml' );
                }
                if ( !$source->isOK() ) {
-                       $this->dieUsageMsg( $source->getErrorsArray() );
+                       $this->dieStatus( $source );
                }
 
                $importer = new WikiImporter( $source->value );
@@ -66,8 +66,8 @@ class ApiImport extends ApiBase {
                }
                if ( isset( $params['rootpage'] ) ) {
                        $statusRootPage = $importer->setTargetRootPage( $params['rootpage'] );
-                       if( !$statusRootPage->isGood() ) {
-                               $this->dieUsageMsg( $statusRootPage->getErrorsArray() );
+                       if ( !$statusRootPage->isGood() ) {
+                               $this->dieStatus( $statusRootPage );
                        }
                }
                $reporter = new ApiImportReporter(
index abd47b2..5ddb3ab 100644 (file)
@@ -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,
                );
        }
@@ -1121,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 0645edb..9fdad2b 100644 (file)
@@ -188,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;
@@ -407,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(
@@ -604,7 +604,7 @@ class ApiPageSet extends ApiBase {
 
        /**
         * Do not use, does nothing, will be removed
-        * @deprecated 1.21
+        * @deprecated since 1.21
         */
        public function finishPageSetGeneration() {
                wfDeprecated( __METHOD__, '1.21' );
@@ -862,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..a369994 100644 (file)
@@ -44,6 +44,14 @@ class ApiParse extends ApiBase {
                $params = $this->extractRequestParams();
                $text = $params['text'];
                $title = $params['title'];
+               if ( $title === null ) {
+                       $titleProvided = false;
+                       // A title is needed for parsing, so arbitrarily choose one
+                       $title = 'API';
+               } else {
+                       $titleProvided = true;
+               }
+
                $page = $params['page'];
                $pageid = $params['pageid'];
                $oldid = $params['oldid'];
@@ -51,7 +59,7 @@ class ApiParse extends ApiBase {
                $model = $params['contentmodel'];
                $format = $params['contentformat'];
 
-               if ( !is_null( $page ) && ( !is_null( $text ) || $title != 'API' ) ) {
+               if ( !is_null( $page ) && ( !is_null( $text ) || $titleProvided ) ) {
                        $this->dieUsage( 'The page parameter cannot be used together with the text and title parameters', 'params' );
                }
 
@@ -94,8 +102,7 @@ class ApiParse extends ApiBase {
                                $titleObj = $rev->getTitle();
                                $wgTitle = $titleObj;
                                $pageObj = WikiPage::factory( $titleObj );
-                               $popts = $pageObj->makeParserOptions( $this->getContext() );
-                               $popts->enableLimitReport( !$params['disablepp'] );
+                               $popts = $this->makeParserOptions( $pageObj, $params );
 
                                // If for some reason the "oldid" is actually the current revision, it may be cached
                                if ( $rev->isCurrent() ) {
@@ -152,8 +159,7 @@ class ApiParse extends ApiBase {
                                        $oldid = $pageObj->getLatest();
                                }
 
-                               $popts = $pageObj->makeParserOptions( $this->getContext() );
-                               $popts->enableLimitReport( !$params['disablepp'] );
+                               $popts = $this->makeParserOptions( $pageObj, $params );
 
                                // Potentially cached
                                $p_result = $this->getParsedContent( $pageObj, $popts, $pageid,
@@ -170,11 +176,24 @@ class ApiParse extends ApiBase {
                        $wgTitle = $titleObj;
                        $pageObj = WikiPage::factory( $titleObj );
 
-                       $popts = $pageObj->makeParserOptions( $this->getContext() );
-                       $popts->enableLimitReport( !$params['disablepp'] );
+                       $popts = $this->makeParserOptions( $pageObj, $params );
 
                        if ( is_null( $text ) ) {
-                               $this->dieUsage( 'The text parameter should be passed with the title parameter. Should you be using the "page" parameter instead?', 'params' );
+                               if ( $titleProvided && ( $prop || $params['generatexml'] ) ) {
+                                       $this->setWarning(
+                                               "'title' used without 'text', and parsed page properties were requested " .
+                                               "(did you mean to use 'page' instead of 'title'?)"
+                                       );
+                               }
+                               // Prevent warning from ContentHandler::makeContent()
+                               $text = '';
+                       }
+
+                       // If we are parsing text, do not use the content model of the default
+                       // API title, but default to wikitext to keep BC.
+                       if ( !$titleProvided && is_null( $model ) ) {
+                               $model = CONTENT_MODEL_WIKITEXT;
+                               $this->setWarning( "No 'title' or 'contentmodel' was given, assuming $model." );
                        }
 
                        try {
@@ -194,10 +213,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 +244,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 +280,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 +321,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 +331,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 +354,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(
@@ -345,6 +378,26 @@ class ApiParse extends ApiBase {
                }
        }
 
+       /**
+        * Constructs a ParserOptions object
+        *
+        * @param WikiPage $pageObj
+        * @param array $params
+        *
+        * @return ParserOptions
+        */
+       protected function makeParserOptions( WikiPage $pageObj, array $params ) {
+               wfProfileIn( __METHOD__ );
+
+               $popts = $pageObj->makeParserOptions( $this->getContext() );
+               $popts->enableLimitReport( !$params['disablepp'] );
+               $popts->setIsPreview( $params['preview'] || $params['sectionpreview'] );
+               $popts->setIsSectionPreview( $params['sectionpreview'] );
+
+               wfProfileOut( __METHOD__ );
+               return $popts;
+       }
+
        /**
         * @param $page WikiPage
         * @param $popts ParserOptions
@@ -400,7 +453,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 +464,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 +518,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 +540,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 +552,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 +563,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 +574,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;
@@ -537,9 +590,7 @@ class ApiParse extends ApiBase {
 
        public function getAllowedParams() {
                return array(
-                       'title' => array(
-                               ApiBase::PARAM_DFLT => 'API',
-                       ),
+                       'title' => null,
                        'text' => null,
                        'summary' => null,
                        'page' => null,
@@ -575,10 +626,13 @@ class ApiParse extends ApiBase {
                        ),
                        'pst' => false,
                        'onlypst' => false,
+                       'effectivelanglinks' => false,
                        'uselang' => null,
                        'section' => null,
                        'disablepp' => false,
                        'generatexml' => false,
+                       'preview' => false,
+                       'sectionpreview' => false,
                        'contentformat' => array(
                                ApiBase::PARAM_TYPE => ContentHandler::getAllContentFormats(),
                        ),
@@ -590,11 +644,13 @@ class ApiParse extends ApiBase {
 
        public function getParamDescription() {
                $p = $this->getModulePrefix();
+               $wikitext = CONTENT_MODEL_WIKITEXT;
                return array(
-                       'text' => 'Wikitext to parse',
+                       'text' => "Text to parse. Use {$p}title or {$p}contentmodel to control the content model",
                        'summary' => 'Summary to parse',
                        'redirects' => "If the {$p}page or the {$p}pageid parameter is set to a redirect, resolve it",
-                       'title' => 'Title of page the text belongs to',
+                       'title' => "Title of page the text belongs to. " .
+                               "If omitted, \"API\" is used as the title with content model $wikitext",
                        'page' => "Parse the content of this page. Cannot be used together with {$p}text and {$p}title",
                        'pageid' => "Parse the content of this page. Overrides {$p}page",
                        'oldid' => "Parse the content of this revision. Overrides {$p}page and {$p}pageid",
@@ -618,34 +674,52 @@ 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'
+                               "Only valid when used with {$p}text",
                        ),
                        'onlypst' => array(
                                'Do a pre-save transform (PST) on the input, but don\'t parse it',
-                               'Returns the same wikitext, after a PST has been applied. Ignored if page, pageid or oldid is used'
+                               'Returns the same wikitext, after a PST has been applied.',
+                               "Only valid when used with {$p}text",
                        ),
                        'uselang' => 'Which language to parse the request in',
                        'section' => 'Only retrieve the content of this section number',
                        'disablepp' => 'Disable the PP Report from the parser output',
-                       'generatexml' => 'Generate XML parse tree (requires prop=wikitext)',
-                       'contentformat' => 'Content serialization format used for the input text',
-                       'contentmodel' => 'Content model of the new content',
+                       'generatexml' => "Generate XML parse tree (requires contentmodel=$wikitext)",
+                       'preview' => 'Parse in preview mode',
+                       'sectionpreview' => 'Parse in section preview mode (enables preview mode too)',
+                       'contentformat' => array(
+                               'Content serialization format used for the input text',
+                               "Only valid when used with {$p}text",
+                       ),
+                       'contentmodel' => array(
+                               "Content model of the input text. Default is the model of the " .
+                               "specified ${p}title, or $wikitext if ${p}title is not specified",
+                               "Only valid when used with {$p}text",
+                       ),
                );
        }
 
        public function getDescription() {
+               $p = $this->getModulePrefix();
                return array(
-                       'Parses wikitext and returns parser output',
+                       'Parses content and returns parser output',
                        'See the various prop-Modules of action=query to get information from the current version of a page',
+                       'There are several ways to specify the text to parse:',
+                       "1) Specify a page or revision, using {$p}page, {$p}pageid, or {$p}oldid.",
+                       "2) Specify content explicitly, using {$p}text, {$p}title, and {$p}contentmodel.",
+                       "3) Specify only a summary to parse. {$p}prop should be given an empty value.",
                );
        }
 
        public function getPossibleErrors() {
                return array_merge( parent::getPossibleErrors(), array(
                        array( 'code' => 'params', 'info' => 'The page parameter cannot be used together with the text and title parameters' ),
-                       array( 'code' => 'params', 'info' => 'The text parameter should be passed with the title parameter. Should you be using the "page" parameter instead?' ),
                        array( 'code' => 'missingrev', 'info' => 'There is no revision ID oldid' ),
                        array( 'code' => 'permissiondenied', 'info' => 'You don\'t have permission to view deleted revisions' ),
                        array( 'code' => 'missingtitle', 'info' => 'The page you specified doesn\'t exist' ),
@@ -660,7 +734,10 @@ class ApiParse extends ApiBase {
 
        public function getExamples() {
                return array(
-                       'api.php?action=parse&text={{Project:Sandbox}}'
+                       'api.php?action=parse&page=Project:Sandbox' => 'Parse a page',
+                       'api.php?action=parse&text={{Project:Sandbox}}' => 'Parse wikitext',
+                       'api.php?action=parse&text={{PAGENAME}}&title=Test' => 'Parse wikitext, specifying the page title',
+                       'api.php?action=parse&summary=Some+[[link]]&prop=' => 'Parse a summary',
                );
        }
 
index 4d4fbba..bd2fde2 100644 (file)
@@ -35,11 +35,27 @@ class ApiPatrol extends ApiBase {
         */
        public function execute() {
                $params = $this->extractRequestParams();
-
-               $rc = RecentChange::newFromID( $params['rcid'] );
-               if ( !$rc instanceof RecentChange ) {
-                       $this->dieUsageMsg( array( 'nosuchrcid', $params['rcid'] ) );
+               $this->requireOnlyOneParameter( $params, 'rcid', 'revid' );
+
+               if ( isset( $params['rcid'] ) ) {
+                       $rc = RecentChange::newFromID( $params['rcid'] );
+                       if ( !$rc ) {
+                               $this->dieUsageMsg( array( 'nosuchrcid', $params['rcid'] ) );
+                       }
+               } else {
+                       $rev = Revision::newFromId( $params['revid'] );
+                       if ( !$rev ) {
+                               $this->dieUsageMsg( array( 'nosuchrevid', $params['revid'] ) );
+                       }
+                       $rc = $rev->getRecentChange();
+                       if ( !$rc ) {
+                               $this->dieUsage(
+                                       'The revision ' . $params['revid'] . " can't be patrolled as it's too old",
+                                       'notpatrollable'
+                               );
+                       }
                }
+
                $retval = $rc->doMarkPatrolled( $this->getUser() );
 
                if ( $retval ) {
@@ -66,8 +82,10 @@ class ApiPatrol extends ApiBase {
                                ApiBase::PARAM_REQUIRED => true
                        ),
                        'rcid' => array(
-                               ApiBase::PARAM_TYPE => 'integer',
-                               ApiBase::PARAM_REQUIRED => true
+                               ApiBase::PARAM_TYPE => 'integer'
+                       ),
+                       'revid' => array(
+                               ApiBase::PARAM_TYPE => 'integer'
                        ),
                );
        }
@@ -76,6 +94,7 @@ class ApiPatrol extends ApiBase {
                return array(
                        'token' => 'Patrol token obtained from list=recentchanges',
                        'rcid' => 'Recentchanges ID to patrol',
+                       'revid' => 'Revision ID to patrol',
                );
        }
 
@@ -94,8 +113,16 @@ class ApiPatrol extends ApiBase {
        }
 
        public function getPossibleErrors() {
-               return array_merge( parent::getPossibleErrors(), array(
-                       array( 'nosuchrcid', 'rcid' ),
+               return array_merge(
+                       parent::getPossibleErrors(),
+                       parent::getRequireOnlyOneParameterErrorMessages( array( 'rcid', 'revid' ) ),
+                       array(
+                               array( 'nosuchrcid', 'rcid' ),
+                               array( 'nosuchrevid', 'revid' ),
+                               array(
+                                       'code' => 'notpatrollable',
+                                       'info' => "The revision can't be patrolled as it's too old"
+                               )
                ) );
        }
 
@@ -109,7 +136,8 @@ class ApiPatrol extends ApiBase {
 
        public function getExamples() {
                return array(
-                       'api.php?action=patrol&token=123abc&rcid=230672766'
+                       'api.php?action=patrol&token=123abc&rcid=230672766',
+                       'api.php?action=patrol&token=123abc&revid=230672766'
                );
        }
 
index 503c692..7830c8b 100644 (file)
@@ -103,8 +103,7 @@ class ApiProtect extends ApiBase {
                $status = $pageObj->doUpdateRestrictions( $protections, $expiryarray, $cascade, $params['reason'], $this->getUser() );
 
                if ( !$status->isOK() ) {
-                       $errors = $status->getErrorsArray();
-                       $this->dieUsageMsg( $errors[0] );
+                       $this->dieStatus( $status );
                }
                $res = array(
                        'title' => $titleObj->getPrefixedText(),
index 49cc738..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;
@@ -204,7 +204,7 @@ class ApiPurge extends ApiBase {
        public function getPossibleErrors() {
                return array_merge(
                        parent::getPossibleErrors(),
-                       $this->getPageSet()->getPossibleErrors()
+                       $this->getPageSet()->getFinalPossibleErrors()
                );
        }
 
index 4d9a772..aafd582 100644 (file)
@@ -722,7 +722,7 @@ class ApiQuery extends ApiBase {
        public function getPossibleErrors() {
                return array_merge(
                        parent::getPossibleErrors(),
-                       $this->getPageSet()->getPossibleErrors()
+                       $this->getPageSet()->getFinalPossibleErrors()
                );
        }
 
@@ -735,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 952c2dc..3f5c6ee 100644 (file)
@@ -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 e355f8b..3744e3c 100644 (file)
@@ -40,8 +40,8 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                                $this->dfltNamespace = NS_MAIN;
                                $this->indexTag = 'l';
                                $this->description = 'Enumerate all links that point to a given namespace';
-                               $this->descriptionLink = 'link';
-                               $this->descriptionLinked = 'linked';
+                               $this->descriptionWhat = 'link';
+                               $this->descriptionTargets = 'linked titles';
                                $this->descriptionLinking = 'linking';
                                break;
                        case 'alltransclusions':
@@ -51,8 +51,8 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                                $this->dfltNamespace = NS_TEMPLATE;
                                $this->indexTag = 't';
                                $this->description = 'List all transclusions (pages embedded using {{x}}), including non-existing';
-                               $this->descriptionLink = 'transclusion';
-                               $this->descriptionLinked = 'transcluded';
+                               $this->descriptionWhat = 'transclusion';
+                               $this->descriptionTargets = 'transcluded titles';
                                $this->descriptionLinking = 'transcluding';
                                break;
                        default:
@@ -90,7 +90,7 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                if ( $params['unique'] ) {
                        if ( $fld_ids ) {
                                $this->dieUsage(
-                                       "{$this->getModuleName()} cannot return corresponding page ids in unique {$this->descriptionLink}s mode",
+                                       "{$this->getModuleName()} cannot return corresponding page ids in unique {$this->descriptionWhat}s mode",
                                        'params' );
                        }
                        $this->addOption( 'DISTINCT' );
@@ -232,23 +232,24 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
 
        public function getParamDescription() {
                $p = $this->getModulePrefix();
-               $link = $this->descriptionLink;
+               $what = $this->descriptionWhat;
+               $targets = $this->descriptionTargets;
                $linking = $this->descriptionLinking;
                return array(
-                       'from' => "The title of the $link to start enumerating from",
-                       'to' => "The title of the $link to stop enumerating at",
-                       'prefix' => "Search for all $link titles that begin with this value",
+                       'from' => "The title of the $what to start enumerating from",
+                       'to' => "The title of the $what to stop enumerating at",
+                       'prefix' => "Search for all $targets that begin with this value",
                        'unique' => array(
-                                       "Only show distinct $link titles. Cannot be used with {$p}prop=ids.",
-                                       'When used as a generator, yields target pages instead of source pages.',
+                               "Only show distinct $targets. Cannot be used with {$p}prop=ids.",
+                               'When used as a generator, yields target pages instead of source pages.',
                        ),
                        'prop' => array(
                                'What pieces of information to include',
                                " ids    - Adds the pageid of the $linking page (Cannot be used with {$p}unique)",
-                               " title  - Adds the title of the $link",
+                               " title  - Adds the title of the $what",
                        ),
                        'namespace' => 'The namespace to enumerate',
-                       'limit' => "How many total items to return",
+                       'limit' => 'How many total items to return',
                        'continue' => 'When more results are available, use this to continue',
                        'dir' => 'The direction in which to list',
                );
@@ -272,29 +273,31 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
 
        public function getPossibleErrors() {
                $m = $this->getModuleName();
-               $link = $this->descriptionLink;
+               $what = $this->descriptionWhat;
                return array_merge( parent::getPossibleErrors(), array(
-                       array( 'code' => 'params', 'info' => "{$m} cannot return corresponding page ids in unique {$link}s mode" ),
+                       array( 'code' => 'params', 'info' => "{$m} cannot return corresponding page ids in unique {$what}s mode" ),
                ) );
        }
 
        public function getExamples() {
                $p = $this->getModulePrefix();
-               $link = $this->descriptionLink;
-               $linked = $this->descriptionLinked;
+               $name = $this->getModuleName();
+               $what = $this->descriptionWhat;
+               $targets = $this->descriptionTargets;
                return array(
-                       "api.php?action=query&list=all{$link}s&{$p}from=B&{$p}prop=ids|title"
-                                       => "List $linked titles with page ids they are from, including missing ones. Start at B",
-                       "api.php?action=query&list=all{$link}s&{$p}unique=&{$p}from=B"
-                                       => "List unique $linked titles",
-                       "api.php?action=query&generator=all{$link}s&g{$p}unique=&g{$p}from=B"
-                                       => "Gets all $link targets, marking the missing ones",
-                       "api.php?action=query&generator=all{$link}s&g{$p}from=B"
-                                       => "Gets pages containing the {$link}s",
+                       "api.php?action=query&list={$name}&{$p}from=B&{$p}prop=ids|title"
+                                       => "List $targets with page ids they are from, including missing ones. Start at B",
+                       "api.php?action=query&list={$name}&{$p}unique=&{$p}from=B"
+                                       => "List unique $targets",
+                       "api.php?action=query&generator={$name}&g{$p}unique=&g{$p}from=B"
+                                       => "Gets all $targets, marking the missing ones",
+                       "api.php?action=query&generator={$name}&g{$p}from=B"
+                                       => "Gets pages containing the {$what}s",
                );
        }
 
        public function getHelpUrls() {
-               return "https://www.mediawiki.org/wiki/API:All{$this->descriptionLink}s";
+               $name = ucfirst( $this->getModuleName() );
+               return "https://www.mediawiki.org/wiki/API:{$name}";
        }
 }
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 6899808..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;
index 44fbf58..8668e04 100644 (file)
@@ -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 ba90452..e3c27f5 100644 (file)
@@ -91,17 +91,30 @@ class ApiQueryBlocks extends ApiQueryBase {
                        $this->addWhereFld( 'ipb_auto', 0 );
                }
                if ( isset( $params['ip'] ) ) {
-                       list( $ip, $range ) = IP::parseCIDR( $params['ip'] );
-                       if ( $ip && $range ) {
-                               // We got a CIDR range
-                               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 );
+                       global $wgBlockCIDRLimit;
+                       if ( IP::isIPv4( $params['ip'] ) ) {
+                               $type = 'IPv4';
+                               $cidrLimit = $wgBlockCIDRLimit['IPv4'];
+                               $prefixLen = 0;
+                       } elseif ( IP::isIPv6( $params['ip'] ) ) {
+                               $type = 'IPv6';
+                               $cidrLimit = $wgBlockCIDRLimit['IPv6'];
+                               $prefixLen = 3; // IP::toHex output is prefixed with "v6-"
                        } else {
-                               $lower = $upper = IP::toHex( $params['ip'] );
+                               $this->dieUsage( 'IP parameter is not valid', 'param_ip' );
                        }
-                       $prefix = substr( $lower, 0, 4 );
+
+                       # Check range validity, if it's a CIDR
+                       list( $ip, $range ) = IP::parseCIDR( $params['ip'] );
+                       if ( $ip !== false && $range !== false && $range < $cidrLimit ) {
+                               $this->dieUsage( "$type CIDR ranges broader than /$cidrLimit are not accepted", 'cidrtoobroad' );
+                       }
+
+                       # Let IP::parseRange handle calculating $upper, instead of duplicating the logic here.
+                       list( $lower, $upper ) = IP::parseRange( $params['ip'] );
+
+                       # Extract the common prefix to any rangeblock affecting this IP/CIDR
+                       $prefix = substr( $lower, 0, $prefixLen + floor( $cidrLimit / 4 ) );
 
                        # Fairly hard to make a malicious SQL statement out of hex characters,
                        # but it is good practice to add quotes
@@ -120,10 +133,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' );
                        }
@@ -294,6 +307,7 @@ class ApiQueryBlocks extends ApiQueryBase {
        }
 
        public function getParamDescription() {
+               global $wgBlockCIDRLimit;
                $p = $this->getModulePrefix();
                return array(
                        'start' => 'The timestamp to start enumerating from',
@@ -301,8 +315,12 @@ class ApiQueryBlocks extends ApiQueryBase {
                        'dir' => $this->getDirectionDescription( $p ),
                        'ids' => 'List of block IDs to list (optional)',
                        'users' => 'List of users to search for (optional)',
-                       'ip' => array( 'Get all blocks applying to this IP or CIDR range, including range blocks.',
-                                       'Cannot be used together with bkusers. CIDR ranges broader than /16 are not accepted' ),
+                       'ip' => array(
+                               'Get all blocks applying to this IP or CIDR range, including range blocks.',
+                               "Cannot be used together with bkusers. CIDR ranges broader than " .
+                                       "IPv4/{$wgBlockCIDRLimit['IPv4']} or IPv6/{$wgBlockCIDRLimit['IPv6']} " .
+                                       "are not accepted"
+                       ),
                        'limit' => 'The maximum amount of blocks to list',
                        'prop' => array(
                                'Which properties to get',
@@ -383,10 +401,19 @@ class ApiQueryBlocks extends ApiQueryBase {
        }
 
        public function getPossibleErrors() {
+               global $wgBlockCIDRLimit;
                return array_merge( parent::getPossibleErrors(),
                        $this->getRequireOnlyOneParameterErrorMessages( array( 'users', 'ip' ) ),
                        array(
-                               array( 'code' => 'cidrtoobroad', 'info' => 'CIDR ranges broader than /16 are not accepted' ),
+                               array(
+                                       'code' => 'cidrtoobroad',
+                                       'info' => "IPv4 CIDR ranges broader than /{$wgBlockCIDRLimit['IPv4']} are not accepted"
+                               ),
+                               array(
+                                       'code' => 'cidrtoobroad',
+                                       'info' => "IPv6 CIDR ranges broader than /{$wgBlockCIDRLimit['IPv6']} are not accepted"
+                               ),
+                               array( 'code' => 'param_ip', 'info' => 'IP parameter is not valid' ),
                                array( 'code' => 'param_user', 'info' => 'User parameter may not be empty' ),
                                array( 'code' => 'param_user', 'info' => 'User name user is not valid' ),
                                array( 'show' ),
index b2d3b1e..5d714f5 100644 (file)
@@ -183,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 7f73631..0311fa7 100644 (file)
@@ -58,7 +58,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
                }
                $images = $namespaces[NS_FILE];
 
-               if( $params['dir'] == 'descending' ) {
+               if ( $params['dir'] == 'descending' ) {
                        $images = array_reverse( $images );
                }
 
@@ -79,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 );
@@ -97,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;
@@ -138,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 );
@@ -148,7 +148,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
                                        }
                                }
                        }
-                       if( !$fit ) {
+                       if ( !$fit ) {
                                break;
                        }
                }
index eb9cdf9..456e87b 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;
@@ -218,13 +218,13 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
                        ),
                        'offset' => 'Used for paging. Use the value returned for "continue"',
                        'protocol' => array(
-                               "Protocol of the url. If empty and {$p}query set, the protocol is http.",
+                               "Protocol of the URL. If empty and {$p}query set, the protocol is http.",
                                "Leave both this and {$p}query empty to list all external links"
                        ),
                        'query' => 'Search string without protocol. See [[Special:LinkSearch]]. Leave empty to list all external links',
                        'namespace' => 'The page namespace(s) to enumerate.',
                        'limit' => 'How many pages to return.',
-                       'expandurl' => 'Expand protocol-relative urls with the canonical protocol',
+                       'expandurl' => 'Expand protocol-relative URLs with the canonical protocol',
                );
 
                if ( $wgMiserMode ) {
index 761b49e..583ef69 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 );
@@ -131,11 +131,11 @@ class ApiQueryExternalLinks extends ApiQueryBase {
                        'limit' => 'How many links to return',
                        'offset' => 'When more results are available, use this to continue',
                        'protocol' => array(
-                               "Protocol of the url. If empty and {$p}query set, the protocol is http.",
+                               "Protocol of the URL. If empty and {$p}query set, the protocol is http.",
                                "Leave both this and {$p}query empty to list all external links"
                        ),
                        'query' => 'Search string without protocol. Useful for checking whether a certain page contains a certain external url',
-                       'expandurl' => 'Expand protocol-relative urls with the canonical protocol',
+                       'expandurl' => 'Expand protocol-relative URLs with the canonical protocol',
                );
        }
 
@@ -148,7 +148,7 @@ class ApiQueryExternalLinks extends ApiQueryBase {
        }
 
        public function getDescription() {
-               return 'Returns all external urls (not interwikis) from the given page(s)';
+               return 'Returns all external URLs (not interwikis) from the given page(s)';
        }
 
        public function getPossibleErrors() {
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 6f03bbe..be53931 100644 (file)
@@ -90,7 +90,7 @@ 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_title' . $sort
@@ -193,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 0869cb9..fedf860 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 );
@@ -202,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;
@@ -232,6 +231,20 @@ class ApiQueryImageInfo extends ApiQueryBase {
         * @return Array of parameters for transform.
         */
        protected function mergeThumbParams( $image, $thumbParams, $otherParams ) {
+               global $wgThumbLimits;
+
+               if ( !isset( $thumbParams['width'] ) && isset( $thumbParams['height'] ) ) {
+                       // We want to limit only by height in this situation, so pass the
+                       // image's full width as the limiting width. But some file types
+                       // don't have a width of their own, so pick something arbitrary so
+                       // thumbnailing the default icon works.
+                       if ( $image->getWidth() <= 0 ) {
+                               $thumbParams['width'] = max( $wgThumbLimits );
+                       } else {
+                               $thumbParams['width'] = $image->getWidth();
+                       }
+               }
+
                if ( !$otherParams ) {
                        return $thumbParams;
                }
@@ -257,8 +270,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']})" );
                        }
                }
 
@@ -540,7 +553,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',
                );
@@ -571,7 +584,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        'urlwidth' => array( "If {$p}prop=url is set, a URL to an image scaled to this width will be returned.",
                                'For performance reasons if this option is used, ' .
                                        'no more than ' . self::TRANSFORM_LIMIT . ' scaled images will be returned.' ),
-                       'urlheight' => "Similar to {$p}urlwidth. Cannot be used without {$p}urlwidth",
+                       '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 per image',
@@ -718,8 +731,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..017684e 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();
@@ -662,7 +669,9 @@ class ApiQueryInfo extends ApiQueryBase {
        private function getWatchedInfo() {
                $user = $this->getUser();
 
-               if ( $user->isAnon() || count( $this->everything ) == 0 ) {
+               if ( $user->isAnon() || count( $this->everything ) == 0
+                       || !$user->isAllowed( 'viewmywatchlist' )
+               ) {
                        return;
                }
 
@@ -819,7 +828,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 e6b02d7..aa796e3 100644 (file)
@@ -67,6 +67,10 @@ class ApiQueryLangLinks extends ApiQueryBase {
                        );
                }
 
+               //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' : '' );
index 73dcea4..96d02da 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'] );
 
@@ -67,7 +67,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                $this->addTables( array( 'logging', 'user', 'page' ) );
                $this->addOption( 'STRAIGHT_JOIN' );
                $this->addJoinConds( array(
-                       'user' => array( 'JOIN',
+                       'user' => array( 'LEFT JOIN',
                                'user_id=log_user' ),
                        'page' => array( 'LEFT JOIN',
                                array( 'log_namespace=page_namespace',
@@ -82,8 +82,8 @@ class ApiQueryLogEvents extends ApiQueryBase {
                ) );
 
                $this->addFieldsIf( array( 'log_id', 'page_id' ), $this->fld_ids );
-               $this->addFieldsIf( array( 'log_user', 'user_name' ), $this->fld_user );
-               $this->addFieldsIf( 'user_id', $this->fld_userid );
+               $this->addFieldsIf( array( 'log_user', 'log_user_text', 'user_name' ), $this->fld_user );
+               $this->addFieldsIf( 'log_user', $this->fld_userid );
                $this->addFieldsIf( array( 'log_namespace', 'log_title' ), $this->fld_title || $this->fld_parsedcomment );
                $this->addFieldsIf( 'log_comment', $this->fld_comment || $this->fld_parsedcomment );
                $this->addFieldsIf( 'log_params', $this->fld_details );
@@ -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();
@@ -331,10 +336,10 @@ class ApiQueryLogEvents extends ApiQueryBase {
                                $vals['userhidden'] = '';
                        } else {
                                if ( $this->fld_user ) {
-                                       $vals['user'] = $row->user_name;
+                                       $vals['user'] = $row->user_name === null ? $row->log_user_text : $row->user_name;
                                }
                                if ( $this->fld_userid ) {
-                                       $vals['userid'] = $row->user_id;
+                                       $vals['userid'] = $row->log_user;
                                }
 
                                if ( !$row->log_user ) {
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 8aceab2..a5a3b8c 100644 (file)
@@ -39,7 +39,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
        private $fld_comment = false, $fld_parsedcomment = false, $fld_user = false, $fld_userid = false,
                        $fld_flags = false, $fld_timestamp = false, $fld_title = false, $fld_ids = false,
                        $fld_sizes = false, $fld_redirect = false, $fld_patrolled = false, $fld_loginfo = false,
-                       $fld_tags = false, $token = array();
+                       $fld_tags = false, $fld_sha1 = false, $token = array();
 
        private $tokenFunctions;
 
@@ -121,6 +121,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                $this->fld_patrolled = isset( $prop['patrolled'] );
                $this->fld_loginfo = isset( $prop['loginfo'] );
                $this->fld_tags = isset( $prop['tags'] );
+               $this->fld_sha1 = isset( $prop['sha1'] );
        }
 
        public function execute() {
@@ -273,6 +274,12 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        $this->addFields( 'ts_tags' );
                }
 
+               if ( $this->fld_sha1 ) {
+                       $this->addTables( 'revision' );
+                       $this->addJoinConds( array( 'revision' => array( 'LEFT JOIN', array( 'rc_this_oldid=rev_id' ) ) ) );
+                       $this->addFields( array( 'rev_sha1', 'rev_deleted' ) );
+               }
+
                if ( $params['toponly'] || $showRedirects ) {
                        $this->addTables( 'page' );
                        $this->addJoinConds( array( 'page' => array( 'LEFT JOIN', array( 'rc_namespace=page_namespace', 'rc_title=page_title' ) ) ) );
@@ -475,6 +482,19 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        }
                }
 
+               if ( $this->fld_sha1 && $row->rev_sha1 !== null ) {
+                       // The RevDel check should currently never pass due to the
+                       // rc_deleted = 0 condition in the WHERE clause, but in case that
+                       // ever changes we check it here too.
+                       if ( $row->rev_deleted & Revision::DELETED_TEXT ) {
+                               $vals['sha1hidden'] = '';
+                       } elseif ( $row->rev_sha1 !== '' ) {
+                               $vals['sha1'] = wfBaseConvert( $row->rev_sha1, 36, 16, 40 );
+                       } else {
+                               $vals['sha1'] = '';
+                       }
+               }
+
                if ( !is_null( $this->token ) ) {
                        $tokenFunctions = $this->getTokenFunctions();
                        foreach ( $this->token as $t ) {
@@ -499,7 +519,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        }
                        return $retval;
                }
-               switch( $type ) {
+               switch ( $type ) {
                        case 'edit':
                                return RC_EDIT;
                        case 'new':
@@ -571,7 +591,8 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                                        'redirect',
                                        'patrolled',
                                        'loginfo',
-                                       'tags'
+                                       'tags',
+                                       'sha1',
                                )
                        ),
                        'token' => array(
@@ -638,6 +659,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                                ' patrolled      - Tags edits that have been patrolled',
                                ' loginfo        - Adds log information (logid, logtype, etc) to log entries',
                                ' tags           - Lists tags for the entry',
+                               ' sha1           - Adds the content checksum for entries associated with a revision',
                        ),
                        'token' => 'Which tokens to obtain for each change',
                        'show' => array(
@@ -735,7 +757,17 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                                        ApiBase::PROP_TYPE => 'string',
                                        ApiBase::PROP_NULLABLE => true
                                )
-                       )
+                       ),
+                       'sha1' => array(
+                               'sha1' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'sha1hidden' => array(
+                                       ApiBase::PROP_TYPE => 'boolean',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                       ),
                );
 
                self::addTokenProperties( $props, $this->getTokenFunctions() );
index 192fe87..5a22311 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'] ) ) {
@@ -520,7 +520,7 @@ class ApiQueryRevisions extends ApiQueryBase {
                                } else {
                                        $this->setWarning( "Conversion to XML is supported for wikitext only, " .
                                                                                $title->getPrefixedDBkey() .
-                                                                               " uses content model " . $content->getModel() . ")" );
+                                                                               " uses content model " . $content->getModel() );
                                }
                        }
 
@@ -533,7 +533,7 @@ class ApiQueryRevisions extends ApiQueryBase {
                                } else {
                                        $this->setWarning( "Template expansion is supported for wikitext only, " .
                                                $title->getPrefixedDBkey() .
-                                               " uses content model " . $content->getModel() . ")" );
+                                               " uses content model " . $content->getModel() );
 
                                        $text = false;
                                }
@@ -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 f79083e..09a0f3d 100644 (file)
@@ -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' );
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 cae9673..53a68fd 100644 (file)
@@ -39,6 +39,9 @@ class ApiSetNotificationTimestamp extends ApiBase {
                if ( $user->isAnon() ) {
                        $this->dieUsage( 'Anonymous users cannot use watchlist change notifications', 'notloggedin' );
                }
+               if ( !$user->isAllowed( 'editmywatchlist' ) ) {
+                       $this->dieUsage( 'You don\'t have permission to edit your watchlist', 'permissiondenied' );
+               }
 
                $params = $this->extractRequestParams();
                $this->requireMaxOneParameter( $params, 'timestamp', 'torevid', 'newerthanrevid' );
@@ -270,7 +273,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 719032f..34741b5 100644 (file)
@@ -56,15 +56,19 @@ 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'];
                }
 
                // Select an upload module
-               if ( !$this->selectUploadModule() ) {
-                       return; // not a true upload, but a status request or similar
-               } elseif ( !isset( $this->mUpload ) ) {
-                       $this->dieUsage( 'No upload module set', 'nomodule' );
+               try {
+                       if ( !$this->selectUploadModule() ) {
+                               return; // not a true upload, but a status request or similar
+                       } elseif ( !isset( $this->mUpload ) ) {
+                               $this->dieUsage( 'No upload module set', 'nomodule' );
+                       }
+               } catch ( UploadStashException $e ) { // XXX: don't spam exception log
+                       $this->dieUsage( get_class( $e ) . ": " . $e->getMessage(), 'stasherror' );
                }
 
                // First check permission to upload
@@ -82,15 +86,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();
                }
 
@@ -105,9 +110,13 @@ class ApiUpload extends ApiBase {
                }
 
                // Get the result based on the current upload context:
-               $result = $this->getContextResult();
-               if ( $result['result'] === 'Success' ) {
-                       $result['imageinfo'] = $this->mUpload->getImageInfo( $this->getResult() );
+               try {
+                       $result = $this->getContextResult();
+                       if ( $result['result'] === 'Success' ) {
+                               $result['imageinfo'] = $this->mUpload->getImageInfo( $this->getResult() );
+                       }
+               } catch ( UploadStashException $e ) { // XXX: don't spam exception log
+                       $this->dieUsage( get_class( $e ) . ": " . $e->getMessage(), 'stasherror' );
                }
 
                $this->getResult()->addValue( null, $this->getModuleName(), $result );
@@ -143,7 +152,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 +204,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 +224,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 +368,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'],
@@ -456,7 +470,7 @@ class ApiUpload extends ApiBase {
                global $wgFileExtensions;
 
                // @todo Move them to ApiBase's message map
-               switch( $verification['status'] ) {
+               switch ( $verification['status'] ) {
                        // Recoverable errors
                        case UploadBase::MIN_LENGTH_PARTNAME:
                                $this->dieRecoverableError( 'filename-tooshort', 'filename' );
@@ -588,12 +602,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 ) {
@@ -801,6 +815,7 @@ class ApiUpload extends ApiBase {
                                array( 'code' => 'publishfailed', 'info' => 'Publishing of stashed file failed' ),
                                array( 'code' => 'internal-error', 'info' => 'An internal error occurred' ),
                                array( 'code' => 'asynccopyuploaddisabled', 'info' => 'Asynchronous copy uploads disabled' ),
+                               array( 'code' => 'stasherror', 'info' => 'An upload stash error occurred' ),
                                array( 'fileexists-forbidden' ),
                                array( 'fileexists-shared-forbidden' ),
                        )
index b9b1eed..7d30828 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,10 +63,10 @@ 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();
-                       $this->dieUsageMsg( $errors[0] );
+                       $this->dieStatus( $status );
                } else {
                        $user = $status->value;
                }
@@ -83,7 +84,7 @@ class ApiUserrights extends ApiBase {
        }
 
        public function getAllowedParams() {
-               return array (
+               return array(
                        'user' => array(
                                ApiBase::PARAM_TYPE => 'string',
                                ApiBase::PARAM_REQUIRED => true
index 3e51299..c7d636a 100644 (file)
@@ -36,6 +36,9 @@ class ApiWatch extends ApiBase {
                if ( !$user->isLoggedIn() ) {
                        $this->dieUsage( 'You must be logged-in to have a watchlist', 'notloggedin' );
                }
+               if ( !$user->isAllowed( 'editmywatchlist' ) ) {
+                       $this->dieUsage( 'You don\'t have permission to edit your watchlist', 'permissiondenied' );
+               }
 
                $params = $this->extractRequestParams();
                $title = Title::newFromText( $params['title'] );
@@ -57,19 +60,19 @@ class ApiWatch extends ApiBase {
                if ( $params['unwatch'] ) {
                        $res['unwatched'] = '';
                        $res['message'] = $this->msg( 'removedwatchtext', $title->getPrefixedText() )->title( $title )->parseAsBlock();
-                       $success = UnwatchAction::doUnwatch( $title, $user );
+                       $status = UnwatchAction::doUnwatch( $title, $user );
                } else {
                        $res['watched'] = '';
                        $res['message'] = $this->msg( 'addedwatchtext', $title->getPrefixedText() )->title( $title )->parseAsBlock();
-                       $success = WatchAction::doWatch( $title, $user );
+                       $status = WatchAction::doWatch( $title, $user );
                }
 
                if ( !is_null( $oldLang ) ) {
                        $this->getContext()->setLanguage( $oldLang ); // Reset language to $oldLang
                }
 
-               if ( !$success ) {
-                       $this->dieUsageMsg( 'hookaborted' );
+               if ( !$status->isOK() ) {
+                       $this->dieStatus( $status );
                }
                $this->getResult()->addValue( null, $this->getModuleName(), $res );
        }
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 791ae3e..992809e 100644 (file)
@@ -62,7 +62,10 @@ class HTMLCacheUpdate implements DeferrableUpdate {
                        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 d093b58..bdc2d78 100644 (file)
@@ -499,7 +499,7 @@ class LocalisationCache {
                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' ) {
@@ -525,7 +525,7 @@ class LocalisationCache {
                }
                try {
                        $compiledRules = CLDRPluralRuleEvaluator::compile( $rules );
-               } catch( CLDRPluralRuleError $e ) {
+               } catch ( CLDRPluralRuleError $e ) {
                        wfDebugLog( 'l10n', $e->getMessage() . "\n" );
                        return array();
                }
@@ -551,7 +551,7 @@ class LocalisationCache {
        /**
         * Get the plural rule types for a given language from the XML files.
         * Cached.
-        * @since 1.21
+        * @since 1.22
         */
        public function getPluralRuleTypes( $code ) {
                if ( $this->pluralRuleTypes === null ) {
index 6cc2a7e..fcefc06 100644 (file)
  */
 
 /**
- *
+ * MediaWiki message cache structure version.
+ * Bump this whenever the message cache format has changed.
+ */
+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 );
-define( 'MSG_CACHE_VERSION', 1 );
 
 /**
  * Message cache
@@ -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;
 
@@ -98,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 );
@@ -205,7 +234,7 @@ class MessageCache {
        function load( $code = false ) {
                global $wgUseLocalMessageCache;
 
-               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" );
@@ -592,7 +621,10 @@ class MessageCache {
        }
 
        /**
-        * Represents a write lock on the messages key
+        * Represents a write lock on the messages key.
+        *
+        * Will retry MessageCache::MSG_WAIT_TIMEOUT times, each operations having
+        * a timeout of MessageCache::MSG_LOCK_TIMEOUT.
         *
         * @param string $key
         * @return Boolean: success
@@ -628,51 +660,62 @@ class MessageCache {
        /**
         * Get a message from either the content language or the user language.
         *
-        * @param string $key The message cache key
-        * @param bool $useDB Get the message from the DB, false to use only
-        *               the localisation
-        * @param bool|string $langcode Code of the language to get the message for, if
-        *                  it is a valid code create a language for that language,
-        *                  if it is a string but not a valid code then make a basic
-        *                  language object, if it is a false boolean then use the
-        *                  current users language (as a fallback for the old
-        *                  parameter functionality), or if it is a true boolean
-        *                  then use the wikis content language (also as a
-        *                  fallback).
-        * @param bool $isFullKey Specifies whether $key is a two part key "msg/lang".
+        * 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.
         *
-        * @throws MWException
-        * @return string|bool
+        * 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 bool $isFullKey specifies whether $key is a two part key
+        *                   "msg/lang".
+        *
+        * @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;
 
-               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 );
-               }
+               $section = new ProfileSection( __METHOD__ );
 
-               if ( !is_string( $key ) ) {
+               if ( is_int( $key ) ) {
+                       // 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
+               } elseif ( $key === '' ) {
+                       // Shortcut: the empty key is always missing
                        return false;
                }
 
-               $lang = wfGetLangObj( $langcode );
-               if ( !$lang ) {
-                       throw new MWException( "Bad lang code $langcode given" );
+               // 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 );
                }
 
-               $langcode = $lang->getCode();
-
-               $message = false;
-
-               # 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 );
@@ -681,61 +724,135 @@ class MessageCache {
                        $uckey = $wgContLang->ucfirst( $lckey );
                }
 
-               # Try the MediaWiki namespace
-               if ( !$this->mDisable && $useDB ) {
-                       $title = $uckey;
-                       if ( !$isFullKey && ( $langcode != $wgLanguageCode ) ) {
-                               $title .= '/' . $langcode;
-                       }
-                       $message = $this->getMsgFromNamespace( $title, $langcode );
-               }
-
-               # Try the array in the language object
-               if ( $message === false ) {
-                       $message = $lang->getMessage( $lckey );
-                       if ( is_null( $message ) ) {
-                               $message = false;
-                       }
-               }
+               // 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 );
 
-               # Try the array of another language
+               // 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.
+                       // 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 ) ) {
+                               if ( $message === null ) {
                                        $message = false;
                                }
                        }
                }
 
-               # Is this a custom message? Try the default language in the db...
-               if ( ( $message === false || $message === '-' ) &&
-                       !$this->mDisable && $useDB &&
-                       !$isFullKey && ( $langcode != $wgLanguageCode )
-               ) {
+               // 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;
+
+               // 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;
+               }
+
+               // 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/$code", $code );
+                               }
+
+                               if ( $message !== false ) {
+                                       // Found the message.
+                                       return $message;
+                               }
+                       }
+               }
+
+               // Now try checking the site language.
+               if ( $useDB ) {
                        $message = $this->getMsgFromNamespace( $uckey, $wgLanguageCode );
+                       if ( $message !== false ) {
+                               return $message;
+                       }
                }
 
-               # Final fallback
-               if ( $message === false ) {
-                       return false;
+               $message = $wgContLang->getMessage( $lckey );
+               if ( $message !== null ) {
+                       return $message;
                }
 
-               # 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",
-                       ) );
+               // 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 );
+                               }
 
-               return $message;
+                               if ( $message !== false ) {
+                                       // Found the message.
+                                       return $message;
+                               }
+                       }
+               }
+
+               return false;
        }
 
        /**
@@ -748,14 +865,16 @@ class MessageCache {
         *
         * @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
+        * @return string|bool The message, or false iff it does not exist or on error
         */
        function getMsgFromNamespace( $title, $code ) {
                $this->load( $code );
                if ( isset( $this->mCache[$code][$title] ) ) {
                        $entry = $this->mCache[$code][$title];
                        if ( substr( $entry, 0, 1 ) === ' ' ) {
-                               return substr( $entry, 1 );
+                               // The message exists, so make sure a string
+                               // is returned.
+                               return (string)substr( $entry, 1 );
                        } elseif ( $entry === '!NONEXISTENT' ) {
                                return false;
                        } elseif ( $entry === '!TOO BIG' ) {
@@ -778,7 +897,9 @@ class MessageCache {
                if ( $entry ) {
                        if ( substr( $entry, 0, 1 ) === ' ' ) {
                                $this->mCache[$code][$title] = $entry;
-                               return substr( $entry, 1 );
+                               // The message exists, so make sure a string
+                               // is returned.
+                               return (string)substr( $entry, 1 );
                        } elseif ( $entry === '!NONEXISTENT' ) {
                                $this->mCache[$code][$title] = '!NONEXISTENT';
                                return false;
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 5f5d257..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,14 @@ 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' );
                                }
index 694c1a1..6085f58 100644 (file)
@@ -63,7 +63,7 @@ class UserCache {
         *
         * @param integer $userId
         * @param string $ip
-        * @since 1.21
+        * @since 1.22
         */
        public function getUserName( $userId, $ip ) {
                return $userId > 0 ? $this->getProp( $userId, 'name' ) : $ip;
@@ -81,6 +81,8 @@ class UserCache {
                $usersToCheck = array();
                $usersToQuery = array();
 
+               $userIds = array_unique( $userIds );
+
                foreach ( $userIds as $userId ) {
                        $userId = (int)$userId;
                        if ( $userId <= 0 ) {
index a15e80b..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;
 
        /**
         * @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'];
@@ -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 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 9c5ebcd..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 {
index 569d122..03cc2d0 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 );
index 9cd947f..2ae572b 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();
index 8fafcb6..f66dacd 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;
index 580ec75..26337db 100644 (file)
@@ -61,7 +61,7 @@ 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 " .
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()
                );
        }
 
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 2142232..a86d6be 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" );
                }
        }
@@ -731,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,
@@ -771,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;
        }
 
@@ -869,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
@@ -944,14 +945,6 @@ abstract class DatabaseBase implements DatabaseType {
                        wfDebug( "Query {$this->mDBname} ($cnt) ($master): $sqlx\n" );
                }
 
-               if ( istainted( $sql ) & TC_MYSQL ) {
-                       if ( !Profiler::instance()->isStub() ) {
-                               wfProfileOut( $queryProf );
-                               wfProfileOut( $totalProf );
-                       }
-                       throw new MWException( 'Tainted query found' );
-               }
-
                $queryId = MWDebug::query( $sql, $fname, $isMaster );
 
                # Do the query and handle errors
@@ -964,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() ) {
@@ -1145,7 +1139,7 @@ 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',
+       public function selectField( $table, $var, $cond = '', $fname = __METHOD__,
                $options = array()
        ) {
                if ( !is_array( $options ) ) {
@@ -1245,7 +1239,7 @@ abstract class DatabaseBase implements DatabaseType {
                        $startOpts .= ' SQL_NO_CACHE';
                }
 
-               if ( isset( $options['USE INDEX'] ) && ! is_array( $options['USE INDEX'] ) ) {
+               if ( isset( $options['USE INDEX'] ) && is_string( $options['USE INDEX'] ) ) {
                        $useIndex = $this->useIndexClause( $options['USE INDEX'] );
                } else {
                        $useIndex = '';
@@ -1436,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 );
 
@@ -1459,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 ) ) {
@@ -1467,28 +1461,26 @@ abstract class DatabaseBase implements DatabaseType {
                }
 
                $options = (array)$options;
+               $useIndexes = ( isset( $options['USE INDEX'] ) && is_array( $options['USE INDEX'] ) )
+                       ? $options['USE INDEX']
+                       : array();
 
                if ( is_array( $table ) ) {
-                       $useIndex = ( isset( $options['USE INDEX'] ) && is_array( $options['USE INDEX'] ) )
-                               ? $options['USE INDEX']
-                               : array();
-                       if ( count( $join_conds ) || count( $useIndex ) ) {
-                               $from = ' FROM ' .
-                                       $this->tableNamesWithUseIndexOrJOIN( $table, $useIndex, $join_conds );
-                       } else {
-                               $from = ' FROM ' . implode( ',', $this->tableNamesWithAlias( $table ) );
-                       }
+                       $from = ' FROM ' .
+                               $this->tableNamesWithUseIndexOrJOIN( $table, $useIndexes, $join_conds );
                } elseif ( $table != '' ) {
                        if ( $table[0] == ' ' ) {
                                $from = ' FROM ' . $table;
                        } else {
-                               $from = ' FROM ' . $this->tableName( $table );
+                               $from = ' FROM ' .
+                                       $this->tableNamesWithUseIndexOrJOIN( array( $table ), $useIndexes, array() );
                        }
                } else {
                        $from = '';
                }
 
-               list( $startOpts, $useIndex, $preLimitTail, $postLimitTail ) = $this->makeSelectOptions( $options );
+               list( $startOpts, $useIndex, $preLimitTail, $postLimitTail ) =
+                       $this->makeSelectOptions( $options );
 
                if ( !empty( $conds ) ) {
                        if ( is_array( $conds ) ) {
@@ -1526,7 +1518,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;
@@ -1567,7 +1559,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 );
@@ -1616,7 +1608,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;
@@ -1633,8 +1625,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;
                }
 
@@ -1738,7 +1730,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;
@@ -1837,7 +1829,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 );
@@ -2266,11 +2258,11 @@ abstract class DatabaseBase implements DatabaseType {
                }
 
                // We can't separate explicit JOIN clauses with ',', use ' ' for those
-               $straightJoins = !empty( $ret ) ? implode( ',', $ret ) : "";
-               $otherJoins = !empty( $retJOIN ) ? implode( ' ', $retJOIN ) : "";
+               $implicitJoins = !empty( $ret ) ? implode( ',', $ret ) : "";
+               $explicitJoins = !empty( $retJOIN ) ? implode( ' ', $retJOIN ) : "";
 
                // Compile our final table clause
-               return implode( ' ', array( $straightJoins, $otherJoins ) );
+               return implode( ' ', array( $implicitJoins, $explicitJoins ) );
        }
 
        /**
@@ -2283,9 +2275,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] ) ) {
@@ -2454,7 +2446,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 ) {
@@ -2466,7 +2458,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 ";
@@ -2535,6 +2527,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.
         *
@@ -2557,7 +2635,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,
@@ -2623,7 +2701,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' );
                }
@@ -2632,7 +2710,10 @@ abstract class DatabaseBase implements DatabaseType {
                $sql = "DELETE FROM $table";
 
                if ( $conds != '*' ) {
-                       $sql .= ' WHERE ' . $this->makeList( $conds, LIST_AND );
+                       if ( is_array( $conds ) ) {
+                               $conds = $this->makeList( $conds, LIST_AND );
+                       }
+                       $sql .= ' WHERE ' . $conds;
                }
 
                return $this->query( $sql, $fname );
@@ -2665,7 +2746,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 );
@@ -2857,7 +2938,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];
@@ -2874,7 +2955,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 );
                                }
@@ -2964,24 +3045,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
         */
@@ -3007,6 +3109,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.
@@ -3019,7 +3143,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
@@ -3040,6 +3164,7 @@ abstract class DatabaseBase implements DatabaseType {
                                }
                        }
 
+                       $this->runOnTransactionPreCommitCallbacks();
                        $this->doCommit( $fname );
                        $this->runOnTransactionIdleCallbacks();
                }
@@ -3073,21 +3198,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();
        }
@@ -3113,12 +3239,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
        }
 
        /**
@@ -3150,7 +3277,7 @@ 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' );
@@ -3163,7 +3290,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' );
        }
 
@@ -3387,7 +3514,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 = '';
 
@@ -3626,12 +3753,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 );
@@ -3704,8 +3831,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 82b0e5a..240a097 100644 (file)
@@ -96,7 +96,7 @@ class DatabaseMssql extends DatabaseBase {
 
                $connectionInfo = array();
 
-               if( $dbName ) {
+               if ( $dbName ) {
                        $connectionInfo['Database'] = $dbName;
                }
 
@@ -109,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;
@@ -297,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'] ) ) {
@@ -322,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'] );
                }
@@ -337,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;
        }
@@ -354,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 . "'";
@@ -399,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;
@@ -421,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 ) );
                }
@@ -434,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 ) {
                                        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;";
@@ -537,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 );
 
@@ -652,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]";
        }
 
@@ -672,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 ) ) {
@@ -686,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 ) ) {
@@ -706,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 );
@@ -719,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;
        }
@@ -727,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;
        }
@@ -736,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;
        }
@@ -1009,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
@@ -1047,7 +1049,7 @@ class MssqlResult {
                                $arrNum[] = $value;
                        }
                }
-               switch( $mode ) {
+               switch ( $mode ) {
                        case SQLSRV_FETCH_ASSOC:
                                $ret = $this->mRows[$this->mCursor];
                                break;
index d6f6809..b75d615 100644 (file)
  */
 
 /**
- * Database abstraction object for mySQL
- * Inherit all methods and properties of Database::Database()
+ * Database abstraction object for PHP extension mysql.
  *
  * @ingroup Database
  * @see Database
  */
-class DatabaseMysql extends DatabaseBase {
-
-       /**
-        * @return string
-        */
-       function getType() {
-               return 'mysql';
-       }
+class DatabaseMysql extends DatabaseMysqlBase {
 
        /**
         * @param $sql string
         * @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 );
@@ -50,40 +42,16 @@ class DatabaseMysql extends DatabaseBase {
                return $ret;
        }
 
-       /**
-        * @param $server string
-        * @param $user string
-        * @param $password string
-        * @param $dbName string
-        * @return bool
-        * @throws DBConnectionError
-        */
-       function open( $server, $user, $password, $dbName ) {
-               global $wgAllDBsAreLocalhost, $wgDBmysql5, $wgSQLMode;
-               wfProfileIn( __METHOD__ );
-
+       protected function mysqlConnect( $realServer ) {
                # Load mysql.so if we don't have it
                wfDl( 'mysql' );
 
                # 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" );
                }
 
-               # Debugging hack -- fake cluster
-               if ( $wgAllDBsAreLocalhost ) {
-                       $realServer = 'localhost';
-               } else {
-                       $realServer = $server;
-               }
-               $this->close();
-               $this->mServer = $server;
-               $this->mUser = $user;
-               $this->mPassword = $password;
-               $this->mDBname = $dbName;
-
                $connFlags = 0;
                if ( $this->mFlags & DBO_SSL ) {
                        $connFlags |= MYSQL_CLIENT_SSL;
@@ -92,81 +60,27 @@ class DatabaseMysql extends DatabaseBase {
                        $connFlags |= MYSQL_CLIENT_COMPRESS;
                }
 
-               wfProfileIn( "dbconnect-$server" );
-
-               # The kernel's default SYN retransmission period is far too slow for us,
-               # so we use a short timeout plus a manual retry. Retrying means that a small
-               # but finite rate of SYN packet loss won't cause user-visible errors.
-               $this->mConn = false;
                if ( ini_get( 'mysql.connect_timeout' ) <= 3 ) {
                        $numAttempts = 2;
                } else {
                        $numAttempts = 1;
                }
-               $this->installErrorHandler();
-               for ( $i = 0; $i < $numAttempts && !$this->mConn; $i++ ) {
+
+               $conn = false;
+
+               for ( $i = 0; $i < $numAttempts && !$conn; $i++ ) {
                        if ( $i > 1 ) {
                                usleep( 1000 );
                        }
                        if ( $this->mFlags & DBO_PERSISTENT ) {
-                               $this->mConn = mysql_pconnect( $realServer, $user, $password, $connFlags );
+                               $conn = mysql_pconnect( $realServer, $this->mUser, $this->mPassword, $connFlags );
                        } else {
                                # Create a new connection...
-                               $this->mConn = mysql_connect( $realServer, $user, $password, true, $connFlags );
-                       }
-                       #if ( $this->mConn === false ) {
-                               #$iplus = $i + 1;
-                               #wfLogDBError("Connect loop error $iplus of $max ($server): " . mysql_errno() . " - " . mysql_error()."\n");
-                       #}
-               }
-               $error = $this->restoreErrorHandler();
-
-               wfProfileOut( "dbconnect-$server" );
-
-               # Always log connection errors
-               if ( !$this->mConn ) {
-                       if ( !$error ) {
-                               $error = $this->lastError();
-                       }
-                       wfLogDBError( "Error connecting to {$this->mServer}: $error\n" );
-                       wfDebug( "DB connection error\n" .
-                               "Server: $server, User: $user, Password: " .
-                               substr( $password, 0, 3 ) . "..., error: " . $error . "\n" );
-
-                       wfProfileOut( __METHOD__ );
-                       return $this->reportConnectionError( $error );
-               }
-
-               if ( $dbName != '' ) {
-                       wfSuppressWarnings();
-                       $success = mysql_select_db( $dbName, $this->mConn );
-                       wfRestoreWarnings();
-                       if ( !$success ) {
-                               wfLogDBError( "Error selecting database $dbName on server {$this->mServer}\n" );
-                               wfDebug( "Error selecting database $dbName on server {$this->mServer} " .
-                                       "from client host " . wfHostname() . "\n" );
-
-                               wfProfileOut( __METHOD__ );
-                               return $this->reportConnectionError( "Error selecting database $dbName" );
+                               $conn = mysql_connect( $realServer, $this->mUser, $this->mPassword, true, $connFlags );
                        }
                }
 
-               // Tell the server we're communicating with it in UTF-8.
-               // This may engage various charset conversions.
-               if( $wgDBmysql5 ) {
-                       $this->query( 'SET NAMES utf8', __METHOD__ );
-               } else {
-                       $this->query( 'SET NAMES binary', __METHOD__ );
-               }
-               // Set SQL mode, default is turning them all off, can be overridden or skipped with null
-               if ( is_string( $wgSQLMode ) ) {
-                       $mode = $this->addQuotes( $wgSQLMode );
-                       $this->query( "SET sql_mode = $mode", __METHOD__ );
-               }
-
-               $this->mOpened = true;
-               wfProfileOut( __METHOD__ );
-               return true;
+               return $conn;
        }
 
        /**
@@ -176,113 +90,6 @@ class DatabaseMysql extends DatabaseBase {
                return mysql_close( $this->mConn );
        }
 
-       /**
-        * @param $res ResultWrapper
-        * @throws DBUnexpectedError
-        */
-       function freeResult( $res ) {
-               if ( $res instanceof ResultWrapper ) {
-                       $res = $res->result;
-               }
-               wfSuppressWarnings();
-               $ok = mysql_free_result( $res );
-               wfRestoreWarnings();
-               if ( !$ok ) {
-                       throw new DBUnexpectedError( $this, "Unable to free MySQL result" );
-               }
-       }
-
-       /**
-        * @param $res ResultWrapper
-        * @return object|bool
-        * @throws DBUnexpectedError
-        */
-       function fetchObject( $res ) {
-               if ( $res instanceof ResultWrapper ) {
-                       $res = $res->result;
-               }
-               wfSuppressWarnings();
-               $row = mysql_fetch_object( $res );
-               wfRestoreWarnings();
-
-               $errno = $this->lastErrno();
-               // Unfortunately, mysql_fetch_object does not reset the last errno.
-               // 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 ) {
-                       throw new DBUnexpectedError( $this, 'Error in fetchObject(): ' . htmlspecialchars( $this->lastError() ) );
-               }
-               return $row;
-       }
-
-       /**
-        * @param $res ResultWrapper
-        * @return array|bool
-        * @throws DBUnexpectedError
-        */
-       function fetchRow( $res ) {
-               if ( $res instanceof ResultWrapper ) {
-                       $res = $res->result;
-               }
-               wfSuppressWarnings();
-               $row = mysql_fetch_array( $res );
-               wfRestoreWarnings();
-
-               $errno = $this->lastErrno();
-               // Unfortunately, mysql_fetch_array does not reset the last errno.
-               // 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 ) {
-                       throw new DBUnexpectedError( $this, 'Error in fetchRow(): ' . htmlspecialchars( $this->lastError() ) );
-               }
-               return $row;
-       }
-
-       /**
-        * @throws DBUnexpectedError
-        * @param $res ResultWrapper
-        * @return int
-        */
-       function numRows( $res ) {
-               if ( $res instanceof ResultWrapper ) {
-                       $res = $res->result;
-               }
-               wfSuppressWarnings();
-               $n = mysql_num_rows( $res );
-               wfRestoreWarnings();
-               // Unfortunately, mysql_num_rows does not reset the last errno.
-               // We are not checking for any errors here, since
-               // these are no errors mysql_num_rows can cause.
-               // See http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
-               // See https://bugzilla.wikimedia.org/42430
-               return $n;
-       }
-
-       /**
-        * @param $res ResultWrapper
-        * @return int
-        */
-       function numFields( $res ) {
-               if ( $res instanceof ResultWrapper ) {
-                       $res = $res->result;
-               }
-               return mysql_num_fields( $res );
-       }
-
-       /**
-        * @param $res ResultWrapper
-        * @param $n string
-        * @return string
-        */
-       function fieldName( $res, $n ) {
-               if ( $res instanceof ResultWrapper ) {
-                       $res = $res->result;
-               }
-               return mysql_field_name( $res, $n );
-       }
-
        /**
         * @return int
         */
@@ -290,18 +97,6 @@ class DatabaseMysql extends DatabaseBase {
                return mysql_insert_id( $this->mConn );
        }
 
-       /**
-        * @param $res ResultWrapper
-        * @param $row
-        * @return bool
-        */
-       function dataSeek( $res, $row ) {
-               if ( $res instanceof ResultWrapper ) {
-                       $res = $res->result;
-               }
-               return mysql_data_seek( $res, $row );
-       }
-
        /**
         * @return int
         */
@@ -313,27 +108,6 @@ class DatabaseMysql extends DatabaseBase {
                }
        }
 
-       /**
-        * @return string
-        */
-       function lastError() {
-               if ( $this->mConn ) {
-                       # Even if it's non-zero, it can still be invalid
-                       wfSuppressWarnings();
-                       $error = mysql_error( $this->mConn );
-                       if ( !$error ) {
-                               $error = mysql_error();
-                       }
-                       wfRestoreWarnings();
-               } else {
-                       $error = mysql_error();
-               }
-               if( $error ) {
-                       $error .= ' (' . $this->mServer . ')';
-               }
-               return $error;
-       }
-
        /**
         * @return int
         */
@@ -341,100 +115,6 @@ class DatabaseMysql extends DatabaseBase {
                return mysql_affected_rows( $this->mConn );
        }
 
-       /**
-        * @param $table string
-        * @param $uniqueIndexes
-        * @param $rows array
-        * @param $fname string
-        * @return ResultWrapper
-        */
-       function replace( $table, $uniqueIndexes, $rows, $fname = 'DatabaseMysql::replace' ) {
-               return $this->nativeReplace( $table, $rows, $fname );
-       }
-
-       /**
-        * Estimate rows in dataset
-        * Returns estimated count, based on EXPLAIN output
-        * Takes same arguments as Database::select()
-        *
-        * @param $table string|array
-        * @param $vars string|array
-        * @param $conds string|array
-        * @param $fname string
-        * @param $options string|array
-        * @return int
-        */
-       public function estimateRowCount( $table, $vars = '*', $conds = '', $fname = 'DatabaseMysql::estimateRowCount', $options = array() ) {
-               $options['EXPLAIN'] = true;
-               $res = $this->select( $table, $vars, $conds, $fname, $options );
-               if ( $res === false ) {
-                       return false;
-               }
-               if ( !$this->numRows( $res ) ) {
-                       return 0;
-               }
-
-               $rows = 1;
-               foreach ( $res as $plan ) {
-                       $rows *= $plan->rows > 0 ? $plan->rows : 1; // avoid resetting to zero
-               }
-               return $rows;
-       }
-
-       /**
-        * @param $table string
-        * @param $field string
-        * @return bool|MySQLField
-        */
-       function fieldInfo( $table, $field ) {
-               $table = $this->tableName( $table );
-               $res = $this->query( "SELECT * FROM $table LIMIT 1", __METHOD__, true );
-               if ( !$res ) {
-                       return false;
-               }
-               $n = mysql_num_fields( $res->result );
-               for( $i = 0; $i < $n; $i++ ) {
-                       $meta = mysql_fetch_field( $res->result, $i );
-                       if( $field == $meta->name ) {
-                               return new MySQLField( $meta );
-                       }
-               }
-               return false;
-       }
-
-       /**
-        * Get information about an index into an object
-        * Returns false if the index does not exist
-        *
-        * @param $table string
-        * @param $index string
-        * @param $fname string
-        * @return bool|array|null False or null on failure
-        */
-       function indexInfo( $table, $index, $fname = 'DatabaseMysql::indexInfo' ) {
-               # 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
-               $table = $this->tableName( $table );
-               $index = $this->indexName( $index );
-
-               $sql = 'SHOW INDEX FROM ' . $table;
-               $res = $this->query( $sql, $fname );
-
-               if ( !$res ) {
-                       return null;
-               }
-
-               $result = array();
-
-               foreach ( $res as $row ) {
-                       if ( $row->Key_name == $index ) {
-                               $result[] = $row;
-                       }
-               }
-               return empty( $result ) ? false : $result;
-       }
-
        /**
         * @param $db
         * @return bool
@@ -444,208 +124,6 @@ class DatabaseMysql extends DatabaseBase {
                return mysql_select_db( $db, $this->mConn );
        }
 
-       /**
-        * @param $s string
-        *
-        * @return string
-        */
-       function strencode( $s ) {
-               $sQuoted = mysql_real_escape_string( $s, $this->mConn );
-
-               if( $sQuoted === false ) {
-                       $this->ping();
-                       $sQuoted = mysql_real_escape_string( $s, $this->mConn );
-               }
-               return $sQuoted;
-       }
-
-       /**
-        * MySQL uses `backticks` for identifier quoting instead of the sql standard "double quotes".
-        *
-        * @param $s string
-        *
-        * @return string
-        */
-       public function addIdentifierQuotes( $s ) {
-               return "`" . $this->strencode( $s ) . "`";
-       }
-
-       /**
-        * @param $name string
-        * @return bool
-        */
-       public function isQuotedIdentifier( $name ) {
-               return strlen( $name ) && $name[0] == '`' && substr( $name, -1, 1 ) == '`';
-       }
-
-       /**
-        * @return bool
-        */
-       function ping() {
-               $ping = mysql_ping( $this->mConn );
-               if ( $ping ) {
-                       return true;
-               }
-
-               mysql_close( $this->mConn );
-               $this->mOpened = false;
-               $this->mConn = false;
-               $this->open( $this->mServer, $this->mUser, $this->mPassword, $this->mDBname );
-               return true;
-       }
-
-       /**
-        * Returns slave lag.
-        *
-        * This will do a SHOW SLAVE STATUS
-        *
-        * @return int
-        */
-       function getLag() {
-               if ( !is_null( $this->mFakeSlaveLag ) ) {
-                       wfDebug( "getLag: fake slave lagged {$this->mFakeSlaveLag} seconds\n" );
-                       return $this->mFakeSlaveLag;
-               }
-
-               return $this->getLagFromSlaveStatus();
-       }
-
-       /**
-        * @return bool|int
-        */
-       function getLagFromSlaveStatus() {
-               $res = $this->query( 'SHOW SLAVE STATUS', __METHOD__ );
-               if ( !$res ) {
-                       return false;
-               }
-               $row = $res->fetchObject();
-               if ( !$row ) {
-                       return false;
-               }
-               if ( strval( $row->Seconds_Behind_Master ) === '' ) {
-                       return false;
-               } else {
-                       return intval( $row->Seconds_Behind_Master );
-               }
-       }
-
-       /**
-        * @deprecated in 1.19, use getLagFromSlaveStatus
-        *
-        * @return bool|int
-        */
-       function getLagFromProcesslist() {
-               wfDeprecated( __METHOD__, '1.19' );
-               $res = $this->query( 'SHOW PROCESSLIST', __METHOD__ );
-               if( !$res ) {
-                       return false;
-               }
-               # Find slave SQL thread
-               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.
-                        *
-                        * Relay log I/O thread does not select databases.
-                        */
-                       if ( $row->User == 'system user' &&
-                               $row->State != 'Waiting for master to send event' &&
-                               $row->State != 'Connecting to master' &&
-                               $row->State != 'Queueing master event to the relay log' &&
-                               $row->State != 'Waiting for master update' &&
-                               $row->State != 'Requesting binlog dump' &&
-                               $row->State != 'Waiting to reconnect after a failed master event read' &&
-                               $row->State != 'Reconnecting after a failed master event read' &&
-                               $row->State != 'Registering slave on master'
-                               ) {
-                               # This is it, return the time (except -ve)
-                               if ( $row->Time > 0x7fffffff ) {
-                                       return false;
-                               } else {
-                                       return $row->Time;
-                               }
-                       }
-               }
-               return false;
-       }
-
-       /**
-        * Wait for the slave to catch up to a given master position.
-        *
-        * @param $pos DBMasterPos object
-        * @param $timeout Integer: the maximum number of seconds to wait for synchronisation
-        * @return bool|string
-        */
-       function masterPosWait( DBMasterPos $pos, $timeout ) {
-               $fname = 'DatabaseBase::masterPosWait';
-               wfProfileIn( $fname );
-
-               # Commit any open transactions
-               if ( $this->mTrxLevel ) {
-                       $this->commit( __METHOD__ );
-               }
-
-               if ( !is_null( $this->mFakeSlaveLag ) ) {
-                       $status = parent::masterPosWait( $pos, $timeout );
-                       wfProfileOut( $fname );
-                       return $status;
-               }
-
-               # Call doQuery() directly, to avoid opening a transaction if DBO_TRX is set
-               $encFile = $this->addQuotes( $pos->file );
-               $encPos = intval( $pos->pos );
-               $sql = "SELECT MASTER_POS_WAIT($encFile, $encPos, $timeout)";
-               $res = $this->doQuery( $sql );
-
-               if ( $res && $row = $this->fetchRow( $res ) ) {
-                       wfProfileOut( $fname );
-                       return $row[0];
-               }
-               wfProfileOut( $fname );
-               return false;
-       }
-
-       /**
-        * Get the position of the master from SHOW SLAVE STATUS
-        *
-        * @return MySQLMasterPos|bool
-        */
-       function getSlavePos() {
-               if ( !is_null( $this->mFakeSlaveLag ) ) {
-                       return parent::getSlavePos();
-               }
-
-               $res = $this->query( 'SHOW SLAVE STATUS', 'DatabaseBase::getSlavePos' );
-               $row = $this->fetchObject( $res );
-
-               if ( $row ) {
-                       $pos = isset( $row->Exec_master_log_pos ) ? $row->Exec_master_log_pos : $row->Exec_Master_Log_Pos;
-                       return new MySQLMasterPos( $row->Relay_Master_Log_File, $pos );
-               } else {
-                       return false;
-               }
-       }
-
-       /**
-        * Get the position of the master from SHOW MASTER STATUS
-        *
-        * @return MySQLMasterPos|bool
-        */
-       function getMasterPos() {
-               if ( $this->mFakeMaster ) {
-                       return parent::getMasterPos();
-               }
-
-               $res = $this->query( 'SHOW MASTER STATUS', 'DatabaseBase::getMasterPos' );
-               $row = $this->fetchObject( $res );
-
-               if ( $row ) {
-                       return new MySQLMasterPos( $row->File, $row->Position );
-               } else {
-                       return false;
-               }
-       }
-
        /**
         * @return string
         */
@@ -653,388 +131,47 @@ class DatabaseMysql extends DatabaseBase {
                return mysql_get_server_info( $this->mConn );
        }
 
-       /**
-        * @param $index
-        * @return string
-        */
-       function useIndexClause( $index ) {
-               return "FORCE INDEX (" . $this->indexName( $index ) . ")";
-       }
-
-       /**
-        * @return string
-        */
-       function lowPriorityOption() {
-               return 'LOW_PRIORITY';
+       protected function mysqlFreeResult( $res ) {
+               return mysql_free_result( $res );
        }
 
-       /**
-        * @return string
-        */
-       public static function getSoftwareLink() {
-               return '[http://www.mysql.com/ MySQL]';
-       }
-
-       /**
-        * @param $options array
-        */
-       public function setSessionOptions( array $options ) {
-               if ( isset( $options['connTimeout'] ) ) {
-                       $timeout = (int)$options['connTimeout'];
-                       $this->query( "SET net_read_timeout=$timeout" );
-                       $this->query( "SET net_write_timeout=$timeout" );
-               }
+       protected function mysqlFetchObject( $res ) {
+               return mysql_fetch_object( $res );
        }
 
-       public function streamStatementEnd( &$sql, &$newLine ) {
-               if ( strtoupper( substr( $newLine, 0, 9 ) ) == 'DELIMITER' ) {
-                       preg_match( '/^DELIMITER\s+(\S+)/', $newLine, $m );
-                       $this->delimiter = $m[1];
-                       $newLine = '';
-               }
-               return parent::streamStatementEnd( $sql, $newLine );
+       protected function mysqlFetchArray( $res ) {
+               return mysql_fetch_array( $res );
        }
 
-       /**
-        * Check to see if a named lock is available. This is non-blocking.
-        *
-        * @param string $lockName name of lock to poll
-        * @param string $method name of method calling us
-        * @return Boolean
-        * @since 1.20
-        */
-       public function lockIsFree( $lockName, $method ) {
-               $lockName = $this->addQuotes( $lockName );
-               $result = $this->query( "SELECT IS_FREE_LOCK($lockName) AS lockstatus", $method );
-               $row = $this->fetchObject( $result );
-               return ( $row->lockstatus == 1 );
+       protected function mysqlNumRows( $res ) {
+               return mysql_num_rows( $res );
        }
 
-       /**
-        * @param $lockName string
-        * @param $method string
-        * @param $timeout int
-        * @return bool
-        */
-       public function lock( $lockName, $method, $timeout = 5 ) {
-               $lockName = $this->addQuotes( $lockName );
-               $result = $this->query( "SELECT GET_LOCK($lockName, $timeout) AS lockstatus", $method );
-               $row = $this->fetchObject( $result );
-
-               if( $row->lockstatus == 1 ) {
-                       return true;
-               } else {
-                       wfDebug( __METHOD__ . " failed to acquire lock\n" );
-                       return false;
-               }
-       }
-
-       /**
-        * FROM MYSQL DOCS: http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_release-lock
-        * @param $lockName string
-        * @param $method string
-        * @return bool
-        */
-       public function unlock( $lockName, $method ) {
-               $lockName = $this->addQuotes( $lockName );
-               $result = $this->query( "SELECT RELEASE_LOCK($lockName) as lockstatus", $method );
-               $row = $this->fetchObject( $result );
-               return ( $row->lockstatus == 1 );
-       }
-
-       /**
-        * @param $read array
-        * @param $write array
-        * @param $method string
-        * @param $lowPriority bool
-        * @return bool
-        */
-       public function lockTables( $read, $write, $method, $lowPriority = true ) {
-               $items = array();
-
-               foreach( $write as $table ) {
-                       $tbl = $this->tableName( $table ) .
-                                       ( $lowPriority ? ' LOW_PRIORITY' : '' ) .
-                                       ' WRITE';
-                       $items[] = $tbl;
-               }
-               foreach( $read as $table ) {
-                       $items[] = $this->tableName( $table ) . ' READ';
-               }
-               $sql = "LOCK TABLES " . implode( ',', $items );
-               $this->query( $sql, $method );
-               return true;
-       }
-
-       /**
-        * @param $method string
-        * @return bool
-        */
-       public function unlockTables( $method ) {
-               $this->query( "UNLOCK TABLES", $method );
-               return true;
-       }
-
-       /**
-        * Get search engine class. All subclasses of this
-        * need to implement this if they wish to use searching.
-        *
-        * @return String
-        */
-       public function getSearchEngine() {
-               return 'SearchMySQL';
-       }
-
-       /**
-        * @param bool $value
-        * @return mixed
-        */
-       public function setBigSelects( $value = true ) {
-               if ( $value === 'default' ) {
-                       if ( $this->mDefaultBigSelects === null ) {
-                               # Function hasn't been called before so it must already be set to the default
-                               return;
-                       } else {
-                               $value = $this->mDefaultBigSelects;
-                       }
-               } elseif ( $this->mDefaultBigSelects === null ) {
-                       $this->mDefaultBigSelects = (bool)$this->selectField( false, '@@sql_big_selects' );
-               }
-               $encValue = $value ? '1' : '0';
-               $this->query( "SET sql_big_selects=$encValue", __METHOD__ );
-       }
-
-       /**
-        * DELETE where the condition is a join. MySql uses multi-table deletes.
-        * @param $delTable string
-        * @param $joinTable string
-        * @param $delVar string
-        * @param $joinVar string
-        * @param $conds array|string
-        * @param bool|string $fname bool
-        * @throws DBUnexpectedError
-        * @return bool|ResultWrapper
-        */
-       function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname = 'DatabaseBase::deleteJoin' ) {
-               if ( !$conds ) {
-                       throw new DBUnexpectedError( $this, 'DatabaseBase::deleteJoin() called with empty $conds' );
-               }
-
-               $delTable = $this->tableName( $delTable );
-               $joinTable = $this->tableName( $joinTable );
-               $sql = "DELETE $delTable FROM $delTable, $joinTable WHERE $delVar=$joinVar ";
-
-               if ( $conds != '*' ) {
-                       $sql .= ' AND ' . $this->makeList( $conds, LIST_AND );
-               }
-
-               return $this->query( $sql, $fname );
-       }
-
-       /**
-        * Determines how long the server has been up
-        *
-        * @return int
-        */
-       function getServerUptime() {
-               $vars = $this->getMysqlStatus( 'Uptime' );
-               return (int)$vars['Uptime'];
-       }
-
-       /**
-        * Determines if the last failure was due to a deadlock
-        *
-        * @return bool
-        */
-       function wasDeadlock() {
-               return $this->lastErrno() == 1213;
-       }
-
-       /**
-        * Determines if the last failure was due to a lock timeout
-        *
-        * @return bool
-        */
-       function wasLockTimeout() {
-               return $this->lastErrno() == 1205;
-       }
-
-       /**
-        * Determines if the last query error was something that should be dealt
-        * with by pinging the connection and reissuing the query
-        *
-        * @return bool
-        */
-       function wasErrorReissuable() {
-               return $this->lastErrno() == 2013 || $this->lastErrno() == 2006;
-       }
-
-       /**
-        * Determines if the last failure was due to the database being read-only.
-        *
-        * @return bool
-        */
-       function wasReadOnlyError() {
-               return $this->lastErrno() == 1223 ||
-                       ( $this->lastErrno() == 1290 && strpos( $this->lastError(), '--read-only' ) !== false );
-       }
-
-       /**
-        * @param $oldName
-        * @param $newName
-        * @param $temporary bool
-        * @param $fname string
-        */
-       function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = 'DatabaseMysql::duplicateTableStructure' ) {
-               $tmp = $temporary ? 'TEMPORARY ' : '';
-               $newName = $this->addIdentifierQuotes( $newName );
-               $oldName = $this->addIdentifierQuotes( $oldName );
-               $query = "CREATE $tmp TABLE $newName (LIKE $oldName)";
-               $this->query( $query, $fname );
-       }
-
-       /**
-        * List all tables on the database
-        *
-        * @param string $prefix Only show tables with this prefix, e.g. mw_
-        * @param string $fname calling function name
-        * @return array
-        */
-       function listTables( $prefix = null, $fname = 'DatabaseMysql::listTables' ) {
-               $result = $this->query( "SHOW TABLES", $fname);
-
-               $endArray = array();
-
-               foreach( $result as $table ) {
-                       $vars = get_object_vars( $table );
-                       $table = array_pop( $vars );
-
-                       if( !$prefix || strpos( $table, $prefix ) === 0 ) {
-                               $endArray[] = $table;
-                       }
-               }
-
-               return $endArray;
-       }
-
-       /**
-        * @param $tableName
-        * @param $fName string
-        * @return bool|ResultWrapper
-        */
-       public function dropTable( $tableName, $fName = 'DatabaseMysql::dropTable' ) {
-               if( !$this->tableExists( $tableName, $fName ) ) {
-                       return false;
-               }
-               return $this->query( "DROP TABLE IF EXISTS " . $this->tableName( $tableName ), $fName );
-       }
-
-       /**
-        * @return array
-        */
-       protected function getDefaultSchemaVars() {
-               $vars = parent::getDefaultSchemaVars();
-               $vars['wgDBTableOptions'] = str_replace( 'TYPE', 'ENGINE', $GLOBALS['wgDBTableOptions'] );
-               $vars['wgDBTableOptions'] = str_replace( 'CHARSET=mysql4', 'CHARSET=binary', $vars['wgDBTableOptions'] );
-               return $vars;
-       }
-
-       /**
-        * Get status information from SHOW STATUS in an associative array
-        *
-        * @param $which string
-        * @return array
-        */
-       function getMysqlStatus( $which = "%" ) {
-               $res = $this->query( "SHOW STATUS LIKE '{$which}'" );
-               $status = array();
-
-               foreach ( $res as $row ) {
-                       $status[$row->Variable_name] = $row->Value;
-               }
-
-               return $status;
-       }
-
-}
-
-/**
- * Utility class.
- * @ingroup Database
- */
-class MySQLField implements Field {
-       private $name, $tablename, $default, $max_length, $nullable,
-               $is_pk, $is_unique, $is_multiple, $is_key, $type;
-
-       function __construct( $info ) {
-               $this->name = $info->name;
-               $this->tablename = $info->table;
-               $this->default = $info->def;
-               $this->max_length = $info->max_length;
-               $this->nullable = !$info->not_null;
-               $this->is_pk = $info->primary_key;
-               $this->is_unique = $info->unique_key;
-               $this->is_multiple = $info->multiple_key;
-               $this->is_key = ( $this->is_pk || $this->is_unique || $this->is_multiple );
-               $this->type = $info->type;
-       }
-
-       /**
-        * @return string
-        */
-       function name() {
-               return $this->name;
-       }
-
-       /**
-        * @return string
-        */
-       function tableName() {
-               return $this->tableName;
-       }
-
-       /**
-        * @return string
-        */
-       function type() {
-               return $this->type;
+       protected function mysqlNumFields( $res ) {
+               return mysql_num_fields( $res );
        }
 
-       /**
-        * @return bool
-        */
-       function isNullable() {
-               return $this->nullable;
+       protected function mysqlFetchField( $res, $n ) {
+               return mysql_fetch_field( $res, $n );
        }
 
-       function defaultValue() {
-               return $this->default;
+       protected function mysqlFieldName( $res, $n ) {
+               return mysql_field_name( $res, $n );
        }
 
-       /**
-        * @return bool
-        */
-       function isKey() {
-               return $this->is_key;
+       protected function mysqlDataSeek( $res, $row ) {
+               return mysql_data_seek( $res, $row );
        }
 
-       /**
-        * @return bool
-        */
-       function isMultipleKey() {
-               return $this->is_multiple;
+       protected function mysqlError( $conn = null ) {
+               return ( $conn !== null ) ? mysql_error( $conn ) : mysql_error(); // avoid warning
        }
-}
-
-class MySQLMasterPos implements DBMasterPos {
-       var $file, $pos;
 
-       function __construct( $file, $pos ) {
-               $this->file = $file;
-               $this->pos = $pos;
+       protected function mysqlRealEscapeString( $s ) {
+               return mysql_real_escape_string( $s, $this->mConn );
        }
 
-       function __toString() {
-               return "{$this->file}/{$this->pos}";
+       protected function mysqlPing() {
+               return mysql_ping( $this->mConn );
        }
 }
diff --git a/includes/db/DatabaseMysqlBase.php b/includes/db/DatabaseMysqlBase.php
new file mode 100644 (file)
index 0000000..cae133b
--- /dev/null
@@ -0,0 +1,1098 @@
+<?php
+/**
+ * This is the MySQL database abstraction layer.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Database
+ */
+
+/**
+ * Database abstraction object for MySQL.
+ * Defines methods independent on used MySQL extension.
+ *
+ * @ingroup Database
+ * @since 1.22
+ * @see Database
+ */
+abstract class DatabaseMysqlBase extends DatabaseBase {
+       /** @var MysqlMasterPos */
+       protected $lastKnownSlavePos;
+
+       /**
+        * @return string
+        */
+       function getType() {
+               return 'mysql';
+       }
+
+       /**
+        * @param $server string
+        * @param $user string
+        * @param $password string
+        * @param $dbName string
+        * @return bool
+        * @throws DBConnectionError
+        */
+       function open( $server, $user, $password, $dbName ) {
+               global $wgAllDBsAreLocalhost, $wgDBmysql5, $wgSQLMode;
+               wfProfileIn( __METHOD__ );
+
+               # Debugging hack -- fake cluster
+               if ( $wgAllDBsAreLocalhost ) {
+                       $realServer = 'localhost';
+               } else {
+                       $realServer = $server;
+               }
+               $this->close();
+               $this->mServer = $server;
+               $this->mUser = $user;
+               $this->mPassword = $password;
+               $this->mDBname = $dbName;
+
+               wfProfileIn( "dbconnect-$server" );
+
+               # The kernel's default SYN retransmission period is far too slow for us,
+               # so we use a short timeout plus a manual retry. Retrying means that a small
+               # but finite rate of SYN packet loss won't cause user-visible errors.
+               $this->mConn = false;
+               $this->installErrorHandler();
+               try {
+                       $this->mConn = $this->mysqlConnect( $realServer );
+               } catch (Exception $ex) {
+                       wfProfileOut( "dbconnect-$server" );
+                       wfProfileOut( __METHOD__ );
+                       throw $ex;
+               }
+               $error = $this->restoreErrorHandler();
+
+               wfProfileOut( "dbconnect-$server" );
+
+               # Always log connection errors
+               if ( !$this->mConn ) {
+                       if ( !$error ) {
+                               $error = $this->lastError();
+                       }
+                       wfLogDBError( "Error connecting to {$this->mServer}: $error\n" );
+                       wfDebug( "DB connection error\n" .
+                               "Server: $server, User: $user, Password: " .
+                               substr( $password, 0, 3 ) . "..., error: " . $error . "\n" );
+
+                       wfProfileOut( __METHOD__ );
+                       return $this->reportConnectionError( $error );
+               }
+
+               if ( $dbName != '' ) {
+                       wfSuppressWarnings();
+                       $success = $this->selectDB( $dbName );
+                       wfRestoreWarnings();
+                       if ( !$success ) {
+                               wfLogDBError( "Error selecting database $dbName on server {$this->mServer}\n" );
+                               wfDebug( "Error selecting database $dbName on server {$this->mServer} " .
+                                       "from client host " . wfHostname() . "\n" );
+
+                               wfProfileOut( __METHOD__ );
+                               return $this->reportConnectionError( "Error selecting database $dbName" );
+                       }
+               }
+
+               // Tell the server we're communicating with it in UTF-8.
+               // This may engage various charset conversions.
+               if ( $wgDBmysql5 ) {
+                       $this->query( 'SET NAMES utf8', __METHOD__ );
+               } else {
+                       $this->query( 'SET NAMES binary', __METHOD__ );
+               }
+               // Set SQL mode, default is turning them all off, can be overridden or skipped with null
+               if ( is_string( $wgSQLMode ) ) {
+                       $mode = $this->addQuotes( $wgSQLMode );
+                       $this->query( "SET sql_mode = $mode", __METHOD__ );
+               }
+
+               $this->mOpened = true;
+               wfProfileOut( __METHOD__ );
+               return true;
+       }
+
+       /**
+        * Open a connection to a MySQL server
+        *
+        * @param $realServer string
+        * @return mixed Raw connection
+        * @throws DBConnectionError
+        */
+       abstract protected function mysqlConnect( $realServer );
+
+       /**
+        * @param $res ResultWrapper
+        * @throws DBUnexpectedError
+        */
+       function freeResult( $res ) {
+               if ( $res instanceof ResultWrapper ) {
+                       $res = $res->result;
+               }
+               wfSuppressWarnings();
+               $ok = $this->mysqlFreeResult( $res );
+               wfRestoreWarnings();
+               if ( !$ok ) {
+                       throw new DBUnexpectedError( $this, "Unable to free MySQL result" );
+               }
+       }
+
+       /**
+        * Free result memory
+        *
+        * @param $res Raw result
+        * @return bool
+        */
+       abstract protected function mysqlFreeResult( $res );
+
+       /**
+        * @param $res ResultWrapper
+        * @return object|bool
+        * @throws DBUnexpectedError
+        */
+       function fetchObject( $res ) {
+               if ( $res instanceof ResultWrapper ) {
+                       $res = $res->result;
+               }
+               wfSuppressWarnings();
+               $row = $this->mysqlFetchObject( $res );
+               wfRestoreWarnings();
+
+               $errno = $this->lastErrno();
+               // Unfortunately, mysql_fetch_object does not reset the last errno.
+               // 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 ) {
+                       throw new DBUnexpectedError( $this, 'Error in fetchObject(): ' . htmlspecialchars( $this->lastError() ) );
+               }
+               return $row;
+       }
+
+       /**
+        * Fetch a result row as an object
+        *
+        * @param $res Raw result
+        * @return stdClass
+        */
+       abstract protected function mysqlFetchObject( $res );
+
+       /**
+        * @param $res ResultWrapper
+        * @return array|bool
+        * @throws DBUnexpectedError
+        */
+       function fetchRow( $res ) {
+               if ( $res instanceof ResultWrapper ) {
+                       $res = $res->result;
+               }
+               wfSuppressWarnings();
+               $row = $this->mysqlFetchArray( $res );
+               wfRestoreWarnings();
+
+               $errno = $this->lastErrno();
+               // Unfortunately, mysql_fetch_array does not reset the last errno.
+               // Only check for CR_SERVER_LOST and CR_UNKNOWN_ERROR, as
+               // these are the only errors mysql_fetch_array can cause.
+               // See http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
+               if ( $errno == 2000 || $errno == 2013 ) {
+                       throw new DBUnexpectedError( $this, 'Error in fetchRow(): ' . htmlspecialchars( $this->lastError() ) );
+               }
+               return $row;
+       }
+
+       /**
+        * Fetch a result row as an associative and numeric array
+        *
+        * @param $res Raw result
+        * @return array
+        */
+       abstract protected function mysqlFetchArray( $res );
+
+       /**
+        * @throws DBUnexpectedError
+        * @param $res ResultWrapper
+        * @return int
+        */
+       function numRows( $res ) {
+               if ( $res instanceof ResultWrapper ) {
+                       $res = $res->result;
+               }
+               wfSuppressWarnings();
+               $n = $this->mysqlNumRows( $res );
+               wfRestoreWarnings();
+               // Unfortunately, mysql_num_rows does not reset the last errno.
+               // We are not checking for any errors here, since
+               // these are no errors mysql_num_rows can cause.
+               // See http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
+               // See https://bugzilla.wikimedia.org/42430
+               return $n;
+       }
+
+       /**
+        * Get number of rows in result
+        *
+        * @param $res Raw result
+        * @return int
+        */
+       abstract protected function mysqlNumRows( $res );
+
+       /**
+        * @param $res ResultWrapper
+        * @return int
+        */
+       function numFields( $res ) {
+               if ( $res instanceof ResultWrapper ) {
+                       $res = $res->result;
+               }
+               return $this->mysqlNumFields( $res );
+       }
+
+       /**
+        * Get number of fields in result
+        *
+        * @param $res Raw result
+        * @return int
+        */
+       abstract protected function mysqlNumFields( $res );
+
+       /**
+        * @param $res ResultWrapper
+        * @param $n string
+        * @return string
+        */
+       function fieldName( $res, $n ) {
+               if ( $res instanceof ResultWrapper ) {
+                       $res = $res->result;
+               }
+               return $this->mysqlFieldName( $res, $n );
+       }
+
+       /**
+        * Get the name of the specified field in a result
+        *
+        * @param $res Raw result
+        * @param $n int
+        * @return string
+        */
+       abstract protected function mysqlFieldName( $res, $n );
+
+       /**
+        * @param $res ResultWrapper
+        * @param $row
+        * @return bool
+        */
+       function dataSeek( $res, $row ) {
+               if ( $res instanceof ResultWrapper ) {
+                       $res = $res->result;
+               }
+               return $this->mysqlDataSeek( $res, $row );
+       }
+
+       /**
+        * Move internal result pointer
+        *
+        * @param $res Raw result
+        * @param $row int
+        * @return bool
+        */
+       abstract protected function mysqlDataSeek( $res, $row );
+
+       /**
+        * @return string
+        */
+       function lastError() {
+               if ( $this->mConn ) {
+                       # Even if it's non-zero, it can still be invalid
+                       wfSuppressWarnings();
+                       $error = $this->mysqlError( $this->mConn );
+                       if ( !$error ) {
+                               $error = $this->mysqlError();
+                       }
+                       wfRestoreWarnings();
+               } else {
+                       $error = $this->mysqlError();
+               }
+               if ( $error ) {
+                       $error .= ' (' . $this->mServer . ')';
+               }
+               return $error;
+       }
+
+       /**
+        * Returns the text of the error message from previous MySQL operation
+        *
+        * @param $conn Raw connection
+        * @return string
+        */
+       abstract protected function mysqlError( $conn = null );
+
+       /**
+        * @param $table string
+        * @param $uniqueIndexes
+        * @param $rows array
+        * @param $fname string
+        * @return ResultWrapper
+        */
+       function replace( $table, $uniqueIndexes, $rows, $fname = __METHOD__ ) {
+               return $this->nativeReplace( $table, $rows, $fname );
+       }
+
+       /**
+        * Estimate rows in dataset
+        * Returns estimated count, based on EXPLAIN output
+        * Takes same arguments as Database::select()
+        *
+        * @param $table string|array
+        * @param $vars string|array
+        * @param $conds string|array
+        * @param $fname string
+        * @param $options string|array
+        * @return int
+        */
+       public function estimateRowCount( $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = array() ) {
+               $options['EXPLAIN'] = true;
+               $res = $this->select( $table, $vars, $conds, $fname, $options );
+               if ( $res === false ) {
+                       return false;
+               }
+               if ( !$this->numRows( $res ) ) {
+                       return 0;
+               }
+
+               $rows = 1;
+               foreach ( $res as $plan ) {
+                       $rows *= $plan->rows > 0 ? $plan->rows : 1; // avoid resetting to zero
+               }
+               return $rows;
+       }
+
+       /**
+        * @param $table string
+        * @param $field string
+        * @return bool|MySQLField
+        */
+       function fieldInfo( $table, $field ) {
+               $table = $this->tableName( $table );
+               $res = $this->query( "SELECT * FROM $table LIMIT 1", __METHOD__, true );
+               if ( !$res ) {
+                       return false;
+               }
+               $n = $this->mysqlNumFields( $res->result );
+               for ( $i = 0; $i < $n; $i++ ) {
+                       $meta = $this->mysqlFetchField( $res->result, $i );
+                       if ( $field == $meta->name ) {
+                               return new MySQLField( $meta );
+                       }
+               }
+               return false;
+       }
+
+       /**
+        * Get column information from a result
+        *
+        * @param $res Raw result
+        * @param $n int
+        * @return stdClass
+        */
+       abstract protected function mysqlFetchField( $res, $n );
+
+       /**
+        * Get information about an index into an object
+        * Returns false if the index does not exist
+        *
+        * @param $table string
+        * @param $index string
+        * @param $fname string
+        * @return bool|array|null False or null on failure
+        */
+       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
+               $table = $this->tableName( $table );
+               $index = $this->indexName( $index );
+
+               $sql = 'SHOW INDEX FROM ' . $table;
+               $res = $this->query( $sql, $fname );
+
+               if ( !$res ) {
+                       return null;
+               }
+
+               $result = array();
+
+               foreach ( $res as $row ) {
+                       if ( $row->Key_name == $index ) {
+                               $result[] = $row;
+                       }
+               }
+               return empty( $result ) ? false : $result;
+       }
+
+       /**
+        * @param $s string
+        *
+        * @return string
+        */
+       function strencode( $s ) {
+               $sQuoted = $this->mysqlRealEscapeString( $s );
+
+               if ( $sQuoted === false ) {
+                       $this->ping();
+                       $sQuoted = $this->mysqlRealEscapeString( $s );
+               }
+               return $sQuoted;
+       }
+
+       /**
+        * MySQL uses `backticks` for identifier quoting instead of the sql standard "double quotes".
+        *
+        * @param $s string
+        *
+        * @return string
+        */
+       public function addIdentifierQuotes( $s ) {
+               return "`" . $this->strencode( $s ) . "`";
+       }
+
+       /**
+        * @param $name string
+        * @return bool
+        */
+       public function isQuotedIdentifier( $name ) {
+               return strlen( $name ) && $name[0] == '`' && substr( $name, -1, 1 ) == '`';
+       }
+
+       /**
+        * @return bool
+        */
+       function ping() {
+               $ping = $this->mysqlPing();
+               if ( $ping ) {
+                       return true;
+               }
+
+               $this->closeConnection();
+               $this->mOpened = false;
+               $this->mConn = false;
+               $this->open( $this->mServer, $this->mUser, $this->mPassword, $this->mDBname );
+               return true;
+       }
+
+       /**
+        * Ping a server connection or reconnect if there is no connection
+        *
+        * @return bool
+        */
+       abstract protected function mysqlPing();
+
+       /**
+        * Returns slave lag.
+        *
+        * This will do a SHOW SLAVE STATUS
+        *
+        * @return int
+        */
+       function getLag() {
+               if ( !is_null( $this->mFakeSlaveLag ) ) {
+                       wfDebug( "getLag: fake slave lagged {$this->mFakeSlaveLag} seconds\n" );
+                       return $this->mFakeSlaveLag;
+               }
+
+               return $this->getLagFromSlaveStatus();
+       }
+
+       /**
+        * @return bool|int
+        */
+       function getLagFromSlaveStatus() {
+               $res = $this->query( 'SHOW SLAVE STATUS', __METHOD__ );
+               if ( !$res ) {
+                       return false;
+               }
+               $row = $res->fetchObject();
+               if ( !$row ) {
+                       return false;
+               }
+               if ( strval( $row->Seconds_Behind_Master ) === '' ) {
+                       return false;
+               } else {
+                       return intval( $row->Seconds_Behind_Master );
+               }
+       }
+
+       /**
+        * @deprecated in 1.19, use getLagFromSlaveStatus
+        *
+        * @return bool|int
+        */
+       function getLagFromProcesslist() {
+               wfDeprecated( __METHOD__, '1.19' );
+               $res = $this->query( 'SHOW PROCESSLIST', __METHOD__ );
+               if ( !$res ) {
+                       return false;
+               }
+               # Find slave SQL thread
+               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.
+                        *
+                        * Relay log I/O thread does not select databases.
+                        */
+                       if ( $row->User == 'system user' &&
+                               $row->State != 'Waiting for master to send event' &&
+                               $row->State != 'Connecting to master' &&
+                               $row->State != 'Queueing master event to the relay log' &&
+                               $row->State != 'Waiting for master update' &&
+                               $row->State != 'Requesting binlog dump' &&
+                               $row->State != 'Waiting to reconnect after a failed master event read' &&
+                               $row->State != 'Reconnecting after a failed master event read' &&
+                               $row->State != 'Registering slave on master'
+                               ) {
+                               # This is it, return the time (except -ve)
+                               if ( $row->Time > 0x7fffffff ) {
+                                       return false;
+                               } else {
+                                       return $row->Time;
+                               }
+                       }
+               }
+               return false;
+       }
+
+       /**
+        * Wait for the slave to catch up to a given master position.
+        * @TODO: return values for this and base class are rubbish
+        *
+        * @param $pos DBMasterPos object
+        * @param $timeout Integer: the maximum number of seconds to wait for synchronisation
+        * @return bool|string
+        */
+       function masterPosWait( DBMasterPos $pos, $timeout ) {
+               if ( $this->lastKnownSlavePos && $this->lastKnownSlavePos->hasReached( $pos ) ) {
+                       return '0'; // http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html
+               }
+
+               wfProfileIn( __METHOD__ );
+               # Commit any open transactions
+               $this->commit( __METHOD__, 'flush' );
+
+               if ( !is_null( $this->mFakeSlaveLag ) ) {
+                       $status = parent::masterPosWait( $pos, $timeout );
+                       wfProfileOut( __METHOD__ );
+                       return $status;
+               }
+
+               # Call doQuery() directly, to avoid opening a transaction if DBO_TRX is set
+               $encFile = $this->addQuotes( $pos->file );
+               $encPos = intval( $pos->pos );
+               $sql = "SELECT MASTER_POS_WAIT($encFile, $encPos, $timeout)";
+               $res = $this->doQuery( $sql );
+
+               $status = false;
+               if ( $res && $row = $this->fetchRow( $res ) ) {
+                       $status = $row[0]; // can be NULL, -1, or 0+ per the MySQL manual
+                       if ( ctype_digit( $status ) ) { // success
+                               $this->lastKnownSlavePos = $pos;
+                       }
+               }
+
+               wfProfileOut( __METHOD__ );
+               return $status;
+       }
+
+       /**
+        * Get the position of the master from SHOW SLAVE STATUS
+        *
+        * @return MySQLMasterPos|bool
+        */
+       function getSlavePos() {
+               if ( !is_null( $this->mFakeSlaveLag ) ) {
+                       return parent::getSlavePos();
+               }
+
+               $res = $this->query( 'SHOW SLAVE STATUS', 'DatabaseBase::getSlavePos' );
+               $row = $this->fetchObject( $res );
+
+               if ( $row ) {
+                       $pos = isset( $row->Exec_master_log_pos ) ? $row->Exec_master_log_pos : $row->Exec_Master_Log_Pos;
+                       return new MySQLMasterPos( $row->Relay_Master_Log_File, $pos );
+               } else {
+                       return false;
+               }
+       }
+
+       /**
+        * Get the position of the master from SHOW MASTER STATUS
+        *
+        * @return MySQLMasterPos|bool
+        */
+       function getMasterPos() {
+               if ( $this->mFakeMaster ) {
+                       return parent::getMasterPos();
+               }
+
+               $res = $this->query( 'SHOW MASTER STATUS', 'DatabaseBase::getMasterPos' );
+               $row = $this->fetchObject( $res );
+
+               if ( $row ) {
+                       return new MySQLMasterPos( $row->File, $row->Position );
+               } else {
+                       return false;
+               }
+       }
+
+       /**
+        * @param $index
+        * @return string
+        */
+       function useIndexClause( $index ) {
+               return "FORCE INDEX (" . $this->indexName( $index ) . ")";
+       }
+
+       /**
+        * @return string
+        */
+       function lowPriorityOption() {
+               return 'LOW_PRIORITY';
+       }
+
+       /**
+        * @return string
+        */
+       public function getSoftwareLink() {
+               return '[http://www.mysql.com/ MySQL]';
+       }
+
+       /**
+        * @param $options array
+        */
+       public function setSessionOptions( array $options ) {
+               if ( isset( $options['connTimeout'] ) ) {
+                       $timeout = (int)$options['connTimeout'];
+                       $this->query( "SET net_read_timeout=$timeout" );
+                       $this->query( "SET net_write_timeout=$timeout" );
+               }
+       }
+
+       public function streamStatementEnd( &$sql, &$newLine ) {
+               if ( strtoupper( substr( $newLine, 0, 9 ) ) == 'DELIMITER' ) {
+                       preg_match( '/^DELIMITER\s+(\S+)/', $newLine, $m );
+                       $this->delimiter = $m[1];
+                       $newLine = '';
+               }
+               return parent::streamStatementEnd( $sql, $newLine );
+       }
+
+       /**
+        * Check to see if a named lock is available. This is non-blocking.
+        *
+        * @param string $lockName name of lock to poll
+        * @param string $method name of method calling us
+        * @return Boolean
+        * @since 1.20
+        */
+       public function lockIsFree( $lockName, $method ) {
+               $lockName = $this->addQuotes( $lockName );
+               $result = $this->query( "SELECT IS_FREE_LOCK($lockName) AS lockstatus", $method );
+               $row = $this->fetchObject( $result );
+               return ( $row->lockstatus == 1 );
+       }
+
+       /**
+        * @param $lockName string
+        * @param $method string
+        * @param $timeout int
+        * @return bool
+        */
+       public function lock( $lockName, $method, $timeout = 5 ) {
+               $lockName = $this->addQuotes( $lockName );
+               $result = $this->query( "SELECT GET_LOCK($lockName, $timeout) AS lockstatus", $method );
+               $row = $this->fetchObject( $result );
+
+               if ( $row->lockstatus == 1 ) {
+                       return true;
+               } else {
+                       wfDebug( __METHOD__ . " failed to acquire lock\n" );
+                       return false;
+               }
+       }
+
+       /**
+        * FROM MYSQL DOCS: http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_release-lock
+        * @param $lockName string
+        * @param $method string
+        * @return bool
+        */
+       public function unlock( $lockName, $method ) {
+               $lockName = $this->addQuotes( $lockName );
+               $result = $this->query( "SELECT RELEASE_LOCK($lockName) as lockstatus", $method );
+               $row = $this->fetchObject( $result );
+               return ( $row->lockstatus == 1 );
+       }
+
+       /**
+        * @param $read array
+        * @param $write array
+        * @param $method string
+        * @param $lowPriority bool
+        * @return bool
+        */
+       public function lockTables( $read, $write, $method, $lowPriority = true ) {
+               $items = array();
+
+               foreach ( $write as $table ) {
+                       $tbl = $this->tableName( $table ) .
+                                       ( $lowPriority ? ' LOW_PRIORITY' : '' ) .
+                                       ' WRITE';
+                       $items[] = $tbl;
+               }
+               foreach ( $read as $table ) {
+                       $items[] = $this->tableName( $table ) . ' READ';
+               }
+               $sql = "LOCK TABLES " . implode( ',', $items );
+               $this->query( $sql, $method );
+               return true;
+       }
+
+       /**
+        * @param $method string
+        * @return bool
+        */
+       public function unlockTables( $method ) {
+               $this->query( "UNLOCK TABLES", $method );
+               return true;
+       }
+
+       /**
+        * Get search engine class. All subclasses of this
+        * need to implement this if they wish to use searching.
+        *
+        * @return String
+        */
+       public function getSearchEngine() {
+               return 'SearchMySQL';
+       }
+
+       /**
+        * @param bool $value
+        * @return mixed
+        */
+       public function setBigSelects( $value = true ) {
+               if ( $value === 'default' ) {
+                       if ( $this->mDefaultBigSelects === null ) {
+                               # Function hasn't been called before so it must already be set to the default
+                               return;
+                       } else {
+                               $value = $this->mDefaultBigSelects;
+                       }
+               } elseif ( $this->mDefaultBigSelects === null ) {
+                       $this->mDefaultBigSelects = (bool)$this->selectField( false, '@@sql_big_selects' );
+               }
+               $encValue = $value ? '1' : '0';
+               $this->query( "SET sql_big_selects=$encValue", __METHOD__ );
+       }
+
+       /**
+        * DELETE where the condition is a join. MySql uses multi-table deletes.
+        * @param $delTable string
+        * @param $joinTable string
+        * @param $delVar string
+        * @param $joinVar string
+        * @param $conds array|string
+        * @param bool|string $fname bool
+        * @throws DBUnexpectedError
+        * @return bool|ResultWrapper
+        */
+       function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname = __METHOD__ ) {
+               if ( !$conds ) {
+                       throw new DBUnexpectedError( $this, 'DatabaseBase::deleteJoin() called with empty $conds' );
+               }
+
+               $delTable = $this->tableName( $delTable );
+               $joinTable = $this->tableName( $joinTable );
+               $sql = "DELETE $delTable FROM $delTable, $joinTable WHERE $delVar=$joinVar ";
+
+               if ( $conds != '*' ) {
+                       $sql .= ' AND ' . $this->makeList( $conds, LIST_AND );
+               }
+
+               return $this->query( $sql, $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 );
+       }
+
+       /**
+        * Determines how long the server has been up
+        *
+        * @return int
+        */
+       function getServerUptime() {
+               $vars = $this->getMysqlStatus( 'Uptime' );
+               return (int)$vars['Uptime'];
+       }
+
+       /**
+        * Determines if the last failure was due to a deadlock
+        *
+        * @return bool
+        */
+       function wasDeadlock() {
+               return $this->lastErrno() == 1213;
+       }
+
+       /**
+        * Determines if the last failure was due to a lock timeout
+        *
+        * @return bool
+        */
+       function wasLockTimeout() {
+               return $this->lastErrno() == 1205;
+       }
+
+       /**
+        * Determines if the last query error was something that should be dealt
+        * with by pinging the connection and reissuing the query
+        *
+        * @return bool
+        */
+       function wasErrorReissuable() {
+               return $this->lastErrno() == 2013 || $this->lastErrno() == 2006;
+       }
+
+       /**
+        * Determines if the last failure was due to the database being read-only.
+        *
+        * @return bool
+        */
+       function wasReadOnlyError() {
+               return $this->lastErrno() == 1223 ||
+                       ( $this->lastErrno() == 1290 && strpos( $this->lastError(), '--read-only' ) !== false );
+       }
+
+       /**
+        * @param $oldName
+        * @param $newName
+        * @param $temporary bool
+        * @param $fname string
+        */
+       function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = __METHOD__ ) {
+               $tmp = $temporary ? 'TEMPORARY ' : '';
+               $newName = $this->addIdentifierQuotes( $newName );
+               $oldName = $this->addIdentifierQuotes( $oldName );
+               $query = "CREATE $tmp TABLE $newName (LIKE $oldName)";
+               $this->query( $query, $fname );
+       }
+
+       /**
+        * List all tables on the database
+        *
+        * @param string $prefix Only show tables with this prefix, e.g. mw_
+        * @param string $fname calling function name
+        * @return array
+        */
+       function listTables( $prefix = null, $fname = __METHOD__ ) {
+               $result = $this->query( "SHOW TABLES", $fname );
+
+               $endArray = array();
+
+               foreach ( $result as $table ) {
+                       $vars = get_object_vars( $table );
+                       $table = array_pop( $vars );
+
+                       if ( !$prefix || strpos( $table, $prefix ) === 0 ) {
+                               $endArray[] = $table;
+                       }
+               }
+
+               return $endArray;
+       }
+
+       /**
+        * @param $tableName
+        * @param $fName string
+        * @return bool|ResultWrapper
+        */
+       public function dropTable( $tableName, $fName = __METHOD__ ) {
+               if ( !$this->tableExists( $tableName, $fName ) ) {
+                       return false;
+               }
+               return $this->query( "DROP TABLE IF EXISTS " . $this->tableName( $tableName ), $fName );
+       }
+
+       /**
+        * @return array
+        */
+       protected function getDefaultSchemaVars() {
+               $vars = parent::getDefaultSchemaVars();
+               $vars['wgDBTableOptions'] = str_replace( 'TYPE', 'ENGINE', $GLOBALS['wgDBTableOptions'] );
+               $vars['wgDBTableOptions'] = str_replace( 'CHARSET=mysql4', 'CHARSET=binary', $vars['wgDBTableOptions'] );
+               return $vars;
+       }
+
+       /**
+        * Get status information from SHOW STATUS in an associative array
+        *
+        * @param $which string
+        * @return array
+        */
+       function getMysqlStatus( $which = "%" ) {
+               $res = $this->query( "SHOW STATUS LIKE '{$which}'" );
+               $status = array();
+
+               foreach ( $res as $row ) {
+                       $status[$row->Variable_name] = $row->Value;
+               }
+
+               return $status;
+       }
+
+}
+
+
+
+/**
+ * Utility class.
+ * @ingroup Database
+ */
+class MySQLField implements Field {
+       private $name, $tablename, $default, $max_length, $nullable,
+               $is_pk, $is_unique, $is_multiple, $is_key, $type;
+
+       function __construct( $info ) {
+               $this->name = $info->name;
+               $this->tablename = $info->table;
+               $this->default = $info->def;
+               $this->max_length = $info->max_length;
+               $this->nullable = !$info->not_null;
+               $this->is_pk = $info->primary_key;
+               $this->is_unique = $info->unique_key;
+               $this->is_multiple = $info->multiple_key;
+               $this->is_key = ( $this->is_pk || $this->is_unique || $this->is_multiple );
+               $this->type = $info->type;
+       }
+
+       /**
+        * @return string
+        */
+       function name() {
+               return $this->name;
+       }
+
+       /**
+        * @return string
+        */
+       function tableName() {
+               return $this->tableName;
+       }
+
+       /**
+        * @return string
+        */
+       function type() {
+               return $this->type;
+       }
+
+       /**
+        * @return bool
+        */
+       function isNullable() {
+               return $this->nullable;
+       }
+
+       function defaultValue() {
+               return $this->default;
+       }
+
+       /**
+        * @return bool
+        */
+       function isKey() {
+               return $this->is_key;
+       }
+
+       /**
+        * @return bool
+        */
+       function isMultipleKey() {
+               return $this->is_multiple;
+       }
+}
+
+class MySQLMasterPos implements DBMasterPos {
+       var $file, $pos;
+
+       function __construct( $file, $pos ) {
+               $this->file = $file;
+               $this->pos = $pos;
+       }
+
+       function __toString() {
+               // e.g db1034-bin.000976/843431247
+               return "{$this->file}/{$this->pos}";
+       }
+
+       /**
+        * @return array|false (int, int)
+        */
+       protected function getCoordinates() {
+               $m = array();
+               if ( preg_match( '!\.(\d+)/(\d+)$!', (string)$this, $m ) ) {
+                       return array( (int)$m[1], (int)$m[2] );
+               }
+               return false;
+       }
+
+       function hasReached( MySQLMasterPos $pos ) {
+               $thisPos = $this->getCoordinates();
+               $thatPos = $pos->getCoordinates();
+               return ( $thisPos && $thatPos && $thisPos >= $thatPos );
+       }
+}
index e59ca95..c0d3805 100644 (file)
@@ -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 ) . '%\'';
@@ -792,16 +800,17 @@ class DatabaseOracle extends DatabaseBase {
                $endArray[] = strtoupper( $prefix . 'IMAGE' );
                $fixedOrderTabs = $endArray;
                while ( ( $row = $result->fetchRow() ) !== false ) {
-                       if ( !in_array( $row['table_name'], $fixedOrderTabs ) )
+                       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;
@@ -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 52fab13..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;
@@ -596,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 );
@@ -610,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];
                        }
                }
@@ -629,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 ) {
@@ -650,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
@@ -704,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 ) ) .
                        ")'";
@@ -732,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;
                }
@@ -849,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 );
                }
 
@@ -870,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 );
@@ -891,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();
@@ -914,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':
@@ -960,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;
@@ -978,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;
                        }
                }
@@ -1023,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;
@@ -1058,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]';
        }
 
@@ -1476,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 f8833f5..3941179 100644 (file)
@@ -37,7 +37,7 @@ interface IORMRow {
         * Load the specified fields from the database.
         *
         * @since 1.20
-        * @deprecated since 1.21
+        * @deprecated since 1.22
         *
         * @param array|null $fields
         * @param boolean $override
@@ -64,9 +64,9 @@ interface IORMRow {
         * Gets the value of a field but first loads it if not done so already.
         *
         * @since 1.20
-        * @deprecated since 1.21
+        * @deprecated since 1.22
         *
-        * @param string$name
+        * @param string $name
         *
         * @return mixed
         */
@@ -146,7 +146,7 @@ interface IORMRow {
         * Load the default values, via getDefaults.
         *
         * @since 1.20
-        * @deprecated since 1.21
+        * @deprecated since 1.22
         *
         * @param boolean $override
         */
@@ -159,7 +159,7 @@ interface IORMRow {
         * @since 1.20
         *
         * @param string|null $functionName
-        * @deprecated since 1.21
+        * @deprecated since 1.22
         *
         * @return boolean Success indicator
         */
@@ -169,7 +169,7 @@ interface IORMRow {
         * Removes the object from the database.
         *
         * @since 1.20
-        * @deprecated since 1.21
+        * @deprecated since 1.22
         *
         * @return boolean Success indicator
         */
@@ -211,7 +211,7 @@ interface IORMRow {
         * Add an amount (can be negative) to the specified field (needs to be numeric).
         *
         * @since 1.20
-        * @deprecated since 1.21
+        * @deprecated since 1.22
         *
         * @param string $field
         * @param integer $amount
@@ -233,7 +233,7 @@ interface IORMRow {
         * Computes and updates the values of the summary fields.
         *
         * @since 1.20
-        * @deprecated since 1.21
+        * @deprecated since 1.22
         *
         * @param array|string|null $summaryFields
         */
@@ -243,7 +243,7 @@ interface IORMRow {
         * Sets the value for the @see $updateSummaries field.
         *
         * @since 1.20
-        * @deprecated since 1.21
+        * @deprecated since 1.22
         *
         * @param boolean $update
         */
@@ -253,7 +253,7 @@ interface IORMRow {
         * Sets the value for the @see $inSummaryMode field.
         *
         * @since 1.20
-        * @deprecated since 1.21
+        * @deprecated since 1.22
         *
         * @param boolean $summaryMode
         */
@@ -263,7 +263,7 @@ interface IORMRow {
         * Returns the table this IORMRow is a row in.
         *
         * @since 1.20
-        * @deprecated since 1.21
+        * @deprecated since 1.22
         *
         * @return IORMTable
         */
index be82f4e..16c43a0 100644 (file)
@@ -300,7 +300,7 @@ class LBFactory_Fake extends LBFactory {
        function __construct( $conf ) {
        }
 
-       function newMainLB( $wiki = false) {
+       function newMainLB( $wiki = false ) {
                throw new DBAccessError;
        }
 
index e2434a0..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
         *
@@ -479,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 ) {
@@ -665,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 );
@@ -682,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.' );
                }
@@ -833,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..519e2df 100644 (file)
@@ -135,18 +135,19 @@ 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 );
                $times = $wgMemc->get( $memcKey );
-               if ( $times ) {
+               if ( is_array( $times ) ) {
                        # Randomly recache with probability rising over $expiry
                        $elapsed = time() - $times['timestamp'];
                        $chance = max( 0, ( $expiry - $elapsed ) * $requestRate );
                        if ( mt_rand( 0, $chance ) != 0 ) {
-                               unset( $times['timestamp'] );
+                               unset( $times['timestamp'] ); // hide from caller
                                wfProfileOut( __METHOD__ );
                                return $times;
                        }
@@ -156,6 +157,17 @@ class LoadMonitor_MySQL implements LoadMonitor {
                }
 
                # Cache key missing or expired
+               if ( $wgMemc->add( "$memcKey:lock", 1, 10 ) ) {
+                       # Let this process alone update the cache value
+                       $unlocker = new ScopedCallback( function() use ( $wgMemc, $memcKey ) {
+                               $wgMemc->delete( $memcKey );
+                       } );
+               } elseif ( is_array( $times ) ) {
+                       # Could not acquire lock but an old cache exists, so use it
+                       unset( $times['timestamp'] ); // hide from caller
+                       wfProfileOut( __METHOD__ );
+                       return $times;
+               }
 
                $times = array();
                foreach ( $serverIndexes as $i ) {
@@ -170,14 +182,11 @@ class LoadMonitor_MySQL implements LoadMonitor {
 
                # Add a timestamp key so we know when it was cached
                $times['timestamp'] = time();
-               $wgMemc->set( $memcKey, $times, $expiry );
-
-               # But don't give the timestamp to the caller
-               unset( $times['timestamp'] );
-               $lagTimes = $times;
+               $wgMemc->set( $memcKey, $times, $expiry + 10 );
+               unset( $times['timestamp'] ); // hide from caller
 
                wfProfileOut( __METHOD__ );
-               return $lagTimes;
+               return $times;
        }
 
        /**
index ea6ff63..5ce3794 100644 (file)
@@ -48,7 +48,7 @@ class ORMRow implements IORMRow {
         * 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
+        * @deprecated since 1.22
         * @since 1.20
         * @var bool
         */
@@ -59,14 +59,14 @@ class ORMRow implements IORMRow {
         * This mode indicates that only summary fields got updated,
         * which allows for optimizations.
         *
-        * @deprecated since 1.21
+        * @deprecated since 1.22
         * @since 1.20
         * @var bool
         */
        protected $inSummaryMode = false;
 
        /**
-        * @deprecated since 1.21
+        * @deprecated since 1.22
         * @since 1.20
         * @var ORMTable|null
         */
@@ -77,9 +77,9 @@ class ORMRow implements IORMRow {
         *
         * @since 1.20
         *
-        * @param IORMTable|null $table Deprecated since 1.21
+        * @param IORMTable|null $table Deprecated since 1.22
         * @param array|null $fields
-        * @param boolean $loadDefaults Deprecated since 1.21
+        * @param boolean $loadDefaults Deprecated since 1.22
         */
        public function __construct( IORMTable $table = null, $fields = null, $loadDefaults = false ) {
                $this->table = $table;
@@ -99,7 +99,7 @@ class ORMRow implements IORMRow {
         * Load the specified fields from the database.
         *
         * @since 1.20
-        * @deprecated since 1.21
+        * @deprecated since 1.22
         *
         * @param array|null $fields
         * @param boolean $override
@@ -164,7 +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
+        * @deprecated since 1.22
         *
         * @param $name string
         *
@@ -240,7 +240,7 @@ class ORMRow implements IORMRow {
         * Gets the fields => values to write to the table.
         *
         * @since 1.20
-        * @deprecated since 1.21
+        * @deprecated since 1.22
         *
         * @return array
         */
@@ -326,7 +326,7 @@ class ORMRow implements IORMRow {
         * Load the default values, via getDefaults.
         *
         * @since 1.20
-        * @deprecated since 1.21
+        * @deprecated since 1.22
         *
         * @param boolean $override
         */
@@ -339,7 +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
+        * @deprecated since 1.22 Use IORMTable->updateRow or ->insertRow
         *
         * @param string|null $functionName
         *
@@ -357,7 +357,7 @@ class ORMRow implements IORMRow {
         * Updates the object in the database.
         *
         * @since 1.20
-        * @deprecated since 1.21
+        * @deprecated since 1.22
         *
         * @param string|null $functionName
         *
@@ -369,7 +369,7 @@ class ORMRow implements IORMRow {
                $success = $dbw->update(
                        $this->table->getName(),
                        $this->getWriteValues(),
-                       $this->table->getPrefixedValues( $this->getWriteValues() ),
+                       $this->table->getPrefixedValues( $this->getUpdateConditions() ),
                        is_null( $functionName ) ? __METHOD__ : $functionName
                );
 
@@ -395,7 +395,7 @@ class ORMRow implements IORMRow {
         * Inserts the object into the database.
         *
         * @since 1.20
-        * @deprecated since 1.21
+        * @deprecated since 1.22
         *
         * @param string|null $functionName
         * @param array|null $options
@@ -428,7 +428,7 @@ class ORMRow implements IORMRow {
         * Removes the object from the database.
         *
         * @since 1.20
-        * @deprecated since 1.21, use IROMtable->removeRow
+        * @deprecated since 1.22, use IORMTable->removeRow
         *
         * @return boolean Success indicator
         */
@@ -448,7 +448,7 @@ class ORMRow implements IORMRow {
         * Gets called before an object is removed from the database.
         *
         * @since 1.20
-        * @deprecated since 1.21
+        * @deprecated since 1.22
         */
        protected function beforeRemove() {
                $this->loadFields( $this->getBeforeRemoveFields(), false, true );
@@ -472,7 +472,7 @@ class ORMRow implements IORMRow {
         * Can be overridden to get rid of linked data.
         *
         * @since 1.20
-        * @deprecated since 1.21
+        * @deprecated since 1.22
         */
        protected function onRemoved() {
                $this->setField( 'id', null );
@@ -520,7 +520,7 @@ class ORMRow implements IORMRow {
         * Add an amount (can be negative) to the specified field (needs to be numeric).
         *
         * @since 1.20
-        * @deprecated since 1.21, use IORMTable->addToField
+        * @deprecated since 1.22, use IORMTable->addToField
         *
         * @param string $field
         * @param integer $amount
@@ -535,7 +535,7 @@ class ORMRow implements IORMRow {
         * Return the names of the fields.
         *
         * @since 1.20
-        * @deprecated since 1.21
+        * @deprecated since 1.22
         *
         * @return array
         */
@@ -547,7 +547,7 @@ class ORMRow implements IORMRow {
         * Computes and updates the values of the summary fields.
         *
         * @since 1.20
-        * @deprecated since 1.21
+        * @deprecated since 1.22
         *
         * @param array|string|null $summaryFields
         */
@@ -559,7 +559,7 @@ class ORMRow implements IORMRow {
         * Sets the value for the @see $updateSummaries field.
         *
         * @since 1.20
-        * @deprecated since 1.21
+        * @deprecated since 1.22
         *
         * @param boolean $update
         */
@@ -571,7 +571,7 @@ class ORMRow implements IORMRow {
         * Sets the value for the @see $inSummaryMode field.
         *
         * @since 1.20
-        * @deprecated since 1.21
+        * @deprecated since 1.22
         *
         * @param boolean $summaryMode
         */
@@ -583,7 +583,7 @@ class ORMRow implements IORMRow {
         * Returns the table this IORMRow is a row in.
         *
         * @since 1.20
-        * @deprecated since 1.21
+        * @deprecated since 1.22
         *
         * @return IORMTable
         */
index 3a432cd..5f6723b 100644 (file)
@@ -952,9 +952,9 @@ class ORMTable extends DBAccessBase implements IORMTable {
        }
 
        /**
-        * Updated the provided row in the database.
+        * Updates the provided row in the database.
         *
-        * @since 1.21
+        * @since 1.22
         *
         * @param IORMRow $row The row to save
         * @param string|null $functionName
@@ -980,7 +980,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
        /**
         * Inserts the provided row into the database.
         *
-        * @since 1.21
+        * @since 1.22
         *
         * @param IORMRow $row
         * @param string|null $functionName
@@ -1013,7 +1013,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
        /**
         * Gets the fields => values to write to the table.
         *
-        * @since 1.20
+        * @since 1.22
         *
         * @param IORMRow $row
         *
@@ -1047,7 +1047,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
        /**
         * Removes the provided row from the database.
         *
-        * @since 1.21
+        * @since 1.22
         *
         * @param IORMRow $row
         * @param string|null $functionName
@@ -1067,7 +1067,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
        /**
         * Add an amount (can be negative) to the specified field (needs to be numeric).
         *
-        * @since 1.21
+        * @since 1.22
         *
         * @param array $conditions
         * @param string $field
index 582b3ac..e2cfa98 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();
 
@@ -310,7 +310,7 @@ class MWDebug {
                global $wgDebugComments, $wgShowDebug;
 
                if ( self::$enabled || $wgDebugComments || $wgShowDebug ) {
-                       self::$debug[] = rtrim( $str );
+                       self::$debug[] = rtrim( UtfNormal::cleanUp( $str ) );
                }
        }
 
@@ -484,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 ) );
                                }
                        }
@@ -498,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 f9cb656..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 ) {
@@ -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 a69862d..975d490 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;
        }
@@ -365,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
@@ -411,43 +410,44 @@ class DifferenceEngine extends ContextSource {
         * @return String
         */
        protected function markPatrolledLink() {
-               global $wgUseRCPatrol;
+               global $wgUseRCPatrol, $wgEnableAPI, $wgEnableWriteAPI;
 
                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 )
+                       ) {
+                               // 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(
@@ -504,7 +504,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
@@ -513,9 +513,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 {
@@ -544,7 +544,7 @@ class DifferenceEngine extends ContextSource {
                                                # Show categories etc.
                                                $out->addParserOutputNoText( $parserOutput );
                                        }
-                               } else if ( $parserOutput ) {
+                               } elseif ( $parserOutput ) {
                                        $out->addParserOutput( $parserOutput );
                                }
                        }
@@ -861,7 +861,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();
        }
 
@@ -992,11 +994,13 @@ class DifferenceEngine extends ContextSource {
                                $colspan = 1;
                                $multiColspan = 2;
                        }
-                       $header .= "
-                       <tr style='vertical-align: top;'>
-                       <td colspan='$colspan' class='diff-otitle'>{$otitle}</td>
-                       <td colspan='$colspan' class='diff-ntitle'>{$ntitle}</td>
-                       </tr>";
+                       if ( $otitle || $ntitle ) {
+                               $header .= "
+                               <tr style='vertical-align: top;'>
+                               <td colspan='$colspan' class='diff-otitle'>{$otitle}</td>
+                               <td colspan='$colspan' class='diff-ntitle'>{$ntitle}</td>
+                               </tr>";
+                       }
                }
 
                if ( $multi != '' ) {
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 7d0dbd5..8f0a133 100644 (file)
@@ -28,7 +28,7 @@
  */
 class FSFile {
        protected $path; // path to file
-       private $sha1Base36 = null; // File Sha1Base36
+       protected $sha1Base36; // file SHA-1 in base 36
 
        /**
         * Sets up the file object
@@ -98,7 +98,7 @@ class FSFile {
         * Get an associative array containing information about
         * a file with the given storage path.
         *
-        * @param $ext Mixed: the file extension, or true to extract it from the filename.
+        * @param Mixed $ext: the file extension, or true to extract it from the filename.
         *             Set it to false to ignore the extension.
         *
         * @return array
@@ -171,7 +171,7 @@ class FSFile {
        /**
         * Exract image size information
         *
-        * @param $gis array
+        * @param array $gis
         * @return Array
         */
        protected function extractImageSizeInfo( array $gis ) {
@@ -194,7 +194,7 @@ class FSFile {
         * 160 log 2 / log 36 = 30.95, so the 160-bit hash fills 31 digits in base 36
         * fairly neatly.
         *
-        * @param $recache bool
+        * @param bool $recache
         * @return bool|string False on failure
         */
        public function getSha1Base36( $recache = false ) {
@@ -220,7 +220,7 @@ class FSFile {
        /**
         * Get the final file extension from a file system path
         *
-        * @param $path string
+        * @param string $path
         * @return string
         */
        public static function extensionFromPath( $path ) {
@@ -232,9 +232,8 @@ class FSFile {
         * Get an associative array containing information about a file in the local filesystem.
         *
         * @param string $path absolute local filesystem path
-        * @param $ext Mixed: the file extension, or true to extract it from the filename.
+        * @param Mixed $ext: the file extension, or true to extract it from the filename.
         *             Set it to false to ignore the extension.
-        *
         * @return array
         */
        public static function getPropsFromPath( $path, $ext = true ) {
@@ -249,19 +248,11 @@ class FSFile {
         * 160 log 2 / log 36 = 30.95, so the 160-bit hash fills 31 digits in base 36
         * fairly neatly.
         *
-        * @param $path string
-        * @param $recache bool
-        *
+        * @param string $path
         * @return bool|string False on failure
         */
-       public static function getSha1Base36FromPath( $path, $recache = false ) {
-               static $sha1Base36 = array();
-
-               if ( !isset( $sha1Base36[$path] ) || $recache ) {
-                       $fsFile = new self( $path );
-                       $sha1Base36[$path] = $fsFile->getSha1Base36();
-               }
-
-               return $sha1Base36[$path];
+       public static function getSha1Base36FromPath( $path ) {
+               $fsFile = new self( $path );
+               return $fsFile->getSha1Base36();
        }
 }
index 92fee83..6d64216 100644 (file)
@@ -82,12 +82,6 @@ class FSFileBackend extends FileBackendStore {
                }
        }
 
-       /**
-        * @see FileBackendStore::resolveContainerPath()
-        * @param $container string
-        * @param $relStoragePath string
-        * @return null|string
-        */
        protected function resolveContainerPath( $container, $relStoragePath ) {
                // Check that container has a root directory
                if ( isset( $this->containerPaths[$container] ) || isset( $this->basePath ) ) {
@@ -121,8 +115,8 @@ class FSFileBackend extends FileBackendStore {
         * Given the short (unresolved) and full (resolved) name of
         * a container, return the file system path of the container.
         *
-        * @param $shortCont string
-        * @param $fullCont string
+        * @param string $shortCont
+        * @param string $fullCont
         * @return string|null
         */
        protected function containerFSRoot( $shortCont, $fullCont ) {
@@ -153,10 +147,6 @@ class FSFileBackend extends FileBackendStore {
                return $fsPath;
        }
 
-       /**
-        * @see FileBackendStore::isPathUsableInternal()
-        * @return bool
-        */
        public function isPathUsableInternal( $storagePath ) {
                $fsPath = $this->resolveToFSPath( $storagePath );
                if ( $fsPath === null ) {
@@ -178,10 +168,6 @@ class FSFileBackend extends FileBackendStore {
                return $ok;
        }
 
-       /**
-        * @see FileBackendStore::doCreateInternal()
-        * @return Status
-        */
        protected function doCreateInternal( array $params ) {
                $status = Status::newGood();
 
@@ -235,10 +221,6 @@ class FSFileBackend extends FileBackendStore {
                }
        }
 
-       /**
-        * @see FileBackendStore::doStoreInternal()
-        * @return Status
-        */
        protected function doStoreInternal( array $params ) {
                $status = Status::newGood();
 
@@ -284,10 +266,6 @@ class FSFileBackend extends FileBackendStore {
                }
        }
 
-       /**
-        * @see FileBackendStore::doCopyInternal()
-        * @return Status
-        */
        protected function doCopyInternal( array $params ) {
                $status = Status::newGood();
 
@@ -348,10 +326,6 @@ class FSFileBackend extends FileBackendStore {
                }
        }
 
-       /**
-        * @see FileBackendStore::doMoveInternal()
-        * @return Status
-        */
        protected function doMoveInternal( array $params ) {
                $status = Status::newGood();
 
@@ -405,10 +379,6 @@ class FSFileBackend extends FileBackendStore {
                }
        }
 
-       /**
-        * @see FileBackendStore::doDeleteInternal()
-        * @return Status
-        */
        protected function doDeleteInternal( array $params ) {
                $status = Status::newGood();
 
@@ -454,10 +424,6 @@ class FSFileBackend extends FileBackendStore {
                }
        }
 
-       /**
-        * @see FileBackendStore::doPrepareInternal()
-        * @return Status
-        */
        protected function doPrepareInternal( $fullCont, $dirRel, array $params ) {
                $status = Status::newGood();
                list( , $shortCont, ) = FileBackend::splitStoragePath( $params['dir'] );
@@ -481,10 +447,6 @@ class FSFileBackend extends FileBackendStore {
                return $status;
        }
 
-       /**
-        * @see FileBackendStore::doSecureInternal()
-        * @return Status
-        */
        protected function doSecureInternal( $fullCont, $dirRel, array $params ) {
                $status = Status::newGood();
                list( , $shortCont, ) = FileBackend::splitStoragePath( $params['dir'] );
@@ -512,10 +474,6 @@ class FSFileBackend extends FileBackendStore {
                return $status;
        }
 
-       /**
-        * @see FileBackendStore::doPublishInternal()
-        * @return Status
-        */
        protected function doPublishInternal( $fullCont, $dirRel, array $params ) {
                $status = Status::newGood();
                list( , $shortCont, ) = FileBackend::splitStoragePath( $params['dir'] );
@@ -543,10 +501,6 @@ class FSFileBackend extends FileBackendStore {
                return $status;
        }
 
-       /**
-        * @see FileBackendStore::doCleanInternal()
-        * @return Status
-        */
        protected function doCleanInternal( $fullCont, $dirRel, array $params ) {
                $status = Status::newGood();
                list( , $shortCont, ) = FileBackend::splitStoragePath( $params['dir'] );
@@ -560,10 +514,6 @@ class FSFileBackend extends FileBackendStore {
                return $status;
        }
 
-       /**
-        * @see FileBackendStore::doFileExists()
-        * @return array|bool|null
-        */
        protected function doGetFileStat( array $params ) {
                $source = $this->resolveToFSPath( $params['src'] );
                if ( $source === null ) {
@@ -577,7 +527,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
@@ -593,10 +543,6 @@ class FSFileBackend extends FileBackendStore {
                clearstatcache(); // clear the PHP file stat cache
        }
 
-       /**
-        * @see FileBackendStore::doDirectoryExists()
-        * @return bool|null
-        */
        protected function doDirectoryExists( $fullCont, $dirRel, array $params ) {
                list( , $shortCont, ) = FileBackend::splitStoragePath( $params['dir'] );
                $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
@@ -647,10 +593,6 @@ class FSFileBackend extends FileBackendStore {
                return new FSFileBackendFileList( $dir, $params );
        }
 
-       /**
-        * @see FileBackendStore::doGetLocalReferenceMulti()
-        * @return Array
-        */
        protected function doGetLocalReferenceMulti( array $params ) {
                $fsFiles = array(); // (path => FSFile)
 
@@ -666,10 +608,6 @@ class FSFileBackend extends FileBackendStore {
                return $fsFiles;
        }
 
-       /**
-        * @see FileBackendStore::doGetLocalCopyMulti()
-        * @return Array
-        */
        protected function doGetLocalCopyMulti( array $params ) {
                $tmpFiles = array(); // (path => TempFSFile)
 
@@ -702,18 +640,10 @@ class FSFileBackend extends FileBackendStore {
                return $tmpFiles;
        }
 
-       /**
-        * @see FileBackendStore::directoriesAreVirtual()
-        * @return bool
-        */
        protected function directoriesAreVirtual() {
                return false;
        }
 
-       /**
-        * @see FileBackendStore::doExecuteOpHandlesInternal()
-        * @return Array List of corresponding Status objects
-        */
        protected function doExecuteOpHandlesInternal( array $fileOpHandles ) {
                $statuses = array();
 
@@ -807,11 +737,12 @@ class FSFileBackend extends FileBackendStore {
        }
 
        /**
-        * @param $errno integer
-        * @param $errstr string
+        * @param integer $errno
+        * @param string $errstr
         * @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
@@ -826,13 +757,15 @@ class FSFileOpHandle extends FileBackendStoreOpHandle {
        public $chmodPath; // string; file to chmod
 
        /**
-        * @param $backend
-        * @param $params array
-        * @param $call
-        * @param $cmd
-        * @param $chmodPath null
+        * @param FSFileBackend $backend
+        * @param array $params
+        * @param string $call
+        * @param string $cmd
+        * @param integer|null $chmodPath
         */
-       public function __construct( $backend, array $params, $call, $cmd, $chmodPath = null ) {
+       public function __construct(
+               FSFileBackend $backend, array $params, $call, $cmd, $chmodPath = null
+       ) {
                $this->backend = $backend;
                $this->params = $params;
                $this->call = $call;
@@ -858,11 +791,11 @@ abstract class FSFileBackendList implements Iterator {
 
        /**
         * @param string $dir file system directory
-        * @param $params array
+        * @param array $params
         */
        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/"
@@ -921,8 +854,8 @@ abstract class FSFileBackendList implements Iterator {
                try {
                        $this->iter->next();
                        $this->filterViaNext();
-               } catch ( UnexpectedValueException $e ) {
-                       $this->iter = null;
+               } catch ( UnexpectedValueException $e ) { // bad permissions? deleted?
+                       throw new FileBackendError( "File iterator gave UnexpectedValueException." );
                }
                ++$this->pos;
        }
@@ -936,8 +869,8 @@ abstract class FSFileBackendList implements Iterator {
                try {
                        $this->iter->rewind();
                        $this->filterViaNext();
-               } catch ( UnexpectedValueException $e ) {
-                       $this->iter = null;
+               } catch ( UnexpectedValueException $e ) { // bad permissions? deleted?
+                       throw new FileBackendError( "File iterator gave UnexpectedValueException." );
                }
        }
 
@@ -958,12 +891,12 @@ abstract class FSFileBackendList implements Iterator {
         * Return only the relative path and normalize slashes to FileBackend-style.
         * Uses the "real path" since the suffix is based upon that.
         *
-        * @param $path string
+        * @param string $path
         * @return string
         */
        protected function getRelPath( $dir ) {
                $path = realpath( $dir );
-               if( $path === false ) {
+               if ( $path === false ) {
                        $path = $dir;
                }
                return strtr( substr( $path, $this->suffixStart ), '\\', '/' );
index d505d6f..9b4760a 100644 (file)
@@ -94,7 +94,7 @@ abstract class FileBackend {
         *                   Allowed values are "implicit", "explicit" and "off".
         *   - concurrency : How many file operations can be done in parallel.
         *
-        * @param $config Array
+        * @param array $config
         * @throws MWException
         */
        public function __construct( array $config ) {
@@ -314,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'] );
                }
@@ -545,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)
@@ -803,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;
        }
@@ -1035,7 +1043,7 @@ abstract class FileBackend {
         *
         * Storage backends with eventual consistency might return stale data.
         *
-        * @param $params array
+        * @param array $params
         * $params include:
         *   - dir : storage directory
         * @return bool|null Returns null on failure
@@ -1053,7 +1061,9 @@ abstract class FileBackend {
         *
         * Storage backends with eventual consistency might return stale data.
         *
-        * @param $params array
+        * Failures during iteration can result in FileBackendError exceptions (since 1.22).
+        *
+        * @param array $params
         * $params include:
         *   - dir     : storage directory
         *   - topOnly : only return direct child dirs of the directory
@@ -1068,7 +1078,9 @@ abstract class FileBackend {
         *
         * Storage backends with eventual consistency might return stale data.
         *
-        * @param $params array
+        * Failures during iteration can result in FileBackendError exceptions (since 1.22).
+        *
+        * @param array $params
         * $params include:
         *   - dir : storage directory
         * @return Traversable|Array|null Returns null on failure
@@ -1088,10 +1100,13 @@ abstract class FileBackend {
         *
         * Storage backends with eventual consistency might return stale data.
         *
-        * @param $params array
+        * Failures during iteration can result in FileBackendError exceptions (since 1.22).
+        *
+        * @param array $params
         * $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 );
@@ -1102,9 +1117,12 @@ abstract class FileBackend {
         *
         * Storage backends with eventual consistency might return stale data.
         *
-        * @param $params array
+        * Failures during iteration can result in FileBackendError exceptions (since 1.22).
+        *
+        * @param array $params
         * $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
         */
@@ -1137,7 +1155,7 @@ abstract class FileBackend {
         * Callers should consider using getScopedFileLocks() instead.
         *
         * @param array $paths Storage paths
-        * @param $type integer LockManager::LOCK_* constant
+        * @param integer $type LockManager::LOCK_* constant
         * @return Status
         */
        final public function lockFiles( array $paths, $type ) {
@@ -1148,7 +1166,7 @@ abstract class FileBackend {
         * Unlock the files at the given storage paths in the backend.
         *
         * @param array $paths Storage paths
-        * @param $type integer LockManager::LOCK_* constant
+        * @param integer $type LockManager::LOCK_* constant
         * @return Status
         */
        final public function unlockFiles( array $paths, $type ) {
@@ -1164,8 +1182,8 @@ abstract class FileBackend {
         * the status updated. Unlock fatals will not change the status "OK" value.
         *
         * @param array $paths Storage paths
-        * @param $type integer LockManager::LOCK_* constant
-        * @param $status Status Status to update on lock/unlock
+        * @param integer $type LockManager::LOCK_* constant
+        * @param Status $status Status to update on lock/unlock
         * @return ScopedLock|null Returns null on failure
         */
        final public function getScopedFileLocks( array $paths, $type, Status $status ) {
@@ -1184,7 +1202,7 @@ abstract class FileBackend {
         * @see FileBackend::doOperations()
         *
         * @param array $ops List of file operations to FileBackend::doOperations()
-        * @param $status Status Status to update on lock/unlock
+        * @param Status $status Status to update on lock/unlock
         * @return Array List of ScopedFileLocks or null values
         * @since 1.20
         */
@@ -1225,7 +1243,7 @@ abstract class FileBackend {
         * Check if a given path is a "mwstore://" path.
         * This does not do any further validation or any existence checks.
         *
-        * @param $path string
+        * @param string $path
         * @return bool
         */
        final public static function isStoragePath( $path ) {
@@ -1237,7 +1255,7 @@ abstract class FileBackend {
         * and a relative file path. The relative path may be the empty string.
         * This does not do any path normalization or traversal checks.
         *
-        * @param $storagePath string
+        * @param string $storagePath
         * @return Array (backend, container, rel object) or (null, null, null)
         */
        final public static function splitStoragePath( $storagePath ) {
@@ -1259,7 +1277,7 @@ abstract class FileBackend {
         * Normalize a storage path by cleaning up directory separators.
         * Returns null if the path is not of the format of a valid storage path.
         *
-        * @param $storagePath string
+        * @param string $storagePath
         * @return string|null
         */
        final public static function normalizeStoragePath( $storagePath ) {
@@ -1280,7 +1298,7 @@ abstract class FileBackend {
         * This returns a path like "mwstore://backend/container",
         * "mwstore://backend/container/...", or null if there is no parent.
         *
-        * @param $storagePath string
+        * @param string $storagePath
         * @return string|null
         */
        final public static function parentStoragePath( $storagePath ) {
@@ -1292,7 +1310,7 @@ abstract class FileBackend {
        /**
         * Get the final extension from a storage or FS path
         *
-        * @param $path string
+        * @param string $path
         * @return string
         */
        final public static function extensionFromPath( $path ) {
@@ -1303,7 +1321,7 @@ abstract class FileBackend {
        /**
         * Check if a relative path has no directory traversals
         *
-        * @param $path string
+        * @param string $path
         * @return bool
         * @since 1.20
         */
@@ -1369,3 +1387,9 @@ abstract class FileBackend {
                return $path;
        }
 }
+
+/**
+ * @ingroup FileBackend
+ * @since 1.22
+ */
+class FileBackendError extends MWException {}
index d790a99..be8a207 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,
                        );
                }
 
@@ -116,7 +116,7 @@ class FileBackendGroup {
        /**
         * Register an array of file backend configurations
         *
-        * @param $configs Array
+        * @param Array $configs
         * @return void
         * @throws MWException
         */
@@ -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
                        );
                }
@@ -145,7 +145,7 @@ class FileBackendGroup {
        /**
         * Get the backend object with a given name
         *
-        * @param $name string
+        * @param string $name
         * @return FileBackend
         * @throws MWException
         */
@@ -165,7 +165,7 @@ class FileBackendGroup {
        /**
         * Get the config array for a backend object with a given name
         *
-        * @param $name string
+        * @param string $name
         * @return Array
         * @throws MWException
         */
@@ -180,7 +180,7 @@ class FileBackendGroup {
        /**
         * Get an appropriate backend object from a storage path
         *
-        * @param $storagePath string
+        * @param string $storagePath
         * @return FileBackend|null Backend or null on failure
         */
        public function backendFromPath( $storagePath ) {
index 17b060c..7d35487 100644 (file)
@@ -75,10 +75,13 @@ 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.
         *
-        * @param $config Array
+        * @param Array $config
         * @throws MWException
         */
        public function __construct( array $config ) {
@@ -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;
@@ -131,10 +136,6 @@ class FileBackendMultiWrite extends FileBackend {
                }
        }
 
-       /**
-        * @see FileBackend::doOperationsInternal()
-        * @return Status
-        */
        final protected function doOperationsInternal( array $ops, array $opts ) {
                $status = Status::newGood();
 
@@ -304,11 +305,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 +317,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 ) ) );
                                }
                        }
@@ -366,7 +383,7 @@ class FileBackendMultiWrite extends FileBackend {
         * for a set of operations with that of a given internal backend.
         *
         * @param array $ops List of file operation arrays
-        * @param $backend FileBackendStore
+        * @param FileBackendStore $backend
         * @return Array
         */
        protected function substOpBatchPaths( array $ops, FileBackendStore $backend ) {
@@ -387,7 +404,7 @@ class FileBackendMultiWrite extends FileBackend {
         * Same as substOpBatchPaths() but for a single operation
         *
         * @param array $ops File operation array
-        * @param $backend FileBackendStore
+        * @param FileBackendStore $backend
         * @return Array
         */
        protected function substOpPaths( array $ops, FileBackendStore $backend ) {
@@ -399,7 +416,7 @@ class FileBackendMultiWrite extends FileBackend {
         * Substitute the backend of storage paths with an internal backend's name
         *
         * @param array|string $paths List of paths or single string path
-        * @param $backend FileBackendStore
+        * @param FileBackendStore $backend
         * @return Array|string
         */
        protected function substPaths( $paths, FileBackendStore $backend ) {
@@ -424,10 +441,6 @@ class FileBackendMultiWrite extends FileBackend {
                );
        }
 
-       /**
-        * @see FileBackend::doQuickOperationsInternal()
-        * @return Status
-        */
        protected function doQuickOperationsInternal( array $ops ) {
                $status = Status::newGood();
                // Do the operations on the master backend; setting Status fields...
@@ -461,10 +474,6 @@ class FileBackendMultiWrite extends FileBackend {
                return !in_array( $shortCont, $this->noPushDirConts );
        }
 
-       /**
-        * @see FileBackend::doPrepare()
-        * @return Status
-        */
        protected function doPrepare( array $params ) {
                $status = Status::newGood();
                $replicate = $this->replicateContainerDirChanges( $params['dir'] );
@@ -477,11 +486,6 @@ class FileBackendMultiWrite extends FileBackend {
                return $status;
        }
 
-       /**
-        * @see FileBackend::doSecure()
-        * @param $params array
-        * @return Status
-        */
        protected function doSecure( array $params ) {
                $status = Status::newGood();
                $replicate = $this->replicateContainerDirChanges( $params['dir'] );
@@ -494,11 +498,6 @@ class FileBackendMultiWrite extends FileBackend {
                return $status;
        }
 
-       /**
-        * @see FileBackend::doPublish()
-        * @param $params array
-        * @return Status
-        */
        protected function doPublish( array $params ) {
                $status = Status::newGood();
                $replicate = $this->replicateContainerDirChanges( $params['dir'] );
@@ -511,11 +510,6 @@ class FileBackendMultiWrite extends FileBackend {
                return $status;
        }
 
-       /**
-        * @see FileBackend::doClean()
-        * @param $params array
-        * @return Status
-        */
        protected function doClean( array $params ) {
                $status = Status::newGood();
                $replicate = $this->replicateContainerDirChanges( $params['dir'] );
@@ -528,62 +522,32 @@ class FileBackendMultiWrite extends FileBackend {
                return $status;
        }
 
-       /**
-        * @see FileBackend::concatenate()
-        * @param $params array
-        * @return Status
-        */
        public function concatenate( array $params ) {
                // We are writing to an FS file, so we don't need to do this per-backend
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
                return $this->backends[$this->masterIndex]->concatenate( $realParams );
        }
 
-       /**
-        * @see FileBackend::fileExists()
-        * @param $params array
-        * @return bool|null
-        */
        public function fileExists( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
                return $this->backends[$this->masterIndex]->fileExists( $realParams );
        }
 
-       /**
-        * @see FileBackend::getFileTimestamp()
-        * @param $params array
-        * @return bool|string
-        */
        public function getFileTimestamp( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
                return $this->backends[$this->masterIndex]->getFileTimestamp( $realParams );
        }
 
-       /**
-        * @see FileBackend::getFileSize()
-        * @param $params array
-        * @return bool|int
-        */
        public function getFileSize( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
                return $this->backends[$this->masterIndex]->getFileSize( $realParams );
        }
 
-       /**
-        * @see FileBackend::getFileStat()
-        * @param $params array
-        * @return Array|bool|null
-        */
        public function getFileStat( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
                return $this->backends[$this->masterIndex]->getFileStat( $realParams );
        }
 
-       /**
-        * @see FileBackend::getFileContentsMulti()
-        * @param $params array
-        * @return bool|string
-        */
        public function getFileContentsMulti( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
                $contentsM = $this->backends[$this->masterIndex]->getFileContentsMulti( $realParams );
@@ -595,41 +559,21 @@ class FileBackendMultiWrite extends FileBackend {
                return $contents;
        }
 
-       /**
-        * @see FileBackend::getFileSha1Base36()
-        * @param $params array
-        * @return bool|string
-        */
        public function getFileSha1Base36( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
                return $this->backends[$this->masterIndex]->getFileSha1Base36( $realParams );
        }
 
-       /**
-        * @see FileBackend::getFileProps()
-        * @param $params array
-        * @return Array
-        */
        public function getFileProps( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
                return $this->backends[$this->masterIndex]->getFileProps( $realParams );
        }
 
-       /**
-        * @see FileBackend::streamFile()
-        * @param $params array
-        * @return \Status
-        */
        public function streamFile( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
                return $this->backends[$this->masterIndex]->streamFile( $realParams );
        }
 
-       /**
-        * @see FileBackend::getLocalReferenceMulti()
-        * @param $params array
-        * @return FSFile|null
-        */
        public function getLocalReferenceMulti( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
                $fsFilesM = $this->backends[$this->masterIndex]->getLocalReferenceMulti( $realParams );
@@ -641,11 +585,6 @@ class FileBackendMultiWrite extends FileBackend {
                return $fsFiles;
        }
 
-       /**
-        * @see FileBackend::getLocalCopyMulti()
-        * @param $params array
-        * @return null|TempFSFile
-        */
        public function getLocalCopyMulti( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
                $tempFilesM = $this->backends[$this->masterIndex]->getLocalCopyMulti( $realParams );
@@ -657,48 +596,26 @@ class FileBackendMultiWrite extends FileBackend {
                return $tempFiles;
        }
 
-       /**
-        * @see FileBackend::getFileHttpUrl()
-        * @return string|null
-        */
        public function getFileHttpUrl( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
                return $this->backends[$this->masterIndex]->getFileHttpUrl( $realParams );
        }
 
-       /**
-        * @see FileBackend::directoryExists()
-        * @param $params array
-        * @return bool|null
-        */
        public function directoryExists( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
                return $this->backends[$this->masterIndex]->directoryExists( $realParams );
        }
 
-       /**
-        * @see FileBackend::getSubdirectoryList()
-        * @param $params array
-        * @return Array|null|Traversable
-        */
        public function getDirectoryList( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
                return $this->backends[$this->masterIndex]->getDirectoryList( $realParams );
        }
 
-       /**
-        * @see FileBackend::getFileList()
-        * @param $params array
-        * @return Array|null|\Traversable
-        */
        public function getFileList( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
                return $this->backends[$this->masterIndex]->getFileList( $realParams );
        }
 
-       /**
-        * @see FileBackend::clearCache()
-        */
        public function clearCache( array $paths = null ) {
                foreach ( $this->backends as $backend ) {
                        $realPaths = is_array( $paths ) ? $this->substPaths( $paths, $backend ) : null;
@@ -706,9 +623,6 @@ class FileBackendMultiWrite extends FileBackend {
                }
        }
 
-       /**
-        * @see FileBackend::getScopedLocksForOps()
-        */
        public function getScopedLocksForOps( array $ops, Status $status ) {
                $fileOps = $this->backends[$this->masterIndex]->getOperationsInternal( $ops );
                // Get the paths to lock from the master backend
index 18a59fa..e976a7a 100644 (file)
@@ -49,17 +49,19 @@ 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()
         *
-        * @param $config Array
+        * @param array $config
         */
        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 );
        }
 
        /**
@@ -79,7 +81,7 @@ abstract class FileBackendStore extends FileBackend {
         * written under it, and that any file already there is writable.
         * Backends using key/value stores should check if the container exists.
         *
-        * @param $storagePath string
+        * @param string $storagePath
         * @return bool
         */
        abstract public function isPathUsableInternal( $storagePath );
@@ -103,8 +105,7 @@ abstract class FileBackendStore extends FileBackend {
         * @return Status
         */
        final public function createInternal( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
                if ( strlen( $params['content'] ) > $this->maxFileSizeInternal() ) {
                        $status = Status::newFatal( 'backend-fail-maxsize',
                                $params['dst'], $this->maxFileSizeInternal() );
@@ -115,8 +116,6 @@ abstract class FileBackendStore extends FileBackend {
                                $this->deleteFileCache( $params['dst'] ); // persistent cache
                        }
                }
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
                return $status;
        }
 
@@ -145,8 +144,7 @@ abstract class FileBackendStore extends FileBackend {
         * @return Status
         */
        final public function storeInternal( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
                if ( filesize( $params['src'] ) > $this->maxFileSizeInternal() ) {
                        $status = Status::newFatal( 'backend-fail-maxsize',
                                $params['dst'], $this->maxFileSizeInternal() );
@@ -157,8 +155,6 @@ abstract class FileBackendStore extends FileBackend {
                                $this->deleteFileCache( $params['dst'] ); // persistent cache
                        }
                }
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
                return $status;
        }
 
@@ -188,15 +184,12 @@ abstract class FileBackendStore extends FileBackend {
         * @return Status
         */
        final public function copyInternal( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
                $status = $this->doCopyInternal( $params );
                $this->clearCache( array( $params['dst'] ) );
                if ( !isset( $params['dstExists'] ) || $params['dstExists'] ) {
                        $this->deleteFileCache( $params['dst'] ); // persistent cache
                }
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
                return $status;
        }
 
@@ -221,13 +214,10 @@ abstract class FileBackendStore extends FileBackend {
         * @return Status
         */
        final public function deleteInternal( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
                $status = $this->doDeleteInternal( $params );
                $this->clearCache( array( $params['src'] ) );
                $this->deleteFileCache( $params['src'] ); // persistent cache
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
                return $status;
        }
 
@@ -257,16 +247,13 @@ abstract class FileBackendStore extends FileBackend {
         * @return Status
         */
        final public function moveInternal( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
                $status = $this->doMoveInternal( $params );
                $this->clearCache( array( $params['src'], $params['dst'] ) );
                $this->deleteFileCache( $params['src'] ); // persistent cache
                if ( !isset( $params['dstExists'] ) || $params['dstExists'] ) {
                        $this->deleteFileCache( $params['dst'] ); // persistent cache
                }
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
                return $status;
        }
 
@@ -303,8 +290,7 @@ abstract class FileBackendStore extends FileBackend {
         * @return Status
         */
        final public function describeInternal( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
                if ( count( $params['headers'] ) ) {
                        $status = $this->doDescribeInternal( $params );
                        $this->clearCache( array( $params['src'] ) );
@@ -312,8 +298,6 @@ abstract class FileBackendStore extends FileBackend {
                } else {
                        $status = Status::newGood(); // nothing to do
                }
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
                return $status;
        }
 
@@ -336,13 +320,8 @@ abstract class FileBackendStore extends FileBackend {
                return Status::newGood();
        }
 
-       /**
-        * @see FileBackend::concatenate()
-        * @return Status
-        */
        final public function concatenate( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
                $status = Status::newGood();
 
                // Try to lock the source files for the scope of this function
@@ -358,8 +337,6 @@ abstract class FileBackendStore extends FileBackend {
                        }
                }
 
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
                return $status;
        }
 
@@ -429,20 +406,13 @@ abstract class FileBackendStore extends FileBackend {
                return $status;
        }
 
-       /**
-        * @see FileBackend::doPrepare()
-        * @return Status
-        */
        final protected function doPrepare( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
-
+               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
                $status = Status::newGood();
+
                list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
                if ( $dir === null ) {
                        $status->fatal( 'backend-fail-invalidpath', $params['dir'] );
-                       wfProfileOut( __METHOD__ . '-' . $this->name );
-                       wfProfileOut( __METHOD__ );
                        return $status; // invalid storage path
                }
 
@@ -456,8 +426,6 @@ abstract class FileBackendStore extends FileBackend {
                        }
                }
 
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
                return $status;
        }
 
@@ -469,20 +437,13 @@ abstract class FileBackendStore extends FileBackend {
                return Status::newGood();
        }
 
-       /**
-        * @see FileBackend::doSecure()
-        * @return Status
-        */
        final protected function doSecure( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
                $status = Status::newGood();
 
                list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
                if ( $dir === null ) {
                        $status->fatal( 'backend-fail-invalidpath', $params['dir'] );
-                       wfProfileOut( __METHOD__ . '-' . $this->name );
-                       wfProfileOut( __METHOD__ );
                        return $status; // invalid storage path
                }
 
@@ -496,8 +457,6 @@ abstract class FileBackendStore extends FileBackend {
                        }
                }
 
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
                return $status;
        }
 
@@ -509,20 +468,13 @@ abstract class FileBackendStore extends FileBackend {
                return Status::newGood();
        }
 
-       /**
-        * @see FileBackend::doPublish()
-        * @return Status
-        */
        final protected function doPublish( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
                $status = Status::newGood();
 
                list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
                if ( $dir === null ) {
                        $status->fatal( 'backend-fail-invalidpath', $params['dir'] );
-                       wfProfileOut( __METHOD__ . '-' . $this->name );
-                       wfProfileOut( __METHOD__ );
                        return $status; // invalid storage path
                }
 
@@ -536,8 +488,6 @@ abstract class FileBackendStore extends FileBackend {
                        }
                }
 
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
                return $status;
        }
 
@@ -549,13 +499,8 @@ abstract class FileBackendStore extends FileBackend {
                return Status::newGood();
        }
 
-       /**
-        * @see FileBackend::doClean()
-        * @return Status
-        */
        final protected function doClean( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
                $status = Status::newGood();
 
                // Recursive: first delete all empty subdirs recursively
@@ -573,8 +518,6 @@ abstract class FileBackendStore extends FileBackend {
                list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
                if ( $dir === null ) {
                        $status->fatal( 'backend-fail-invalidpath', $params['dir'] );
-                       wfProfileOut( __METHOD__ . '-' . $this->name );
-                       wfProfileOut( __METHOD__ );
                        return $status; // invalid storage path
                }
 
@@ -582,8 +525,6 @@ abstract class FileBackendStore extends FileBackend {
                $filesLockEx = array( $params['dir'] );
                $scopedLockE = $this->getScopedFileLocks( $filesLockEx, LockManager::LOCK_EX, $status );
                if ( !$status->isOK() ) {
-                       wfProfileOut( __METHOD__ . '-' . $this->name );
-                       wfProfileOut( __METHOD__ );
                        return $status; // abort
                }
 
@@ -599,8 +540,6 @@ abstract class FileBackendStore extends FileBackend {
                        }
                }
 
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
                return $status;
        }
 
@@ -612,56 +551,30 @@ abstract class FileBackendStore extends FileBackend {
                return Status::newGood();
        }
 
-       /**
-        * @see FileBackend::fileExists()
-        * @return bool|null
-        */
        final public function fileExists( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
                $stat = $this->getFileStat( $params );
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
                return ( $stat === null ) ? null : (bool)$stat; // null => failure
        }
 
-       /**
-        * @see FileBackend::getFileTimestamp()
-        * @return bool
-        */
        final public function getFileTimestamp( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
                $stat = $this->getFileStat( $params );
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
                return $stat ? $stat['mtime'] : false;
        }
 
-       /**
-        * @see FileBackend::getFileSize()
-        * @return bool
-        */
        final public function getFileSize( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
                $stat = $this->getFileStat( $params );
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
                return $stat ? $stat['size'] : false;
        }
 
-       /**
-        * @see FileBackend::getFileStat()
-        * @return bool
-        */
        final public function getFileStat( array $params ) {
                $path = self::normalizeStoragePath( $params['src'] );
                if ( $path === null ) {
                        return false; // invalid storage path
                }
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
                $latest = !empty( $params['latest'] ); // use latest data?
                if ( !$this->cheapCache->has( $path, 'stat', self::CACHE_TTL ) ) {
                        $this->primeFileCache( array( $path ) ); // check persistent cache
@@ -672,14 +585,10 @@ abstract class FileBackendStore extends FileBackend {
                        // value was in fact fetched with the latest available data.
                        if ( is_array( $stat ) ) {
                                if ( !$latest || $stat['latest'] ) {
-                                       wfProfileOut( __METHOD__ . '-' . $this->name );
-                                       wfProfileOut( __METHOD__ );
                                        return $stat;
                                }
                        } elseif ( in_array( $stat, array( 'NOT_EXIST', 'NOT_EXIST_LATEST' ) ) ) {
                                if ( !$latest || $stat === 'NOT_EXIST_LATEST' ) {
-                                       wfProfileOut( __METHOD__ . '-' . $this->name );
-                                       wfProfileOut( __METHOD__ );
                                        return false;
                                }
                        }
@@ -699,12 +608,12 @@ 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" );
                }
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
                return $stat;
        }
 
@@ -713,19 +622,12 @@ abstract class FileBackendStore extends FileBackend {
         */
        abstract protected function doGetFileStat( array $params );
 
-       /**
-        * @see FileBackend::getFileContentsMulti()
-        * @return Array
-        */
        public function getFileContentsMulti( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
 
                $params = $this->setConcurrencyFlags( $params );
                $contents = $this->doGetFileContentsMulti( $params );
 
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
                return $contents;
        }
 
@@ -743,25 +645,18 @@ abstract class FileBackendStore extends FileBackend {
                return $contents;
        }
 
-       /**
-        * @see FileBackend::getFileSha1Base36()
-        * @return bool|string
-        */
        final public function getFileSha1Base36( array $params ) {
                $path = self::normalizeStoragePath( $params['src'] );
                if ( $path === null ) {
                        return false; // invalid storage path
                }
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
                $latest = !empty( $params['latest'] ); // use latest data?
                if ( $this->cheapCache->has( $path, 'sha1', self::CACHE_TTL ) ) {
                        $stat = $this->cheapCache->get( $path, 'sha1' );
                        // If we want the latest data, check that this cached
                        // value was in fact fetched with the latest available data.
                        if ( !$latest || $stat['latest'] ) {
-                               wfProfileOut( __METHOD__ . '-' . $this->name );
-                               wfProfileOut( __METHOD__ );
                                return $stat['hash'];
                        }
                }
@@ -771,8 +666,6 @@ abstract class FileBackendStore extends FileBackend {
                wfProfileOut( __METHOD__ . '-miss-' . $this->name );
                wfProfileOut( __METHOD__ . '-miss' );
                $this->cheapCache->set( $path, 'sha1', array( 'hash' => $hash, 'latest' => $latest ) );
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
                return $hash;
        }
 
@@ -789,27 +682,15 @@ abstract class FileBackendStore extends FileBackend {
                }
        }
 
-       /**
-        * @see FileBackend::getFileProps()
-        * @return Array
-        */
        final public function getFileProps( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
                $fsFile = $this->getLocalReference( $params );
                $props = $fsFile ? $fsFile->getProps() : FSFile::placeholderProps();
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
                return $props;
        }
 
-       /**
-        * @see FileBackend::getLocalReferenceMulti()
-        * @return Array
-        */
        final public function getLocalReferenceMulti( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
 
                $params = $this->setConcurrencyFlags( $params );
 
@@ -839,8 +720,6 @@ abstract class FileBackendStore extends FileBackend {
                        }
                }
 
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
                return $fsFiles;
        }
 
@@ -852,19 +731,12 @@ abstract class FileBackendStore extends FileBackend {
                return $this->doGetLocalCopyMulti( $params );
        }
 
-       /**
-        * @see FileBackend::getLocalCopyMulti()
-        * @return Array
-        */
        final public function getLocalCopyMulti( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
 
                $params = $this->setConcurrencyFlags( $params );
                $tmpFiles = $this->doGetLocalCopyMulti( $params );
 
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
                return $tmpFiles;
        }
 
@@ -882,13 +754,8 @@ abstract class FileBackendStore extends FileBackend {
                return null; // not supported
        }
 
-       /**
-        * @see FileBackend::streamFile()
-        * @return Status
-        */
        final public function streamFile( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
                $status = Status::newGood();
 
                $info = $this->getFileStat( $params );
@@ -919,8 +786,6 @@ abstract class FileBackendStore extends FileBackend {
                        $status->fatal( 'backend-fail-stream', $params['src'] );
                }
 
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
                return $status;
        }
 
@@ -941,10 +806,6 @@ abstract class FileBackendStore extends FileBackend {
                return $status;
        }
 
-       /**
-        * @see FileBackend::directoryExists()
-        * @return bool|null
-        */
        final public function directoryExists( array $params ) {
                list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
                if ( $dir === null ) {
@@ -979,10 +840,6 @@ abstract class FileBackendStore extends FileBackend {
         */
        abstract protected function doDirectoryExists( $container, $dir, array $params );
 
-       /**
-        * @see FileBackend::getDirectoryList()
-        * @return Traversable|Array|null Returns null on failure
-        */
        final public function getDirectoryList( array $params ) {
                list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
                if ( $dir === null ) { // invalid storage path
@@ -1012,10 +869,6 @@ abstract class FileBackendStore extends FileBackend {
         */
        abstract public function getDirectoryListInternal( $container, $dir, array $params );
 
-       /**
-        * @see FileBackend::getFileList()
-        * @return Traversable|Array|null Returns null on failure
-        */
        final public function getFileList( array $params ) {
                list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
                if ( $dir === null ) { // invalid storage path
@@ -1058,13 +911,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
@@ -1109,10 +962,6 @@ abstract class FileBackendStore extends FileBackend {
                return $paths;
        }
 
-       /**
-        * @see FileBackend::getScopedLocksForOps()
-        * @return Array
-        */
        public function getScopedLocksForOps( array $ops, Status $status ) {
                $paths = $this->getPathsToLockForOpsInternal( $this->getOperationsInternal( $ops ) );
                return array(
@@ -1121,13 +970,8 @@ abstract class FileBackendStore extends FileBackend {
                );
        }
 
-       /**
-        * @see FileBackend::doOperationsInternal()
-        * @return Status
-        */
        final protected function doOperationsInternal( array $ops, array $opts ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
                $status = Status::newGood();
 
                // Fix up custom header name/value pairs...
@@ -1144,8 +988,6 @@ abstract class FileBackendStore extends FileBackend {
                        $scopeLockS = $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status );
                        $scopeLockE = $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status );
                        if ( !$status->isOK() ) {
-                               wfProfileOut( __METHOD__ . '-' . $this->name );
-                               wfProfileOut( __METHOD__ );
                                return $status; // abort
                        }
                }
@@ -1167,19 +1009,11 @@ abstract class FileBackendStore extends FileBackend {
                $status->merge( $subStatus );
                $status->success = $subStatus->success; // not done in merge()
 
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
                return $status;
        }
 
-       /**
-        * @see FileBackend::doQuickOperationsInternal()
-        * @return Status
-        * @throws MWException
-        */
        final protected function doQuickOperationsInternal( array $ops ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
                $status = Status::newGood();
 
                // Fix up custom header name/value pairs...
@@ -1189,7 +1023,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)
@@ -1198,8 +1032,6 @@ abstract class FileBackendStore extends FileBackend {
                // Perform the sync-only ops and build up op handles for the async ops...
                foreach ( $ops as $index => $params ) {
                        if ( !in_array( $params['op'], $supportedOps ) ) {
-                               wfProfileOut( __METHOD__ . '-' . $this->name );
-                               wfProfileOut( __METHOD__ );
                                throw new MWException( "Operation '{$params['op']}' is not supported." );
                        }
                        $method = $params['op'] . 'Internal'; // e.g. "storeInternal"
@@ -1233,8 +1065,6 @@ abstract class FileBackendStore extends FileBackend {
                        }
                }
 
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
                return $status;
        }
 
@@ -1248,16 +1078,11 @@ abstract class FileBackendStore extends FileBackend {
         * @throws MWException
         */
        final public function executeOpHandlesInternal( array $fileOpHandles ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $section = new ProfileSection( __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." );
                        }
                }
@@ -1265,8 +1090,6 @@ abstract class FileBackendStore extends FileBackend {
                foreach ( $fileOpHandles as $fileOpHandle ) {
                        $fileOpHandle->closeResources();
                }
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
                return $res;
        }
 
@@ -1308,9 +1131,6 @@ abstract class FileBackendStore extends FileBackend {
                return $op;
        }
 
-       /**
-        * @see FileBackend::preloadCache()
-        */
        final public function preloadCache( array $paths ) {
                $fullConts = array(); // full container names
                foreach ( $paths as $path ) {
@@ -1322,9 +1142,6 @@ abstract class FileBackendStore extends FileBackend {
                $this->primeFileCache( $paths );
        }
 
-       /**
-        * @see FileBackend::clearCache()
-        */
        final public function clearCache( array $paths = null ) {
                if ( is_array( $paths ) ) {
                        $paths = array_map( 'FileBackend::normalizeStoragePath', $paths );
@@ -1365,7 +1182,7 @@ abstract class FileBackendStore extends FileBackend {
         * Check if a container name is valid.
         * This checks for for length and illegal characters.
         *
-        * @param $container string
+        * @param string $container
         * @return bool
         */
        final protected static function isValidContainerName( $container ) {
@@ -1387,7 +1204,7 @@ abstract class FileBackendStore extends FileBackend {
         * this means that the path can only refer to a directory and can only
         * be scanned by looking in all the container shards.
         *
-        * @param $storagePath string
+        * @param string $storagePath
         * @return Array (container, path, container suffix) or (null, null, null) if invalid
         */
        final protected function resolveStoragePath( $storagePath ) {
@@ -1417,16 +1234,22 @@ 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()
         *
-        * @param $storagePath string
+        * @param string $storagePath
         * @return Array (container, path) or (null, null) if invalid
         */
        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 );
@@ -1486,7 +1309,7 @@ abstract class FileBackendStore extends FileBackend {
         * If greater than 0, then all file storage paths within
         * the container are required to be hashed accordingly.
         *
-        * @param $container string
+        * @param string $container
         * @return Array (integer levels, integer base, repeat flag) or (0, 0, false)
         */
        final protected function getContainerHashLevels( $container ) {
@@ -1506,7 +1329,7 @@ abstract class FileBackendStore extends FileBackend {
        /**
         * Get a list of full container shard suffixes for a container
         *
-        * @param $container string
+        * @param string $container
         * @return Array
         */
        final protected function getContainerSuffixes( $container ) {
@@ -1524,7 +1347,7 @@ abstract class FileBackendStore extends FileBackend {
        /**
         * Get the full container name, including the wiki ID prefix
         *
-        * @param $container string
+        * @param string $container
         * @return string
         */
        final protected function fullContainerName( $container ) {
@@ -1540,7 +1363,7 @@ abstract class FileBackendStore extends FileBackend {
         * This is intended for internal use, such as encoding illegal chars.
         * Subclasses can override this to be more restrictive.
         *
-        * @param $container string
+        * @param string $container
         * @return string|null
         */
        protected function resolveContainerName( $container ) {
@@ -1575,10 +1398,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 );
        }
 
        /**
@@ -1586,6 +1410,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 ) ) {
@@ -1598,12 +1423,11 @@ abstract class FileBackendStore extends FileBackend {
         * used in a list of container names, storage paths, or FileOp objects.
         * This loads the persistent cache values into the process cache.
         *
-        * @param $items Array
+        * @param Array $items
         * @return void
         */
        final protected function primeContainerCache( array $items ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
 
                $paths = array(); // list of storage paths
                $contNames = array(); // (cache key => resolved container name)
@@ -1635,9 +1459,6 @@ abstract class FileBackendStore extends FileBackend {
 
                // Populate the container process cache for the backend...
                $this->doPrimeContainerCache( array_filter( $contInfo, 'is_array' ) );
-
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -1666,14 +1487,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 );
        }
 
        /**
@@ -1683,6 +1507,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 );
@@ -1703,8 +1528,7 @@ abstract class FileBackendStore extends FileBackend {
         * @return void
         */
        final protected function primeFileCache( array $items ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
 
                $paths = array(); // list of storage paths
                $pathNames = array(); // (cache key => storage path)
@@ -1738,9 +1562,6 @@ abstract class FileBackendStore extends FileBackend {
                                }
                        }
                }
-
-               wfProfileOut( __METHOD__ . '-' . $this->name );
-               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -1798,26 +1619,20 @@ 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)
 
        /**
-        * @param $backend FileBackendStore
+        * @param FileBackendStore $backend
         * @param string $container Full storage container name
         * @param string $dir Storage directory relative to container
         * @param array $suffixes List of container shard suffixes
@@ -1829,142 +1644,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 );
+               parent::__construct( $iter );
        }
 
-       /**
-        * @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 );
-       }
-
-       /**
-        * 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;
+               }
        }
 }
 
@@ -1972,11 +1701,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 62e9fba..33a5c9e 100644 (file)
@@ -57,14 +57,14 @@ abstract class FileOp {
        /**
         * Build a new batch file operation transaction
         *
-        * @param $backend FileBackendStore
-        * @param $params Array
+        * @param FileBackendStore $backend
+        * @param Array $params
         * @throws MWException
         */
        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
+               // @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
@@ -85,7 +85,7 @@ abstract class FileOp {
        /**
         * Normalize $item or anything in $item that is a valid storage path
         *
-        * @param $item string|array
+        * @param string $item|array
         * @return string|Array
         */
        protected function normalizeAnyStoragePaths( $item ) {
@@ -105,7 +105,7 @@ abstract class FileOp {
        /**
         * Normalize a string if it is a valid storage path
         *
-        * @param $path string
+        * @param string $path
         * @return string
         */
        protected static function normalizeIfValidStoragePath( $path ) {
@@ -119,7 +119,7 @@ abstract class FileOp {
        /**
         * Set the batch UUID this operation belongs to
         *
-        * @param $batchId string
+        * @param string $batchId
         * @return void
         */
        final public function setBatchId( $batchId ) {
@@ -129,7 +129,7 @@ abstract class FileOp {
        /**
         * Get the value of the parameter with the given name
         *
-        * @param $name string
+        * @param string $name
         * @return mixed Returns null if the parameter is not set
         */
        final public function getParam( $name ) {
@@ -212,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]
                                );
                        }
@@ -240,7 +240,7 @@ abstract class FileOp {
         * This must update $predicates for each path that the op can change
         * except when a failing status object is returned.
         *
-        * @param $predicates Array
+        * @param Array $predicates
         * @return Status
         */
        final public function precheck( array &$predicates ) {
@@ -317,7 +317,7 @@ abstract class FileOp {
        /**
         * Adjust params to FileBackendStore internal file calls
         *
-        * @param $params Array
+        * @param Array $params
         * @return Array (required params list, optional params list)
         */
        protected function setFlags( array $params ) {
@@ -347,7 +347,7 @@ abstract class FileOp {
         * 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
+        * @param Array $predicates
         * @return Status
         */
        protected function precheckDestExistence( array $predicates ) {
@@ -396,7 +396,7 @@ abstract class FileOp {
         * Check if a file will exist in storage when this operation is attempted
         *
         * @param string $source Storage path
-        * @param $predicates Array
+        * @param Array $predicates
         * @return bool
         */
        final protected function fileExists( $source, array $predicates ) {
@@ -412,7 +412,7 @@ abstract class FileOp {
         * Get the SHA-1 of a file in storage when this operation is attempted
         *
         * @param string $source Storage path
-        * @param $predicates Array
+        * @param Array $predicates
         * @return string|bool False on failure
         */
        final protected function fileSha1( $source, array $predicates ) {
@@ -438,7 +438,7 @@ abstract class FileOp {
        /**
         * Log a file operation failure and preserve any temp files
         *
-        * @param $action string
+        * @param string $action
         * @return void
         */
        final public function logFailure( $action ) {
@@ -488,9 +488,6 @@ class CreateFileOp extends FileOp {
                return $status; // safe to call attempt()
        }
 
-       /**
-        * @return Status
-        */
        protected function doAttempt() {
                if ( !$this->overwriteSameCase ) {
                        // Create the file at the destination
@@ -499,16 +496,10 @@ class CreateFileOp extends FileOp {
                return Status::newGood();
        }
 
-       /**
-        * @return bool|String
-        */
        protected function getSourceSha1Base36() {
                return wfBaseConvert( sha1( $this->params['content'] ), 16, 36, 31 );
        }
 
-       /**
-        * @return array
-        */
        public function storagePathsChanged() {
                return array( $this->params['dst'] );
        }
@@ -519,18 +510,11 @@ class CreateFileOp extends FileOp {
  * Parameters for this operation are outlined in FileBackend::doOperations().
  */
 class StoreFileOp extends FileOp {
-       /**
-        * @return array
-        */
        protected function allowedParams() {
                return array( array( 'src', 'dst' ),
                        array( 'overwrite', 'overwriteSame', 'headers' ) );
        }
 
-       /**
-        * @param $predicates array
-        * @return Status
-        */
        protected function doPrecheck( array &$predicates ) {
                $status = Status::newGood();
                // Check if the source file exists on the file system
@@ -560,9 +544,6 @@ class StoreFileOp extends FileOp {
                return $status; // safe to call attempt()
        }
 
-       /**
-        * @return Status
-        */
        protected function doAttempt() {
                if ( !$this->overwriteSameCase ) {
                        // Store the file at the destination
@@ -571,9 +552,6 @@ class StoreFileOp extends FileOp {
                return Status::newGood();
        }
 
-       /**
-        * @return bool|string
-        */
        protected function getSourceSha1Base36() {
                wfSuppressWarnings();
                $hash = sha1_file( $this->params['src'] );
@@ -594,18 +572,11 @@ class StoreFileOp extends FileOp {
  * Parameters for this operation are outlined in FileBackend::doOperations().
  */
 class CopyFileOp extends FileOp {
-       /**
-        * @return array
-        */
        protected function allowedParams() {
                return array( array( 'src', 'dst' ),
                        array( 'overwrite', 'overwriteSame', 'ignoreMissingSource', 'headers' ) );
        }
 
-       /**
-        * @param $predicates array
-        * @return Status
-        */
        protected function doPrecheck( array &$predicates ) {
                $status = Status::newGood();
                // Check if the source file exists
@@ -637,9 +608,6 @@ class CopyFileOp extends FileOp {
                return $status; // safe to call attempt()
        }
 
-       /**
-        * @return Status
-        */
        protected function doAttempt() {
                if ( $this->overwriteSameCase ) {
                        $status = Status::newGood(); // nothing to do
@@ -656,16 +624,10 @@ class CopyFileOp extends FileOp {
                return $status;
        }
 
-       /**
-        * @return array
-        */
        public function storagePathsRead() {
                return array( $this->params['src'] );
        }
 
-       /**
-        * @return array
-        */
        public function storagePathsChanged() {
                return array( $this->params['dst'] );
        }
@@ -676,18 +638,11 @@ class CopyFileOp extends FileOp {
  * Parameters for this operation are outlined in FileBackend::doOperations().
  */
 class MoveFileOp extends FileOp {
-       /**
-        * @return array
-        */
        protected function allowedParams() {
                return array( array( 'src', 'dst' ),
                        array( 'overwrite', 'overwriteSame', 'ignoreMissingSource', 'headers' ) );
        }
 
-       /**
-        * @param $predicates array
-        * @return Status
-        */
        protected function doPrecheck( array &$predicates ) {
                $status = Status::newGood();
                // Check if the source file exists
@@ -721,9 +676,6 @@ class MoveFileOp extends FileOp {
                return $status; // safe to call attempt()
        }
 
-       /**
-        * @return Status
-        */
        protected function doAttempt() {
                if ( $this->overwriteSameCase ) {
                        if ( $this->params['src'] === $this->params['dst'] ) {
@@ -748,16 +700,10 @@ class MoveFileOp extends FileOp {
                return $status;
        }
 
-       /**
-        * @return array
-        */
        public function storagePathsRead() {
                return array( $this->params['src'] );
        }
 
-       /**
-        * @return array
-        */
        public function storagePathsChanged() {
                return array( $this->params['src'], $this->params['dst'] );
        }
@@ -768,17 +714,10 @@ class MoveFileOp extends FileOp {
  * Parameters for this operation are outlined in FileBackend::doOperations().
  */
 class DeleteFileOp extends FileOp {
-       /**
-        * @return array
-        */
        protected function allowedParams() {
                return array( array( 'src' ), array( 'ignoreMissingSource' ) );
        }
 
-       /**
-        * @param $predicates array
-        * @return Status
-        */
        protected function doPrecheck( array &$predicates ) {
                $status = Status::newGood();
                // Check if the source file exists
@@ -805,17 +744,11 @@ class DeleteFileOp extends FileOp {
                return $status; // safe to call attempt()
        }
 
-       /**
-        * @return Status
-        */
        protected function doAttempt() {
                // Delete the source file
                return $this->backend->deleteInternal( $this->setFlags( $this->params ) );
        }
 
-       /**
-        * @return array
-        */
        public function storagePathsChanged() {
                return array( $this->params['src'] );
        }
@@ -826,17 +759,10 @@ class DeleteFileOp extends FileOp {
  * Parameters for this operation are outlined in FileBackend::doOperations().
  */
 class DescribeFileOp extends FileOp {
-       /**
-        * @return array
-        */
        protected function allowedParams() {
                return array( array( 'src' ), array( 'headers' ) );
        }
 
-       /**
-        * @param $predicates array
-        * @return Status
-        */
        protected function doPrecheck( array &$predicates ) {
                $status = Status::newGood();
                // Check if the source file exists
@@ -857,17 +783,11 @@ class DescribeFileOp extends FileOp {
                return $status; // safe to call attempt()
        }
 
-       /**
-        * @return Status
-        */
        protected function doAttempt() {
                // Update the source file's metadata
                return $this->backend->describeInternal( $this->setFlags( $this->params ) );
        }
 
-       /**
-        * @return array
-        */
        public function storagePathsChanged() {
                return array( $this->params['src'] );
        }
index fc51d78..785c0bc 100644 (file)
@@ -51,7 +51,7 @@ class FileOpBatch {
         *
         * @param array $performOps List of FileOp operations
         * @param array $opts Batch operation options
-        * @param $journal FileJournal Journal to log operations to
+        * @param FileJournal $journal Journal to log operations to
         * @return Status
         */
        public static function attempt( array $performOps, array $opts, FileJournal $journal ) {
@@ -145,8 +145,8 @@ class FileOpBatch {
         * within any given sub-batch do not depend on each other.
         * This will abort remaining ops on failure.
         *
-        * @param $pPerformOps Array
-        * @param $status Status
+        * @param Array $pPerformOps
+        * @param Status $status
         * @return bool Success
         */
        protected static function runParallelBatches( array $pPerformOps, Status $status ) {
index 6ab5481..569f337 100644 (file)
@@ -47,7 +47,7 @@ directories. See FileBackend.php for full documentation for each function.
 The following basic operations are supported for reading from a backend:
 
 On files:
-* state a file for basic information (timestamp, size)
+* stat a file for basic information (timestamp, size)
 * read a file into a string or  several files into a map of path names to strings
 * download a file or set of files to a temporary file (on a mounted file system)
 * get the SHA1 hash of a file
index 2f7e256..f3aa145 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;
@@ -172,10 +172,6 @@ class SwiftFileBackend extends FileBackendStore {
                return $relStoragePath;
        }
 
-       /**
-        * @see FileBackendStore::isPathUsableInternal()
-        * @return bool
-        */
        public function isPathUsableInternal( $storagePath ) {
                list( $container, $rel ) = $this->resolveStoragePathReal( $storagePath );
                if ( $rel === null ) {
@@ -194,7 +190,7 @@ class SwiftFileBackend extends FileBackendStore {
        }
 
        /**
-        * @param $headers array
+        * @param array $headers
         * @return array
         */
        protected function sanitizeHdrs( array $headers ) {
@@ -206,7 +202,7 @@ class SwiftFileBackend extends FileBackendStore {
        }
 
        /**
-        * @param $disposition string Content-Disposition header value
+        * @param string $disposition Content-Disposition header value
         * @return string Truncated Content-Disposition header value to meet Swift limits
         */
        protected function truncDisp( $disposition ) {
@@ -223,10 +219,6 @@ class SwiftFileBackend extends FileBackendStore {
                return $res;
        }
 
-       /**
-        * @see FileBackendStore::doCreateInternal()
-        * @return Status
-        */
        protected function doCreateInternal( array $params ) {
                $status = Status::newGood();
 
@@ -298,10 +290,6 @@ class SwiftFileBackend extends FileBackendStore {
                }
        }
 
-       /**
-        * @see FileBackendStore::doStoreInternal()
-        * @return Status
-        */
        protected function doStoreInternal( array $params ) {
                $status = Status::newGood();
 
@@ -391,10 +379,6 @@ class SwiftFileBackend extends FileBackendStore {
                }
        }
 
-       /**
-        * @see FileBackendStore::doCopyInternal()
-        * @return Status
-        */
        protected function doCopyInternal( array $params ) {
                $status = Status::newGood();
 
@@ -464,10 +448,6 @@ class SwiftFileBackend extends FileBackendStore {
                }
        }
 
-       /**
-        * @see FileBackendStore::doMoveInternal()
-        * @return Status
-        */
        protected function doMoveInternal( array $params ) {
                $status = Status::newGood();
 
@@ -540,10 +520,6 @@ class SwiftFileBackend extends FileBackendStore {
                }
        }
 
-       /**
-        * @see FileBackendStore::doDeleteInternal()
-        * @return Status
-        */
        protected function doDeleteInternal( array $params ) {
                $status = Status::newGood();
 
@@ -596,10 +572,6 @@ class SwiftFileBackend extends FileBackendStore {
                }
        }
 
-       /**
-        * @see FileBackendStore::doDescribeInternal()
-        * @return Status
-        */
        protected function doDescribeInternal( array $params ) {
                $status = Status::newGood();
 
@@ -633,10 +605,6 @@ class SwiftFileBackend extends FileBackendStore {
                return $status;
        }
 
-       /**
-        * @see FileBackendStore::doPrepareInternal()
-        * @return Status
-        */
        protected function doPrepareInternal( $fullCont, $dir, array $params ) {
                $status = Status::newGood();
 
@@ -750,10 +718,6 @@ class SwiftFileBackend extends FileBackendStore {
                return $status;
        }
 
-       /**
-        * @see FileBackendStore::doCleanInternal()
-        * @return Status
-        */
        protected function doCleanInternal( $fullCont, $dir, array $params ) {
                $status = Status::newGood();
 
@@ -789,10 +753,6 @@ class SwiftFileBackend extends FileBackendStore {
                return $status;
        }
 
-       /**
-        * @see FileBackendStore::doFileExists()
-        * @return array|bool|null
-        */
        protected function doGetFileStat( array $params ) {
                list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
                if ( $srcRel === null ) {
@@ -807,8 +767,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 ) {
@@ -823,7 +783,7 @@ class SwiftFileBackend extends FileBackendStore {
        /**
         * Fill in any missing object metadata and save it to Swift
         *
-        * @param $obj CF_Object
+        * @param CF_Object $obj
         * @param string $path Storage path to object
         * @return bool Success
         * @throws Exception cloudfiles exceptions
@@ -854,10 +814,6 @@ class SwiftFileBackend extends FileBackendStore {
                return false; // failed
        }
 
-       /**
-        * @see FileBackendStore::doGetFileContentsMulti()
-        * @return Array
-        */
        protected function doGetFileContentsMulti( array $params ) {
                $contents = array();
 
@@ -967,24 +923,25 @@ class SwiftFileBackend extends FileBackendStore {
         * @param string $fullCont Resolved container name
         * @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 integer $limit Max number of items to list
+        * @param array $params Parameters for getDirectoryList()
+        * @return Array List of resolved paths of directories directly under $dir
+        * @throws FileBackendError
         */
        public function getDirListPageInternal( $fullCont, $dir, &$after, $limit, array $params ) {
                $dirs = array();
                if ( $after === INF ) {
                        return $dirs; // nothing more
                }
-               wfProfileIn( __METHOD__ . '-' . $this->name );
 
+               $section = new ProfileSection( __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 +972,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 {
@@ -1024,9 +982,9 @@ class SwiftFileBackend extends FileBackendStore {
                } catch ( CloudFilesException $e ) { // some other exception?
                        $this->handleException( $e, null, __METHOD__,
                                array( 'cont' => $fullCont, 'dir' => $dir ) );
+                       throw new FileBackendError( "Got " . get_class( $e ) . " exception." );
                }
 
-               wfProfileOut( __METHOD__ . '-' . $this->name );
                return $dirs;
        }
 
@@ -1040,33 +998,49 @@ class SwiftFileBackend extends FileBackendStore {
         * @param string $fullCont Resolved container name
         * @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 integer $limit Max number of items to list
+        * @param array $params Parameters for getDirectoryList()
+        * @return Array List of resolved paths of files under $dir
+        * @throws FileBackendError
         */
        public function getFileListPageInternal( $fullCont, $dir, &$after, $limit, array $params ) {
                $files = array();
                if ( $after === INF ) {
                        return $files; // nothing more
                }
-               wfProfileIn( __METHOD__ . '-' . $this->name );
 
+               $section = new ProfileSection( __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 {
@@ -1076,29 +1050,57 @@ class SwiftFileBackend extends FileBackendStore {
                } catch ( CloudFilesException $e ) { // some other exception?
                        $this->handleException( $e, null, __METHOD__,
                                array( 'cont' => $fullCont, 'dir' => $dir ) );
+                       throw new FileBackendError( "Got " . get_class( $e ) . " exception." );
                }
 
-               wfProfileOut( __METHOD__ . '-' . $this->name );
                return $files;
        }
 
        /**
-        * @see FileBackendStore::doGetFileSha1base36()
-        * @return bool
+        * 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/"
+               // Iterate over the list *backwards* as this primes the stat cache, which is LRU.
+               // If this fills the cache and the caller stats an uncached file before stating
+               // the ones on the listing, there would be zero cache hits if this went forwards.
+               for ( end( $cfObjects ); key( $cfObjects ) !== null; prev( $cfObjects ) ) {
+                       $object = current( $cfObjects );
+                       $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 array_reverse( $names ); // keep the paths in original order
+       }
+
        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;
                }
        }
 
-       /**
-        * @see FileBackendStore::doStreamFile()
-        * @return Status
-        */
        protected function doStreamFile( array $params ) {
                $status = Status::newGood();
 
@@ -1130,10 +1132,6 @@ class SwiftFileBackend extends FileBackendStore {
                return $status;
        }
 
-       /**
-        * @see FileBackendStore::doGetLocalCopyMulti()
-        * @return null|TempFSFile
-        */
        protected function doGetLocalCopyMulti( array $params ) {
                $tmpFiles = array();
 
@@ -1203,10 +1201,6 @@ class SwiftFileBackend extends FileBackendStore {
                return $tmpFiles;
        }
 
-       /**
-        * @see FileBackendStore::getFileHttpUrl()
-        * @return string|null
-        */
        public function getFileHttpUrl( array $params ) {
                if ( $this->swiftTempUrlKey != '' ||
                        ( $this->rgwS3AccessKey != '' && $this->rgwS3SecretKey != '' ) )
@@ -1239,8 +1233,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 )
                                        );
                                }
@@ -1252,10 +1246,6 @@ class SwiftFileBackend extends FileBackendStore {
                return null;
        }
 
-       /**
-        * @see FileBackendStore::directoriesAreVirtual()
-        * @return bool
-        */
        protected function directoriesAreVirtual() {
                return true;
        }
@@ -1276,10 +1266,6 @@ class SwiftFileBackend extends FileBackendStore {
                return $hdrs;
        }
 
-       /**
-        * @see FileBackendStore::doExecuteOpHandlesInternal()
-        * @return Array List of corresponding Status objects
-        */
        protected function doExecuteOpHandlesInternal( array $fileOpHandles ) {
                $statuses = array();
 
@@ -1327,7 +1313,7 @@ class SwiftFileBackend extends FileBackendStore {
         * In general, we don't allow listings to end-users. It's not useful, isn't well-defined
         * (lists are truncated to 10000 item with no way to page), and is just a performance risk.
         *
-        * @param $contObj CF_Container Swift container
+        * @param CF_Container $contObj Swift container
         * @param array $readGrps List of read access routes
         * @param array $writeGrps List of write access routes
         * @return Status
@@ -1397,12 +1383,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
@@ -1435,7 +1421,7 @@ class SwiftFileBackend extends FileBackendStore {
        /**
         * Get the cache key for a container
         *
-        * @param $username string
+        * @param string $username
         * @return string
         */
        private function getCredsCacheKey( $username ) {
@@ -1498,10 +1484,6 @@ class SwiftFileBackend extends FileBackendStore {
                $conn->delete_container( $container );
        }
 
-       /**
-        * @see FileBackendStore::doPrimeContainerCache()
-        * @return void
-        */
        protected function doPrimeContainerCache( array $containerInfo ) {
                try {
                        $conn = $this->getConnection(); // Swift proxy connection
@@ -1519,9 +1501,9 @@ class SwiftFileBackend extends FileBackendStore {
         * Log an unexpected exception for this backend.
         * This also sets the Status object to have a fatal error.
         *
-        * @param $e Exception
-        * @param $status Status|null
-        * @param $func string
+        * @param Exception $e
+        * @param Status $status|null
+        * @param string $func
         * @param array $params
         * @return void
         */
@@ -1556,7 +1538,15 @@ class SwiftFileOpHandle extends FileBackendStoreOpHandle {
        /** @var Array */
        public $affectedObjects = array();
 
-       public function __construct( $backend, array $params, $call, CF_Async_Op $cfOp ) {
+       /**
+        * @param SwiftFileBackend $backend
+        * @param array $params
+        * @param string $call
+        * @param CF_Async_Op $cfOp
+        */
+       public function __construct(
+               SwiftFileBackend $backend, array $params, $call, CF_Async_Op $cfOp
+       ) {
                $this->backend = $backend;
                $this->params = $params;
                $this->call = $call;
@@ -1588,7 +1578,7 @@ abstract class SwiftFileBackendList implements Iterator {
        const PAGE_SIZE = 9000; // file listing buffer size
 
        /**
-        * @param $backend SwiftFileBackend
+        * @param SwiftFileBackend $backend
         * @param string $fullCont Resolved container name
         * @param string $dir Resolved directory relative to container
         * @param array $params
@@ -1662,10 +1652,10 @@ abstract class SwiftFileBackendList implements Iterator {
         *
         * @param string $container Resolved container name
         * @param string $dir Resolved path relative to container
-        * @param $after string|null
-        * @param $limit integer
+        * @param string $after|null
+        * @param integer $limit
         * @param array $params
-        * @return Traversable|Array|null Returns null on failure
+        * @return Traversable|Array
         */
        abstract protected function pageFromList( $container, $dir, &$after, $limit, array $params );
 }
@@ -1684,7 +1674,7 @@ class SwiftFileBackendDirList extends SwiftFileBackendList {
 
        /**
         * @see SwiftFileBackendList::pageFromList()
-        * @return Array|null
+        * @return Array
         */
        protected function pageFromList( $container, $dir, &$after, $limit, array $params ) {
                return $this->backend->getDirListPageInternal( $container, $dir, $after, $limit, $params );
@@ -1705,7 +1695,7 @@ class SwiftFileBackendFileList extends SwiftFileBackendList {
 
        /**
         * @see SwiftFileBackendList::pageFromList()
-        * @return Array|null
+        * @return Array
         */
        protected function pageFromList( $container, $dir, &$after, $limit, array $params ) {
                return $this->backend->getFileListPageInternal( $container, $dir, $after, $limit, $params );
index 11e125c..8266e42 100644 (file)
@@ -37,8 +37,8 @@ class TempFSFile extends FSFile {
         * Make a new temporary file on the file system.
         * Temporary files may be purged when the file object falls out of scope.
         *
-        * @param $prefix string
-        * @param $extension string
+        * @param string $prefix
+        * @param string $extension
         * @return TempFSFile|null
         */
        public static function factory( $prefix, $extension = '' ) {
@@ -81,7 +81,7 @@ class TempFSFile extends FSFile {
        /**
         * Clean up the temporary file only after an object goes out of scope
         *
-        * @param $object Object
+        * @param Object $object
         * @return TempFSFile This object
         */
        public function bind( $object ) {
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 f534eff..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 );
                }
        }
 
@@ -92,11 +92,25 @@ abstract class LockManager {
         * @return Status
         */
        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 = Status::newGood();
+               $pathsByType = $this->normalizePathsByType( $pathsByType );
                $msleep = array( 0, 50, 100, 300, 500 ); // retry backoff times
                $start = microtime( true );
                do {
-                       $status = $this->doLock( array_unique( $paths ), $this->lockTypeMap[$type] );
+                       $status = $this->doLockByType( $pathsByType );
                        $elapsed = microtime( true ) - $start;
                        if ( $status->isOK() || $elapsed >= $timeout || $elapsed < 0 ) {
                                break; // success, timeout, or clock set back
@@ -116,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;
        }
@@ -146,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 64155e6..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' );
@@ -1096,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 edf623e..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 ) {
+                       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,11 +174,11 @@ 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 ) {
+               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 f8887cc..3be66d3 100644 (file)
@@ -532,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__
@@ -604,7 +604,7 @@ class LocalFile extends File {
         * Return the width of the image
         *
         * @param $page int
-        * @return bool|int Returns false on error
+        * @return int
         */
        public function getWidth( $page = 1 ) {
                $this->load();
@@ -614,7 +614,9 @@ class LocalFile extends File {
                        if ( $dim ) {
                                return $dim['width'];
                        } else {
-                               return false;
+                               // For non-paged media, the false goes through an
+                               // intval, turning failure into 0, so do same here.
+                               return 0;
                        }
                } else {
                        return $this->width;
@@ -625,7 +627,7 @@ class LocalFile extends File {
         * Return the height of the image
         *
         * @param $page int
-        * @return bool|int Returns false on error
+        * @return int
         */
        public function getHeight( $page = 1 ) {
                $this->load();
@@ -635,7 +637,9 @@ class LocalFile extends File {
                        if ( $dim ) {
                                return $dim['height'];
                        } else {
-                               return false;
+                               // For non-paged media, the false goes through an
+                               // intval, turning failure into 0, so do same here.
+                               return 0;
                        }
                } else {
                        return $this->height;
@@ -803,7 +807,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();
                }
 
@@ -845,7 +849,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 );
@@ -866,7 +870,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
@@ -1196,20 +1200,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'
@@ -1275,20 +1279,45 @@ 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 );
 
-               wfProfileIn( __METHOD__ . '-edit' );
+               $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.
+               // For a similar reason, we avoid making an RC entry
+               // now and wait until the page exists.
+               $logId = $logEntry->insert();
+
                $exists = $descTitle->exists();
+               if ( $exists ) {
+                       // Page exists, do RC entry now (otherwise we wait for later).
+                       $logEntry->publish( $logId );
+               }
+               wfProfileIn( __METHOD__ . '-edit' );
 
                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 ) ) {
@@ -1316,16 +1345,20 @@ class LocalFile extends File {
                        $content = ContentHandler::makeContent( $pageText, $descTitle );
                        $status = $wikiPage->doEditContent( $content, $comment, EDIT_NEW | EDIT_SUPPRESS_RC, false, $user );
 
-                       if ( isset( $status->value['revision'] ) ) { // XXX; doEdit() uses a transaction
-                               $dbw->begin( __METHOD__ );
+                       $dbw->begin( __METHOD__ ); // XXX; doEdit() uses a transaction
+                       // Now that the page exists, make an RC entry.
+                       $logEntry->publish( $logId );
+                       if ( isset( $status->value['revision'] ) ) {
                                $dbw->update( 'logging',
                                        array( 'log_page' => $status->value['revision']->getPage() ),
                                        array( 'log_id' => $logId ),
                                        __METHOD__
                                );
-                               $dbw->commit( __METHOD__ ); // commit before anything bad can happen
                        }
+                       $dbw->commit( __METHOD__ ); // commit before anything bad can happen
                }
+
+
                wfProfileOut( __METHOD__ . '-edit' );
 
                # Save to cache and purge the squid
@@ -1352,11 +1385,17 @@ class LocalFile extends File {
                # Invalidate cache for all pages using this file
                $update = new HTMLCacheUpdate( $this->getTitle(), 'imagelinks' );
                $update->doUpdate();
+               if ( !$reupload ) {
+                       LinksUpdate::queueRecursiveJobsForTable( $this->getTitle(), 'imagelinks' );
+               }
 
                # Invalidate cache for all pages that redirects on this page
                $redirs = $this->getTitle()->getRedirectsHere();
 
                foreach ( $redirs as $redir ) {
+                       if ( !$reupload && $redir->getNamespace() === NS_FILE ) {
+                               LinksUpdate::queueRecursiveJobsForTable( $redir, 'imagelinks' );
+                       }
                        $update = new HTMLCacheUpdate( $redir, 'imagelinks' );
                        $update->doUpdate();
                }
@@ -1406,7 +1445,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 );
@@ -1602,9 +1641,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();
        }
@@ -1659,11 +1702,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;
        }
 
        /**
@@ -2174,7 +2219,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 2e86ae1..2c54596 100644 (file)
@@ -291,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 cd14e4e..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;
@@ -569,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' ) );
                }
 
@@ -588,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;
                }
@@ -601,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 f525319..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;
@@ -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 );
@@ -978,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 9119312..2d863eb 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".
@@ -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.
@@ -550,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.
 
@@ -605,6 +616,7 @@ Used as error message.',
        'config-page-name' => '{{Identical|Name}}',
        'config-page-options' => '{{Identical|Options}}',
        'config-page-install' => '{{Identical|Install}}',
+       'config-page-complete' => '{{Identical|Complete}}',
        '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.',
@@ -647,6 +659,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.',
@@ -752,6 +768,8 @@ See also:
        '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-mysql-binary' => '{{Identical|Binary}}',
        'config-ns-generic' => 'Used as label for "namespace type" radio button.
 
 See also:
@@ -966,6 +984,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.',
@@ -1165,7 +1184,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 (አማርኛ)
@@ -1178,7 +1197,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)
@@ -1192,20 +1211,20 @@ $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)
  * @author Gott wisst
  */
 $messages['ang'] = array(
-       'mainpagetext' => "'''MediaǷiki hafaþ ȝeƿorden spēdiȝe inseted.'''",
+       'mainpagetext' => "'''MediaWiki hafaþ geworden spēdige inseted.'''",
        'mainpagedocfooter' => 'Þeahta þone [//meta.wikimedia.org/wiki/Help:Contents Brūcenda Lǣdend]  on helpe mid þǣre nytte of ƿikisōftƿare.
 
 == 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 (العربية)
@@ -1271,7 +1290,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 (مصرى)
@@ -1284,10 +1303,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
  */
@@ -1298,7 +1317,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)
@@ -1384,7 +1403,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ə',
@@ -1398,7 +1416,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 (башҡортса)
@@ -1411,7 +1429,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)
@@ -1425,7 +1443,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 (بلوچی مکرانی)
@@ -1437,7 +1455,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)
@@ -1450,7 +1468,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 (беларуская)
@@ -1463,7 +1481,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) (беларуская (тарашкевіца)‎)
@@ -1604,6 +1622,8 @@ MediaWiki патрабуе падтрымкі UTF-8 для слушнай пра
        '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 падтрымліваецца ўбудавана.
@@ -1719,7 +1739,7 @@ $1
        'config-missing-db-host' => 'Вы павінны ўвесьці значэньне парамэтру «Хост базы зьвестак»',
        'config-missing-db-server-oracle' => 'Вы павінны ўвесьці значэньне парамэтру «TNS базы зьвестак»',
        'config-invalid-db-server-oracle' => 'Няслушнае TNS базы зьвестак «$1».
-Назва можа ўтрымліваць толькі ASCII-літары (a-z, A-Z), лічбы (0-9), сымбалі падкрэсьліваньня(_) і кропкі (.).',
+Назва можа ўтрымліваць толькі ASCII-літары (a-z, A-Z), лічбы (0-9), сымбалі падкрэсьліваньня(_) і кропкі (.).', # Fuzzy
        'config-invalid-db-name' => 'Няслушная назва базы зьвестак «$1».
 Назва можа ўтрымліваць толькі ASCII-літары (a-z, A-Z), лічбы (0-9), сымбалі падкрэсьліваньня(_) і працяжнікі (-).',
        'config-invalid-db-prefix' => 'Няслушны прэфікс базы зьвестак «$1».
@@ -1914,7 +1934,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 патрабуе доступу да Інтэрнэту.
@@ -2435,7 +2455,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/ Общомедия].
 За да е възможно това, МедияУики изисква достъп до Интернет.
@@ -2548,7 +2568,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 (বাংলা)
@@ -2594,12 +2614,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' => 'আপনাকে অবশ্যই "ডেটাবেজ হোস্ট"-এর জন্য একটি মান প্রবেশ করাতে হবে',
@@ -2629,7 +2647,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' => 'ব্যক্তিগত উইকি',
@@ -2663,7 +2681,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 (বিষ্ণুপ্রিয়া মণিপুরী)
@@ -2676,7 +2694,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)
@@ -3194,7 +3212,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)
@@ -3206,7 +3224,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 (کوردی)
@@ -3238,7 +3256,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) (къырымтатарджа (Кирилл)‎)
@@ -3250,7 +3268,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)‎)
@@ -3262,11 +3280,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 아라
  */
@@ -3399,6 +3418,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.
@@ -3831,21 +3852,23 @@ $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)
+ * @author Lloffiwr
  * @author Xxglennxx
  */
 $messages['cy'] = array(
        'mainpagetext' => "'''Wedi llwyddo gosod meddalwedd MediaWiki yma'''",
-       'mainpagedocfooter' => 'Ceir cymorth (yn Saesneg) ar ddefnyddio meddalwedd wici yn y [//meta.wikimedia.org/wiki/Help:Contents Canllaw Defnyddwyr] ar wefan Wikimedia.
+       'mainpagedocfooter' => "Ceir cymorth (yn Saesneg) ar ddefnyddio meddalwedd wici yn y [//meta.wikimedia.org/wiki/Help:Contents Canllaw Defnyddwyr] ar wefan Wikimedia.
 
 ==Cychwyn arni==
 
 * [//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]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Cyfieithu MediaWici i'ch iaith chi]",
 );
 
 /** Danish (dansk)
@@ -3858,7 +3881,7 @@ $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)
@@ -4003,6 +4026,8 @@ 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.
@@ -4117,7 +4142,7 @@ Sofern nicht das Datenbanksystem angezeigt wird, das verwendet werden soll, gibt
        'config-missing-db-host' => 'Bei „Datenbankhost“ muss ein Wert angegeben werden.',
        'config-missing-db-server-oracle' => 'Für das „Datenbank-TNS“ muss ein Wert eingegeben werden',
        'config-invalid-db-server-oracle' => 'Ungültiges Datenbank-TNS „$1“.
-Es dürfen nur ASCII-codierte Buchstaben (a-z, A-Z), Zahlen (0-9) und Unterstriche (_) und Punkte (.) verwendet werden.',
+Entweder „TNS Name“ oder eine „Easy Connect“-Zeichenfolge verwenden ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle-Benennungsmethoden])',
        'config-invalid-db-name' => 'Ungültiger Datenbankname „$1“.
 Es dürfen nur ASCII-codierte Buchstaben (a-z, A-Z), Zahlen (0-9), Unter- (_) sowie Bindestriche (-) verwendet werden.',
        'config-invalid-db-prefix' => 'Ungültiger Datenbanktabellenpräfix „$1“.
@@ -4193,6 +4218,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.
@@ -4405,6 +4436,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].
 
@@ -4425,7 +4459,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)
@@ -4463,7 +4497,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',
@@ -4492,7 +4525,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)
@@ -4522,7 +4555,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 (Ελληνικά)
@@ -4562,7 +4595,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' => 'Όνομα του βίκι:',
@@ -4630,7 +4662,7 @@ $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)
@@ -4638,6 +4670,7 @@ $messages['eo'] = array(
  * @author Ciencia Al Poder
  * @author Crazymadlover
  * @author Danke7
+ * @author Fitoschido
  * @author Locos epraix
  * @author Od1n
  * @author Platonides
@@ -4776,6 +4809,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.
@@ -5194,7 +5228,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)
@@ -5339,7 +5373,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',
@@ -5355,7 +5389,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)
@@ -5368,7 +5402,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 (فارسی)
@@ -5803,6 +5837,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.
@@ -5914,7 +5950,7 @@ Si vous ne voyez pas le système de base de données que vous essayez d'utiliser
        'config-missing-db-host' => "Vous devez entrer une valeur pour « l'hôte de la base de données »",
        'config-missing-db-server-oracle' => 'Vous devez saisir une valeur pour le « Nom TNS de la base de données »',
        'config-invalid-db-server-oracle' => 'Le nom TNS de la base de données (« $1 ») est invalide.
-Il ne peut contenir que des lettres latines de base (a-z, A-Z), des chiffres (0-9), des caractères de soulignement (_) et des points (.).',
+Utilisez uniquement la chaîne "TNS Name" ou "Easy Connect" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Méthodes de nommage Oracle])',
        'config-invalid-db-name' => 'Nom de la base de données invalide (« $1 »).
 Il ne peut contenir que des lettres latines (a-z, A-Z), des chiffres (0-9), des caractères de soulignement (_) et des tirets (-).',
        'config-invalid-db-prefix' => 'Préfixe de la base de données non valide « $1 ».
@@ -5987,6 +6023,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.",
@@ -6196,6 +6238,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.
 
@@ -6216,7 +6261,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)
@@ -6408,7 +6453,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)
@@ -6421,7 +6466,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)
@@ -6434,7 +6479,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 (赣语(简体)‎)
@@ -6447,20 +6492,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)
@@ -6613,6 +6659,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.
@@ -6727,7 +6775,7 @@ Se non ve listado a continuación o sistema de base de datos que intenta usar, s
        'config-missing-db-host' => 'Debe escribir un valor "Servidor da base de datos"',
        'config-missing-db-server-oracle' => 'Debe escribir un valor "TNS da base de datos"',
        'config-invalid-db-server-oracle' => 'O TNS da base de datos, "$1", é incorrecto.
-Só pode conter letras ASCII (a-z, A-Z), números (0-9), guións baixos (_) e puntos (.).',
+Utilice só "TNS Name" ou unha cadea de texto "Easy Connect" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm métodos de nomeamento de Oracle])',
        'config-invalid-db-name' => 'O nome da base de datos, "$1", é incorrecto.
 Só pode conter letras ASCII (a-z, A-Z), números (0-9), guións baixos (_) e guións (-).',
        'config-invalid-db-prefix' => 'O prefixo da base de datos, "$1", é incorrecto.
@@ -6802,6 +6850,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.
@@ -7016,7 +7070,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.
 
@@ -7046,7 +7103,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)
@@ -7161,6 +7218,7 @@ Miniaturaasichte vu Bilder sin megli, sobald s Uffelade vu Dateie aktiviert isch
 );
 
 /** Gujarati (ગુજરાતી)
+ * @author Ashok modhvadia
  * @author Dineshjk
  */
 $messages['gu'] = array(
@@ -7170,7 +7228,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)
@@ -7189,7 +7248,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)
@@ -7637,7 +7696,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).
 כדי לעשות את זה, מדיה־ויקי צריך לגשת לאינטרנט.
@@ -7749,7 +7808,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)
@@ -7762,7 +7821,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)
@@ -7775,7 +7834,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)
@@ -7783,7 +7842,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)
@@ -8144,7 +8203,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)
@@ -8571,7 +8630,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.
@@ -8756,7 +8815,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)
@@ -9202,7 +9261,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.
@@ -9728,7 +9787,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.
@@ -9866,7 +9925,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)
@@ -9879,7 +9938,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)
@@ -9978,6 +10037,8 @@ L'installazione potrebbe non riuscire!",
        'config-no-cache' => "'''Attenzione:''' [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache] non sono stati trovati.
 La caching degli oggetti non è attivata.",
        'config-diff3-bad' => 'GNU diff3 non trovato.',
+       'config-git' => 'Trovato software di controllo della versione Git: <code>$1</code>.',
+       'config-git-bad' => 'Software di controllo della versione Git non trovato.',
        'config-imagemagick' => 'Trovato ImageMagick: <code>$1</code>.
 Le miniature delle immagini saranno presenti se gli upload vengono abilitati.',
        'config-gd' => 'Trovata la GD Graphics Library built-in.
@@ -9990,13 +10051,25 @@ Installazione interrotta.",
        'config-using-server' => 'Nome server in uso "<nowiki>$1</nowiki>".',
        'config-using-uri' => 'URL del server in uso "<nowiki>$1$2</nowiki>".',
        'config-db-type' => 'Tipo di database:',
+       'config-db-host' => 'Host del database:',
+       'config-db-host-oracle' => 'TNS del database:',
        'config-db-wiki-settings' => 'Identifica questo wiki',
        'config-db-name' => 'Nome del database:',
        'config-db-name-oracle' => 'Schema del database:',
+       'config-db-install-account' => "Account utente per l'installazione",
        'config-db-username' => 'Nome utente del database:',
+       'config-db-password' => 'Password del database:',
        'config-db-password-empty' => 'Inserire una password per il nuovo utente del database: $1.
 Anche se può essere possibile creare utenti senza password, questo non è sicuro.',
+       'config-db-install-username' => "Inserisci il nome utente che verrà utilizzato per connettersi al database durante il processo di installazione.
+Questo non è il nome utente dell'account MediaWiki; ma quello per il tuo database.",
+       'config-db-install-password' => "Inserisci la password che verrà utilizzato per connettersi al database durante il processo di installazione.
+Questa non è la password dell'account MediaWiki; ma quella per il tuo database.",
        'config-db-install-help' => "Inserire il nome utente e la password che verranno usate per la connessione al database durante il processo d'installazione.",
+       'config-db-account-lock' => 'Utilizza lo stesso nome utente e password durante il normale funzionamento',
+       'config-db-wiki-account' => 'Account utente per il normale funzionamento',
+       'config-db-wiki-help' => "Inserisci il nome utente e la password che verrà utilizzato per connettersi al database durante il normale funzionamento del wiki.
+Se l'account non esiste, e l'account di installazione dispone di privilegi sufficienti, verrà creato con privilegi minimi necessari per operare sul wiki.",
        'config-db-prefix' => 'Prefisso tabella del database:',
        'config-db-charset' => 'Set di caratteri del database',
        'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
@@ -10008,25 +10081,51 @@ 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-oracle-def-ts' => 'Tablespace di default:',
+       'config-oracle-temp-ts' => 'Tablespace temporaneo:',
        '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-missing-db-host' => 'È necessario immettere un valore per "Host del database"',
+       'config-missing-db-server-oracle' => 'È necessario immettere un valore per "TNS del database"',
+       'config-connection-error' => '$1.
+
+Controlla host, nome utente e password e prova ancora.',
+       'config-postgres-old' => 'PostgreSQL $1 o una versione successiva è necessaria, rilevata la $2.',
+       'config-sqlite-cant-create-db' => 'Impossibile creare il file di database <code>$1</code> .',
+       'config-can-upgrade' => "Ci sono tabelle di MediaWiki in questo database.
+Per aggiornarle a MediaWiki $1, fai clic su '''continua'''.",
+       'config-upgrade-done' => "Aggiornamento completo.
+
+Puoi [$1 iniziare ad usare il tuo wiki].
+
+Se vuoi rigenerare il tuo file <code>LocalSettings.php</code>, clicca sul pulsante sotto. Questa operazione '''non è raccomandata''', a meno che non hai problemi con il tuo wiki.",
+       'config-upgrade-done-no-regenerate' => 'Aggiornamento completo.
+
+Puoi [$1 iniziare ad usare il tuo wiki].',
+       'config-regenerate' => 'Rigenera LocalSettings.php →',
        'config-db-web-account' => "Account del database per l'accesso web",
+       'config-db-web-help' => 'Seleziona il nome utente e la password che il server web utilizzerà per connettersi al server di database, durante il normale funzionamento del wiki.',
+       'config-db-web-account-same' => "Utilizza lo stesso account dell'installazione",
        'config-db-web-create' => "Crea l'account se non esiste già",
+       'config-db-web-no-create-privs' => "L'account usato per l'installazione non dispone dei privilegi necessari per creare un altro account.
+L'account indicato qui deve già esistere.",
        'config-mysql-engine' => 'Storage engine:',
        'config-mysql-innodb' => 'InnoDB',
        'config-mysql-myisam' => 'MyISAM',
        '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-site-name' => 'Nome del wiki:',
+       'config-site-name-help' => 'Questo verrà visualizzato nella barra del titolo del browser e in vari altri posti.',
+       'config-site-name-blank' => 'Inserisci il nome del sito.',
+       'config-project-namespace' => 'Namespace del progetto:',
        'config-ns-generic' => 'Progetto',
-       'config-ns-site-name' => 'Stesso nome wiki: $1',
+       'config-ns-site-name' => 'Stesso nome del wiki: $1',
+       'config-ns-other' => 'Altro (specificare)',
        'config-ns-other-default' => 'MyWiki',
        'config-admin-box' => 'Account amministratore',
        'config-admin-name' => 'Tuo nome:',
@@ -10049,7 +10148,9 @@ 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-optional-skip' => 'Sono già stanco, installa solo il wiki.',
+       'config-profile' => 'Profilo dei diritti utente:',
+       'config-profile-wiki' => 'Wiki aperto',
        'config-profile-no-anon' => 'Creazione utenza obbligatoria',
        'config-profile-fishbowl' => 'Solo editori autorizzati',
        'config-profile-private' => 'Wiki privata',
@@ -10068,8 +10169,13 @@ Se vuoi usare testi da Wikipedia, o desideri che Wikipedia possa essere in grado
 
 In precedenza Wikipedia ha utilizzato la GNU Free Documentation License. La GFDL è una licenza valida, ma è di difficile comprensione e complica il riutilizzo dei contenuti.",
        'config-email-settings' => 'Impostazioni email',
+       'config-enable-email' => 'Abilita la posta elettronica in uscita',
        'config-email-user' => 'Abilita invio email fra utenti',
+       'config-email-usertalk' => 'Abilita le notifiche per le pagine di discussione utente',
+       'config-email-watchlist' => 'Abilita le notifiche per gli osservati speciali',
        'config-email-auth' => 'Abilita autenticazione via email',
+       'config-email-sender' => 'Indirizzo email di ritorno:',
+       'config-upload-settings' => 'Caricamenti di immagini e file',
        'config-upload-enable' => 'Consentire il caricamento di file',
        'config-upload-deleted' => 'Directory per i file cancellati:',
        'config-logo' => 'URL del logo:',
@@ -10077,16 +10183,20 @@ In precedenza Wikipedia ha utilizzato la GNU Free Documentation License. La GFDL
        'config-cc-again' => 'Seleziona di nuovo...',
        'config-cc-not-chosen' => 'Scegliere quale licenza Creative Commons si desidera e cliccare su "procedi".',
        'config-advanced-settings' => 'Configurazione avanzata',
+       'config-memcached-servers' => 'Server di memcached:',
        'config-memcache-needservers' => 'È stato selezionato il tipo di caching Memcached, ma non è stato impostato alcun server.',
        'config-memcache-badip' => 'È stato inserito un indirizzo IP non valido per Memcached: $1.',
+       'config-memcache-badport' => 'I numeri di porta per memcached dovrebbero essere tra $1 e $2.',
        'config-extensions' => 'Estensioni',
        'config-install-step-done' => 'fatto',
        'config-install-step-failed' => 'non riuscito',
+       'config-install-database' => 'Configurazione database',
        'config-install-schema' => 'Creazione dello schema',
        'config-install-user' => 'Creazione di utente del database',
        'config-install-user-alreadyexists' => 'L\'utente "$1" è già presente',
        'config-install-user-create-failed' => 'Creazione dell\'utente "$1" non riuscita: $2',
        'config-install-user-missing' => 'L\'utente indicato "$1" non esiste.',
+       'config-install-tables' => 'Creazione tabelle',
        'config-install-tables-failed' => "'''Errore''': La creazione della tabella non è riuscita: $1",
        'config-install-interwiki' => 'Riempimento della tabella interwiki predefinita',
        'config-install-interwiki-list' => 'Impossibile leggere il file <code>interwiki.list</code>.',
@@ -10096,6 +10206,7 @@ In precedenza Wikipedia ha utilizzato la GNU Free Documentation License. La GFDL
        'config-install-subscribe-fail' => 'Impossibile sottoscrivere mediawiki-announce: $1',
        'config-install-subscribe-notpossible' => 'cURL non è installato e allow_url_fopen non è disponibile.',
        'config-install-mainpage' => 'Creazione della pagina principale con contenuto predefinito',
+       'config-install-extension-tables' => 'Creazione delle tabelle per le estensioni attivate',
        'config-install-mainpage-failed' => 'Impossibile inserire la pagina principale: $1',
        'config-download-localsettings' => 'Scarica <code>LocalSettings.php</code>',
        'config-help' => 'aiuto',
@@ -10114,6 +10225,7 @@ I seguenti collegamenti sono in lingua inglese:
 
 /** Japanese (日本語)
  * @author Aphaia
+ * @author Fryed-peach
  * @author Iwai.masaharu
  * @author Mizusumashi
  * @author Ninomy
@@ -10215,6 +10327,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> オプションが有効になっています。'''
 '''可能なら無効化してください。'''
@@ -10250,6 +10363,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画像ライブラリが内蔵されていることが確認されました。
        'config-missing-db-host' => '「データベースのホスト」を入力してください',
        'config-missing-db-server-oracle' => '「データベース TNS」の値を入力してください',
        'config-invalid-db-server-oracle' => '「$1」は無効なデータベース TNS です。
\82¢ã\82¹ã\82­ã\83¼è\8b±å­\97(a-zã\80\81A-Z)ã\80\81æ\95°å­\97(0-9)ã\80\81ã\82¢ã\83³ã\83\80ã\83¼ã\83\90ã\83¼(_)ã\80\81ã\83\89ã\83\83ã\83\88(.)ã\81®ã\81¿ã\82\92使ç\94¨ã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82',
\80\8cTNS å\90\8dã\80\8dã\80\8cEasy Connectã\80\8dæ\96\87å­\97å\88\97ã\81®ã\81\84ã\81\9aã\82\8cã\81\8bã\82\92使ç\94¨ã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84 ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods])',
        'config-invalid-db-name' => '「$1」は無効なデータベース名です。
-アスキー英字(a-z、A-Z)、数字(0-9)、アンダーバー(_)、ハイフン(-)のみを使用してください。',
-       'config-invalid-db-prefix' => 'ã\80\8c$1ã\80\8dã\81¯ç\84¡å\8a¹ã\81ªã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹æ\8e¥é ­èª\9eã\81§ã\81\99ã\80\82
-アスキー英字(a-z, A-Z)、数字(0-9)、下線(_)、ハイフン(-)のみを使用してください。',
+半角の英数字 (a-z、A-Z、0-9)、アンダースコア (_)、ハイフン (-) のみを使用してください。',
+       'config-invalid-db-prefix' => 'ã\80\8c$1ã\80\8dã\81¯ç\84¡å\8a¹ã\81ªã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹æ\8e¥é ­è¾\9eã\81§ã\81\99ã\80\82
+半角の英数字 (a-z、A-Z、0-9)、アンダースコア (_)、ハイフン (-) のみを使用してください。',
        'config-connection-error' => '$1。
 
 以下のホスト名、ユーザー名、パスワードを確認してから再度試してください。',
        'config-invalid-schema' => '「$1」は MediaWiki のスキーマとして無効です。
-ASCII の英数字 (a-z、A-Z、0-9)、下線 (_) のみを使用してください。',
+半角の英数字 (a-z、A-Z、0-9)、アンダースコア (_) のみを使用してください。',
        'config-postgres-old' => 'PostgreSQL $1 以降が必要です。ご使用中の PostgreSQL は $2 です。',
        'config-sqlite-name-help' => 'あなたのウェキと同一性のある名前を選んでください。
 空白およびハイフンは使用しないでください。
@@ -10476,7 +10591,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' => '非公開ウィキ',
@@ -10645,7 +10760,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)
@@ -10653,7 +10768,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)
@@ -10664,7 +10779,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 (ქართული)
@@ -10712,7 +10827,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',
@@ -10773,7 +10887,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
 );
 
 /** Адыгэбзэ (Адыгэбзэ)
@@ -10787,7 +10901,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 (کھوار)
@@ -10807,7 +10921,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) (قازاقشا (تٴوتە)‏)
@@ -10819,7 +10933,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) (қазақша (кирил)‎)
@@ -10831,7 +10945,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)‎)
@@ -10843,7 +10957,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 (ភាសាខ្មែរ)
@@ -10873,7 +10987,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 (ಕನ್ನಡ)
@@ -10886,7 +11000,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 (한국어)
@@ -11118,7 +11232,7 @@ MySQL의 UTF-8 모드를 보다 더 효율적이고 유니코드 문자의 전
 예를 들어 <code>/var/lib/mediawiki/yourwiki</code>와 같이 다른 곳에 데이터베이스를 넣는 것이 좋습니다.",
        'config-oracle-def-ts' => '기본 테이블공간:',
        'config-oracle-temp-ts' => '임시 테이블공간:',
-       'config-type-oracle' => '오라클',
+       'config-type-oracle' => 'Oracle',
        'config-support-info' => '미디어위키는 다음의 데이터베이스 시스템을 지원합니다:
 
 $1
        'config-header-mysql' => 'MySQL 설정',
        'config-header-postgres' => 'PostgreSQL 설정',
        'config-header-sqlite' => 'SQLite 설정',
-       'config-header-oracle' => '오라클 설정',
+       'config-header-oracle' => 'Oracle 설정',
        'config-invalid-db-type' => '잘못된 데이터베이스 종류',
        'config-missing-db-name' => '"데이터베이스 이름"에 대한 값을 입력해야 합니다',
        'config-missing-db-host' => '"데이터베이스 호스트"에 대한 값을 입력해야 합니다',
        'config-missing-db-server-oracle' => '"데이터베이스 TNS"에 대한 값을 입력해야 합니다',
        'config-invalid-db-server-oracle' => '"$1" 데이터베이스 TNS가 잘못됐습니다.
-ASCII 글자 (a-z, A-Z), 숫자 (0-9), 밑줄 (_)과 하이픈 (-)만 사용하세요.',
+ASCII 글자 (a-z, A-Z), 숫자 (0-9), 밑줄 (_)과 하이픈 (-)만 사용하세요.', # Fuzzy
        'config-invalid-db-name' => '"$1" 데이터베이스 이름이 잘못되었습니다.
 ASCII 글자 (a-z, A-Z), 숫자 (0-9), 밑줄 (_)과 하이픈 (-)만 사용하세요.',
        'config-invalid-db-prefix' => '"$1" 데이터베이스 접두어가 잘못됐습니다.
@@ -11448,7 +11562,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)
@@ -11578,7 +11692,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.',
@@ -11593,6 +11707,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.
@@ -11612,7 +11728,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.
@@ -11694,7 +11810,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
@@ -11704,12 +11819,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.',
@@ -11786,6 +11899,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.
@@ -11798,7 +11918,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.',
@@ -11841,25 +11960,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',
@@ -11908,6 +12027,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.
@@ -11934,7 +12055,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.',
@@ -11942,7 +12063,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',
@@ -12002,14 +12123,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î)‎)
@@ -12031,7 +12156,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)
@@ -12044,7 +12169,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)
@@ -12058,6 +12183,8 @@ $messages['lb'] = array(
        'config-localsettings-upgrade' => "'''Opgepasst''': E Fichier <code>LocalSettings.php</code> gouf fonnt.
 Är Software kann aktualiséiert ginn, setzt w.e.g. de Wäert vum <code>\$wgUpgradeKey</code> an d'Këscht.
 Dir fannt en am <code>LocalSettings.php</code>.",
+       'config-localsettings-cli-upgrade' => "E Fichier <code>LocalSettings.php</code> gouf fonnt.
+Fir dës Installatioun z'aktuaéliséieren start w.e.g. <code>update.php</code>",
        'config-localsettings-key' => 'Aktualisatiounsschlëssel:',
        'config-localsettings-badkey' => 'De Schlëssel deen Dir aginn hutt ass net korrekt',
        'config-localsettings-incomplete' => 'De Fichier <code>LocalSettings.php</code> schéngt net komplett ze sinn.
@@ -12226,7 +12353,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...',
@@ -12236,6 +12363,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!',
@@ -12247,18 +12375,20 @@ Dir kënnt elo déi Astellungen déi nach iwwreg sinn iwwersprangen an d'Wiki el
        'config-install-stats' => 'Initialisatioun vun de Statistiken',
        'config-install-keys' => 'Generéiere vum Geheimschlëssel',
        'config-install-sysop' => 'Administrateur Benotzerkont gëtt ugeluecht',
+       'config-install-mainpage' => 'Haaptsäit mat Standard-Inhalt gëtt ugeluecht',
        'config-install-extension-tables' => "D'Tabelle fir déi aktivéiert Erweiderunge ginn ugeluecht",
        'config-install-mainpage-failed' => "D'Haaptsäit konnt net dragesat ginn: $1",
        'config-download-localsettings' => '<code>LocalSettings.php</code> eroflueden',
        '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)
@@ -12271,7 +12401,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)
@@ -12284,7 +12414,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)
@@ -12297,7 +12427,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 (ລາວ)
@@ -12327,12 +12457,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',
@@ -12353,7 +12481,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',
@@ -12400,7 +12528,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 (文言)
@@ -12413,7 +12541,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)
@@ -12426,7 +12554,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 (मैथिली)
@@ -12439,7 +12567,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 (мокшень)
@@ -12452,7 +12580,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)
@@ -12486,7 +12614,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',
@@ -12510,7 +12638,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 (олык марий)
@@ -12520,17 +12648,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 (македонски)
@@ -12669,6 +12798,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 графичка библиотека.
@@ -12779,8 +12910,8 @@ $1
        'config-missing-db-name' => 'Мора да внесете значење за параметарот „Име на базата“',
        'config-missing-db-host' => 'Мора да внесете вредност за „Домаќин на базата на податоци“',
        'config-missing-db-server-oracle' => 'Мора да внесете вредност за „TNS на базата“',
-       'config-invalid-db-server-oracle' => 'Неважечки TNS „$1“ за базата.
-Користете само знаци по ASCII - букви (a-z, A-Z), бројки (0-9), долни црти (_) и точки (.).',
+       'config-invalid-db-server-oracle' => 'Неважечки TNS „$1“.
+Користете или „TNS Name“ или низата „Easy Connect“ ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Методи на именување за Oracle])',
        'config-invalid-db-name' => 'Неважечко име на базата „$1“.
 Користете само ASCII-букви (a-z, A-Z), бројки (0-9), долни црти (_) и цртички (-).',
        'config-invalid-db-prefix' => 'Неважечки префикс за базата „$1“.
@@ -12855,6 +12986,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''' може да е побрз кај инсталациите наменети за само еден корисник или незаписни инсталации (само читање).
@@ -12875,8 +13011,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>“ се коси со основниот именски простор на МедијаВики.
@@ -13069,6 +13205,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 Упатството за корисници] за подетални иформации како се користи вики-програмот.
 
@@ -13246,7 +13385,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 (मराठी)
@@ -13259,7 +13398,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)
@@ -13273,7 +13412,7 @@ $messages['ms'] = array(
        'config-localsettings-key' => 'Kunci naik taraf:',
        'config-localsettings-badkey' => 'Kunci yang anda berikan tidak betul.',
        'config-session-error' => 'Ralat ketika memulakan sesi: $1',
-       'config-your-language' => 'Bahasa kamu:',
+       'config-your-language' => 'Bahasa anda:',
        'config-your-language-help' => 'Pilihkan bahasa untuk digunakan dalam proses pemasangan ini.',
        'config-wiki-language' => 'Bahasa wiki:',
        'config-wiki-language-help' => 'Pilih bahasa utama wiki yang bakal dicipta ini.',
@@ -13300,12 +13439,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',
@@ -13347,11 +13484,12 @@ Bagaimanapun, MediaWiki memerlukan PHP $2 ke atas.',
        'mainpagetext' => "'''MediaWiki telah berjaya dipasang.'''",
        'mainpagedocfooter' => 'Sila rujuk [//meta.wikimedia.org/wiki/Help:Contents Panduan Penggunaan] untuk maklumat mengenai penggunaan perisian wiki ini.
 
-== Untuk bermula ==
+== Permulaan ==
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Senarai tetapan konfigurasi]
 * [//www.mediawiki.org/wiki/Manual:FAQ Soalan Lazim MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Senarai mel bagi keluaran MediaWiki]', # Fuzzy
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Senarai surat keluaran MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Terjemahkan MediaWiki ke dalam bahasa anda]',
 );
 
 /** Maltese (Malti)
@@ -13498,7 +13636,7 @@ $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)
@@ -13973,7 +14111,7 @@ $messages['nds'] = array(
 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(
@@ -13983,7 +14121,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 (नेपाली)
@@ -13997,7 +14135,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)
@@ -14142,6 +14280,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.
@@ -14256,8 +14396,8 @@ Als u het databasesysteem dat u wilt gebruiken niet in de lijst terugvindt, volg
        '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 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-server-oracle' => 'Ongeldige database-TNS "$1".
+Gebruik "TNS Names" of een "Easy Connect" tekst ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle naamgevingsmethoden])',
        'config-invalid-db-name' => 'Ongeldige databasenaam "$1".
 Gebruik alleen letters (a-z, A-Z), cijfers (0-9) en liggende streepjes (_) en streepjes (-).',
        'config-invalid-db-prefix' => 'Ongeldig databasevoorvoegsel "$1".
@@ -14334,6 +14474,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.
@@ -14553,6 +14699,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.
 
@@ -14809,7 +14957,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
  */
@@ -14856,7 +15004,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)‬) */
@@ -14874,10 +15022,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(
@@ -14912,7 +15060,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)
@@ -14936,7 +15084,7 @@ $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)
@@ -15080,6 +15228,8 @@ Instalacja może się nie udać!",
        'config-mod-security' => "''' Ostrzeżenie ''': Serwer sieci web ma włączone [http://modsecurity.org/ mod_security]. Jeśli niepoprawnie skonfigurowane, może być przyczyną problemów MediaWiki lub innego oprogramowania, które pozwala użytkownikom na wysyłanie dowolnej zawartości.
 Sprawdź w [http://modsecurity.org/documentation/ dokumentacji mod_security] lub skontaktuj się z obsługa hosta, jeśli wystąpią losowe błędy.",
        'config-diff3-bad' => 'Nie znaleziono GNU diff3.',
+       'config-git' => 'Znaleziono oprogramowanie kontroli wersji Git: <code>$1</code>.',
+       'config-git-bad' => 'Oprogramowanie systemu kontroli wersji Git nie zostało znalezione.',
        'config-imagemagick' => 'Mamy zainstalowany ImageMagick <code>$1</code>, dzięki czemu będzie można pomniejszać załadowane grafiki.',
        'config-gd' => 'Mamy wbudowaną bibliotekę graficzną GD, dzięki ceymu będzie można pomniejszać załadowane grafiki.',
        'config-no-scaling' => 'Nie można odnaleźć biblioteki GD lub ImageMagick. Nie będzie działać pomniejszanie załadowane grafiki.',
@@ -15098,7 +15248,8 @@ Instalacja została przerwana.',
        'config-using531' => 'MediaWiki nie może być używane z PHP $1 z powodu błędu dotyczącego referencyjnych argumentów funkcji <code>__call()</code>.
 Uaktualnij do PHP 5.3.2 lub nowszego. Możesz również cofnąć wersję do PHP 5.3.0, aby naprawić ten błąd.
 Instalacja została przerwana.',
-       'config-suhosin-max-value-length' => 'Jest zainstalowany Suhosin i ogranicza długość parametru GET do $1  bajtów. Komponent ResourceLoader w MediaWiki  wykona obejście tego ograniczenia, ale kosztem wydajności. Jeśli to możliwe należy ustawić <code>suhosin.get.max_value_length</code> na 1024 lub wyższej w <code>php.ini</code> oraz ustawić <code>$wgResourceLoaderMaxQueryLength</code> w LocalSettings.php na tę samą wartość.', # Fuzzy
+       'config-suhosin-max-value-length' => 'Jest zainstalowany Suhosin i ogranicza długość parametru GET <code>length</code> do $1 bajtów. Komponent ResourceLoader w MediaWiki wykona obejście tego ograniczenia, ale kosztem wydajności.
+Jeśli to możliwe, należy ustawić <code>suhosin.get.max_value_length</code> na 1024 lub wyżej w <code>php.ini</code> oraz ustawić <code>$wgResourceLoaderMaxQueryLength</code> w <code>LocalSettings.php</code> na tę samą wartość.',
        'config-db-type' => 'Typ bazy danych',
        'config-db-host' => 'Adres serwera bazy danych',
        'config-db-host-help' => 'Jeśli serwer bazy danych jest na innej maszynie, wprowadź jej nazwę domenową lub adres IP.
@@ -15188,7 +15339,7 @@ Poniżej wyświetlone są systemy baz danych gotowe do użycia. Jeżeli poniżej
        'config-missing-db-host' => 'Musisz wpisać wartość w polu „Serwer bazy danych”',
        'config-missing-db-server-oracle' => 'Należy wpisać wartość w polu „Nazwa instancji bazy danych (TNS)”',
        'config-invalid-db-server-oracle' => 'Nieprawidłowa nazwa instancji bazy danych (TNS) „$1”.
-W nazwie można użyć wyłącznie liter ASCII (a-z, A-Z), cyfr (0-9), podkreślenia (_) i kropek (.).',
+Użyj "TNS Name" lub "Easy Connect" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods])',
        'config-invalid-db-name' => 'Nieprawidłowa nazwa bazy danych „$1”.
 Używaj wyłącznie liter ASCII (a-z, A-Z), cyfr (0-9), podkreślenia (_) lub znaku odejmowania (-).',
        'config-invalid-db-prefix' => 'Nieprawidłowy prefiks bazy danych „$1”.
@@ -15263,6 +15414,12 @@ Konto, które wskazałeś tutaj musi już istnieć.',
 
 Jeśli instalacja MySQL obsługuje InnoDB, jest wysoce zalecane, by to je wybrać.
 Jeśli instalacja MySQL nie obsługuje InnoDB, być może nadszedł czas na jej uaktualnienie.",
+       'config-mysql-only-myisam-dep' => "'''Ostrzeżenie:''' MyISAM jest jedynym dostępnym mechanizmem składowania dla MySQL, który nie jest zalecany do używania z MediaWiki, ponieważ:
+* słabo obsługuje współbieżność z powodu blokowania tabel
+* jest bardziej skłonny do uszkodzeń niż inne silniki
+* kod MediaWiki nie zawsze traktuje MyISAM jak powinien
+
+Twoja instalacja MySQL nie obsługuje InnoDB, być może jest to czas na aktualizację.",
        'config-mysql-engine-help' => "'''InnoDB''' jest prawie zawsze najlepszą opcją, ponieważ posiada dobrą obsługę współbieżności.
 
 '''MyISAM''' może być szybsze w instalacjach pojedynczego użytkownika lub tylko do odczytu.
@@ -15306,7 +15463,7 @@ Podaj inną nazwę.',
        'config-admin-error-user' => 'Błąd wewnętrzny podczas tworzenia konta administratora o nazwie „<nowiki>$1</nowiki>”.',
        'config-admin-error-password' => 'Wewnętrzny błąd podczas ustawiania hasła dla administratora „<nowiki>$1</nowiki>”: <pre>$2</pre>',
        'config-admin-error-bademail' => 'Wpisałeś nieprawidłowy adres e‐mail',
-       'config-subscribe' => 'Zapisz się na [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce listę pocztową z ogłaszaniami o nowych wersjach].',
+       'config-subscribe' => 'Zapisz się na [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce listę pocztową z ogłoszeniami o nowych wersjach].',
        'config-subscribe-help' => 'Jest to lista o małej liczbie wiadomości, wykorzystywana do przesyłania informacji o udostępnieniu nowej wersji oraz istotnych sprawach dotyczących bezpieczeństwa.
 Powinieneś zapisać się na tę listę i aktualizować zainstalowane oprogramowanie MediaWiki gdy pojawia się nowa wersja.',
        'config-subscribe-noemail' => 'Próbowano subskrybować listę mailingową ogłoszeń wersji bez podania adresu e-mail.
@@ -15321,17 +15478,17 @@ Możesz pominąć pozostałe czynności konfiguracyjne i zainstalować wiki.',
        'config-profile-fishbowl' => 'Wyłącznie zatwierdzeni edytorzy',
        'config-profile-private' => 'Prywatna wiki',
        'config-profile-help' => "Strony typu wiki działają najlepiej, gdy pozwolisz je edytować tak wielu osobom, jak to możliwie.
-W MediaWiki, jest łatwe sprawdzenie ostatnich zmian i wycofać szkody, które są spowodowane przez naiwnych lub złośliwych użytkowników.
+W MediaWiki, można łatwo sprawdzić ostatnie zmiany i wycofać szkody, które są spowodowane przez naiwnych lub złośliwych użytkowników.
 
-Jednakże wielu uznało MediaWiki użytecznymi w różnorodnych rolach, a czasami nie jest łatwo przekonać wszystkich do korzyści ze sposobu działania wiki.
+Jednakże wielu uznało MediaWiki użytecznym w różnorodnych rolach, a czasami nie jest łatwo przekonać wszystkich do korzyści ze sposobu działania wiki. Masz więc wybór.
 
-Ustawienie '''{{int:config-profil-wiki}}''' pozwala każdemu na edycję, nawet bez logowania się.
-Wiki z '''{{int:config-profile-no-anon}}''' zawiera dodatkowe funkcje rozliczania się, ale może powstrzymać dorywczych współpracowników.
+Ustawienie '''{{int:config-profile-wiki}}''' pozwala każdemu na edycję, nawet bez logowania się.
+Wiki z '''{{int:config-profile-no-anon}}''' zawiera dodatkowe możliwości ale może powstrzymywać potencjalnych edytorów.
 
 Scenariusz '''{{int:config-profile-fishbowl}}''' umożliwia zatwierdzonym użytkownikom edycję, ale wyświetlanie stron jest powszechnie dostępne, włącznie z historią.
-Ustawienie '''{{int:config-profile-private}}'' ' pozwala na wyświetlanie stron tylko zatwierdzonym użytkownikom, ta sama grupa może edytować.
+Ustawienie '''{{int:config-profile-private}}'' ' pozwala na wyświetlanie stron tylko zatwierdzonym użytkownikom, ta sama grupa może je edytować.
 
-Bardziej skomplikowane konfiguracje uprawnień użytkowników są dostępne po zakończeniu instalacji, zobacz [//www.mediawiki.org/wiki/Manual:User_rights odpowiednią część podręcznika].", # Fuzzy
+Bardziej skomplikowane konfiguracje uprawnień użytkowników są dostępne po zakończeniu instalacji, zobacz [//www.mediawiki.org/wiki/Manual:User_rights odpowiednią część podręcznika].",
        'config-license' => 'Prawa autorskie i licencja',
        'config-license-none' => 'Brak stopki z licencją',
        'config-license-cc-by-sa' => 'Creative Commons – za uznaniem autora, na tych samych zasadach',
@@ -15382,7 +15539,9 @@ 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.', # Fuzzy
+Możesz użyć <code>$wgStylePath</code> lub <code>$wgScriptPath</code> jeżeli twoje logo jest relatywne do tych ścieżek.
+
+Jeśli nie chcesz logo, pozostaw to pole puste.',
        '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.
@@ -15415,8 +15574,8 @@ Jeśli nie znasz numeru portu, wartością domyślną jest 11211.',
 Mogą one wymagać dodatkowych czynności konfiguracyjnych, ale można je teraz włączyć',
        'config-install-alreadydone' => "'''Uwaga''' – wydaje się, że MediaWiki jest już zainstalowane, a obecnie próbujesz zainstalować je ponownie.
 Przejdź do następnej strony.",
-       'config-install-begin' => 'Po naciśnięciu "{{int:config-continue}}", rozpocznie się instalacji MediaWiki.
-Jeśli nadal chcesz dokonać zmian, naciśnij wstecz.', # Fuzzy
+       'config-install-begin' => 'Po naciśnięciu "{{int:config-continue}}", rozpocznie się instalacja MediaWiki.
+Jeśli nadal chcesz dokonać zmian, naciśnij "{{int:config-back}}".',
        'config-install-step-done' => 'gotowe',
        'config-install-step-failed' => 'nieudane',
        'config-install-extensions' => 'Włącznie z rozszerzeniami',
@@ -15474,13 +15633,17 @@ Po załadowaniu pliku konfiguracyjnego możesz '''[ $2  wejść na wiki]'''.",
        'config-download-localsettings' => 'Pobierz <code>LocalSettings.php</code>',
        'config-help' => 'pomoc',
        'config-nofile' => 'Nie udało się odnaleźć pliku "$1". Czy nie został usunięty?',
+       'config-extension-link' => 'Czy wiesz, że twoja wiki obsługuje [//www.mediawiki.org/wiki/Manual:Extensions/pl rozszerzenia]?
+
+Możesz przejrzeć [//www.mediawiki.org/wiki/Category:Extensions_by_category rozszerzenia według kategorii] lub [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] aby zobaczyć pełną listę rozszerzeń.',
        'mainpagetext' => "'''Instalacja MediaWiki powiodła się.'''",
        'mainpagedocfooter' => 'Zobacz [//meta.wikimedia.org/wiki/Help:Contents przewodnik użytkownika] w celu uzyskania informacji o działaniu oprogramowania wiki.
 
 == Na początek ==
-* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista ustawień konfiguracyjnych]
-* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komunikaty o nowych wersjach MediaWiki]', # Fuzzy
+* [//www.mediawiki.org/wiki/Manual:Configuration_settings/pl Lista ustawień konfiguracyjnych]
+* [//www.mediawiki.org/wiki/Manual:FAQ/pl MediaWiki FAQ]
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komunikaty o nowych wersjach MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Przetłumacz MediaWiki na swój język]',
 );
 
 /** Piedmontese (Piemontèis)
@@ -15854,18 +16017,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é.
@@ -15920,7 +16083,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à.
@@ -15953,8 +16116,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",
@@ -16040,7 +16203,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 (پښتو)
@@ -16067,7 +16230,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' => 'د ويکي نوم:',
@@ -16079,7 +16241,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' => 'ترسره شو',
@@ -16098,6 +16260,7 @@ $messages['ps'] = array(
 /** Portuguese (português)
  * @author Crazymadlover
  * @author Hamilton Abreu
+ * @author Luckas
  * @author Mormegil
  * @author Platonides
  * @author SandroHc
@@ -16109,7 +16272,7 @@ $messages['pt'] = array(
        'config-title' => 'Instalação MediaWiki $1',
        'config-information' => 'Informação',
        'config-localsettings-upgrade' => 'Foi detectado um ficheiro <code>LocalSettings.php</code>.
-Para actualizar esta instalação, por favor introduza o valor de <code>$wgUpgradeKey</code> na caixa abaixo.
+Para atualizar esta instalação, por favor introduza o valor de <code>$wgUpgradeKey</code> na caixa abaixo.
 Encontra este valor no <code>LocalSettings.php</code>.',
        'config-localsettings-cli-upgrade' => 'Foi detectada a existência de um ficheiro <code>LocalSettings.php</code>.
 Para actualizar esta instalação execute o <code>update.php</code>, por favor.',
@@ -16141,7 +16304,7 @@ Verifique o seu php.ini e certifique-se de que em <code>session.save_path</code>
        'config-page-language' => 'Língua',
        'config-page-welcome' => 'Bem-vindo(a) ao MediaWiki!',
        'config-page-dbconnect' => 'Ligar à base de dados',
-       'config-page-upgrade' => 'Actualizar a instalação existente',
+       'config-page-upgrade' => 'Atualizar a instalação existente',
        'config-page-dbsettings' => 'Configurações da base de dados',
        'config-page-name' => 'Nome',
        'config-page-options' => 'Opções',
@@ -16151,7 +16314,7 @@ Verifique o seu php.ini e certifique-se de que em <code>session.save_path</code>
        'config-page-readme' => 'Leia-me',
        'config-page-releasenotes' => 'Notas de lançamento',
        'config-page-copying' => 'A copiar',
-       'config-page-upgradedoc' => 'A actualizar',
+       'config-page-upgradedoc' => 'Atualizando',
        'config-page-existingwiki' => 'Wiki existente',
        'config-help-restart' => 'Deseja limpar todos os dados gravados que introduziu e reiniciar o processo de instalação?',
        'config-restart' => 'Sim, reiniciar',
@@ -16346,7 +16509,7 @@ Se a plataforma que pretende usar não está listada abaixo, siga as instruçõe
        'config-missing-db-host' => 'Tem de introduzir um valor para "Servidor da base de dados"',
        'config-missing-db-server-oracle' => 'Tem de introduzir um valor para "TNS da base de dados"',
        'config-invalid-db-server-oracle' => 'O TNS da base de dados, "$1", é inválido.
-Use só letras (a-z, A-Z), algarismos (0-9), sublinhados (_) e pontos (.) dos caracteres ASCII.',
+Use só letras (a-z, A-Z), algarismos (0-9), sublinhados (_) e pontos (.) dos caracteres ASCII.', # Fuzzy
        'config-invalid-db-name' => 'O nome da base de dados, "$1",  é inválido.
 Use só letras (a-z, A-Z), algarismos (0-9), sublinhados (_) e hífens (-) dos caracteres ASCII.',
        'config-invalid-db-prefix' => 'O prefixo da base de dados, "$1",  é inválido.
@@ -16437,7 +16600,7 @@ mas não lhe permitirá armazenar caracteres acima do [//en.wikipedia.org/wiki/M
        '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',
@@ -16467,7 +16630,7 @@ Introduza um nome de utilizador diferente.',
        'config-admin-error-bademail' => 'Introduziu um correio electrónico inválido',
        'config-subscribe' => 'Subscreva a [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce lista de divulgação de anúncios de lançamento].',
        'config-subscribe-help' => 'Esta é uma lista de divulgação de baixo volume para anúncios de lançamento de versões novas, incluindo anúncios de segurança importantes.
-Deve subscrevê-la e actualizar a sua instalação MediaWiki quando são lançadas versões novas.',
+Deve subscrevê-la e atualizar a sua instalação MediaWiki quando são lançadas versões novas.',
        'config-subscribe-noemail' => 'Tentou subscrever a lista de divulgação dos anúncios de novas versões, sem fornecer um endereço de correio electrónico.
 Para subscrever esta lista de divulgação tem de fornecer um endereço de correio electrónico.',
        'config-almost-done' => 'Está quase a terminar!
@@ -16542,7 +16705,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.
@@ -16648,6 +16811,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
  */
@@ -16693,6 +16857,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 ===
@@ -16726,10 +16891,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.
 
@@ -16782,7 +16961,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ă)
@@ -16937,8 +17116,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',
@@ -17417,7 +17617,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 необходим доступ к Интернету.
@@ -17531,7 +17731,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 (संस्कृतम्)
@@ -17551,7 +17751,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)
@@ -17570,7 +17770,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)
@@ -17583,7 +17783,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)
@@ -17597,7 +17797,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)
@@ -17616,7 +17816,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/ⵜⴰⵛⵍⵃⵉⵜ)
@@ -17629,7 +17829,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 (සිංහල)
@@ -17903,7 +18103,7 @@ $1
        'config-missing-db-host' => 'Vnesti morate vrednost za »Gostitelj zbirke podatkov«',
        'config-missing-db-server-oracle' => 'Vnesti morate vrednost za »TNS zbirke podatkov«',
        'config-invalid-db-server-oracle' => 'Neveljaven TNS zbirke podatkov »$1«.
-Uporabljajte samo črke ASCII (a-z, A-Z), številke (0-9), podčrtaje (_) in pike (.).',
+Uporabite ali "ime TNS" ali niz "Easy Connect" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Načini poimenovanja Oracle])',
        'config-invalid-db-name' => 'Neveljavno ime zbirke podatkov »$1«.
 Uporabljajte samo črke ASCII (a-z, A-Z), številke (0-9), podčrtaje (_) in vezaje (-).',
        'config-invalid-db-prefix' => 'Neveljavna predpona zbirke podatkov »$1«.
@@ -17962,7 +18162,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:',
@@ -18023,7 +18223,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)
@@ -18035,7 +18235,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)
@@ -18047,7 +18247,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) (српски (ћирилица)‎)
@@ -18093,7 +18293,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)‎)
@@ -18137,7 +18337,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)
@@ -18150,7 +18350,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)
@@ -18164,17 +18364,18 @@ $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)
+ * @author Jopparn
  * @author Skalman
  * @author WikiPhoenix
  */
@@ -18182,8 +18383,20 @@ $messages['sv'] = array(
        'config-desc' => 'Installationsprogram för MediaWiki',
        'config-title' => 'Installation av MediaWiki $1',
        'config-information' => 'Information',
+       'config-localsettings-upgrade' => 'A <code>LocalSettings.php</code>-fil har upptäckts.
+För att uppgradera den här installationen, vänligen ange värdet för <code>$wgUpgradeKey</code> i rutan nedan.
+Du hittar den i <code>LocalSettings.php</code>.',
+       'config-localsettings-cli-upgrade' => 'En <code>LocalSettings.php</code>-fil har upptäckts.
+För att uppgradera denna installation, kör <code>update.php</code> istället',
        'config-localsettings-key' => 'Uppgraderingsnyckel:',
        'config-localsettings-badkey' => 'Nyckeln du angav är inkorrekt.',
+       'config-upgrade-key-missing' => 'En nuvarande installerade av MediaWiki har upptäckts.
+För att uppgradera installationen, lägg till följande rad i slutet av din <code>LocalSettings.php</code>:
+
+$1',
+       'config-localsettings-incomplete' => 'De befintliga <code>LocalSettings.php</code> verkar vara ofullständig.
+Variabeln $1 är inte inställd.
+Ändra <code>LocalSettings.php</code> så att denna variabel är inställd och klicka på "{{int:Config-continue}}".',
        'config-session-error' => 'Fel vid uppstart av session: $1',
        'config-your-language' => 'Ditt språk:',
        'config-your-language-help' => 'Välj ett språk som ska användas under installationen.',
@@ -18224,21 +18437,43 @@ Du kan inte installera MediaWiki.',
        'config-env-php' => 'PHP $1 är installerad.',
        'config-env-php-toolow' => 'PHP $1 är installerad.
 MediaWiki kräver PHP $2 eller högre.',
+       'config-outdated-sqlite' => "'''Varning:''' du har SQLite $1, vilket är lägre än minimikravet version $2. SQLite kommer inte att vara tillgänglig.",
+       'config-register-globals' => "'''Varning: PHP:s <code>[http://php.net/register_globals register_globals]</code> tillval är aktiverat.'''
+'''Inaktivera den om du kan.'''
+MediaWiki kommer att fungera, men din server exponeras för potentiella säkerhetsluckor.",
+       'config-safe-mode' => "''' Varning:''' PHP:s [http://www.php.net/features.safe-mode felsäkert läge] är aktivt.
+Det kan orsaka problem, särskilt om du använder filöverföringar och <code>math</code>-stöd.",
+       'config-xml-bad' => 'PHP:s XML-modul saknas.
+MediaWiki kräver funktioner i denna modul och kommer inte att fungera i den här konfigurationen.
+Om du kör Mandrake, installera php-xml-paketet.',
+       'config-memory-bad' => "''' Varning:''' PHP:s <code>memory_limit</code> är $1.
+Detta är förmodligen för lågt.
+Installationen kan misslyckas!",
        'config-xcache' => '[http://xcache.lighttpd.net/ XCache] är installerad',
        'config-apc' => '[http://www.php.net/apc APC] är installerad',
        'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] är installerad',
        'config-diff3-bad' => 'GNU diff3 hittades inte.',
+       'config-git-bad' => 'Git-versionen av kontrollmjukvaran hittades inte.',
+       'config-no-uri' => "'''Fel:''' Kunde inte fastställa det nuvarande URI:et.
+Installationen avbröts.",
+       'config-no-cli-uri' => "'''Varning:''' inget --scriptpath är anget, med standarden: <code>$1</code> .",
        'config-using-server' => 'Använder servernamn "<nowiki>$1</nowiki>".',
        'config-using-uri' => 'Använder server-URL "<nowiki>$1$2</nowiki>".',
+       'config-no-cli-uploads-check' => "'''Varning:''' Din standardkatalog för uppladdningar (<code>$1</code>) inte är kontrollerad för sårbarhet från godtyckliga skriptkörning under CLI-installationen.",
        'config-db-type' => 'Databastyp:',
+       'config-db-host' => 'Databasvärd:',
        'config-db-wiki-settings' => 'Identifiera denna wiki',
        'config-db-name' => 'Databasnamn:',
        'config-db-name-oracle' => 'Databasschema:',
        'config-db-install-account' => 'Användarkonto för installation',
        'config-db-username' => 'Databas-användarnamn:',
        'config-db-password' => 'Databas-lösenord:',
+       'config-db-wiki-account' => 'Användarkonto för normal drift',
+       'config-db-prefix' => 'Prefix för tabellerna i databasen:',
        'config-db-port' => 'Databasport:',
        'config-db-schema' => 'Schema för MediaWiki',
+       'config-pg-test-error' => "Kan inte ansluta till databas '''$1''': $2",
+       'config-sqlite-dir' => 'SQLite data-katalog:',
        'config-header-mysql' => 'MySQL-inställningar',
        'config-header-postgres' => 'PostgreSQL-inställningar',
        'config-header-sqlite' => 'SQLite-inställningar',
@@ -18246,6 +18481,7 @@ MediaWiki kräver PHP $2 eller högre.',
        'config-invalid-db-type' => 'Ogiltig databastyp',
        'config-missing-db-name' => 'Du måste ange ett värde för "Databasnamn"',
        'config-missing-db-host' => 'Du måste ange ett värde för "Databasvärd"',
+       'config-missing-db-server-oracle' => 'Du måste ange ett värde för "Databas TNS"',
        'config-invalid-db-name' => '"$1" är ett ogiltigt databasnamn.
 Använd bara ASCII-bokstäver (a-z, A-Z), siffror (0-9), understreck (_) och bindestreck (-).',
        'config-invalid-db-prefix' => '"$1" är ett ogiltigt databasprefix.
@@ -18255,8 +18491,14 @@ Använd bara ASCII-bokstäver (a-z, A-Z), siffror (0-9), understreck (_) och bin
 Kontrollera värden, användarnamnet och lösenordet nedan och försök igen',
        'config-invalid-schema' => '"$1" är ett ogiltigt schema för MediaWiki.
 Använd bara ASCII-bokstäver (a-z, A-Z), siffror (0-9), understreck (_) och bindestreck (-).',
+       'config-db-sys-create-oracle' => 'Installationsprogrammet stöder endast med ett SYSDBA-konto för att skapa ett nytt konto.',
        'config-db-sys-user-exists-oracle' => 'Användarkontot "$1" finns redan. SYSDBA kan endast användas för att skapa ett nytt konto!',
        'config-postgres-old' => 'PostgreSQL $1 eller senare krävs, du har $2.',
+       'config-sqlite-readonly' => 'Filen <code>$1</code> är inte skrivbar.',
+       'config-sqlite-cant-create-db' => 'Kunde inte skapa databasfilen <code>$1</code>.',
+       'config-sqlite-fts3-downgrade' => 'PHP saknar stöd för FTS3, nedgraderar tabeller',
+       'config-can-upgrade' => "Det finns MediaWiki-tabeller i den här databasen.
+För att uppgradera dem till MediaWiki $1, klicka på '''Fortsätt'''.",
        'config-upgrade-done' => "Uppgraderingen slutfördes.
 
 Du kan nu [$1 börja använda din wiki].
@@ -18266,6 +18508,8 @@ Detta '''rekommenderas inte''' om du har problem med din wiki.",
        'config-upgrade-done-no-regenerate' => 'Uppgraderingen slutfördes.
 
 Du kan nu [$1 börja använda din wiki].',
+       'config-regenerate' => 'Återskapa LocalSettings.php →',
+       'config-db-web-account' => 'Databaskonto för webbaccess',
        'config-db-web-account-same' => 'Använd samma konto som för installation',
        'config-db-web-create' => 'Skapa kontot om det inte redan finns',
        'config-mysql-engine' => 'Lagringsmotor:',
@@ -18274,6 +18518,7 @@ Du kan nu [$1 börja använda din wiki].',
        'config-site-name' => 'Namnet på wikin:',
        'config-site-name-blank' => 'Ange ett sidnamn.',
        'config-ns-generic' => 'Projekt',
+       'config-ns-other' => 'Annan (specificera)',
        'config-ns-invalid' => 'Den angivna namnrymden "<nowiki>$1</nowiki>" är ogiltig.
 Ange ett annat namnrymd för projektet.',
        'config-ns-conflict' => 'Den angivna namnrymden "<nowiki>$1</nowiki>" står i konflikt med en standardnamnrymd för MediaWiki.
@@ -18297,6 +18542,7 @@ Du kan nu hoppa över återstående konfigurationer och installera wikin nu.',
        'config-optional-continue' => 'Ställ fler frågor till mig.',
        'config-optional-skip' => 'Jag är redan uttråkad, bara installera wiki.',
        'config-profile-wiki' => 'Öppen wiki',
+       'config-profile-no-anon' => 'Kontoskapande krävs',
        'config-profile-fishbowl' => 'Endast auktoriserade redigerare',
        'config-profile-private' => 'Privat wiki',
        'config-license' => 'Upphovsrätt och licens:',
@@ -18309,7 +18555,12 @@ Du kan nu hoppa över återstående konfigurationer och installera wikin nu.',
        'config-license-pd' => 'Allmän egendom',
        'config-license-cc-choose' => 'Välj en anpassad Creative Commons-licens',
        'config-email-settings' => 'E-postinställningar',
+       'config-enable-email' => 'Aktivera utgående e-post',
+       'config-email-user' => 'Aktivera e-post mellan användare',
+       'config-email-user-help' => 'Tillåta alla användare att skicka mail till varandra om de har aktiverat det i deras preferenser.',
+       'config-email-usertalk' => 'Aktivera underrättelse för användardiskussionssidan',
        'config-email-watchlist' => 'Aktivera meddelanden för bevakningslistan',
+       'config-email-auth' => 'Aktivera autentisering via e-post',
        'config-upload-settings' => 'Bild- och filuppladdningar',
        'config-upload-enable' => 'Aktivera filöverföringar',
        'config-upload-deleted' => 'Mapp för raderade filer:',
@@ -18372,7 +18623,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)
@@ -18385,7 +18636,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 (தமிழ்)
@@ -18502,7 +18753,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 (తెలుగు)
@@ -18548,7 +18799,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' => 'కాపీహక్కులు మరియు లైసెన్సు:',
@@ -18566,7 +18817,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)
@@ -18587,7 +18838,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ī)
@@ -18601,7 +18852,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 (ไทย)
@@ -18615,7 +18866,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)
@@ -18628,7 +18879,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)
@@ -19070,7 +19321,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.
@@ -19189,7 +19440,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) (татарча)
@@ -19202,7 +19453,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)
@@ -19215,7 +19466,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 (удмурт)
@@ -19235,7 +19486,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 (українська)
@@ -19676,7 +19927,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' => 'ای میل کی ترتیبات',
@@ -19808,8 +20068,10 @@ $messages['ur'] = array(
 );
 
 /** Uzbek (oʻzbekcha)
+ * @author Sociologist
  */
 $messages['uz'] = array(
+       'config-admin-password-blank' => 'Administrator hisob yozuvi uchun maxfiy soʻz kiriting.',
        'mainpagetext' => "'''MediaWiki muvaffaqiyatli o'rnatildi.'''",
        'mainpagedocfooter' => "Wiki dasturini ishlatish haqida ma'lumot olish uchun  [//meta.wikimedia.org/wiki/Help:Contents Foydalanuvchi qo'llanmasi] sahifasiga murojaat qiling.
 
@@ -19817,7 +20079,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)
@@ -19833,7 +20095,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’)
@@ -19846,7 +20108,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)
@@ -19868,7 +20130,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)
@@ -19881,7 +20143,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)
@@ -19892,7 +20154,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)
@@ -19912,7 +20174,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)
@@ -19925,7 +20187,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 (吴语)
@@ -19938,7 +20200,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 (хальмг)
@@ -19951,7 +20213,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 (ייִדיש)
@@ -20001,7 +20263,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 (粵語)
@@ -20013,7 +20275,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)
@@ -20026,14 +20288,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
@@ -20139,6 +20403,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。缩略图功能将不可用。',
@@ -20150,7 +20416,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地址。
@@ -20291,6 +20557,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数据库。",
@@ -20383,6 +20655,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必须能够访问互联网。
@@ -20477,6 +20751,7 @@ $3
 /** Traditional Chinese (中文(繁體)‎)
  * @author Anthony Fok
  * @author Hzy980512
+ * @author Justincheng12345
  * @author Liangent
  * @author Mark85296341
  * @author Simon Shek
@@ -20579,6 +20854,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。縮略圖功能將不可用。',
@@ -20670,7 +20947,8 @@ $1
        'config-missing-db-name' => '您必須為“數據庫名稱”輸入內容',
        'config-missing-db-host' => '您必須為“數據庫主機”輸入內容',
        'config-missing-db-server-oracle' => '您必須為“數據庫透明網絡底層(TNS)”輸入內容',
-       'config-invalid-db-server-oracle' => '無效的數據庫TNS“$1”。請只使用ASCII字母(a-z、A-Z)、數字(0-9)、下劃線(_)和點號(.)。',
+       'config-invalid-db-server-oracle' => '無效的數據庫TNS「$1」。
+請只使用「TNS Name」或「Easy Connect」 字串([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle命名法])',
        'config-invalid-db-name' => '無效的數據庫名稱“$1”。請只使用ASCII字母(a-z、A-Z)、數字(0-9)、下劃線(_)和連字號(-)。',
        'config-invalid-db-prefix' => '無效的數據庫前綴“$1”。請只使用ASCII字母(a-z、A-Z)、數字(0-9)、下劃線(_)和連字號(-)。',
        'config-connection-error' => '$1。
@@ -20773,7 +21051,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',
@@ -20823,7 +21101,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 daac558..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();
        }
@@ -682,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' );
                }
        }
@@ -720,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;
                }
@@ -828,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 );
@@ -898,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 ) {
@@ -914,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.
         */
@@ -945,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
@@ -958,7 +984,7 @@ abstract class Installer {
        }
 
        /**
-        * TODO: document
+        * Environment check for preferred locale in shell
         * @return bool
         */
        protected function envCheckShellLocale() {
@@ -977,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();
 
@@ -1032,7 +1058,7 @@ abstract class Installer {
        }
 
        /**
-        * TODO: document
+        * Environment check for the permissions of the uploads directory
         * @return bool
         */
        protected function envCheckUploadsDirectory() {
@@ -1057,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 );
                        }
@@ -1115,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 ) {
@@ -1131,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' );
                        }
                }
@@ -1218,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;
                        }
                }
@@ -1258,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;
                                }
@@ -1319,7 +1345,7 @@ abstract class Installer {
         * @return array
         */
        public function findExtensions() {
-               if( $this->getVar( 'IP' ) === null ) {
+               if ( $this->getVar( 'IP' ) === null ) {
                        return array();
                }
 
@@ -1331,10 +1357,10 @@ abstract class Installer {
                $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;
                        }
                }
@@ -1365,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'] ) ?
@@ -1406,9 +1432,9 @@ 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']]
@@ -1417,7 +1443,7 @@ abstract class Installer {
                }
 
                // 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
@@ -1425,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' ) )
                        );
@@ -1450,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 ) );
 
@@ -1463,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;
@@ -1535,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();
@@ -1552,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 );
                }
 
@@ -1564,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 {
index c9ebc7e..3a9bfe8 100644 (file)
@@ -73,10 +73,10 @@ class LocalSettingsGenerator {
                        '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,7 +222,7 @@ class LocalSettingsGenerator {
                        }
                }
 
-               switch( $this->values['wgMainCacheType'] ) {
+               switch ( $this->values['wgMainCacheType'] ) {
                        case 'anything':
                        case 'db':
                        case 'memcached':
index 72514f2..e0bf3d7 100644 (file)
@@ -152,7 +152,6 @@ class MysqlInstaller extends DatabaseInstaller {
                                $this->getVar( '_InstallUser' ),
                                $this->getVar( '_InstallPassword' ),
                                false,
-                               false,
                                0,
                                $this->getVar( 'wgDBprefix' )
                        );
@@ -350,10 +349,14 @@ 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' );
@@ -371,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' );
                }
@@ -429,7 +434,6 @@ class MysqlInstaller extends DatabaseInstaller {
                                        $this->getVar( 'wgDBuser' ),
                                        $this->getVar( 'wgDBpassword' ),
                                        false,
-                                       false,
                                        0,
                                        $this->getVar( 'wgDBprefix' )
                                );
@@ -470,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 );
                }
@@ -483,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();
@@ -506,7 +510,6 @@ class MysqlInstaller extends DatabaseInstaller {
                                        $dbUser,
                                        $password,
                                        false,
-                                       false,
                                        0,
                                        $this->getVar( 'wgDBprefix' )
                                );
@@ -520,7 +523,7 @@ class MysqlInstaller extends DatabaseInstaller {
                        $tryToCreate = false;
                }
 
-               if( $tryToCreate ) {
+               if ( $tryToCreate ) {
                        $createHostList = array(
                                $server,
                                'localhost',
@@ -531,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 );
@@ -563,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() );
                        }
@@ -599,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 df1f610..1c22afb 100644 (file)
@@ -331,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." );
                }
        }
@@ -368,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__ );
@@ -525,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';
@@ -651,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__ );
                        }
@@ -686,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" );
index 632015f..e34bed3 100644 (file)
@@ -66,8 +66,8 @@ class OracleInstaller extends DatabaseInstaller {
                        $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();
        }
 
@@ -86,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'] ) ) {
@@ -296,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 e7ae8d5..3747189 100644 (file)
@@ -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 08797b2..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'         ),
@@ -252,9 +252,9 @@ class PostgresUpdater extends DatabaseUpdater {
                        ),
                        '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),
+                               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(
@@ -308,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)' ),
@@ -515,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")' );
                        }
                }
@@ -538,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 );
                        }
                }
@@ -592,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 ) ) {
@@ -744,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 . "\"" );
                }
        }
 
@@ -752,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" );
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 ac66cd9..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;
                }
@@ -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 );
        }
@@ -889,7 +889,7 @@ 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() );
@@ -983,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 );
@@ -1067,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 8aec289..8a9fc2d 100644 (file)
@@ -254,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";
@@ -310,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';
@@ -336,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',
@@ -458,14 +460,21 @@ class WebInstaller_DBConnect extends WebInstallerPage {
                // 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>' .
@@ -501,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 ) {
@@ -552,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 );
@@ -764,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;
                }
@@ -812,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;
                }
@@ -911,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,
@@ -974,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';
@@ -987,7 +999,7 @@ 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' ) .
@@ -1054,7 +1066,7 @@ 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" .
                        Html::element( 'iframe', $iframeAttribs, '', false /* not short */ ) .
@@ -1066,12 +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(),
@@ -1080,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" .
@@ -1139,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;
                                }
@@ -1180,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(
@@ -1227,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 );
                }
        }
@@ -1243,8 +1255,7 @@ 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=' .
+                       $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" );
@@ -1263,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 );
        }
@@ -1302,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 );
@@ -1320,7 +1334,7 @@ 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.' );
                }
 
index 64925f7..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,7 +99,7 @@ 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 );
@@ -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;
@@ -212,10 +213,10 @@ abstract class Job {
         */
        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()
                );
                if ( is_array( $info['params'] ) ) {
                        // Identical jobs with different "root" jobs should count as duplicates
@@ -269,7 +270,7 @@ abstract class Job {
        /**
         * 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 17a1338..3295c24 100644 (file)
@@ -96,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 );
@@ -121,23 +121,37 @@ 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();
 
        /**
+        * Find out if delayed jobs are supported for configuration validation
+        *
         * @return boolean Whether delayed jobs are supported
         */
        protected function supportsDelayedJobs() {
@@ -338,7 +352,7 @@ abstract class JobQueue {
                // Flag this job as an old duplicate based on its "root" job...
                try {
                        if ( $job && $this->isRootJobOldDuplicate( $job ) ) {
-                               wfIncrStats( 'job-pop-duplicate' );
+                               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
@@ -493,6 +507,28 @@ abstract class JobQueue {
                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." );
+       }
+
        /**
         * Wait for any slaves or backup servers to catch up.
         *
@@ -580,6 +616,19 @@ abstract class JobQueue {
                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 a8186ab..0000000
+++ /dev/null
@@ -1,156 +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();
-
-       /**
-        * 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/JobQueueAggregatorMemc.php b/includes/job/JobQueueAggregatorMemc.php
deleted file mode 100644 (file)
index 15bb833..0000000
+++ /dev/null
@@ -1,124 +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
-       }
-
-       /**
-        * @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/JobQueueAggregatorRedis.php b/includes/job/JobQueueAggregatorRedis.php
deleted file mode 100644 (file)
index c6a799d..0000000
+++ /dev/null
@@ -1,193 +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
- * @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 d1e6eb4..56da4f3 100644 (file)
@@ -177,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 );
-                       $cache = $this->cache;
-                       $method = __METHOD__;
+               return true;
+       }
 
-                       $dbw->onTransactionIdle(
-                               function() use ( $dbw, $cache, $rowSet, $rowList, $atomic, $key, $method, $scope
-                       ) {
-                               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 );
-                               }
+       /**
+        * 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;
+               }
 
-                               $cache->set( $key, 'false', JobQueueDB::CACHE_TTL_LONG );
-                       } );
+               $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 ( $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
+                               }
+                       }
+                       // 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;
        }
 
@@ -256,6 +270,11 @@ class JobQueueDB extends JobQueue {
 
                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
@@ -273,19 +292,20 @@ class JobQueueDB extends JobQueue {
                                $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
                        break; // done
-               } while( true );
+               } while ( true );
 
                return $job;
        }
@@ -317,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__,
@@ -334,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__,
@@ -349,7 +369,7 @@ class JobQueueDB extends JobQueue {
                        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' => '' ),
@@ -400,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 = (' .
@@ -419,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
@@ -429,77 +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() {
-               $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() );
-                               $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();
-               }
-
-               $dbw->unlock( "jobqueue-recycle-{$this->type}", __METHOD__ );
-
-               return $count;
-       }
-
        /**
         * @see JobQueue::doAck()
         * @param Job $job
@@ -507,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;
        }
@@ -555,6 +509,17 @@ class JobQueueDB extends JobQueue {
                return true;
        }
 
+       /**
+        * @see JobQueue::doDelete()
+        * @return bool
+        */
+       protected function doDelete() {
+               list( $dbw, $scope ) = $this->getMasterDB();
+
+               $dbw->delete( 'job', array( 'job_cmd' => $this->type ) );
+               return true;
+       }
+
        /**
         * @see JobQueue::doWaitForBackups()
         * @return void
@@ -570,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 )
                        )
                );
        }
@@ -599,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)
         */
@@ -664,7 +710,8 @@ class JobQueueDB extends JobQueue {
         */
        private function getCacheKey( $property ) {
                list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
-               return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, $property );
+               $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 1b22c8d..1f5b761 100644 (file)
  *
  * @ingroup JobQueue
  * @ingroup Redis
- * @since 1.21
+ * @since 1.22
  */
 class JobQueueRedis extends JobQueue {
        /** @var RedisConnectionPool */
        protected $redisPool;
 
        protected $server; // string; server address
+       protected $compression; // string; compression method to use
 
        const MAX_AGE_PRUNE = 604800; // integer; seconds a job can live once claimed (7 days)
 
@@ -73,12 +74,14 @@ class JobQueueRedis extends JobQueue {
         *   - 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'] );
        }
 
@@ -216,8 +219,9 @@ class JobQueueRedis extends JobQueue {
                                wfDebugLog( 'JobQueueRedis', "Could not insert {$failed} {$this->type} job(s)." );
                                return false;
                        }
-                       wfIncrStats( 'job-insert', count( $items ) );
-                       wfIncrStats( 'job-insert-duplicate', count( $items ) - $failed - $pushed );
+                       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 );
                }
@@ -232,12 +236,12 @@ class JobQueueRedis extends JobQueue {
         * @throws RedisException
         */
        protected function pushBlobs( RedisConnRef $conn, array $items ) {
-               $args = array(); // ([id, sha1, blob [, id, sha1, blob ... ] ] )
+               $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)serialize( $item );
+                       $args[] = (string)$this->serialize( $item );
                }
                static $script =
 <<<LUA
@@ -263,7 +267,7 @@ class JobQueueRedis extends JobQueue {
                end
                return pushed
 LUA;
-               return $this->redisEval( $conn, $script,
+               return $conn->luaEval( $script,
                        array_merge(
                                array(
                                        $this->getQueueKey( 'l-unclaimed' ), # KEYS[1]
@@ -308,8 +312,8 @@ LUA;
                                        break; // no jobs; nothing to do
                                }
 
-                               wfIncrStats( 'job-pop' );
-                               $item = unserialize( $blob );
+                               JobQueue::incrStats( 'job-pop', $this->type );
+                               $item = $this->unserialize( $blob );
                                if ( $item === false ) {
                                        wfDebugLog( 'JobQueueRedis', "Could not unserialize {$this->type} job." );
                                        continue;
@@ -346,7 +350,7 @@ LUA;
                -- Return the job data
                return item
 LUA;
-               return $this->redisEval( $conn, $script,
+               return $conn->luaEval( $script,
                        array(
                                $this->getQueueKey( 'l-unclaimed' ), # KEYS[1]
                                $this->getQueueKey( 'h-sha1ById' ), # KEYS[2]
@@ -377,7 +381,7 @@ LUA;
                redis.call('hIncrBy',KEYS[5],id,1)
                return redis.call('hGet',KEYS[6],id)
 LUA;
-               return $this->redisEval( $conn, $script,
+               return $conn->luaEval( $script,
                        array(
                                $this->getQueueKey( 'l-unclaimed' ), # KEYS[1]
                                $this->getQueueKey( 'h-sha1ById' ), # KEYS[2]
@@ -398,13 +402,12 @@ LUA;
         * @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'];
-
                                static $script =
 <<<LUA
                                -- Unmark the job as claimed
@@ -413,12 +416,12 @@ LUA;
                                -- Delete the job data itself
                                return redis.call('hDel',KEYS[3],ARGV[1])
 LUA;
-                               $res = $this->redisEval( $conn, $script,
+                               $res = $conn->luaEval( $script,
                                        array(
                                                $this->getQueueKey( 'z-claimed' ), # KEYS[1]
                                                $this->getQueueKey( 'h-attempts' ), # KEYS[2]
                                                $this->getQueueKey( 'h-data' ), # KEYS[3]
-                                               $item['uuid'] # ARGV[1]
+                                               $job->metadata['uuid'] # ARGV[1]
                                        ),
                                        3 # number of first argument(s) that are keys
                                );
@@ -467,13 +470,10 @@ LUA;
         * @return bool
         */
        protected function doIsRootJobOldDuplicate( Job $job ) {
-               $params = $job->getParams();
-               if ( !isset( $params['rootJobSignature'] ) ) {
+               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 {
@@ -487,15 +487,32 @@ LUA;
                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(
@@ -515,9 +532,6 @@ LUA;
         */
        public function getAllDelayedJobs() {
                $conn = $this->getConnection();
-               if ( !$conn ) {
-                       throw new MWException( "Unable to connect to redis server." );
-               }
                try {
                        $that = $this;
                        return new MappedIterator( // delayed jobs
@@ -541,13 +555,13 @@ LUA;
         */
        public function getJobFromUidInternal( $uid, RedisConnRef $conn ) {
                try {
-                       $item = unserialize( $conn->hGet( $this->getQueueKey( 'h-data' ), $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( $item['namespace'], $item['title'] );
                        $job = Job::factory( $item['type'], $title, $item['params'] );
-                       $job->metadata['sourceFields'] = $item;
+                       $job->metadata['uuid'] = $item['uuid'];
                        return $job;
                } catch ( RedisException $e ) {
                        $this->throwRedisException( $this->server, $conn, $e );
@@ -576,7 +590,7 @@ LUA;
                        end
                        return #ids
 LUA;
-                       $count += (int)$this->redisEval( $conn, $script,
+                       $count += (int)$conn->luaEval( $script,
                                array(
                                        $this->getQueueKey( 'z-delayed' ), // KEYS[1]
                                        $this->getQueueKey( 'l-unclaimed' ), // KEYS[2]
@@ -642,7 +656,7 @@ LUA;
                        end
                        return {released,abandoned,pruned}
 LUA;
-                       $res = $this->redisEval( $conn, $script,
+                       $res = $conn->luaEval( $script,
                                array(
                                        $this->getQueueKey( 'z-claimed' ), # KEYS[1]
                                        $this->getQueueKey( 'h-attempts' ), # KEYS[2]
@@ -658,7 +672,8 @@ LUA;
                        if ( $res ) {
                                list( $released, $abandoned, $pruned ) = $res;
                                $count += $released + $pruned;
-                               wfIncrStats( 'job-recycle', count( $released ) );
+                               JobQueue::incrStats( 'job-recycle', $this->type, $released );
+                               JobQueue::incrStats( 'job-abandon', $this->type, $abandoned );
                        }
                } catch ( RedisException $e ) {
                        $this->throwRedisException( $this->server, $conn, $e );
@@ -675,45 +690,18 @@ LUA;
                if ( $this->claimTTL > 0 ) {
                        $tasks['recycleAndDeleteStaleJobs'] = array(
                                'callback' => array( $this, 'recycleAndDeleteStaleJobs' ),
-                               'period'   => ceil( $this->claimTTL / 2 )
+                               'period' => ceil( $this->claimTTL / 2 )
                        );
                }
                if ( $this->checkDelay ) {
                        $tasks['releaseReadyDelayedJobs'] = array(
                                'callback' => array( $this, 'releaseReadyDelayedJobs' ),
-                               'period'   => 300 // 5 minutes
+                               'period' => 300 // 5 minutes
                        );
                }
                return $tasks;
        }
 
-       /**
-        * @param RedisConnRef $conn
-        * @param string $script
-        * @param array $params
-        * @param integer $numKeys
-        * @return mixed
-        */
-       protected function redisEval( RedisConnRef $conn, $script, array $params, $numKeys ) {
-               $sha1 = sha1( $script ); // 40 char hex
-
-               // 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 ( $conn->getLastError() && $conn->script( 'exists', $sha1 ) === array( 0 ) ) {
-                       $conn->clearLastError();
-                       $res = $conn->eval( $script, $params, $numKeys );
-                       wfDebugLog( 'JobQueueRedis', "Used eval() for Lua script $sha1." );
-               }
-
-               if ( $conn->getLastError() ) { // script bug?
-                       wfDebugLog( 'JobQueueRedis', "Lua script error: " . $conn->getLastError() );
-               }
-
-               return $res;
-       }
-
        /**
         * @param $job Job
         * @return array
@@ -744,12 +732,45 @@ LUA;
                $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 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 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;
+       }
+
        /**
         * Get a connection to the server that handles all sub-queues for this queue
         *
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 d4a2024..44c240b 100644 (file)
@@ -82,7 +82,8 @@ class HTMLCacheUpdateJob extends Job {
                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;
@@ -97,7 +98,7 @@ 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
@@ -153,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;
@@ -166,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 );
@@ -202,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
                        );
                }
@@ -253,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 f17a1a1..91e1e87 100644 (file)
@@ -30,7 +30,7 @@ class FormatJson {
         * 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
+        * @since 1.22
         */
        const UTF8_OK = 1;
 
@@ -42,7 +42,7 @@ class FormatJson {
         * - 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
+        * @since 1.22
         */
        const XMLMETA_OK = 2;
 
@@ -51,7 +51,7 @@ class FormatJson {
         *
         * @warning When generating inline script blocks, use FormatJson::UTF8_OK instead.
         *
-        * @since 1.21
+        * @since 1.22
         */
        const ALL_OK = 3;
 
@@ -80,7 +80,7 @@ class FormatJson {
         * @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.
         *
-        * @note In pre-1.21 versions of MediaWiki, using this function for generating inline script
+        * @note In pre-1.22 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.
         *
index fb1e9a4..ac33448 100644 (file)
@@ -113,8 +113,8 @@ class CSSJanus {
                $patterns['rtl_in_url'] = "/{$patterns['lookbehind_not_letter']}(rtl){$patterns['lookahead_for_closing_paren']}/i";
                $patterns['cursor_east'] = "/{$patterns['lookbehind_not_letter']}([ns]?)e-resize/";
                $patterns['cursor_west'] = "/{$patterns['lookbehind_not_letter']}([ns]?)w-resize/";
-               $patterns['four_notation_quantity'] = "/{$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}/i";
-               $patterns['four_notation_color'] = "/(-color\s*:\s*){$patterns['color']}(\s+){$patterns['color']}(\s+){$patterns['color']}(\s+){$patterns['color']}/i";
+               $patterns['four_notation_quantity'] = "/(:\s*){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s*[;}])/i";
+               $patterns['four_notation_color'] = "/(-color\s*:\s*){$patterns['color']}(\s+){$patterns['color']}(\s+){$patterns['color']}(\s+){$patterns['color']}(\s*[;}])/i";
                // The two regexes below are parenthesized differently then in the original implementation to make the
                // callback's job more straightforward
                $patterns['bg_horizontal_percentage'] = "/(background(?:-position)?\s*:\s*[^%]*?)(-?{$patterns['num']})(%\s*(?:{$patterns['quantity']}|{$patterns['ident']}))/";
@@ -257,8 +257,8 @@ class CSSJanus {
         * @return string
         */
        private static function fixFourPartNotation( $css ) {
-               $css = preg_replace( self::$patterns['four_notation_quantity'], '$1$2$7$4$5$6$3', $css );
-               $css = preg_replace( self::$patterns['four_notation_color'], '$1$2$3$8$5$6$7$4', $css );
+               $css = preg_replace( self::$patterns['four_notation_quantity'], '$1$2$3$8$5$6$7$4$9', $css );
+               $css = preg_replace( self::$patterns['four_notation_color'], '$1$2$3$8$5$6$7$4$9', $css );
 
                return $css;
        }
index 78d8180..4f626b2 100644 (file)
@@ -26,7 +26,7 @@
 class HttpStatus {
 
        /**
-        * Get the message associed with the HTTP response code $code
+        * Get the message associated with HTTP response code $code
         *
         * Replace OutputPage::getStatusMessage( $code )
         *
index 8a9e6db..44334ba 100644 (file)
@@ -20,7 +20,7 @@
  * @file
  * @author Niklas Laxström
  * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- * @since 1.21
+ * @since 1.22
  */
 
 /**
@@ -55,8 +55,8 @@ class DeleteLogFormatter extends LogFormatter {
                        ) {
                                $paramStart = $subtype === 'revision' ? 4 : 3;
 
-                               $old = $this->parseBitField( $params[$paramStart+1] );
-                               $new = $this->parseBitField( $params[$paramStart+2] );
+                               $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 ) {
@@ -101,7 +101,7 @@ class DeleteLogFormatter extends LogFormatter {
 
                switch ( $this->entry->getSubtype() ) {
                case 'delete': // Show undelete link
-                       if( $user->isAllowed( 'undelete' ) ) {
+                       if ( $user->isAllowed( 'undelete' ) ) {
                                $message = 'undeletelink';
                        } else {
                                $message = 'undeleteviewlink';
@@ -147,8 +147,8 @@ class DeleteLogFormatter extends LogFormatter {
                                                $this->msg( 'diff' )->escaped(),
                                                array(),
                                                array(
-                                                       'target'    => $this->entry->getTarget()->getPrefixedDBkey(),
-                                                       'diff'      => 'prev',
+                                                       'target' => $this->entry->getTarget()->getPrefixedDBkey(),
+                                                       'diff' => 'prev',
                                                        'timestamp' => $ids[0]
                                                )
                                        );
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 683dc03..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 '';
                        }
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 );
index 8dafb4a..0978f97 100644 (file)
@@ -20,7 +20,7 @@
  * @file
  * @author Niklas Laxström
  * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- * @since 1.21
+ * @since 1.22
  */
 
 /**
@@ -73,7 +73,7 @@ class MoveLogFormatter extends LogFormatter {
                        array(
                                'wpOldTitle' => $destTitle->getPrefixedDBkey(),
                                'wpNewTitle' => $this->entry->getTarget()->getPrefixedDBkey(),
-                               'wpReason'   => $this->msg( 'revertmove' )->inContentLanguage()->text(),
+                               'wpReason' => $this->msg( 'revertmove' )->inContentLanguage()->text(),
                                'wpMovetalk' => 0
                        )
                );
index ed37b6a..602728b 100644 (file)
@@ -20,7 +20,7 @@
  * @file
  * @author Niklas Laxström
  * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- * @since 1.21
+ * @since 1.22
  */
 
 /**
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 ) ) {
index 74ab196..507039b 100644 (file)
@@ -20,7 +20,7 @@
  * @file
  * @author Niklas Laxström
  * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- * @since 1.21
+ * @since 1.22
  */
 
 /**
index 67bd4d0..d3daf6e 100644 (file)
@@ -20,7 +20,7 @@
  * @file
  * @author Alexandre Emsenhuber
  * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- * @since 1.21
+ * @since 1.22
  */
 
 /**
index e1bacf3..99b7741 100644 (file)
@@ -58,7 +58,7 @@ class BmpHandler extends BitmapHandler {
         */
        function getImageSize( $image, $filename ) {
                $f = fopen( $filename, 'rb' );
-               if( !$f ) {
+               if ( !$f ) {
                        return false;
                }
                $header = fread( $f, 54 );
index 1d8337d..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 ) {
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 0831e68..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 98c423f..d8d0bed 100644 (file)
@@ -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 5bcb484..1c5136f 100644 (file)
@@ -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':
@@ -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 6ee0399..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;
                }
@@ -189,7 +189,7 @@ abstract class ImageHandler extends MediaHandler {
                }
                $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 cb0fbb3..1feb378 100644 (file)
@@ -71,7 +71,7 @@ class JpegHandler extends ExifBitmapHandler {
 
                $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'] ) .
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 b67f3d3..2e8d41d 100644 (file)
@@ -78,7 +78,7 @@ abstract class MediaHandler {
        /**
         * Merge a parameter array into a string appropriate for inclusion in filenames
         *
-        * @param $params array
+        * @param $params array Array of parameters that have been through normaliseParams.
         */
        abstract function makeParamString( $params );
 
@@ -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.
@@ -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.
@@ -216,6 +220,7 @@ abstract class MediaHandler {
         * @param string $dstPath filesystem destination path
         * @param string $dstUrl destination URL to use in output HTML
         * @param array $params arbitrary set of parameters validated by $this->validateParam()
+        *   Note: These parameters have *not* gone through $this->normaliseParams()
         * @param $flags Integer: a bitfield, may contain self::TRANSFORM_LATER
         *
         * @return MediaTransformOutput
@@ -224,6 +229,10 @@ abstract class MediaHandler {
 
        /**
         * Get the thumbnail extension and MIME type for a given source MIME type
+        *
+        * @param String $ext Extension of original file
+        * @param String $mime Mime type of original file
+        * @param Array $params Handler specific rendering parameters
         * @return array thumbnail extension and MIME type
         */
        function getThumbType( $ext, $mime, $params = null ) {
@@ -255,63 +264,96 @@ 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
         * Currently "width" and "height" are understood, but this might be
         * expanded in the future.
-        * Returns false if unknown or if the document is not multi-page.
+        * Returns false if unknown.
+        *
+        * It is expected that handlers for paged media (e.g. DjVuHandler)
+        * will override this method so that it gives the correct results
+        * for each specific page of the file, using the $page argument.
+        *
+        * @note For non-paged media, use getImageSize.
         *
         * @param $image File
-        * @param $page Unused, left for backcompatibility?
-        * @return array
+        * @param $page What page to get dimensions of
+        * @return array|bool
         */
        function getPageDimensions( $image, $page ) {
                $gis = $this->getImageSize( $image, $image->getLocalRefPath() );
-               return array(
-                       'width' => $gis[0],
-                       'height' => $gis[1]
-               );
+               if ( $gis ) {
+                       return array(
+                               'width' => $gis[0],
+                               'height' => $gis[1]
+                       );
+               } else {
+                       return false;
+               }
        }
 
        /**
@@ -394,9 +436,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];
                        }
                }
@@ -448,6 +490,8 @@ abstract class MediaHandler {
        }
 
        /**
+        * Used instead of getLongDesc if there is no handler registered for file.
+        *
         * @param $file File
         * @return string
         */
@@ -457,6 +501,8 @@ abstract class MediaHandler {
        }
 
        /**
+        * Short description. Shown on Special:Search results.
+        *
         * @param $file File
         * @return string
         */
@@ -467,6 +513,8 @@ abstract class MediaHandler {
        }
 
        /**
+        * Long description. Shown under image on image description page surounded by ().
+        *
         * @param $file File
         * @return string
         */
@@ -476,6 +524,8 @@ abstract class MediaHandler {
        }
 
        /**
+        * Used instead of getShortDesc if there is no handler registered for file.
+        *
         * @param $file File
         * @return string
         */
@@ -496,19 +546,32 @@ 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;
                }
        }
 
+       /**
+        * Shown in file history box on image description page.
+        *
+        * @param File $file
+        * @return String Dimensions
+        */
        function getDimensionsString( $file ) {
                return '';
        }
 
        /**
-        * Modify the parser object post-transform
+        * Modify the parser object post-transform.
+        *
+        * This is often used to do $parser->addOutputHook(),
+        * in order to add some javascript to render a viewer.
+        * See TimedMediaHandler or OggHandler for an example.
+        *
+        * @param Parser $parser
+        * @param File $file
         */
        function parserTransformHook( $parser, $file ) {}
 
@@ -535,9 +598,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 ) {
@@ -556,10 +619,17 @@ abstract class MediaHandler {
        }
 
        /**
-        * Remove files from the purge list
+        * Remove files from the purge list.
+        *
+        * This is used by some video handlers to prevent ?action=purge
+        * from removing a transcoded video, which is expensive to
+        * regenerate.
+        *
+        * @see LocalFile::purgeThumbnails
         *
         * @param array $files
-        * @param array $options
+        * @param array $options Purge options. Currently will always be
+        *  an array with a single key 'forThumbRefresh' set to true.
         */
        public function filterThumbnailPurgeList( &$files, $options ) {
                // Do nothing
index 1c2dfdd..8632399 100644 (file)
@@ -32,7 +32,7 @@ abstract class MediaTransformOutput {
         */
        var $file;
 
-       var $width, $height, $url, $page, $path;
+       var $width, $height, $url, $page, $path, $lang;
 
        /**
         * @var array Associative array mapping optional supplementary image files
@@ -197,17 +197,26 @@ abstract class MediaTransformOutput {
 
        /**
         * @param $title string
-        * @param $params array
+        * @param $params string|array Query parameters to add
         * @return array
         */
-       public function getDescLinkAttribs( $title = null, $params = '' ) {
-               $query = '';
+       public function getDescLinkAttribs( $title = null, $params = array() ) {
+               if ( is_array( $params ) ) {
+                       $query = $params;
+               } else {
+                       $query = array();
+               }
                if ( $this->page && $this->page !== 1 ) {
-                       $query = 'page=' . urlencode( $this->page );
+                       $query['page'] = $this->page;
                }
-               if( $params ) {
-                       $query .= $query ? '&' . $params : $params;
+               if( $this->lang ) {
+                       $query['lang'] = $this->lang;
                }
+
+               if ( is_string( $params ) && $params !== '' ) {
+                       $query = $params . '&' . wfArrayToCgi( $query );
+               }
+
                $attribs = array(
                        'href' => $this->file->getTitle()->getLocalURL( $query ),
                        'class' => 'image',
@@ -242,10 +251,12 @@ class ThumbnailImage extends MediaTransformOutput {
                # Previous parameters:
                #   $file, $url, $width, $height, $path = false, $page = false
 
-               if( is_array( $parameters ) ) {
-                       $defaults = array(
-                               'page' => false
-                       );
+               $defaults = array(
+                       'page' => false,
+                       'lang' => false
+               );
+
+               if ( is_array( $parameters ) ) {
                        $actualParams = $parameters + $defaults;
                } else {
                        # Using old format, should convert. Later a warning could be added here.
@@ -254,7 +265,7 @@ class ThumbnailImage extends MediaTransformOutput {
                                'width' => $path,
                                'height' => $parameters,
                                'page' => ( $numArgs > 5 ) ? func_get_arg( 5 ) : false
-                       );
+                       ) + $defaults;
                        $path = ( $numArgs > 4 ) ? func_get_arg( 4 ) : false;
                }
 
@@ -269,6 +280,7 @@ class ThumbnailImage extends MediaTransformOutput {
                $this->height = round( $actualParams['height'] );
 
                $this->page = $actualParams['page'];
+               $this->lang = $actualParams['lang'];
        }
 
        /**
@@ -301,7 +313,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 e65a558..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,14 +202,14 @@ 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;
                                                }
@@ -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;
                                        }
@@ -308,7 +308,7 @@ class PNGMetadataExtractor {
                                        $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..f0356f5 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'];
                        }
                }
@@ -115,6 +115,7 @@ class SvgHandler extends ImageHandler {
                $clientHeight = $params['height'];
                $physicalWidth = $params['physicalWidth'];
                $physicalHeight = $params['physicalHeight'];
+               $lang = isset( $params['lang'] ) ? $params['lang'] : 'en';
 
                if ( $flags & self::TRANSFORM_LATER ) {
                        return new ThumbnailImage( $image, $dstUrl, $dstPath, $params );
@@ -132,7 +133,7 @@ class SvgHandler extends ImageHandler {
                }
 
                $srcPath = $image->getLocalRefPath();
-               $status = $this->rasterize( $srcPath, $dstPath, $physicalWidth, $physicalHeight );
+               $status = $this->rasterize( $srcPath, $dstPath, $physicalWidth, $physicalHeight, $lang );
                if ( $status === true ) {
                        return new ThumbnailImage( $image, $dstUrl, $dstPath, $params );
                } else {
@@ -147,10 +148,11 @@ class SvgHandler extends ImageHandler {
         * @param string $dstPath
         * @param string $width
         * @param string $height
+        * @param string $lang Language code of the language to render the SVG in
         * @throws MWException
         * @return bool|MediaTransformError
         */
-       public function rasterize( $srcPath, $dstPath, $width, $height ) {
+       public function rasterize( $srcPath, $dstPath, $width, $height, $lang = false ) {
                global $wgSVGConverters, $wgSVGConverter, $wgSVGConverterPath;
                $err = false;
                $retval = '';
@@ -158,7 +160,7 @@ class SvgHandler extends ImageHandler {
                        if ( is_array( $wgSVGConverters[$wgSVGConverter] ) ) {
                                // This is a PHP callable
                                $func = $wgSVGConverters[$wgSVGConverter][0];
-                               $args = array_merge( array( $srcPath, $dstPath, $width, $height ),
+                               $args = array_merge( array( $srcPath, $dstPath, $width, $height, $lang ),
                                        array_slice( $wgSVGConverters[$wgSVGConverter], 1 ) );
                                if ( !is_callable( $func ) ) {
                                        throw new MWException( "$func is not callable" );
@@ -176,9 +178,15 @@ class SvgHandler extends ImageHandler {
                                                wfEscapeShellArg( $dstPath ) ),
                                        $wgSVGConverters[$wgSVGConverter]
                                ) . " 2>&1";
+
+                               $env = array();
+                               if( $lang !== false ) {
+                                       $env['LANG'] = $lang;
+                               }
+
                                wfProfileIn( 'rsvg' );
                                wfDebug( __METHOD__ . ": $cmd\n" );
-                               $err = wfShellExec( $cmd, $retval );
+                               $err = wfShellExec( $cmd, $retval, $env );
                                wfProfileOut( 'rsvg' );
                        }
                }
@@ -263,11 +271,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" );
                }
@@ -357,4 +365,68 @@ class SvgHandler extends ImageHandler {
                }
                return $result;
        }
+
+
+       /**
+        * @param string $name Parameter name
+        * @param $string $value Parameter value
+        * @return bool Validity
+        */
+       function validateParam( $name, $value ) {
+               if ( in_array( $name, array( 'width', 'height' ) ) ) {
+                       // Reject negative heights, widths
+                       return ( $value > 0 );
+               } elseif( $name == 'lang' ) {
+                       // Validate $code
+                       if( !Language::isValidBuiltinCode( $value ) ) {
+                               wfDebug( "Invalid user language code\n" );
+                               return false;
+                       }
+                       return true;
+               }
+               // Only lang, width and height are acceptable keys
+               return false;
+       }
+
+       /**
+        * @param array $params name=>value pairs of parameters
+        * @return string Filename to use
+        */
+       function makeParamString( $params ) {
+               $lang = '';
+               if( isset( $params['lang'] ) && $params['lang'] !== 'en' ) {
+                       $params['lang'] = mb_strtolower( $params['lang'] );
+                       $lang = "lang{$params['lang']}-";
+               }
+               if ( !isset( $params['width'] ) ) {
+                       return false;
+               }
+               return "$lang{$params['width']}px";
+       }
+
+       function parseParamString( $str ) {
+               $m = false;
+               if ( preg_match( '/^lang([a-z]+(?:-[a-z]+)*)-(\d+)px$/', $str, $m ) ) {
+                       return array( 'width' => array_pop( $m ), 'lang' => $m[1] );
+               } elseif( preg_match( '/^(\d+)px$/', $str, $m ) ) {
+                       return array( 'width' => $m[1], 'lang' => 'en' );
+               } else {
+                       return false;
+               }
+       }
+
+       function getParamMap() {
+               return array( 'img_lang' => 'lang', 'img_width' => 'width' );
+       }
+
+       /**
+        * @param $params
+        * @return array
+        */
+       function getScriptParams( $params ) {
+               return array(
+                       'width' => $params['width'],
+                       'lang' => $params['lang'],
+               );
+       }
 }
index f21d6b0..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 ) {
+       private function readField( $name, $metafield = null ) {
                $this->debug( "Read field $metafield" );
-               if( !$metafield || $this->reader->nodeType != XmlReader::ELEMENT ) {
+               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 ) {
+       private function readXml( $metafield = null ) {
                $this->debug( "Read top level metadata" );
-               if( !$metafield || $this->reader->nodeType != XmlReader::ELEMENT ) {
+               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)." );
@@ -221,7 +228,7 @@ class SVGReader {
         */
        private function animateFilter( $name ) {
                $this->debug( "animate filter for tag $name" );
-               if( $this->reader->nodeType != XmlReader::ELEMENT ) {
+               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 081433b..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;
@@ -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 f727400..3e29c12 100644 (file)
@@ -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..0f718d2 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://git.wikimedia.org/summary/mediawiki%2Fextensions%2Fnormal.git.
+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 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 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 bc2acb3..e5f60b5 100644 (file)
@@ -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 );
@@ -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..f962162 100644 (file)
@@ -37,6 +37,8 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
         *   - compress_threshold:  The minimum size an object must be before it is compressed
         *   - timeout:             The read timeout in microseconds
         *   - connect_timeout:     The connect timeout in seconds
+        *   - retry_timeout:       Time in seconds to wait before retrying a failed connect attempt
+        *   - server_failure_limit:  Limit for server connect failures before it is removed
         *   - serializer:          May be either "php" or "igbinary". Igbinary produces more compact
         *                          values, but serialization is much slower unless the php.ini option
         *                          igbinary.compact_strings is off.
@@ -61,6 +63,14 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
                        $params['serializer'] = 'php';
                }
 
+               if ( isset( $params['retry_timeout'] ) ) {
+                       $this->client->setOption( Memcached::OPT_RETRY_TIMEOUT, $params['retry_timeout'] );
+               }
+
+               if ( isset ( $params['server_failure_limit'] ) ) {
+                       $this->client->setOption( Memcached::OPT_SERVER_FAILURE_LIMIT, $params['server_failure_limit'] );
+               }
+
                // The compression threshold is an undocumented php.ini option for some
                // reason. There's probably not much harm in setting it globally, for
                // compatibility with the settings for the PHP client.
@@ -87,13 +97,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..6c1433a 100644 (file)
@@ -34,7 +34,7 @@ class ObjectCache {
         *
         * @param $id string
         *
-        * @return ObjectCache
+        * @return BagOStuff
         */
        static function getInstance( $id ) {
                if ( isset( self::$instances[$id] ) ) {
@@ -59,7 +59,7 @@ class ObjectCache {
         * @param $id string
         *
         * @throws MWException
-        * @return ObjectCache
+        * @return BagOStuff
         */
        static function newFromId( $id ) {
                global $wgObjectCaches;
@@ -78,7 +78,7 @@ class ObjectCache {
         * @param $params array
         *
         * @throws MWException
-        * @return ObjectCache
+        * @return BagOStuff
         */
        static function newFromParams( $params ) {
                if ( isset( $params['factory'] ) ) {
@@ -102,7 +102,7 @@ class ObjectCache {
         * If no cache choice is configured (by default $wgMainCacheType is CACHE_NONE),
         * then CACHE_ANYTHING will forward to CACHE_DB.
         * @param $params array
-        * @return ObjectCache
+        * @return BagOStuff
         */
        static function newAnything( $params ) {
                global $wgMainCacheType, $wgMessageCacheType, $wgParserCacheType;
@@ -120,14 +120,14 @@ class ObjectCache {
         *
         * @param $params array
         * @throws MWException
-        * @return ObjectCache
+        * @return BagOStuff
         */
        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 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 36bfb48..8b513a6 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;
@@ -433,12 +456,13 @@ class CoreParserFunctions {
                return self::formatRaw( SiteStats::edits(), $raw );
        }
        static function numberofviews( $parser, $raw = null ) {
-               return self::formatRaw( SiteStats::views(), $raw );
+               global $wgDisableCounters;
+               return !$wgDisableCounters ? self::formatRaw( SiteStats::views(), $raw ) : '';
        }
        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 +475,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,74 +530,100 @@ 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() );
        }
        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() );
        }
 
@@ -589,7 +646,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 +655,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 +693,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 +700,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 +717,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 +778,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 );
@@ -762,7 +825,9 @@ class CoreParserFunctions {
                        $title = SpecialPage::getTitleFor( $page, $subpage );
                        return $title->getPrefixedText();
                } else {
-                       return wfMessage( 'nosuchspecialpage' )->inContentLanguage()->text();
+                       // unknown special page, just use the given text as its title, if at all possible
+                       $title = Title::makeTitleSafe( NS_SPECIAL, $text );
+                       return $title ? $title->getPrefixedText() : self::special( $parser, 'Badtitle' );
                }
        }
 
@@ -786,19 +851,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 +873,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 08b1f3e..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 );
                }
@@ -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 f125510..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 );
                }
 
@@ -425,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'] );
                }
@@ -486,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 );
@@ -514,7 +514,7 @@ class LinkHolderArray {
                        }
                }
 
-               if( !$linkBatch->isEmpty() ) {
+               if ( !$linkBatch->isEmpty() ) {
                        // construct query
                        $dbr = wfGetDB( DB_SLAVE );
                        $varRes = $dbr->select( 'page',
@@ -533,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'];
@@ -570,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;
@@ -615,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 611eb02..28cde7f 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,7 +1260,7 @@ class Parser {
                                'x' => 'X',
                        ));
                        $titleObj = SpecialPage::getTitleFor( 'Booksources', $num );
-                       return'<a href="' .
+                       return '<a href="' .
                                htmlspecialchars( $titleObj->getLocalURL() ) .
                                "\" class=\"internal mw-magiclink-isbn\">ISBN $isbn</a>";
                } else {
@@ -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';
                                                }
                                        }
                                }
@@ -1539,7 +1564,7 @@ class Parser {
                $s = array_shift( $bits );
 
                $i = 0;
-               while ( $i<count( $bits ) ) {
+               while ( $i < count( $bits ) ) {
                        $url = $bits[$i++];
                        $i++; // protocol
                        $text = $bits[$i++];
@@ -2155,7 +2180,7 @@ class Parser {
        function closeParagraph() {
                $result = '';
                if ( $this->mLastSection != '' ) {
-                       $result = '</' . $this->mLastSection  . ">\n";
+                       $result = '</' . $this->mLastSection . ">\n";
                }
                $this->mInPre = false;
                $this->mLastSection = '';
@@ -2350,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.
@@ -2383,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
@@ -2441,7 +2466,7 @@ class Parser {
                        }
                }
                while ( $prefixLength ) {
-                       $output .= $this->closeList( $prefix2[$prefixLength-1] );
+                       $output .= $this->closeList( $prefix2[$prefixLength - 1] );
                        --$prefixLength;
                }
                if ( $this->mLastSection != '' ) {
@@ -2477,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;
                }
@@ -2486,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;
@@ -2537,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;
@@ -2551,7 +2576,7 @@ class Parser {
                                }
                                break;
                        case 2: # self::COLON_STATE_TAGSTART:
-                               switch( $c ) {
+                               switch ( $c ) {
                                case "/":
                                        $state = self::COLON_STATE_CLOSETAG;
                                        break;
@@ -2741,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;
@@ -2773,7 +2804,7 @@ class Parser {
                                break;
                        case 'pageid': // requested in bug 23427
                                $pageid = $this->getTitle()->getArticleID();
-                               if( $pageid == 0 ) {
+                               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
@@ -3089,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 = '';
                                }
@@ -3292,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->getPrefixedDBkey();
                                wfProfileIn( $titleProfileIn ); // template in
                        }
                        wfProfileIn( __METHOD__ . '-loadtpl' );
@@ -3618,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 );
@@ -3657,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;
                        }
@@ -3675,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 ) {
@@ -3778,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();
@@ -4094,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'] ) ) {
@@ -4111,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>.*?'.'>)\s*(?P<header>[\s\S]*?)\s*<\/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.
@@ -4228,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 .= '.';
@@ -4260,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.
                                #
@@ -4481,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 );
@@ -4600,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' );
@@ -4642,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;
        }
 
        /**
@@ -4880,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() );
@@ -4925,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 );
@@ -5044,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;
@@ -5184,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;
@@ -5205,7 +5245,7 @@ class Parser {
                                                $validated = $handler->validateParam( $paramName, $value );
                                        } else {
                                                # Validate internal parameters
-                                               switch( $paramName ) {
+                                               switch ( $paramName ) {
                                                case 'manualthumb':
                                                case 'alt':
                                                case 'class':
@@ -5643,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();
                        }
                }
@@ -5930,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..c5e42a4 100644 (file)
@@ -176,10 +176,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 +201,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 +258,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 +329,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 7cb91da..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,21 +148,19 @@ 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, '<' );
@@ -441,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;
@@ -578,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 );
@@ -1215,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 469ce80..654a66e 100644 (file)
@@ -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 );
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 c732b8d..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 );
 
                                // 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 1cf4fa7..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'] )
index 5d335b0..d2ddea3 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 );
@@ -283,13 +284,13 @@ 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 &$module ) {
+               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.
@@ -297,7 +298,7 @@ class ResourceLoader {
                        $module['dependencies'][] = 'mediawiki.tests.qunit.testrunner';
                }
 
-               foreach( $testModules as $id => $names ) {
+               foreach ( $testModules as $id => $names ) {
                        // Register test modules
                        $this->register( $testModules[$id] );
 
@@ -318,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 ) {
@@ -364,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] ) ) {
@@ -453,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;
@@ -466,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
@@ -485,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 ) ) {
@@ -557,6 +563,7 @@ class ResourceLoader {
                }
                if ( $context->getOnly() === 'styles' ) {
                        header( 'Content-Type: text/css; charset=utf-8' );
+                       header( 'Access-Control-Allow-Origin: *' );
                } else {
                        header( 'Content-Type: text/javascript; charset=utf-8' );
                }
@@ -637,7 +644,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
                        }
                }
@@ -694,9 +701,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();
@@ -800,9 +808,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;
@@ -914,7 +923,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
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 2718bcb..af533c6 100644 (file)
@@ -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;
        }
index 340d7df..05754d3 100644 (file)
@@ -37,7 +37,7 @@ class ResourceLoaderSiteModule extends ResourceLoaderWikiModule {
         * @return Array: List of pages
         */
        protected function getPages( ResourceLoaderContext $context ) {
-               global $wgUseSiteJs, $wgUseSiteCss, $wgHandheldStyle;
+               global $wgUseSiteJs, $wgUseSiteCss;
 
                $pages = array();
                if ( $wgUseSiteJs ) {
@@ -50,11 +50,6 @@ class ResourceLoaderSiteModule extends ResourceLoaderWikiModule {
 
                }
                $pages['MediaWiki:Print.css'] = array( 'type' => 'style', 'media' => 'print' );
-               if ( $wgHandheldStyle ) {
-                       $pages['MediaWiki:Handheld.css'] = array(
-                               'type' => 'style',
-                               'media' => 'handheld' );
-               }
                return $pages;
        }
 
index 5919cde..861ff18 100644 (file)
@@ -52,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;
index 9795cd0..7b4b668 100644 (file)
@@ -81,7 +81,7 @@ class ResourceLoaderUserCSSPrefsModule extends ResourceLoaderModule {
                        $rules[] = "#toc { display: none; }\n";
                }
                if ( !$options['editsection'] ) {
-                       $rules[] = ".editsection { display: none; }\n";
+                       $rules[] = ".mw-editsection { display: none; }\n";
                }
                if ( $options['editfont'] !== 'default' ) {
                        // Double-check that $options['editfont'] consists of safe characters only
index 7586bb7..9064263 100644 (file)
@@ -54,7 +54,7 @@ class ResourceLoaderUserGroupsModule extends ResourceLoaderWikiModule {
                }
 
                $pages = array();
-               foreach( $user->getEffectiveGroups() as $group ) {
+               foreach ( $user->getEffectiveGroups() as $group ) {
                        if ( in_array( $group, array( '*', 'user' ) ) ) {
                                continue;
                        }
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 ae5d934..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' ),
@@ -292,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__,
@@ -349,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();
@@ -449,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__,
@@ -623,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() )
                                )
                        );
@@ -636,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;
@@ -655,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;
@@ -673,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>';
        }
 }
 
@@ -700,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' )
@@ -759,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' );
@@ -772,7 +772,7 @@ class RevDel_ArchivedFileItem extends RevDel_FileItem {
                                )
                        );
                }
-               if( $this->isDeleted() ) {
+               if ( $this->isDeleted() ) {
                        $link = '<span class="history-deleted">' . $link . '</span>';
                }
                return $link;
@@ -901,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 fcbec9e..9ace35a 100644 (file)
@@ -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 d2e10e1..2de19ac 100644 (file)
@@ -39,7 +39,7 @@ class RevisionDeleter {
         * @param array $arr the array to update.
         */
        protected static function checkItem( $desc, $field, $diff, $new, &$arr ) {
-               if( $diff & $field ) {
+               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..4f4e31d 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;
        }
@@ -492,6 +494,18 @@ class SearchEngine {
                // no-op
        }
 
+       /**
+        * Delete an indexed page
+        * Title should be pre-processed.
+        * STUB
+        *
+        * @param Integer $id Page id that was deleted
+        * @param String $title Title of page that was deleted
+        */
+       function delete( $id, $title ) {
+               // no-op
+       }
+
        /**
         * Get OpenSearch suggestion template
         *
@@ -509,6 +523,20 @@ class SearchEngine {
                        return $wgCanonicalServer . wfScript( 'api' ) . '?action=opensearch&search={searchTerms}&namespace=' . $ns;
                }
        }
+
+       /**
+        * Get the raw text for updating the index from a content object
+        * Nicer search backends could possibly do something cooler than
+        * just returning raw text
+        *
+        * @todo This isn't ideal, we'd really like to have content-specific handling here
+        * @param Title $t Title we're indexing
+        * @param Content $c Content of the page to index
+        * @return string
+        */
+       public function getTextFromContent( Title $t, Content $c = null ) {
+               return $c ? $c->getTextForSearchIndex() : '';
+       }
 }
 
 /**
@@ -641,26 +669,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 +782,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 +794,9 @@ class SearchResult {
         * @return Boolean
         */
        function isBrokenTitle() {
-               if ( is_null( $this->mTitle ) )
+               if ( is_null( $this->mTitle ) ) {
                        return true;
+               }
                return false;
        }
 
@@ -795,10 +829,8 @@ class SearchResult {
        protected function initText() {
                if ( !isset( $this->mText ) ) {
                        if ( $this->mRevision != null ) {
-                               //TODO: if we could plug in some code that knows about special content models *and* about
-                               //      special features of the search engine, the search could benefit.
-                               $content = $this->mRevision->getContent();
-                               $this->mText = $content ? $content->getTextForSearchIndex() : '';
+                               $this->mText = SearchEngine::create()
+                                       ->getTextFromContent( $this->mTitle, $this->mRevision->getContent() );
                        } else { // TODO: can we fetch raw wikitext for commons images?
                                $this->mText = '';
                        }
@@ -816,10 +848,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 +896,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 +986,9 @@ class SearchHighlighter {
                global $wgSearchHighlightBoundaries;
                $fname = __METHOD__;
 
-               if ( $text == '' )
+               if ( $text == '' ) {
                        return '';
+               }
 
                // spli text into text + templates/links/tables
                $spat = "/(\\{\\{)|(\\[\\[[^\\]:]+:)|(\n\\{\\|)";
@@ -984,8 +1019,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 +1042,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 +1155,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 +1191,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 +1231,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 +1307,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 +1329,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 +1359,9 @@ class SearchHighlighter {
                        $out[$index] = $this->extract( $line, $begin, $end, $posBegin );
                        $offsets[$index] = $posBegin;
                        $linesleft--;
-                       if ( $linesleft == 0 )
+                       if ( $linesleft == 0 ) {
                                return;
+                       }
                }
        }
 
@@ -1357,16 +1402,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 605a71b..d8c638e 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,11 +364,24 @@ 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() ) );
        }
 
+       /**
+        * Delete an indexed page
+        * Title should be pre-processed.
+        *
+        * @param Integer $id Page id that was deleted
+        * @param String $title Title of page that was deleted
+        */
+       function delete( $id, $title ) {
+               $dbw = wfGetDB( DB_MASTER );
+
+               $dbw->delete( 'searchindex', array( 'si_page' => $id ), __METHOD__ );
+       }
+
        /**
         * Converts some characters for MySQL's indexing to grok it correctly,
         * and pads short words to overcome limitations.
@@ -386,7 +405,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 +446,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 +454,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 +468,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 dd152f7..a847965 100644 (file)
@@ -74,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 );
@@ -88,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 );
@@ -112,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 {
@@ -197,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 ) ) {
+                               if ( is_array( $temp_terms ) ) {
                                        $temp_terms = array_unique( array_values( $temp_terms ) );
-                                       foreach( $temp_terms as $t ) {
-                                               $searchon .= ($terms[1] == '-' ? ' ~' : ' & ') . $this->escapeTerm( $t );
+                                       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] ), '/' );
                                }
@@ -275,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 b8d5dc1..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 ) {
@@ -97,8 +97,8 @@ class SearchPostgres extends SearchEngine {
 
                $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 .= ' & !';
                                }
@@ -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 ee30d9b..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 35199d6..7146917 100644 (file)
  * @ingroup Search
  */
 class SearchUpdate implements DeferrableUpdate {
-
-       private $mId = 0, $mNamespace, $mTitle, $mText;
-       private $mTitleWords;
-
-       function __construct( $id, $title, $text = false ) {
+       /**
+        * Page id being updated
+        * @var int
+        */
+       private $id = 0;
+
+       /**
+        * Title we're updating
+        * @var Title
+        */
+       private $title;
+
+       /**
+        * Content of the page (not text)
+        * @var Content|false
+        */
+       private $content;
+
+       /**
+        * Constructor
+        *
+        * @param int $id Page id to update
+        * @param Title|string $title Title of page to update
+        * @param Content|string|false $c Content of the page to update.
+        *  If a Content object, text will be gotten from it. String is for back-compat.
+        *  Passing false tells the backend to just update the title, not the content
+        */
+       public function __construct( $id, $title, $c = false ) {
                if ( is_string( $title ) ) {
                        $nt = Title::newFromText( $title );
                } else {
                        $nt = $title;
                }
 
-               if( $nt ) {
-                       $this->mId = $id;
-                       $this->mText = $text;
-
-                       $this->mNamespace = $nt->getNamespace();
-                       $this->mTitle = $nt->getText(); # Discard namespace
-
-                       $this->mTitleWords = $this->mTextWords = array();
+               if ( $nt ) {
+                       $this->id = $id;
+                       // is_string() check is back-compat for ApprovedRevs
+                       if( is_string( $c ) ) {
+                               $this->content = new TextContent( $c );
+                       } else {
+                               $this->content = $c ?: false;
+                       }
+                       $this->title = $nt;
                } else {
                        wfDebug( "SearchUpdate object created with invalid title '$title'\n" );
                }
        }
 
-       function doUpdate() {
-               global $wgContLang, $wgDisableSearchUpdate;
+       /**
+        * Perform actual update for the entry
+        */
+       public function doUpdate() {
+               global $wgDisableSearchUpdate;
 
-               if( $wgDisableSearchUpdate || !$this->mId ) {
+               if ( $wgDisableSearchUpdate || !$this->id ) {
                        return;
                }
 
                wfProfileIn( __METHOD__ );
 
                $search = SearchEngine::create();
-               $lc = SearchEngine::legalSearchChars() . '&#;';
+               $normalTitle = $search->normalizeText(
+                       Title::indexTitle( $this->title->getNamespace(), $this->title->getText() ) );
 
-               if( $this->mText === false ) {
-                       $search->updateTitle( $this->mId,
-                               $search->normalizeText( Title::indexTitle( $this->mNamespace, $this->mTitle ) ) );
+               if ( WikiPage::newFromId( $this->id ) === null ) {
+                       $search->delete( $this->id, $normalTitle );
+                       wfProfileOut( __METHOD__ );
+                       return;
+               } elseif ( $this->content === false ) {
+                       $search->updateTitle( $this->id, $normalTitle );
                        wfProfileOut( __METHOD__ );
                        return;
                }
 
+               $text = $search->getTextFromContent( $this->title, $this->content );
+               if( wfRunHooks( 'SearchUpdate', array( $this->id, $this->title, &$text, $this->content ) ) ) {
+                       $text = self::updateText( $text );
+               }
+
+               # Perform the actual update
+               $search->update( $this->id, $normalTitle, $search->normalizeText( $text ) );
+
+               wfProfileOut( __METHOD__ );
+       }
+
+       /**
+        * Clean text for indexing. Only really suitable for indexing in databases.
+        * If you're using a real search engine, you'll probably want to override
+        * this behavior and do something nicer with the original wikitext.
+        */
+       public static function updateText( $text ) {
+               global $wgContLang;
+
                # Language-specific strip/conversion
-               $text = $wgContLang->normalizeForSearch( $this->mText );
+               $text = $wgContLang->normalizeForSearch( $text );
+               $lc = SearchEngine::legalSearchChars() . '&#;';
 
                wfProfileIn( __METHOD__ . '-regexps' );
                $text = preg_replace( "/<\\/?\\s*[A-Za-z][^>]*?>/",
@@ -123,22 +174,6 @@ class SearchUpdate implements DeferrableUpdate {
                # Strip wiki '' and '''
                $text = preg_replace( "/''[']*/", " ", $text );
                wfProfileOut( __METHOD__ . '-regexps' );
-
-               wfRunHooks( 'SearchUpdate', array( $this->mId, $this->mNamespace, $this->mTitle, &$text ) );
-
-               # Perform the actual update
-               $search->update( $this->mId, $search->normalizeText( Title::indexTitle( $this->mNamespace, $this->mTitle ) ),
-                               $search->normalizeText( $text ) );
-
-               wfProfileOut( __METHOD__ );
+               return $text;
        }
 }
-
-/**
- * Placeholder class
- *
- * @ingroup Search
- */
-class SearchUpdateMyISAM extends SearchUpdate {
-       # Inherits everything
-}
index 4cd48b8..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 = wfAppendQuery( $this->getFileUrl( wfScript( 'api' ) ), $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 );
                }
 
diff --git a/includes/specials/SpecialActiveusers.php b/includes/specials/SpecialActiveusers.php
new file mode 100644 (file)
index 0000000..3885043
--- /dev/null
@@ -0,0 +1,272 @@
+<?php
+/**
+ * Implements Special:Activeusers
+ *
+ * Copyright © 2008 Aaron Schulz
+ *
+ * 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
+ */
+
+/**
+ * This class is used to get a list of active users. The ones with specials
+ * rights (sysop, bureaucrat, developer) will have them displayed
+ * next to their names.
+ *
+ * @ingroup SpecialPage
+ */
+class ActiveUsersPager extends UsersPager {
+
+       /**
+        * @var FormOptions
+        */
+       protected $opts;
+
+       /**
+        * @var Array
+        */
+       protected $hideGroups = array();
+
+       /**
+        * @var Array
+        */
+       protected $hideRights = array();
+
+       /**
+        * @param $context IContextSource
+        * @param $group null Unused
+        * @param string $par Parameter passed to the page
+        */
+       function __construct( IContextSource $context = null, $group = null, $par = null ) {
+               global $wgActiveUserDays;
+
+               parent::__construct( $context );
+
+               $this->RCMaxAge = $wgActiveUserDays;
+               $un = $this->getRequest()->getText( 'username', $par );
+               $this->requestedUser = '';
+               if ( $un != '' ) {
+                       $username = Title::makeTitleSafe( NS_USER, $un );
+                       if ( !is_null( $username ) ) {
+                               $this->requestedUser = $username->getText();
+                       }
+               }
+
+               $this->setupOptions();
+       }
+
+       public function setupOptions() {
+               $this->opts = new FormOptions();
+
+               $this->opts->add( 'hidebots', false, FormOptions::BOOL );
+               $this->opts->add( 'hidesysops', false, FormOptions::BOOL );
+
+               $this->opts->fetchValuesFromRequest( $this->getRequest() );
+
+               if ( $this->opts->getValue( 'hidebots' ) == 1 ) {
+                       $this->hideRights[] = 'bot';
+               }
+               if ( $this->opts->getValue( 'hidesysops' ) == 1 ) {
+                       $this->hideGroups[] = 'sysop';
+               }
+       }
+
+       function getIndexField() {
+               return 'rc_user_text';
+       }
+
+       function getQueryInfo() {
+               $dbr = $this->getDatabase();
+
+               $conds = array( 'rc_user > 0' ); // Users - no anons
+               $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 ) );
+
+               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' ),
+                       'fields' => array(
+                               'user_name' => 'rc_user_text', // for Pager inheritance
+                               'rc_user_text', // for Pager
+                               'user_id' => 'MAX(rc_user)', // Postgres
+                               'recentedits' => 'COUNT(*)'
+                       ),
+                       'options' => array(
+                               'GROUP BY' => array( 'rc_user_text' ),
+                               'USE INDEX' => array( 'recentchanges' => 'rc_user_text' )
+                       ),
+                       '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;
+
+               $ulinks = Linker::userLink( $row->user_id, $userName );
+               $ulinks .= Linker::userToolLinks( $row->user_id, $userName );
+
+               $lang = $this->getLanguage();
+
+               $list = array();
+               $user = User::newFromId( $row->user_id );
+
+               // User right filter
+               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
+                       // User object
+                       if ( in_array( $right, $user->getRights() ) ) {
+                               return '';
+                       }
+               }
+
+               // User group filter
+               // 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 ) {
+                       if ( in_array( $group, $this->hideGroups ) ) {
+                               return '';
+                       }
+                       $list[] = self::buildGroupLink( $group, $userName );
+               }
+
+               $groups = $lang->commaList( $list );
+
+               $item = $lang->specialList( $ulinks, $groups );
+
+               $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 = $isBlocked ? ' ' . $this->msg( 'listusers-blocked', $userName )->escaped() : '';
+
+               return Html::rawElement( 'li', array(), "{$item} [{$count}]{$blocked}" );
+       }
+
+       function getPageHeader() {
+               global $wgScript;
+
+               $self = $this->getTitle();
+               $limit = $this->mLimit ? Html::hidden( 'limit', $this->mLimit ) : '';
+
+               $out = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ); # Form tag
+               $out .= Xml::fieldset( $this->msg( 'activeusers' )->text() ) . "\n";
+               $out .= Html::hidden( 'title', $self->getPrefixedDBkey() ) . $limit . "\n";
+
+               $out .= Xml::inputLabel( $this->msg( 'activeusers-from' )->text(),
+                       'username', 'offset', 20, $this->requestedUser ) . '<br />';# Username field
+
+               $out .= Xml::checkLabel( $this->msg( 'activeusers-hidebots' )->text(),
+                       'hidebots', 'hidebots', $this->opts->getValue( 'hidebots' ) );
+
+               $out .= Xml::checkLabel( $this->msg( 'activeusers-hidesysops' )->text(),
+                       'hidesysops', 'hidesysops', $this->opts->getValue( 'hidesysops' ) ) . '<br />';
+
+               $out .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) . "\n";# Submit button and form bottom
+               $out .= Xml::closeElement( 'fieldset' );
+               $out .= Xml::closeElement( 'form' );
+
+               return $out;
+       }
+}
+
+/**
+ * @ingroup SpecialPage
+ */
+class SpecialActiveUsers extends SpecialPage {
+
+       /**
+        * Constructor
+        */
+       public function __construct() {
+               parent::__construct( 'Activeusers' );
+       }
+
+       /**
+        * Show the special page
+        *
+        * @param $par Mixed: parameter passed to the page or null
+        */
+       public function execute( $par ) {
+               global $wgActiveUserDays;
+
+               $this->setHeaders();
+               $this->outputHeader();
+
+               $out = $this->getOutput();
+               $out->wrapWikiMsg( "<div class='mw-activeusers-intro'>\n$1\n</div>",
+                       array( 'activeusers-intro', $this->getLanguage()->formatNum( $wgActiveUserDays ) ) );
+
+               $up = new ActiveUsersPager( $this->getContext(), null, $par );
+
+               # getBody() first to check, if empty
+               $usersbody = $up->getBody();
+
+               $out->addHTML( $up->getPageHeader() );
+               if ( $usersbody ) {
+                       $out->addHTML(
+                               $up->getNavigationBar() .
+                               Html::rawElement( 'ul', array(), $usersbody ) .
+                               $up->getNavigationBar()
+                       );
+               } else {
+                       $out->addWikiMsg( 'activeusers-noresult' );
+               }
+       }
+
+       protected function getGroupName() {
+               return 'users';
+       }
+}
index 7f315de..35d6a0c 100644 (file)
@@ -28,7 +28,6 @@
  * @ingroup SpecialPage
  */
 class SpecialAllmessages extends SpecialPage {
-
        /**
         * @var AllmessagesTablePager
         */
@@ -55,6 +54,7 @@ class SpecialAllmessages extends SpecialPage {
                global $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;
@@ -213,6 +211,7 @@ class AllmessagesTablePager extends TablePager {
                        $this->getHiddenFields( array( 'title', 'prefix', 'filter', 'lang', 'limit' ) ) .
                        Xml::closeElement( 'fieldset' ) .
                        Xml::closeElement( 'form' );
+
                return $out;
        }
 
@@ -229,6 +228,7 @@ class AllmessagesTablePager extends TablePager {
                $messageNames = array_map( array( $this->lang, 'ucfirst' ), $messageNames );
 
                wfProfileOut( __METHOD__ );
+
                return $messageNames;
        }
 
@@ -319,6 +319,7 @@ class AllmessagesTablePager extends TablePager {
                                break;
                        }
                }
+
                return $result;
        }
 
@@ -367,6 +368,7 @@ class AllmessagesTablePager extends TablePager {
                                                array( 'broken' )
                                        );
                                }
+
                                return $title . ' ' . $this->msg( 'parentheses' )->rawParams( $talk )->escaped();
 
                        case 'am_default' :
@@ -390,6 +392,7 @@ class AllmessagesTablePager extends TablePager {
                        $s .= Xml::tags( 'td', $this->getCellAttrs( 'am_actual', $row->am_actual ), $formatted )
                                . "</tr>\n";
                }
+
                return $s;
        }
 
@@ -401,6 +404,7 @@ class AllmessagesTablePager extends TablePager {
                if ( !$isSecond ) {
                        $arr['id'] = Sanitizer::escapeId( 'msg_' . $this->getLanguage()->lcfirst( $row->am_title ) );
                }
+
                return $arr;
        }
 
index 7505df8..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,7 +84,7 @@ 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 ) ) ) ?
@@ -160,6 +159,7 @@ class SpecialAllpages extends IncludableSpecialPage {
                $out .= Xml::closeElement( 'fieldset' );
                $out .= Xml::closeElement( 'form' );
                $out .= Xml::closeElement( 'div' );
+
                return $out;
        }
 
@@ -259,6 +259,7 @@ class SpecialAllpages extends IncludableSpecialPage {
                        } else {
                                $output->addHTML( $this->namespaceForm( $namespace, $from, $to, $hideredirects ) );
                        }
+
                        return;
                }
 
@@ -305,32 +306,37 @@ class SpecialAllpages extends IncludableSpecialPage {
         * @return string
         */
        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 = array (
+               $queryParams = array(
                        'from' => $inpoint,
                        'to' => $outpoint,
                );
 
-               if( $namespace ) {
+               if ( $namespace ) {
                        $queryParams['namespace'] = $namespace;
                }
                if ( $hideRedirects ) {
                        $queryParams['hideredirects'] = 1;
                }
 
-               $link = htmlspecialchars(
-                       $this->getTitle()->getLocalURL( $queryParams ) );
+               $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>';
        }
 
@@ -341,12 +347,11 @@ class SpecialAllpages extends IncludableSpecialPage {
         * @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 ) {
@@ -532,7 +537,6 @@ class SpecialAllpages extends IncludableSpecialPage {
                                        )
                        );
                }
-
        }
 
        /**
index fafe75f..b083032 100644 (file)
@@ -64,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;
 
@@ -73,6 +78,7 @@ class AncientPagesPage extends QueryPage {
                        $title,
                        htmlspecialchars( $wgContLang->convert( $title->getPrefixedText() ) )
                );
+
                return $this->getLanguage()->specialList( $link, htmlspecialchars( $d ) );
        }
 
index 53f7f4d..6ba009a 100644 (file)
@@ -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(),
                        ),
@@ -444,6 +446,7 @@ class SpecialBlock extends FormSpecialPage {
                } elseif ( IP::isIPAddress( $target ) ) {
                        return Title::makeTitleSafe( NS_USER, $target );
                }
+
                return null;
        }
 
@@ -510,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;
@@ -527,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 );
 
@@ -605,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;
@@ -747,7 +753,7 @@ class SpecialBlock extends FormSpecialPage {
 
                # Can't watch a rangeblock
                if ( $type != Block::TYPE_RANGE && $data['Watch'] ) {
-                       $performer->addWatch( Title::makeTitle( NS_USER, $target ) );
+                       WatchAction::doWatch( Title::makeTitle( NS_USER, $target ), $performer, WatchedItem::IGNORE_USER_RIGHTS );
                }
 
                # Block constructor sanitizes certain block options on insert
@@ -952,4 +958,5 @@ class SpecialBlock extends FormSpecialPage {
 }
 
 # BC @since 1.18
-class IPBlockForm extends SpecialBlock {}
+class IPBlockForm extends SpecialBlock {
+}
index eb25eaf..784ad04 100644 (file)
@@ -59,6 +59,7 @@ class SpecialBlockList extends SpecialPage {
                        # B/C @since 1.18: Unblock interface is now at Special:Unblock
                        $title = SpecialPage::getTitleFor( 'Unblock', $this->target );
                        $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' );
@@ -141,7 +143,7 @@ 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;
                        }
@@ -182,10 +184,8 @@ class SpecialBlockList extends SpecialPage {
                                        $pager->getBody() .
                                        $pager->getNavigationBar()
                        );
-
                } elseif ( $this->target ) {
                        $out->addWikiMsg( 'ipblocklist-no-results' );
-
                } else {
                        $out->addWikiMsg( 'ipblocklist-empty' );
                }
@@ -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__ );
@@ -482,5 +482,4 @@ class HTMLBlockedUsersItemSelect extends HTMLSelectField {
 
                return true;
        }
-
 }
index 1e5b524..c3d6080 100644 (file)
@@ -41,6 +41,7 @@ class SpecialBlockme extends UnlistedSpecialPage {
                $ip = $this->getRequest()->getIP();
                if ( !$wgBlockOpenProxies || $this->getRequest()->getText( 'ip' ) != md5( $ip . $wgProxyKey ) ) {
                        $this->getOutput()->addWikiMsg( 'proxyblocker-disabled' );
+
                        return;
                }
 
index 0774c44..5ad961c 100644 (file)
@@ -95,6 +95,7 @@ class SpecialBookSources extends SpecialPage {
                                return true;
                        }
                }
+
                return false;
        }
 
@@ -116,13 +117,14 @@ 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 .= '<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 = 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, array( 'autofocus' => true ) );
+               $form .= '&#160;' . Xml::submitButton( $this->msg( 'booksources-go' )->text() ) . "</p>\n";
+               $form .= Html::closeElement( 'form' ) . "\n";
+               $form .= Html::closeElement( 'fieldset' ) . "\n";
                return $form;
        }
 
@@ -152,6 +154,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 +165,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 +182,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 e6fd58d..b2ddc22 100644 (file)
@@ -51,6 +51,7 @@ class BrokenRedirectsPage extends QueryPage {
 
        function getQueryInfo() {
                $dbr = wfGetDB( DB_SLAVE );
+
                return array(
                        'tables' => array(
                                'redirect',
@@ -92,9 +93,9 @@ class BrokenRedirectsPage extends QueryPage {
        }
 
        /**
-        * @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 );
@@ -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 f7256a4..d01bfd7 100644 (file)
@@ -90,6 +90,7 @@ class CategoryPager extends AlphabeticPager {
        function getDefaultQuery() {
                parent::getDefaultQuery();
                unset( $this->mDefaultQuery['from'] );
+
                return $this->mDefaultQuery;
        }
 
@@ -114,6 +115,7 @@ class CategoryPager extends AlphabeticPager {
                }
                $batch->execute();
                $this->mResult->rewind();
+
                return parent::getBody();
        }
 
@@ -121,6 +123,7 @@ 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";
        }
 
@@ -136,9 +139,9 @@ class CategoryPager extends AlphabeticPager {
                                        Xml::inputLabel(
                                                $this->msg( 'categoriesfrom' )->text(),
                                                'from', 'from', 20, $from ) .
-                                                       ' ' .
-                                                       Xml::submitButton( $this->msg( 'allpagessubmit' )->text()
-                                       )
+                                               ' ' .
+                                               Xml::submitButton( $this->msg( 'allpagessubmit' )->text()
+                                               )
                                )
                );
        }
index 2086fd3..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;
                }
 
@@ -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;
                }
 
@@ -243,6 +251,7 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
                                '<p class="error">' .
                                        $this->getOutput()->parseInline( $status->getWikiText( 'mailerror' ) ) .
                                        '</p>' );
+
                        return false;
                }
 
index 95fbb0d..b53a46a 100644 (file)
@@ -54,11 +54,13 @@ class SpecialChangePassword extends UnlistedSpecialPage {
                $user = $this->getUser();
                if ( !$request->wasPosted() && !$user->isLoggedIn() ) {
                        $this->error( $this->msg( 'resetpass-no-info' )->text() );
+
                        return;
                }
 
                if ( $request->wasPosted() && $request->getBool( 'wpCancel' ) ) {
                        $this->doReturnTo();
+
                        return;
                }
 
@@ -69,6 +71,7 @@ class SpecialChangePassword extends UnlistedSpecialPage {
                                $this->mDomain = $wgAuth->getDomain();
                                if ( !$wgAuth->allowPasswordChange() ) {
                                        $this->error( $this->msg( 'resetpass_forbidden' )->text() );
+
                                        return;
                                }
 
@@ -90,6 +93,7 @@ class SpecialChangePassword extends UnlistedSpecialPage {
                                        $login->setContext( $this->getContext() );
                                        $login->execute( null );
                                }
+
                                return;
                        } catch ( PasswordError $e ) {
                                $this->error( $e->getMessage() );
@@ -218,6 +222,7 @@ class SpecialChangePassword extends UnlistedSpecialPage {
                        $out .= "</td>\n";
                        $out .= "</tr>";
                }
+
                return $out;
        }
 
@@ -246,6 +251,12 @@ class SpecialChangePassword extends UnlistedSpecialPage {
                        throw new PasswordError( $this->msg( 'login-throttled' )->text() );
                }
 
+               $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() );
index 3b82326..fc6b0c5 100644 (file)
@@ -136,6 +136,7 @@ class SpecialComparePages extends SpecialPage {
                                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 3287c63..47808d1 100644 (file)
@@ -104,13 +104,13 @@ class EmailConfirmation extends UnlistedSpecialPage {
                        }
 
                        $out->addWikiMsg( 'confirmemail_text' );
-                       $form = Xml::openElement(
+                       $form = Html::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' );
+                       ) . "\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 );
                }
        }
@@ -125,6 +125,7 @@ class EmailConfirmation extends UnlistedSpecialPage {
                $user = User::newFromConfirmationCode( $code );
                if ( !is_object( $user ) ) {
                        $this->getOutput()->addWikiMsg( 'confirmemail_invalid' );
+
                        return;
                }
 
@@ -167,6 +168,7 @@ class EmailInvalidation extends UnlistedSpecialPage {
                $user = User::newFromConfirmationCode( $code );
                if ( !is_object( $user ) ) {
                        $this->getOutput()->addWikiMsg( 'confirmemail_invalid' );
+
                        return;
                }
 
index 932f05e..2f37cb4 100644 (file)
@@ -64,6 +64,7 @@ class SpecialContributions extends SpecialPage {
 
                if ( !strlen( $target ) ) {
                        $out->addHTML( $this->getForm() );
+
                        return;
                }
 
@@ -76,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();
@@ -158,6 +161,7 @@ class SpecialContributions extends SpecialPage {
                        $url = wfAppendQuery( wfScript( 'api' ), $apiParams );
 
                        $out->redirect( $url, '301' );
+
                        return;
                }
 
@@ -171,6 +175,7 @@ class SpecialContributions extends SpecialPage {
                                'target' => $target,
                                'contribs' => $this->opts['contribs'],
                                'namespace' => $this->opts['namespace'],
+                               'tagfilter' => $this->opts['tagfilter'],
                                'year' => $this->opts['year'],
                                'month' => $this->opts['month'],
                                'deletedOnly' => $this->opts['deletedOnly'],
@@ -270,6 +275,7 @@ class SpecialContributions extends SpecialPage {
                $oldMsg = $this->msg( 'contribsub' );
                if ( $oldMsg->exists() ) {
                        $linksWithParentheses = $this->msg( 'parentheses' )->rawParams( $links )->escaped();
+
                        return $oldMsg->rawParams( "$user $linksWithParentheses" );
                }
 
@@ -308,6 +314,7 @@ class SpecialContributions extends SpecialPage {
                                        );
                                }
                        }
+
                        # Block log link
                        $tools[] = Linker::linkKnown(
                                SpecialPage::getTitleFor( 'Log', 'block' ),
@@ -347,6 +354,7 @@ class SpecialContributions extends SpecialPage {
                }
 
                wfRunHooks( 'ContributionsToolLinks', array( $id, $userpage, &$tools ) );
+
                return $tools;
        }
 
@@ -496,32 +504,32 @@ class SpecialContributions extends SpecialPage {
                                        'class' => 'namespaceselector',
                                )
                        ) . '&#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'
-                                       )
-                               ) . '&#160;'
-                       ) .
-                       Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
-                               Xml::checkLabel(
-                                       $this->msg( 'namespace_association' )->text(),
-                                       'associated',
-                                       'associated',
-                                       $this->opts['associated'],
-                                       array(
-                                               'title' => $this->msg( 'tooltip-namespace_association' )->text(),
-                                               'class' => 'mw-input'
-                                       )
-                               ) . '&#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'
+                                               )
+                                       ) . '&#160;'
+                               ) .
+                               Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
+                                       Xml::checkLabel(
+                                               $this->msg( 'namespace_association' )->text(),
+                                               'associated',
+                                               'associated',
+                                               $this->opts['associated'],
+                                               array(
+                                                       'title' => $this->msg( 'tooltip-namespace_association' )->text(),
+                                                       'class' => 'mw-input'
+                                               )
+                                       ) . '&#160;'
+                               )
                );
 
                if ( $this->getUser()->isAllowed( 'deletedhistory' ) ) {
@@ -559,7 +567,7 @@ class SpecialContributions extends SpecialPage {
 
                $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(
@@ -644,6 +652,7 @@ class ContribsPager extends ReverseChronologicalPager {
        function getDefaultQuery() {
                $query = parent::getDefaultQuery();
                $query['target'] = $this->target;
+
                return $query;
        }
 
@@ -753,6 +762,7 @@ class ContribsPager extends ReverseChronologicalPager {
                );
 
                wfRunHooks( 'ContribsPager::getQueryInfo', array( &$this, &$queryInfo ) );
+
                return $queryInfo;
        }
 
@@ -1030,6 +1040,7 @@ class ContribsPager extends ReverseChronologicalPager {
                }
 
                wfProfileOut( __METHOD__ );
+
                return $ret;
        }
 
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 901c7f9..28ca24b 100644 (file)
@@ -49,6 +49,7 @@ class DeletedContribsPager extends IndexPager {
        function getDefaultQuery() {
                $query = parent::getDefaultQuery();
                $query['target'] = $this->target;
+
                return $query;
        }
 
@@ -63,6 +64,7 @@ class DeletedContribsPager extends IndexPager {
                        $conds[] = $this->mDb->bitAnd( 'ar_deleted', Revision::SUPPRESSED_USER ) .
                                ' != ' . Revision::SUPPRESSED_USER;
                }
+
                return array(
                        'tables' => array( 'archive' ),
                        'fields' => array(
@@ -255,6 +257,7 @@ class DeletedContribsPager extends IndexPager {
                $ret = Html::rawElement( 'li', array(), $ret ) . "\n";
 
                wfProfileOut( __METHOD__ );
+
                return $ret;
        }
 
@@ -290,6 +293,7 @@ class DeletedContributionsPage extends SpecialPage {
 
                if ( !$this->userCanExecute( $user ) ) {
                        $this->displayRestrictionError();
+
                        return;
                }
 
@@ -307,6 +311,7 @@ class DeletedContributionsPage extends SpecialPage {
 
                if ( !strlen( $target ) ) {
                        $out->addHTML( $this->getForm( '' ) );
+
                        return;
                }
 
@@ -316,6 +321,7 @@ class DeletedContributionsPage extends SpecialPage {
                $userObj = User::newFromName( $target, false );
                if ( !$userObj ) {
                        $out->addHTML( $this->getForm( '' ) );
+
                        return;
                }
                $this->getSkin()->setRelevantUser( $userObj );
@@ -334,6 +340,7 @@ class DeletedContributionsPage extends SpecialPage {
                $pager = new DeletedContribsPager( $this->getContext(), $target, $options['namespace'] );
                if ( !$pager->getNumRows() ) {
                        $out->addWikiMsg( 'nocontribs' );
+
                        return;
                }
 
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 ad06d5f..b6005de 100644 (file)
@@ -35,7 +35,6 @@
  * @author Rob Church <robchur@gmail.com>
  */
 class SpecialEditWatchlist extends UnlistedSpecialPage {
-
        /**
         * Editing modes
         */
@@ -50,7 +49,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
        private $badItems = array();
 
        public function __construct() {
-               parent::__construct( 'EditWatchlist' );
+               parent::__construct( 'EditWatchlist', 'editmywatchlist' );
        }
 
        /**
@@ -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,12 +81,12 @@ 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 ) {
                                $mode = $args[3];
@@ -94,7 +94,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                }
                $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 3607be9..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!
@@ -127,12 +136,13 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                }
                // 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;
        }
 
@@ -273,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'];
@@ -287,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.
                        //
@@ -299,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 {
@@ -321,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,
@@ -336,6 +368,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                        }
 
                        wfRunHooks( 'EmailUserComplete', array( $to, $from, $subject, $text ) );
+
                        return $status;
                }
        }
index ef86e8e..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}" );
@@ -188,8 +186,16 @@ class SpecialExport extends SpecialPage {
 
                $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 />';
+               $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' ),
@@ -536,10 +552,10 @@ class SpecialExport extends SpecialPage {
        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.
@@ -556,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 cc5cd5b..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(
-                       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' )
+                       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 fc6172f..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' );
@@ -186,158 +207,191 @@ class SpecialImport extends SpecialPage {
                $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 ab42549..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 ) . '".'
                        );
                }
+
                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 1bd33df..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' );
+                       }
                }
        }
 
@@ -142,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 );
        }
 
@@ -155,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;
        }
 
@@ -166,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;
@@ -203,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..070cdea 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 ) );
@@ -236,25 +255,33 @@ class ImageListPager extends TablePager {
        function getForm() {
                global $wgScript, $wgMiserMode;
                $inputForm = array();
-               $inputForm['table_pager_limit_label'] = $this->getLimitSelect();
+               $inputForm['table_pager_limit_label'] = $this->getLimitSelect( array( 'tabindex' => 1 ) );
                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',
+                                       'tabindex' => 2,
+                               )
+                       );
                }
                $inputForm['username'] = Html::input( 'user', $this->mUserName, 'text', array(
-                       'size'          => '40',
+                       'size' => '40',
                        'maxlength' => '255',
-                       'id'            => 'mw-listfiles-user',
+                       'id' => 'mw-listfiles-user',
+                       'tabindex' => 3,
                ) );
+
                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' ) .
+                       Xml::buildForm( $inputForm, 'table_pager_limit_submit', array( 'tabindex' => 4 ) ) .
                        $this->getHiddenFields( array( 'limit', 'ilsearch', 'user', 'title' ) ) .
                        Html::closeElement( 'fieldset' ) .
                        Html::closeElement( 'form' ) . "\n";
@@ -280,6 +307,7 @@ class ImageListPager extends TablePager {
                                $query['user'] = $this->mUserName;
                        }
                }
+
                return $queries;
        }
 
@@ -288,6 +316,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..0e342cc 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 ) || $nt->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,26 +683,20 @@ 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() ) {
-                       $user->addWatch( $ot );
-                       $user->addWatch( $nt );
-               } else {
-                       $user->removeWatch( $ot );
-                       $user->removeWatch( $nt );
-               }
+               WatchAction::doWatchOrUnwatch( $this->watch, $ot, $user );
+               WatchAction::doWatchOrUnwatch( $this->watch, $nt, $user );
 
                # 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 +709,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 +722,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 eefc1b7..43d4855 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 ) {
@@ -331,11 +334,8 @@ class SpecialNewpages extends IncludableSpecialPage {
 
                $query = array( 'redirect' => 'no' );
 
-               if( $this->patrollable( $result ) ) {
-                       $query['rcid'] = $result->rc_id;
-               }
-
-               // 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 +352,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 +373,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 +388,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 +400,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,11 +417,13 @@ 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;
                }
 
@@ -427,7 +438,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 +449,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 +478,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 +486,7 @@ class SpecialNewpages extends IncludableSpecialPage {
                                "</p>\n<hr />\n<div>" .
                                nl2br( htmlspecialchars( $revision->getContent()->serialize() ) ) . "</div>";
                }
+
                return '';
        }
 
@@ -511,7 +524,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 +536,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 +563,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 +573,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 +610,7 @@ class NewPagesPager extends ReverseChronologicalPager {
                        $linkBatch->add( $row->rc_namespace, $row->rc_title );
                }
                $linkBatch->execute();
+
                return '<ul>';
        }
 
index 2f49803..72a3476 100644 (file)
@@ -23,7 +23,6 @@
  * @author Brad Jorsch
  */
 
-
 /**
  * Special:PagesWithProp to search the page_props table
  * @ingroup SpecialPage
@@ -119,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( Html::element( 'span', array( 'class' => 'prop-value' ), $result->pp_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 6b335c3..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 );
 
@@ -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() ) );
@@ -296,8 +314,8 @@ class SpecialPasswordReset extends FormSpecialPage {
 
                // 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';
                }
 
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 85f7893..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,27 +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 ) {
+               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";
+
+                       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();
                }
 
@@ -106,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',
@@ -116,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(),
@@ -141,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";
        }
 
        /**
@@ -161,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() ) .
@@ -197,8 +234,8 @@ class SpecialProtectedpages extends SpecialPage {
                                        'all' => '',
                                        'label' => $this->msg( 'namespace' )->text()
                                ), array(
-                                       'name'  => 'namespace',
-                                       'id'    => 'namespace',
+                                       'name' => 'namespace',
+                                       'id' => 'namespace',
                                        'class' => 'namespaceselector',
                                )
                        )
@@ -210,7 +247,12 @@ class SpecialProtectedpages extends SpecialPage {
         * @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";
        }
 
        /**
@@ -218,7 +260,12 @@ class SpecialProtectedpages extends SpecialPage {
         * @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";
        }
 
        /**
@@ -229,9 +276,21 @@ class SpecialProtectedpages extends SpecialPage {
        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;' .
@@ -248,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";
                }
 
@@ -274,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 );
                }
 
@@ -312,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';
@@ -334,6 +394,7 @@ class ProtectedPagesPager extends AlphabeticPager {
                        $lb->add( $row->page_namespace, $row->page_title );
                }
                $lb->execute();
+
                return '';
        }
 
@@ -344,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 4700648..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,7 +68,7 @@ class SpecialProtectedtitles extends SpecialPage {
        /**
         * Callback function to output a restriction
         *
-        * @param Object $row Database row
+        * @param object $row Database row
         * @return string
         */
        function formatRow( $row ) {
@@ -77,29 +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 );
-               if( !$title ) {
+               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";
+
+                       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 ();
-
+               $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',
@@ -111,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";
        }
 
@@ -126,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() ) .
@@ -150,8 +161,8 @@ class SpecialProtectedtitles extends SpecialPage {
                                'all' => '',
                                'label' => $this->msg( 'namespace' )->text()
                        ), array(
-                               'name'  => 'namespace',
-                               'id'    => 'namespace',
+                               'name' => 'namespace',
+                               'id' => 'namespace',
                                'class' => 'namespaceselector',
                        )
                );
@@ -165,23 +176,25 @@ class SpecialProtectedtitles extends SpecialPage {
        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 );
                }
 
@@ -203,7 +216,9 @@ 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;
@@ -224,6 +239,7 @@ class ProtectedTitlesPager extends AlphabeticPager {
 
                $lb->execute();
                wfProfileOut( __METHOD__ );
+
                return '';
        }
 
@@ -244,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 2b25b78..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,10 +62,11 @@ 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;
                }
 
@@ -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 d9145b8..d263202 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,6 +60,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                $opts->add( 'categories', '' );
                $opts->add( 'categories_any', false );
                $opts->add( 'tagfilter', '' );
+
                return $opts;
        }
 
@@ -73,18 +74,19 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        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;
        }
 
@@ -98,6 +100,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                        $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,6 +130,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                        }
                        $this->rcOptions = $isFeed ? $this->feedSetup() : $this->setup( $this->rcSubpage );
                }
+
                return $this->rcOptions;
        }
 
@@ -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,23 +159,24 @@ 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 );
@@ -194,6 +200,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                        $this->msg( 'recentchanges-feed-description' )->inContentLanguage()->text(),
                        $this->getTitle()->getFullURL()
                );
+
                return array( $changesFeed, $formatter );
        }
 
@@ -206,44 +213,44 @@ class SpecialRecentChanges extends IncludableSpecialPage {
         */
        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];
                        }
                }
@@ -260,12 +267,13 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        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;
        }
 
@@ -282,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;
@@ -294,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' );
@@ -310,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() );
@@ -338,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
@@ -358,6 +366,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 
                        $conds[] = $condition;
                }
+
                return $conds;
        }
 
@@ -384,7 +393,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 
                $fields = RecentChange::selectFields();
                // JOIN on watchlist for users
-               if ( $uid ) {
+               if ( $uid && $this->getUser()->isAllowed( 'viewmywatchlist' ) ) {
                        $tables[] = 'watchlist';
                        $fields[] = 'wl_user';
                        $fields[] = 'wl_notificationtimestamp';
@@ -392,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';
@@ -410,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;
                }
 
@@ -420,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,
@@ -444,6 +454,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                                ),
                                $join_conds
                        );
+
                        // Old pages
                        $sqlOld = $dbr->selectSQLText(
                                $tables,
@@ -457,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';
@@ -478,7 +490,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 
                $limit = $opts['limit'];
 
-               if( !$this->including() ) {
+               if ( !$this->including() ) {
                        // Output options box
                        $this->doHeader( $opts );
                }
@@ -491,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 );
@@ -503,23 +516,30 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                $counter = 1;
                $list = ChangesList::newFromContext( $this->getContext() );
 
+               if ( $rows->numRows() === 0 ) {
+                       $this->getOutput()->wrapWikiMsg(
+                               "<div class='mw-changeslist-empty'>\n$1\n</div>", 'recentchanges-noresult'
+                       );
+                       return;
+               }
+
                $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',
@@ -579,10 +599,6 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 
                $defaults = $opts->getAllValues();
                $nondefaults = $opts->getChangedValues();
-               $opts->consumeValues( array(
-                       'namespace', 'invert', 'associated', 'tagfilter',
-                       'categories', 'categories_any'
-               ) );
 
                $panel = array();
                $panel[] = $this->optionsPanel( $defaults, $nondefaults );
@@ -594,24 +610,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 );
                }
 
@@ -622,7 +650,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 );
@@ -635,11 +667,15 @@ class SpecialRecentChanges extends IncludableSpecialPage {
         * @return array
         */
        function getExtraOptions( $opts ) {
+               $opts->consumeValues( array(
+                       'namespace', 'invert', 'associated', 'tagfilter', 'categories', 'categories_any'
+               ) );
+
                $extraOpts = array();
                $extraOpts['namespace'] = $this->namespaceFilterForm( $opts );
 
                global $wgAllowCategorizedRecentChanges;
-               if( $wgAllowCategorizedRecentChanges ) {
+               if ( $wgAllowCategorizedRecentChanges ) {
                        $extraOpts['category'] = $this->categoryFilterForm( $opts );
                }
 
@@ -648,7 +684,11 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                        $extraOpts['tagfilter'] = $tagFilter;
                }
 
-               wfRunHooks( 'SpecialRecentChangesPanel', array( &$extraOpts, $opts ) );
+               // Don't fire the hook for subclasses. (Or should we?)
+               if ( $this->getName() === 'Recentchanges' ) {
+                       wfRunHooks( 'SpecialRecentChangesPanel', array( &$extraOpts, $opts ) );
+               }
+
                return $extraOpts;
        }
 
@@ -674,12 +714,12 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        }
 
        /**
-        * Send the text to be displayed after the options, for use in
-        * Recentchangeslinked
+        * Send the text to be displayed after the options, for use in subclasses.
         *
         * @param FormOptions $opts
         */
-       function setBottomText( FormOptions $opts ) {}
+       function setBottomText( FormOptions $opts ) {
+       }
 
        /**
         * Creates the choose namespace selection
@@ -704,6 +744,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                        $opts['associated'],
                        array( 'title' => $this->msg( 'tooltip-namespace_association' )->text() )
                );
+
                return array( $nsLabel, "$nsSelect $invert $associated" );
        }
 
@@ -732,15 +773,15 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        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;
@@ -750,16 +791,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;
@@ -767,7 +808,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                }
 
                # Shortcut?
-               if( !count( $articles ) || !count( $cats ) ) {
+               if ( !count( $articles ) || !count( $cats ) ) {
                        return;
                }
 
@@ -778,8 +819,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];
                        }
@@ -812,6 +853,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                if ( $active ) {
                        $text = '<strong>' . $text . '</strong>';
                }
+
                return Linker::linkKnown( $this->getTitle(), $text, array(), $params );
        }
 
@@ -829,13 +871,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 ),
@@ -843,16 +885,19 @@ 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
                $cl = array();
-               foreach( $wgRCLinkLimits as $value ) {
+               foreach ( $linkLimits as $value ) {
                        $cl[] = $this->makeOptionsLink( $lang->formatNum( $value ),
                                array( 'limit' => $value ), $nondefaults, $value == $options['limit'] );
                }
@@ -860,7 +905,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 
                // day links, reset 'from' to none
                $dl = array();
-               foreach( $wgRCLinkDays as $value ) {
+               foreach ( $linkDays as $value ) {
                        $dl[] = $this->makeOptionsLink( $lang->formatNum( $value ),
                                array( 'days' => $value, 'from' => '' ), $nondefaults, $value == $options['days'] );
                }
@@ -869,12 +914,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'];
@@ -887,7 +932,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();
                }
 
@@ -898,13 +943,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 bdeb770..a844704 100644 (file)
@@ -71,8 +71,8 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
                }
                $outputPage = $this->getOutput();
                $title = Title::newFromURL( $target );
-               if( !$title || $title->getInterwiki() != '' ) {
-                       $outputPage->wrapWikiMsg( "<div class=\"errorbox\">\n$1\n</div><br style=\"clear: both\" />", 'allpagesbadtitle' );
+               if ( !$title || $title->getInterwiki() != '' ) {
+                       $outputPage->wrapWikiMsg( "<div class=\"errorbox\">\n$1\n</div>", '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 && $this->getUser()->isAllowed( 'viewmywatchlist' ) ) {
                        $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;
                }
 
@@ -225,21 +226,21 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
        }
 
        /**
-        * @param $opts FormOptions
+        * Get options to be displayed in a form
+        *
+        * @param FormOptions $opts
         * @return array
         */
        function getExtraOptions( $opts ) {
-               $opts->consumeValues( array( 'showlinkedto', 'target', 'tagfilter' ) );
-               $extraOpts = array();
-               $extraOpts['namespace'] = $this->namespaceFilterForm( $opts );
+               $extraOpts = parent::getExtraOptions( $opts );
+
+               $opts->consumeValues( array( 'showlinkedto', 'target' ) );
+
                $extraOpts['target'] = array( $this->msg( 'recentchangeslinked-page' )->escaped(),
                        Xml::input( 'target', 40, str_replace( '_', ' ', $opts['target'] ) ) .
                        Xml::check( 'showlinkedto', $opts['showlinkedto'], array( 'id' => 'showlinkedto' ) ) . ' ' .
                        Xml::label( $this->msg( 'recentchangeslinked-to' )->text(), 'showlinkedto' ) );
-               $tagFilter = ChangeTags::buildTagFilterSelector( $opts['tagfilter'] );
-               if ( $tagFilter ) {
-                       $extraOpts['tagfilter'] = $tagFilter;
-               }
+
                return $extraOpts;
        }
 
@@ -260,14 +261,8 @@ 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 ) {
-                       $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 3a7399a..1e9adf5 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,10 +389,12 @@ 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' ) ),
                                        'id' => 'mw-revdel-form-revisions' ) ) .
@@ -406,7 +409,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                                Xml::listDropDown( 'wpRevDeleteReasonList',
                                                        $this->msg( 'revdelete-reason-dropdown' )->inContentLanguage()->text(),
                                                        $this->msg( 'revdelete-reasonotherlist' )->inContentLanguage()->text(),
-                                                       '', 'wpReasonDropDown', 1
+                                                       $this->getRequest()->getText( 'wpRevDeleteReasonList', 'other' ), 'wpReasonDropDown', 1
                                                ) .
                                        '</td>' .
                                "</tr><tr>\n" .
@@ -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 a4ab7a8..8a2163b 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,24 +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 ) {
+               if ( $textMatches instanceof Status ) {
                        $textStatus = $textMatches;
                        $textMatches = null;
                }
 
                // did you mean... suggestions
-               if( $textMatches && !$textStatus && $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;
                        }
 
@@ -281,7 +281,7 @@ class SpecialSearch extends SpecialPage {
 
                        $suggestionSnippet = $textMatches->getSuggestionSnippet();
 
-                       if( $suggestionSnippet == '' ) {
+                       if ( $suggestionSnippet == '' ) {
                                $suggestionSnippet = null;
                        }
 
@@ -323,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>' );
@@ -353,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 ) );
@@ -366,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,
@@ -380,34 +382,34 @@ 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 && !$textStatus ) {
+               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 ) {
+               if ( $num === 0 ) {
                        if ( $textStatus ) {
                                $out->addHTML( '<div class="error">' .
                                        htmlspecialchars( $textStatus->getWikiText( 'search-error' ) ) . '</div>' );
@@ -419,7 +421,7 @@ class SpecialSearch extends SpecialPage {
                }
                $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 ) );
@@ -433,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';
@@ -451,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...
@@ -464,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()
@@ -485,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;
                        }
                }
@@ -502,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;
                        }
                }
@@ -527,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();
                }
@@ -555,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";
                }
@@ -564,8 +566,9 @@ class SpecialSearch extends SpecialPage {
 
                $titleSnippet = $result->getTitleSnippet( $terms );
 
-               if( $titleSnippet == '' )
+               if ( $titleSnippet == '' ) {
                        $titleSnippet = null;
+               }
 
                $link_t = clone $t;
 
@@ -580,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";
                }
@@ -588,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";
                }
@@ -600,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(
@@ -612,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(
@@ -628,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 {
@@ -644,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() )
@@ -655,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(),
@@ -675,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.
@@ -705,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,
@@ -733,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();
@@ -774,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";
                }
@@ -786,8 +791,9 @@ class SpecialSearch extends SpecialPage {
 
                $titleSnippet = $result->getTitleSnippet( $terms );
 
-               if( $titleSnippet == '' )
+               if ( $titleSnippet == '' ) {
                        $titleSnippet = null;
+               }
 
                $link = Linker::linkKnown(
                        $t,
@@ -798,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(
@@ -810,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 {
@@ -870,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] .=
@@ -897,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' );
@@ -911,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 );
                }
@@ -920,7 +927,7 @@ 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
@@ -980,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'] );
                }
 
@@ -998,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 );
                }
@@ -1092,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;
@@ -1125,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;
@@ -1142,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;
@@ -1174,6 +1183,6 @@ class SpecialSearch extends SpecialPage {
        }
 
        protected function getGroupName() {
-               return 'redirects';
+               return 'pages';
        }
 }
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 199460e..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 );
                }
 
@@ -115,11 +115,11 @@ class SpecialStatistics extends SpecialPage {
         * @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" );
                        }
                }
@@ -171,7 +171,11 @@ class SpecialStatistics extends SpecialPage {
                                $this->formatRow( $this->msg( 'statistics-users' )->parse(),
                                                $this->getLanguage()->formatNum( $this->users ),
                                                array( 'class' => 'mw-statistics-users' ) ) .
-                               $this->formatRow( $this->msg( 'statistics-users-active' )->parse(),
+                               $this->formatRow( $this->msg( 'statistics-users-active' )->parse() . ' ' .
+                                                       Linker::linkKnown(
+                                                               SpecialPage::getTitleFor( 'Activeusers' ),
+                                                               $this->msg( 'listgrouprights-members' )->escaped()
+                                                       ),
                                                $this->getLanguage()->formatNum( $this->activeUsers ),
                                                array( 'class' => 'mw-statistics-users-active' ),
                                                'statistics-users-active-desc',
@@ -181,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;
@@ -213,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,
@@ -229,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() {
@@ -256,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 ) );
 
@@ -283,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 ) ) {
 
@@ -294,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 026b936..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 );
                }
 
index 7b3ae6b..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(
@@ -159,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 ) );
                }
 
@@ -174,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' );
                }
 
@@ -191,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 0e8cf58..caf6a8b 100644 (file)
@@ -271,7 +271,7 @@ class PageArchive {
        /**
         * Get the text from an archive row containing ar_text, ar_flags and ar_text_id
         *
-        * @param Object $row Database row
+        * @param object $row Database row
         * @return string
         */
        function getTextFromRow( $row ) {
@@ -760,7 +760,7 @@ 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() ) {
@@ -797,7 +797,8 @@ class SpecialUndelete extends SpecialPage {
                                        'prefix',
                                        'prefix',
                                        20,
-                                       $this->mSearchPrefix
+                                       $this->mSearchPrefix,
+                                       array( 'autofocus' => true )
                                ) . ' ' .
                                Xml::submitButton( $this->msg( 'undelete-search-submit' )->text() ) .
                                Xml::closeElement( 'fieldset' ) .
@@ -1115,10 +1116,11 @@ class SpecialUndelete extends SpecialPage {
                $out->addHTML(
                        Xml::openElement( 'form', array(
                                        'method' => 'POST',
-                                       'action' => $this->getTitle()->getLocalURL(
-                                               'target=' . urlencode( $this->mTarget ) .
-                                                       '&file=' . urlencode( $key ) .
-                                                       '&token=' . urlencode( $user->getEditToken( $key ) ) )
+                                       'action' => $this->getTitle()->getLocalURL( array(
+                                               'target' => $this->mTarget,
+                                               'file' => $key,
+                                               'token' => $user->getEditToken( $key ),
+                                       ) ),
                                )
                        ) .
                                Xml::submitButton( $this->msg( 'undelete-show-file-submit' )->text() ) .
@@ -1251,7 +1253,7 @@ class SpecialUndelete extends SpecialPage {
                                        Xml::label( $this->msg( 'undeletecomment' )->text(), 'wpComment' ) .
                                        "</td>
                                        <td class='mw-input'>" .
-                                       Xml::input( 'wpComment', 50, $this->mComment, array( 'id' => 'wpComment' ) ) .
+                                       Xml::input( 'wpComment', 50, $this->mComment, array( 'id' => 'wpComment', 'autofocus' => true ) ) .
                                        "</td>
                                </tr>
                                <tr>
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 b665c4b..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>' .
@@ -889,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 a8e140d..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.
index 41c63b6..71efefa 100644 (file)
@@ -51,9 +51,6 @@ class LoginForm extends SpecialPage {
        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 WebRequest
@@ -115,18 +112,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 );
@@ -135,7 +132,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 = '';
@@ -144,17 +141,10 @@ class LoginForm extends SpecialPage {
        }
 
        function getDescription() {
-               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();
-                       }
+               if ( $this->mType === 'signup' ) {
+                       return $this->msg( 'createaccount' )->text();
                } else {
-                       return $this->msg( 'userlogin' )->text();
+                       return $this->msg( 'login' )->text();
                }
        }
 
@@ -173,8 +163,6 @@ class LoginForm extends SpecialPage {
                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.
@@ -206,8 +194,8 @@ class LoginForm extends SpecialPage {
                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 ) {
@@ -231,7 +219,7 @@ class LoginForm extends SpecialPage {
                }
 
                $status = $this->addNewaccountInternal();
-               if( !$status->isGood() ) {
+               if ( !$status->isGood() ) {
                        $error = $this->getOutput()->parse( $status->getWikiText() );
                        $this->mainLoginForm( $error );
                        return;
@@ -250,7 +238,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() );
@@ -267,7 +255,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;
@@ -279,7 +267,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 {
 
@@ -296,9 +284,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' ) );
@@ -311,7 +299,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
@@ -320,7 +308,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' );
@@ -347,7 +335,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' );
                }
 
@@ -356,8 +344,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 ) ||
@@ -455,7 +443,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 ) );
@@ -478,7 +466,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' );
                }
 
@@ -576,7 +564,7 @@ class LoginForm extends SpecialPage {
                }
 
                $u = User::newFromName( $this->mUsername );
-               if( !( $u instanceof User ) || !User::isUsableName( $u->getName() ) ) {
+               if ( !( $u instanceof User ) || !User::isUsableName( $u->getName() ) ) {
                        return self::ILLEGAL;
                }
 
@@ -594,13 +582,13 @@ class LoginForm extends SpecialPage {
 
                // 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-
@@ -617,7 +605,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();
                                }
@@ -726,7 +714,7 @@ class LoginForm extends SpecialPage {
                }
 
                $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;
@@ -752,14 +740,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();
@@ -771,7 +759,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.
                                         */
@@ -801,7 +789,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 {
@@ -819,7 +807,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() );
@@ -860,7 +848,7 @@ class LoginForm extends SpecialPage {
                        return Status::newFatal( 'noemail', $u->getName() );
                }
                $ip = $this->getRequest()->getIP();
-               if( !$ip ) {
+               if ( !$ip ) {
                        return Status::newFatal( 'badipaddress' );
                }
 
@@ -894,7 +882,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 {
@@ -973,6 +961,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.
         *
@@ -1000,7 +1011,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 {
@@ -1016,22 +1027,6 @@ 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 $wgUseVFormUserLogin;
-
-               if ( $this->mType == 'signup' ) {
-                       return false;
-               } else {
-                       return $this->mRequest->getBool( 'useNew', $wgUseVFormUserLogin );
-               }
-       }
-
        /**
         * @private
         */
@@ -1071,23 +1066,33 @@ class LoginForm extends SpecialPage {
 
                if ( $this->mType == 'signup' ) {
                        $template = new UsercreateTemplate();
+
+                       $out->addModuleStyles( array(
+                               'mediawiki.ui',
+                               'mediawiki.special.createaccount'
+                       ) );
+                       // 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( array(
+                               'mediawiki.special.createaccount.js'
+                       ) );
+                       // Must match number of benefits defined in messages
+                       $template->set( 'benefitCount', 3 );
+
                        $q = 'action=submitlogin&type=signup';
                        $linkq = 'type=login';
-                       $linkmsg = 'gotaccount';
-                       $out->addModules( 'mediawiki.special.userlogin.signup' );
                } else {
-                       if ( $this->mShowVForm ) {
-                               $template = new UserloginTemplateVForm();
-                               $out->addModuleStyles( array(
-                                       'mediawiki.ui',
-                                       'mediawiki.special.userlogin.vform'
-                               ) );
-                       } else {
-                               $template = new UserloginTemplate();
-                       }
+                       $template = new UserloginTemplate();
+
+                       $out->addModuleStyles( array(
+                               'mediawiki.ui',
+                               'mediawiki.special.userlogin'
+                       ) );
+
                        $q = 'action=submitlogin&type=login';
                        $linkq = 'type=signup';
-                       $linkmsg = 'nologin';
                }
 
                if ( $this->mReturnTo !== '' ) {
@@ -1101,22 +1106,13 @@ class LoginForm extends SpecialPage {
                }
 
                # Don't show a "create account" link if the user can't.
-               if( $this->showCreateOrLoginLink( $user ) ) {
+               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;
                        }
-                       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() );
-
-                       } 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 ) );
-                       }
+                       // Supply URL, login template creates the button.
+                       $template->set( 'createOrLoginHref', $titleObj->getLocalURL( $linkq ) );
                } else {
                        $template->set( 'link', '' );
                }
@@ -1131,6 +1127,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 );
@@ -1169,9 +1166,9 @@ 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 );
                        }
                }
@@ -1213,9 +1210,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;
@@ -1294,7 +1291,7 @@ class LoginForm extends SpecialPage {
         */
        private function renewSessionId() {
                global $wgSecureLogin, $wgCookieSecure;
-               if( $wgSecureLogin && !$this->mStickHTTPS ) {
+               if ( $wgSecureLogin && !$this->mStickHTTPS ) {
                        $wgCookieSecure = false;
                }
 
@@ -1353,10 +1350,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 ) {
@@ -1379,15 +1376,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 336363d..e893455 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,27 @@ 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 ) ) {
+                       if ( $this->isself && $request->getCheck( 'success' ) ) {
+                               // bug 48609: if the user just removed its own rights, this would
+                               // leads it in a "permissions error" page. In that case, show a
+                               // message that it can't anymore use this page instead of an error
+                               $this->setHeaders();
+                               $out = $this->getOutput();
+                               $out->wrapWikiMsg( "<div class=\"successbox\">\n$1\n</div>", 'userrights-removed-self' );
+                               $out->returnToMain();
+                               return;
+                       }
+
                        // @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,31 +139,42 @@ 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 );
                }
        }
 
        function getSuccessURL() {
-               return $this->getTitle( $this->mTarget )->getFullURL();
+               return $this->getTitle( $this->mTarget )->getFullURL( array( 'success' => 1 ) );
        }
 
        /**
@@ -155,17 +183,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 +234,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 +255,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 +283,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 {
@@ -290,57 +311,57 @@ class UserrightsPage extends SpecialPage {
                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 );
                }
 
@@ -348,7 +369,7 @@ class UserrightsPage extends SpecialPage {
        }
 
        function makeGroupNameList( $ids ) {
-               if( empty( $ids ) ) {
+               if ( empty( $ids ) ) {
                        return $this->msg( 'rightsnone' )->inContentLanguage()->text();
                } else {
                        return implode( ', ', $ids );
@@ -365,7 +386,7 @@ class UserrightsPage extends SpecialPage {
        function makeGroupNameListForLog( $ids ) {
                wfDeprecated( __METHOD__, '1.21' );
 
-               if( empty( $ids ) ) {
+               if ( empty( $ids ) ) {
                        return '';
                } else {
                        return $this->makeGroupNameList( $ids );
@@ -381,7 +402,7 @@ class UserrightsPage extends SpecialPage {
                        Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'name' => 'uluser', 'id' => 'mw-userrights-form1' ) ) .
                        Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
                        Xml::fieldset( $this->msg( 'userrights-lookup-user' )->text() ) .
-                       Xml::inputLabel( $this->msg( 'userrights-user-editname' )->text(), 'user', 'username', 30, str_replace( '_', ' ', $this->mTarget ) ) . ' ' .
+                       Xml::inputLabel( $this->msg( 'userrights-user-editname' )->text(), 'user', 'username', 30, str_replace( '_', ' ', $this->mTarget ), array( 'autofocus' => true ) ) . ' ' .
                        Xml::submitButton( $this->msg( 'editusergroup' )->text() ) .
                        Html::closeElement( 'fieldset' ) .
                        Html::closeElement( 'form' ) . "\n"
@@ -420,7 +441,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 );
                }
@@ -428,7 +449,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 );
                        }
@@ -448,12 +469,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(
@@ -467,6 +488,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() .
@@ -540,7 +562,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 = !(
@@ -557,7 +579,7 @@ class UserrightsPage extends SpecialPage {
                                'irreversible' => $irreversible
                        );
 
-                       if( $disabled ) {
+                       if ( $disabled ) {
                                $columns['unchangeable'][$group] = $checkbox;
                        } else {
                                $columns['changeable'][$group] = $checkbox;
@@ -567,17 +589,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 8dd38d4..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() .
@@ -113,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() . ']]';
                }
@@ -159,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>
@@ -218,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
@@ -240,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;
                }
 
@@ -265,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]}";
@@ -274,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";
        }
 
@@ -395,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";
                }
@@ -444,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'] )
@@ -461,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;
@@ -474,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.
@@ -501,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
@@ -526,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";
@@ -562,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";
                }
 
@@ -603,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 ) == ' ...]' ) {
@@ -648,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];
@@ -686,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;
                }
 
@@ -696,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;
                        }
@@ -708,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'] ) );
                                                }
                                        }
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 303df34..d61e1ee 100644 (file)
@@ -26,8 +26,8 @@ class SpecialWatchlist extends SpecialPage {
        /**
         * Constructor
         */
-       public function __construct( $page = 'Watchlist' ) {
-               parent::__construct( $page );
+       public function __construct( $page = 'Watchlist', $restriction = 'viewmywatchlist' ) {
+               parent::__construct( $page, $restriction );
        }
 
        /**
@@ -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(
@@ -54,6 +54,9 @@ class SpecialWatchlist extends SpecialPage {
                        return;
                }
 
+               // Check permissions
+               $this->checkPermissions();
+
                // Add feed links
                $wlToken = $user->getOption( 'watchlisttoken' );
                if ( !$wlToken ) {
@@ -74,9 +77,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;
@@ -99,23 +102,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 +133,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 +162,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,7 +180,7 @@ 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();
@@ -188,7 +191,7 @@ class SpecialWatchlist extends SpecialPage {
                # 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 +204,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 +227,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 +239,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 +288,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 +314,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 +324,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 +340,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] );
                }
 
@@ -349,8 +361,8 @@ class SpecialWatchlist extends SpecialPage {
                                'all' => '',
                                'label' => $this->msg( 'namespace' )->text()
                        ), array(
-                               'name'  => 'namespace',
-                               'id'    => 'namespace',
+                               'name' => 'namespace',
+                               'id' => 'namespace',
                                'class' => 'namespaceselector',
                        )
                ) . '&#160;';
@@ -377,8 +389,10 @@ class SpecialWatchlist extends SpecialPage {
                $output->addHTML( $form );
 
                # If there's nothing to show, stop here
-               if( $numRows == 0 ) {
-                       $output->addWikiMsg( 'watchnochange' );
+               if ( $numRows == 0 ) {
+                       $output->wrapWikiMsg(
+                               "<div class='mw-changeslist-empty'>\n$1\n</div>", 'recentchanges-noresult'
+                       );
                        return;
                }
 
@@ -477,11 +491,11 @@ class SpecialWatchlist extends SpecialPage {
                $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(
index 57bb7d0..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;
                }
@@ -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,7 +166,7 @@ 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,
@@ -174,7 +174,7 @@ class SpecialWhatLinksHere extends SpecialPage {
                        );
                }
 
-               if( !$hidetrans ) {
+               if ( !$hidetrans ) {
                        $options['ORDER BY'] = 'tl_from';
                        $tlRes = $dbr->select( array( 'templatelinks', 'page', 'redirect' ), $fields,
                                $tlConds, __METHOD__, $options,
@@ -182,7 +182,7 @@ class SpecialWhatLinksHere extends SpecialPage {
                        );
                }
 
-               if( !$hideimages ) {
+               if ( !$hideimages ) {
                        $options['ORDER BY'] = 'il_from';
                        $ilRes = $dbr->select( array( 'imagelinks', 'page', 'redirect' ), $fields,
                                $ilConds, __METHOD__, $options,
@@ -190,13 +190,14 @@ class SpecialWhatLinksHere extends SpecialPage {
                        );
                }
 
-               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() );
@@ -207,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;
@@ -272,7 +273,7 @@ class SpecialWhatLinksHere extends SpecialPage {
 
                $out->addHTML( $this->listEnd() );
 
-               if( $level == 0 ) {
+               if ( $level == 0 ) {
                        $out->addHTML( $prevnext );
                }
        }
@@ -295,7 +296,7 @@ class SpecialWhatLinksHere extends SpecialPage {
                        }
                }
 
-               if( $row->rd_from ) {
+               if ( $row->rd_from ) {
                        $query = array( 'redirect' => 'no' );
                } else {
                        $query = array();
@@ -311,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();
@@ -337,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,
@@ -422,8 +427,8 @@ class SpecialWhatLinksHere extends SpecialPage {
                                'all' => '',
                                'label' => $this->msg( 'namespace' )->text()
                        ), array(
-                               'name'  => 'namespace',
-                               'id'    => 'namespace',
+                               'name' => 'namespace',
+                               'id' => 'namespace',
                                'class' => 'namespaceselector',
                        )
                );
@@ -453,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 329b1ad..9d23499 100644 (file)
@@ -44,7 +44,7 @@ class WithoutInterwikiPage extends PageQueryPage {
                global $wgScript;
 
                # Do not show useless input form if special page is cached
-               if( $this->isCached() ) {
+               if ( $this->isCached() ) {
                        return '';
                }
 
@@ -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 b0ec8b5..0006df4 100644 (file)
@@ -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 dff9ada..c066da9 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Html form for account creation.
+ * Html form for account creation (since 1.22 with 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
  * @ingroup Templates
  */
 
-/**
- * @defgroup Templates Templates
- */
-
 if ( !defined( 'MEDIAWIKI' ) ) {
        die( -1 );
 }
 
-/**
- * @ingroup Templates
- */
-class UsercreateTemplate extends QuickTemplate {
+class UsercreateTemplate 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,
@@ -44,253 +42,233 @@ class UsercreateTemplate extends QuickTemplate {
        }
 
        function execute() {
-               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>
-       <div class="visualClear"></div>
-<?php
-               }
+               global $wgCookieExpiration;
+               $expirationDays = ceil( $wgCookieExpiration / ( 3600 * 24 ) );
 ?>
-
-<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
+<div class="mw-ui-container">
+       <?php
        if ( $this->haveData( 'languages' ) ) {
-               ?><div id="languagelinks"><p><?php $this->html( 'languages' ); ?></p></div><?php
+       ?>
+               <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'] ) {
 ?>
-       <table>
-               <tr>
-                       <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(
-                               'class' => 'loginText',
+               <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'
                        ) ); ?>
-                       </td>
-               </tr>
-               <tr>
-                       <td></td>
-                       <td class="mw-input">
-<?php
-                               if ( $this->data['createemail'] ) {
-                                       echo Xml::checkLabel(
-                                               wfMessage( 'createaccountmail' )->text(),
-                                               'wpCreateaccountMail',
-                                               'wpCreateaccountMail',
-                                               $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-input">
-<?php
-                       echo Html::input( 'wpPassword', null, 'password', array(
-                               'class' => 'loginPassword',
+               </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'
+                               'size' => '20',
+                               'required',
+                               'placeholder' => $this->getMsg( 'createacct-yourpassword-ph' )->text()
                        ) + User::passwordChangeInputAttribs() ); ?>
-                       </td>
-               </tr>
-<?php
-               if ( $this->data['usedomain'] ) {
+               </div>
+       <?php if ( $this->data['usedomain'] ) {
                $doms = "";
                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">
-                               <select name="wpDomain" value="<?php $this->text( 'domain' ) ?>"
+       ?>
+               <div id="mw-user-domain-section">
+                       <label for="wpDomain"><?php $this->msg( 'yourdomainname' ); ?></label>
+                       <div class="mw-input">
+                               <select name="wpDomain" value="<?php $this->text( 'domain' ); ?>"
                                        tabindex="4">
                                        <?php echo $doms ?>
                                </select>
-                       </td>
-               </tr>
-<?php
-               }
-?>
-               <tr class="mw-row-password">
-                       <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(
-                       'class' => 'loginPassword',
-                       'id' => 'wpRetype',
-                       'tabindex' => '5',
-                       'size' => '20'
-               ) + User::passwordChangeInputAttribs() ); ?>
-                       </td>
-               </tr>
-               <tr>
-<?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(
-                       'class' => 'loginText',
-                       'id' => 'wpEmail',
-                       'tabindex' => '6',
-                       'size' => '20'
-               ) ); ?>
-                                       <div class="prefsectiontip">
-                                               <?php  // duplicated in Preferences.php profilePreferences()
-                                                       if( $this->data['emailrequired'] ) {
-                                                               $this->msgWiki('prefs-help-email-required');
-                                                       } else {
-                                                               $this->msgWiki('prefs-help-email');
-                                                       }
-                                                       if( $this->data['emailothers'] ) {
-                                                               $this->msgWiki('prefs-help-email-others');
-                                                       } ?>
-                                       </div>
-                               </td>
-<?php
-               }
-
-               if ( $this->data['userealname'] ) {
-?>
-                               </tr>
-                               <tr>
-                                       <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' />
-                                               <div class="prefsectiontip">
-                                                       <?php $this->msgWiki('prefs-help-realname'); ?>
-                                               </div>
-                                       </td>
-<?php
-               }
-
-               if ( $this->data['usereason'] ) {
-?>
-                               </tr>
-                               <tr>
-                                       <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' />
-                                       </td>
-<?php
-               }
-?>
-               </tr>
-<?php
-               if ( $this->data['canremember'] ) {
-?>
-               <tr>
-                       <td></td>
-                       <td class="mw-input">
+                       </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
-                               global $wgCookieExpiration;
-                               $expirationDays = ceil( $wgCookieExpiration / ( 3600 * 24 ) );
-                               echo Xml::checkLabel(
-                                       wfMessage( 'remembermypassword' )->numParams( $expirationDays )->text(),
-                                       'wpRemember',
-                                       'wpRemember',
-                                       $this->data['remember'],
-                                       array( 'tabindex' => '9' )
-                               )
+                                       $this->msg( $this->data['emailrequired'] ?
+                                               'createacct-emailrequired' :
+                                               'createacct-emailoptional'
+                                       );
                                ?>
-                       </td>
-               </tr>
-<?php
-               }
-
-               $tabIndex = 10;
+                       </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 } ?>
+               </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 ) { ?>
-               <tr>
-                       <?php
-                               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
-                               } else {
-                                       ?><td><?php
-                               }
-                       ?></td>
-                       <td class="mw-input">
-                               <input type="<?php echo htmlspecialchars( $inputItem['type'] ) ?>" name="<?php
-                               echo htmlspecialchars( $inputItem['name'] ); ?>"
-                                       tabindex="<?php echo $tabIndex++; ?>"
-                                       value="<?php
-                               if ( $inputItem['type'] != 'checkbox' ) {
-                                       echo htmlspecialchars( $inputItem['value'] );
+                       <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 {
-                                       echo '1';
-                               }
-                                       ?>" id="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
+                                       // Not a checkbox.
+                                       // TODO (bug 31909) support other input types, e.g. select boxes.
+                                       if ( !empty( $inputItem['msg'] ) ) {
+                                               // Output the message label
+                                       ?>
+                                               <label for="<?php echo htmlspecialchars( $inputItem['name'] ); ?>">
+                                                       <?php $this->msgWiki( $inputItem['msg'] ); ?>
+                                               </label>
                                        <?php
-                               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
                                        }
+                                       ?>
+                                       <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 class="prefsectiontip">
+                                               <?php $this->msgWiki( $inputItem['helptext'] ); ?>
+                                       </div>
+                               <?php
                                }
                                ?>
-                       </td>
-               </tr>
-<?php
+                               </div>
+                       <?php
                        }
                }
-?>
-               <tr>
-                       <td></td>
-                       <td class="mw-submit">
-                               <input type='submit' name="wpCreateaccount" id="wpCreateaccount"
-                                       tabindex="<?php echo $tabIndex++; ?>"
-                                       value="<?php $this->msg('createaccount') ?>" />
-                       </td>
-               </tr>
-       </table>
-<?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
-       }
-?>
+               // 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>
+<?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 id="signupend"><?php $this->html( 'signupend' ); ?></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 0b4b8e5..b9825a6 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Html form for user login.
+ * Html form for user login (since 1.22 with 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
  * @ingroup Templates
  */
 
-/**
- * @defgroup Templates Templates
- */
+class UserloginTemplate extends BaseTemplate {
 
-/**
- * HTML template for Special:Userlogin form
- * @ingroup Templates
- */
-class UserloginTemplate extends QuickTemplate {
        function execute() {
-               if ( $this->data['message'] ) {
+               global $wgCookieExpiration;
+               $expirationDays = ceil( $wgCookieExpiration / ( 3600 * 24 ) );
 ?>
-       <div class="<?php $this->text('messagetype') ?>box">
+<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
-               }
                ?>
-               <?php $this->html('message') ?>
-       </div>
-       <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
+                       <strong><?php $this->msg( 'loginerror' ) ?></strong><br />
+               <?php
                }
-?>
-       <table>
-               <tr>
-                       <td class="mw-label"><label for='wpName1'><?php $this->msg('yourname') ?></label></td>
-                       <td class="mw-input">
+               $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'
-                               # Can't do + array( 'autofocus' ) because + for arrays in PHP
-                               # only works right for associative arrays!  Thanks, PHP.
-                       ) + ( $this->data['name'] ? array() : array( 'autofocus' => '' ) ) ); ?>
+                               // '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' );
 
-                       </td>
-               </tr>
-               <tr>
-                       <td class="mw-label"><label for='wpPassword1'><?php $this->msg('yourpassword') ?></label></td>
-                       <td class="mw-input">
-                               <?php
+                       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' )
+                                       );
+                       }
+                       ?>
+                       </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'
-                       ) + ( $this->data['name'] ? array( 'autofocus' ) : array() ) ); ?>
-
-                       </td>
-               </tr>
-<?php
-               if ( isset( $this->data['usedomain'] ) && $this->data['usedomain'] ) {
+                               '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>";
                }
-?>
-               <tr id="mw-user-domain-section">
-                       <td class="mw-label"><?php $this->msg( 'yourdomainname' ) ?></td>
-                       <td class="mw-input">
-                               <select name="wpDomain" value="<?php $this->text( 'domain' ) ?>"
+       ?>
+               <div id="mw-user-domain-section">
+                       <label for='wpDomain'><?php $this->msg( 'yourdomainname' ); ?></label>
+                               <select name="wpDomain" value="<?php $this->text( 'domain' ); ?>"
                                        tabindex="3">
                                        <?php echo $doms ?>
                                </select>
-                       </td>
-               </tr>
-<?php
-               }
+               </div>
+       <?php }
 
-               if ( $this->haveData( 'extrafields' ) ) {
-                       echo $this->data['extrafields'];
-               }
+       if ( $this->haveData( 'extrafields' ) ) {
+               echo $this->data['extrafields'];
+       } ?>
 
-               if ( $this->data['canremember'] ) {
-?>
-               <tr>
-                       <td></td>
-                       <td class="mw-input">
-                               <?php
-                               global $wgCookieExpiration;
-                               $expirationDays = ceil( $wgCookieExpiration / ( 3600 * 24 ) );
-                               echo Xml::checkLabel(
-                                       wfMessage( 'remembermypassword' )->numParams( $expirationDays )->text(),
-                                       'wpRemember',
-                                       'wpRemember',
-                                       $this->data['remember'],
-                                       array( 'tabindex' => '8' )
-                               )
-                               ?>
-                       </td>
-               </tr>
-<?php
-               }
+               <div>
 
-               if ( $this->data['cansecurelogin'] ) {
-?>
-               <tr>
-                       <td></td>
-                       <td class="mw-input">
-                       <?php
-                       echo Xml::checkLabel(
-                               wfMessage( 'securelogin-stick-https' )->text(),
-                               'wpStickHTTPS',
-                               'wpStickHTTPS',
-                               $this->data['stickHTTPS'],
-                               array( 'tabindex' => '9' )
-                       );
-?>
-                       </td>
-               </tr>
-<?php
-               }
-?>
-               <tr>
-                       <td></td>
-                       <td class="mw-submit">
+       <?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', wfMessage( 'login' )->text(), 'submit', array(
+                       echo Html::input( 'wpLoginAttempt', $this->getMsg( 'login' )->text(), 'submit', array(
                                'id' => 'wpLoginAttempt',
-                               'tabindex' => '9'
+                               'tabindex' => '6',
+                               'class' => 'mw-ui-button mw-ui-big mw-ui-block mw-ui-primary'
                        ) );
-               if ( $this->data['useemail'] && $this->data['canreset'] ) {
-                       if ( $this->data['resetlink'] === true ) {
-                               echo '&#160;';
-                               echo Linker::link(
-                                       SpecialPage::getTitleFor( 'PasswordReset' ),
-                                       wfMessage( 'userlogin-resetlink' )
-                               );
-                       } elseif ( $this->data['resetlink'] === null ) {
-                               echo '&#160;';
-                               echo Html::input(
-                                       'wpMailmypassword',
-                                       wfMessage( 'mailmypassword' )->text(),
-                                       'submit', array(
-                                               'id' => 'wpMailmypassword',
-                                               'tabindex' => '10'
-                                       )
-                               );
-                       }
-               }
-?>
-                       </td>
-               </tr>
-       </table>
-<?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
-       }
-?>
+                       ?>
+               </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 } ?>
+<?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 id="loginend"><?php $this->html( 'loginend' ); ?></div>
+</div>
 <?php
-
        }
 }
diff --git a/includes/templates/UserloginVForm.php b/includes/templates/UserloginVForm.php
deleted file mode 100644 (file)
index 132a7c1..0000000
+++ /dev/null
@@ -1,206 +0,0 @@
-<?php
-/**
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Templates
- */
-
-
-/**
- * Html form for user login with new VForm appearance.
- */
-class UserloginTemplateVForm extends BaseTemplate {
-
-       /**
-        * Get the Skin object related to this object, so that BaseTemplate msg 31
-        * methods work.
-        *
-        * @return Skin object
-        */
-       public function getSkin() {
-               global $wgOut;
-               return $wgOut->getSkin();
-       }
-
-       function execute() {
-               global $wgCookieExpiration;
-               $expirationDays = ceil( $wgCookieExpiration / ( 3600 * 24 ) );
-?>
-<div class="mw-ui-container">
-       <?php
-       // Some extensions including CAPTCHAs add content to header on UserLoginForm hook.
-       $this->html('header');
-       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') ?>">
-       <?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-resetlink' )->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 bf809a1..36e4252 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;
@@ -83,7 +85,7 @@ abstract class UploadBase {
                        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];
                }
 
@@ -136,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;
                }
 
@@ -149,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;
                }
 
@@ -254,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
@@ -275,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 );
                }
@@ -284,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,
@@ -298,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,
@@ -310,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__ );
@@ -335,9 +337,9 @@ abstract class UploadBase {
         **/
        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 ) {
@@ -354,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
         */
@@ -370,12 +374,6 @@ abstract class UploadBase {
                                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 );
@@ -396,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 );
@@ -421,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' );
                                }
@@ -460,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;
        }
@@ -532,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 );
@@ -542,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;
@@ -579,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;
                }
 
@@ -602,7 +634,7 @@ abstract class UploadBase {
                }
 
                $exists = self::getExistsWarning( $localFile );
-               if( $exists !== false ) {
+               if ( $exists !== false ) {
                        $warnings['exists'] = $exists;
                }
 
@@ -612,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;
                }
 
@@ -654,9 +686,9 @@ abstract class UploadBase {
                        $user
                );
 
-               if( $status->isGood() ) {
+               if ( $status->isGood() ) {
                        if ( $watch ) {
-                               $user->addWatch( $this->getLocalFile()->getTitle() );
+                               WatchAction::doWatch( $this->getLocalFile()->getTitle(), $user, WatchedItem::IGNORE_USER_RIGHTS );
                        }
                        wfRunHooks( 'UploadComplete', array( &$this ) );
                }
@@ -675,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.
                 */
@@ -701,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;
                }
@@ -713,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 = '';
@@ -761,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;
                }
@@ -781,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 );
                }
@@ -894,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!
@@ -940,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' );
@@ -950,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 );
                }
 
@@ -979,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
@@ -1005,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;
@@ -1025,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;
@@ -1050,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
@@ -1071,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" );
@@ -1151,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;
                        }
@@ -1281,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;
@@ -1308,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 ) ) {
@@ -1336,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 );
                }
 
@@ -1348,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 {
@@ -1367,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,
@@ -1391,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,
@@ -1407,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',
@@ -1443,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 == '' ) {
@@ -1454,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 7e07516..1746206 100644 (file)
@@ -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,6 +70,8 @@ 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)
@@ -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" );
+
+               $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)
-               $this->mTempPath = $tmpPath; // file system path
                $tStart = microtime( true );
                $this->mLocalFile = parent::stashFile( $this->user );
                $tAmount = microtime( true ) - $tStart;
@@ -189,8 +200,17 @@ class UploadFromChunks extends UploadFromFile {
                        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 150e516..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'] );
@@ -172,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..ebeb9c1 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 {
@@ -666,11 +675,12 @@ class UploadStashFile extends UnregisteredLocalFile {
 
 }
 
-class UploadStashNotAvailableException extends MWException {};
-class UploadStashFileNotFoundException extends MWException {};
-class UploadStashBadPathException extends MWException {};
-class UploadStashFileException extends MWException {};
-class UploadStashZeroLengthFileException extends MWException {};
-class UploadStashNotLoggedInException extends MWException {};
-class UploadStashWrongOwnerException extends MWException {};
-class UploadStashNoSuchKeyException extends MWException {};
+class UploadStashException extends MWException {};
+class UploadStashNotAvailableException extends UploadStashException {};
+class UploadStashFileNotFoundException extends UploadStashException {};
+class UploadStashBadPathException extends UploadStashException {};
+class UploadStashFileException extends UploadStashException {};
+class UploadStashZeroLengthFileException extends UploadStashException {};
+class UploadStashNotLoggedInException extends UploadStashException {};
+class UploadStashWrongOwnerException extends UploadStashException {};
+class UploadStashNoSuchKeyException extends UploadStashException {};
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 b653f99..e5cab05 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' );
@@ -81,7 +81,7 @@ class Language {
 
        public $mVariants, $mCode, $mLoaded = false;
        public $mMagicExtensions = array(), $mMagicHookDone = false;
-       private $mHtmlCode = null;
+       private $mHtmlCode = null, $mParentLanguage = false;
 
        public $dateFormatStrings = array();
        public $mExtendedSpecialPageAliases;
@@ -170,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
@@ -275,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 ? '[-_]' : '-';
 
@@ -326,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];
        }
 
        /**
@@ -371,8 +385,14 @@ class Language {
        public static function isKnownLanguageTag( $tag ) {
                static $coreLanguageNames;
 
+               // Quick escape for invalid input to avoid exceptions down the line
+               // when code tries to process tags which are not valid at all.
+               if ( !self::isValidBuiltInCode( $tag ) ) {
+                       return false;
+               }
+
                if ( $coreLanguageNames === null ) {
-                       include( MWInit::compiledPath( 'languages/Names.php' ) );
+                       include MWInit::compiledPath( 'languages/Names.php' );
                }
 
                if ( isset( $coreLanguageNames[$tag] )
@@ -408,10 +428,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";
                }
        }
 
@@ -482,6 +500,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() {
@@ -842,7 +863,7 @@ class Language {
                static $coreLanguageNames;
 
                if ( $coreLanguageNames === null ) {
-                       include( MWInit::compiledPath( 'languages/Names.php' ) );
+                       include MWInit::compiledPath( 'languages/Names.php' );
                }
 
                $names = array();
@@ -1075,6 +1096,7 @@ class Language {
         * @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, DateTimeZone $zone = null ) {
@@ -1090,6 +1112,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];
@@ -1121,7 +1152,9 @@ 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':
@@ -1637,7 +1670,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--;
                }
@@ -1811,13 +1844,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;
@@ -1900,12 +1933,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();
@@ -1956,6 +1989,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 ) {
@@ -1965,7 +2000,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" );
                                }
@@ -2198,6 +2238,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.22
+        */
+       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
@@ -2781,7 +2894,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;';
        }
 
@@ -2798,7 +2913,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;
        }
 
@@ -2842,12 +2959,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;
@@ -2864,17 +2985,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 ) ) {
@@ -3022,7 +3142,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();
@@ -3030,20 +3150,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
@@ -3220,9 +3340,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];
                        }
@@ -3306,7 +3426,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];
@@ -3439,7 +3561,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();
        }
@@ -3492,10 +3614,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 ) ) {
@@ -3506,7 +3624,11 @@ class Language {
                                unset( $forms[$index] );
                        }
                }
+
                $forms = array_values( $forms );
+               if ( !count( $forms ) ) {
+                       return '';
+               }
 
                $pluralForm = $this->getPluralRuleIndexNumber( $count );
                $pluralForm = min( $pluralForm, count( $forms ) - 1 );
@@ -3817,6 +3939,34 @@ class Language {
                return $this;
        }
 
+       /**
+        * Get the "parent" language which has a converter to convert a "compatible" language
+        * (in another variant) to this language (eg. zh for zh-cn, but not en for en-gb).
+        *
+        * @return Language|null
+        * @since 1.22
+        */
+       public function getParentLanguage() {
+               if ( $this->mParentLanguage !== false ) {
+                       return $this->mParentLanguage;
+               }
+
+               $pieces = explode( '-', $this->getCode() );
+               $code = $pieces[0];
+               if ( !in_array( $code, LanguageConverter::$languagesWithVariants ) ) {
+                       $this->mParentLanguage = null;
+                       return null;
+               }
+               $lang = Language::factory( $code );
+               if ( !$lang->hasVariant( $this->getCode() ) ) {
+                       $this->mParentLanguage = null;
+                       return null;
+               }
+
+               $this->mParentLanguage = $lang;
+               return $lang;
+       }
+
        /**
         * Get the RFC 3066 code for this language object
         *
@@ -3851,8 +4001,9 @@ class Language {
         */
        public function setCode( $code ) {
                $this->mCode = $code;
-               // Ensure we don't leave an incorrect html code lying around
+               // Ensure we don't leave incorrect cached data lying around
                $this->mHtmlCode = null;
+               $this->mParentLanguage = false;
        }
 
        /**
@@ -3948,6 +4099,36 @@ class Language {
                }
        }
 
+       /**
+        * Get the ordered list of fallback languages, ending with the fallback
+        * language chain for the site language.
+        *
+        * @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.
+               $cacheKey = "{$code}-{$wgLanguageCode}";
+
+               if ( !array_key_exists( $cacheKey, self::$fallbackLanguageCache ) ) {
+                       $fallbacks = self::getFallbacksFor( $code );
+
+                       // 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_diff( $siteFallbacks, $fallbacks );
+
+                       self::$fallbackLanguageCache[$cacheKey] = array( $fallbacks, $siteFallbacks );
+               }
+               return self::$fallbackLanguageCache[$cacheKey];
+       }
+
        /**
         * Get all messages for a given language
         * WARNING: this may take a long time. If you just need all message *keys*
@@ -4048,15 +4229,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
@@ -4353,7 +4533,7 @@ class Language {
 
        /**
         * Get the plural rule types for the language
-        * @since 1.21
+        * @since 1.22
         * @return array Associative array with plural form number and plural rule type as key-value pairs
         */
        public function getPluralRuleTypes() {
@@ -4384,7 +4564,7 @@ class Language {
         * 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
+        * @since 1.22
         * @return string The name of the plural rule type, e.g. one, two, few, many
         */
        public function getPluralRuleType( $number ) {
index e36c085..a02fc8a 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;
        }
 
@@ -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.22
+        * @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 89eff30..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
@@ -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
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 3cc1f29..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',
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 14a5641..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;
+               }
        }
 
        /**
@@ -170,7 +172,9 @@ class IuConverter extends LanguageConverter {
                global $wgTitle;
                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 d8a7e2c..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;
+               }
        }
 
        /**
@@ -282,7 +284,9 @@ class KkConverter extends LanguageConverter {
                global $wgTitle;
                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 ef1b065..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;
+               }
        }
 
        /**
@@ -190,7 +192,9 @@ class KuConverter extends LanguageConverter {
                global $wgTitle;
                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];
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];
        }
 }
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 001ad08..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;
+               }
        }
 
        /**
@@ -149,7 +151,9 @@ class ShiConverter extends LanguageConverter {
                global $wgTitle;
                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 77957b2..06c75c9 100644 (file)
@@ -45,9 +45,11 @@ 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
index b29cfb8..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;
+               }
        }
 
        /**
@@ -141,7 +143,9 @@ class SrConverter extends LanguageConverter {
                global $wgTitle;
                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 ac386c5..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',
                );
index 3bbee94..3062073 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',
@@ -401,7 +396,6 @@ $1",
 'disclaimers' => 'Beunantah',
 'disclaimerpage' => 'Project:Beunantah umom',
 'edithelp' => 'Bantu andam',
-'edithelppage' => 'Help:Andam',
 'helppage' => 'Help:Asoë',
 'mainpage' => 'Ôn Keuë',
 'mainpage-description' => 'Ôn Keuë',
@@ -420,7 +414,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 +453,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 +572,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 +642,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 +652,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 +673,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 +698,13 @@ 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!'''",
-'searchhelp-url' => 'Help:Asoë',
-'searchprofile-articles' => 'On asoe',
-'searchprofile-project' => 'On Beunantu ngon Buet',
+'searchmenu-new' => "'''Peugöt ôn \"[[:\$1]]\" bak wiki nyoë!'''",
+'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 +712,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 +742,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 +767,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 +817,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 +932,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 +1005,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 +1026,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 +1050,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 +1099,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 +1128,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 +1153,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 +1172,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..7e624bb 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' => 'نبهني عند إدخال ملخص تعديل فارغ',
@@ -256,7 +254,6 @@ $1',
 'disclaimers' => 'عدم مسؤولية',
 'disclaimerpage' => 'Project:عدم مسؤولية عام',
 'edithelp' => 'مساعدة التحرير',
-'edithelppage' => 'Help:تحرير',
 'helppage' => 'Help:محتويات',
 'mainpage' => 'الصفحة الرئيسية',
 'mainpage-description' => 'الصفحة الرئيسية',
@@ -543,10 +540,8 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'إعادة ضبط كلمة السر',
-'passwordreset-text' => 'أكمل هذا النموذج لتتلقى بريدا إلكترونيا يذكر بتفاصيل حسابك.',
 'passwordreset-legend' => 'إعادة تعيين كلمة السر',
 'passwordreset-disabled' => 'عُطّلت إعادة تعيين كلمة السر على هذه الويكي.',
-'passwordreset-pretext' => '{{PLURAL:$1||أدخل أحد أجزاء البيانات أدناه}}',
 'passwordreset-username' => 'اسم المستخدم:',
 'passwordreset-domain' => 'النطاق:',
 'passwordreset-capture' => 'أأعرض البريد الإلكتروني الناتج؟',
index 8f01de7..071c8f8 100644 (file)
@@ -15,6 +15,7 @@
  * @author Kaganer
  * @author Manie
  * @author Naudefj
+ * @author Nemo bis
  * @author Purodha
  * @author Reedy
  * @author SPQRobin
@@ -254,7 +255,7 @@ $messages = array(
 
 '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:',
@@ -314,6 +315,18 @@ $messages = array(
 'oct' => 'Okt',
 'nov' => 'Nov',
 'dec' => 'Des',
+'january-date' => '$1 Januarie',
+'february-date' => '$1 Februarie',
+'march-date' => '$1 Maart',
+'april-date' => '$1 April',
+'may-date' => '$1 Mei',
+'june-date' => '$1 Junie',
+'july-date' => '$1 Julie',
+'august-date' => '$1 Augustus',
+'september-date' => '$1 September',
+'october-date' => '$1 Oktober',
+'november-date' => '$1 November',
+'december-date' => '$1 Desember',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorie|Kategorieë}}',
@@ -423,7 +436,7 @@ $messages = array(
 'otherlanguages' => 'Ander tale',
 'redirectedfrom' => '(Aangestuur vanaf $1)',
 'redirectpagesub' => 'Aanstuurblad',
-'lastmodifiedat' => 'Die bladsy is laas op $1 om $1 bygewerk.',
+'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:',
@@ -448,7 +461,6 @@ $1",
 'disclaimers' => 'Voorbehoud',
 'disclaimerpage' => 'Project:Voorwaardes',
 'edithelp' => 'Wysigingshulp',
-'edithelppage' => 'Help:Wysig',
 'helppage' => 'Help:Inhoud',
 'mainpage' => 'Tuisblad',
 'mainpage-description' => 'Tuisblad',
@@ -574,7 +586,7 @@ 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 />
@@ -604,7 +616,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''",
@@ -614,49 +626,80 @@ 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 tydens aanmelding voorgekom 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 op {{SITENAME}} te kan aanteken.',
-'userlogin' => 'Teken in / registreer',
-'userloginnocreate' => 'Teken in',
+'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',
+'userlogin-noaccount' => 'Nog nie geregistreer nie?',
+'userlogin-joinproject' => 'Word lid van {{SITENAME}}',
 'nologin' => 'Nog nie geregistreer nie? $1.',
-'nologinlink' => "Skep gerus 'n rekening",
+'nologinlink' => "Skep gerus 'n gebruiker",
 'createaccount' => 'Skep nuwe rekening',
 'gotaccount' => "Het u reeds 'n rekening? $1.",
 'gotaccountlink' => 'Meld aan',
-'userlogin-resetlink' => 'U aanmeld besonderhede vergeet?',
+'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 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.',
-'loginsuccesstitle' => 'Suksesvolle intekening',
+'loginsuccesstitle' => 'Suksesvolle aanmelding',
 'loginsuccess' => 'U is nou by {{SITENAME}} as "$1" ingeteken.',
 'nosuchuser' => 'Die gebruiker "$1" bestaan nie.
 Gebruikersname is gevoelig vir hoofletters.
@@ -672,13 +715,13 @@ Intekening word verbied.',
 'password-login-forbidden' => 'Die gebruik van hierdie gebruikersnaam en wagwoord is geweier.',
 '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,
@@ -698,12 +741,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',
@@ -723,8 +767,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',
@@ -732,13 +777,15 @@ 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 u wagwoord te herstel.',
+'passwordreset-text-one' => 'Voltooi hierdie vorm om u wagwoord te herstel.',
+'passwordreset-text-many' => '{{PLURAL:$1|Vul een van die velde in om u wagwoord te herstel.}}',
 '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,7 +810,7 @@ Meld asseblief aan en verander u wagwoord nou. As u dit nie versoek het nie, of
 Tydelike wagwoord: $2',
 'passwordreset-emailsent' => "'n E-pos is gestuur om u wagwoord te herstel.",
 'passwordreset-emailsent-capture' => "'n E-pos vir die herstel van 'n wagwoord is gestuur. Dit word hieronder vertoon.",
-'passwordreset-emailerror-capture' => "'n E-pos vir die herstel van 'n wagwoord is saamgestel. Dit word hieronder vertoon. Die uitstuur daarvan het egter gefaal: $1",
+'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',
@@ -813,22 +860,22 @@ Tydelike wagwoord: $2',
 '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:',
+'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:
 
@@ -850,8 +897,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.
@@ -861,7 +908,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]
@@ -898,7 +948,7 @@ 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 meld.'''",
 'session_fail_preview_html' => "'''Jammer! U wysigings is nie verwerk nie omdat sessie-data verlore gegaan het.'''
@@ -952,12 +1002,12 @@ Die nuutste logboekinskrywing word hieronder ter verwysing vertoon:",
 '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.'''
@@ -973,6 +1023,7 @@ Geen verduideliking is verskaf nie.",
 Dit lyk of dit verwyder is.',
 'edit-conflict' => 'Wysigingskonflik',
 'edit-no-change' => 'U wysiging was geignoreer omdat die teks nie verander is nie.',
+'postedit-confirmation' => 'U wysigings is gestoor.',
 'edit-already-exists' => 'Die bladsy is nie geskep nie.
 Dit bestaan alreeds.',
 'defaultmessagetext' => 'Verstekteks',
@@ -980,7 +1031,7 @@ Dit bestaan alreeds.',
 '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.',
+Indien u aangemeld is, kan u hierdie waarskuwing in die "Wysigings"-afdeling van u voorkeure afskakel.',
 
 # Content models
 'content-model-wikitext' => 'Wikiteks',
@@ -1205,7 +1256,7 @@ Details kan in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} s
 # Search results
 'searchresults' => 'Soekresultate',
 'searchresults-title' => 'Soekresultate vir "$1"',
-'searchresulttext' => 'Vir meer inligting oor {{SITENAME}}-soekresultate, sien [[{{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.",
@@ -1222,7 +1273,6 @@ Details kan in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} s
 'searchmenu-legend' => 'Soekopsies',
 'searchmenu-exists' => "'''Daar is reeds 'n bladsy genaamd \"[[:\$1]]\" op die wiki'''",
 'searchmenu-new' => "'''Skep die bladsy \"[[:\$1]]\" op hierdie wiki'''",
-'searchhelp-url' => 'Help:Inhoud',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Wys bladsye wat met die voorvoegsel begin]]',
 'searchprofile-articles' => 'Inhoudelike bladsye',
 'searchprofile-project' => 'Hulp- en projekbladsye',
@@ -1248,7 +1298,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.
@@ -1265,13 +1315,14 @@ U kan ook 'n naamruimte as voorvoegsel gebruik.",
 '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.',
+'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',
@@ -1365,7 +1416,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.',
@@ -1405,10 +1457,11 @@ Die inligting is vir ander gebruikers sigbaar.',
 'userrights-reason' => 'Rede:',
 'userrights-no-interwiki' => "U het nie toestemming om gebruikersregte op ander wiki's te verander nie.",
 'userrights-nodatabase' => 'Databasis $1 bestaan nie of is nie hier beskikbaar nie.',
-'userrights-nologin' => "U moet [[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:',
@@ -1552,7 +1605,7 @@ Die inligting is vir ander gebruikers sigbaar.',
 '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}} gedurende die afgelope {{PLURAL:$2|dag|'''$2''' dae}}, soos vanaf $4 om $5.",
-'rcnotefrom' => 'Hier onder is die wysigings sedert <b>$2</b> (tot by <b>$1</b> word gewys).',
+'rcnotefrom' => "Hier volg wysigings sedert '''$2''' (maksimum van '''$1''' word gewys).",
 'rclistfrom' => 'Vertoon wysigings vanaf $1',
 'rcshowhideminor' => '$1 klein wysigings',
 'rcshowhidebots' => '$1 robotte',
@@ -1594,8 +1647,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 $1 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',
@@ -2083,12 +2135,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}}.
@@ -2136,7 +2188,7 @@ Sien 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',
@@ -2152,6 +2204,15 @@ Benodig ten minste een topvlakdomein, soos byvoorbeeld "*.org".<br />
 'listusers-noresult' => 'Geen gebruikers gevind nie.',
 'listusers-blocked' => '(geblokkeer)',
 
+# Special:ActiveUsers
+'activeusers' => 'Aktiewe gebruikers',
+'activeusers-intro' => "Hierdie is 'n lys van gebruikers wat die laaste {{PLURAL:$1|dag|$1 dae}} enige aktiwiteit getoon het.",
+'activeusers-count' => '$1 onlangse {{PLURAL:$1|wysiging|wysigings}} in die {{PLURAL:$3|afgelope dag|laatste $3 dae}}',
+'activeusers-from' => 'Wys gebruikers, beginnende by:',
+'activeusers-hidebots' => 'Versteek bots',
+'activeusers-hidesysops' => 'Versteek administrateurs',
+'activeusers-noresult' => 'Geen gebruikers gevind nie.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Gebruikersgroepregte',
 'listgrouprights-summary' => "Hier volg 'n lys van gebruikersgroepe met hulle ooreenstemmende regte wat op die wiki gedefinieer is.
@@ -2173,7 +2234,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',
@@ -2228,8 +2289,8 @@ 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 kennisgewings 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' => 'Jou dophoulys bevat $1 {{PLURAL:$1|bladsy|bladsye}}.',
@@ -2502,7 +2563,7 @@ 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',
@@ -2530,8 +2591,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:',
@@ -2649,6 +2710,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.",
@@ -2898,8 +2960,8 @@ 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 inhoudbladsy',
 'tooltip-ca-edit' => 'U kan hierdie bladsy wysig. Gebruik asseblief die voorskoufunksie vóór u dit stoor.',
@@ -3111,11 +3173,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:
 
@@ -3128,7 +3204,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
@@ -3145,7 +3221,7 @@ Ander velde sal versteek wees.
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Breedte',
 'exif-imagelength' => 'Hoogte',
 'exif-bitspersample' => 'Grepe per komponent',
@@ -3323,7 +3399,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',
@@ -3560,7 +3636,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',
@@ -3738,12 +3815,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',
@@ -3834,6 +3916,9 @@ 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")',
index 7dd39e0..8c15418 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ë',
@@ -302,7 +301,6 @@ $1',
 'disclaimers' => 'Shfajsime',
 'disclaimerpage' => 'Project:Shfajsimet e përgjithshme',
 'edithelp' => 'Ndihmë për redaktim',
-'edithelppage' => 'Help:Redaktimi',
 'helppage' => 'Help:Përmbajtja',
 'mainpage' => 'Faqja kryesore',
 'mainpage-description' => 'Faqja Kryesore',
@@ -750,6 +748,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.
@@ -903,7 +902,6 @@ Kini kujdes se përdorimi i lidhjeve të shfletimit do të ndryshojë përzgjedh
 'searchmenu-legend' => 'Opcionet e kërkimit',
 'searchmenu-exists' => "'''Në këtë wiki âsht nji faqe me titullin \"[[:\$1]]\"'''",
 'searchmenu-new' => "'''Krijo faqen \"[[:\$1]]\" në këtë wiki!'''",
-'searchhelp-url' => 'Help:Përmbajtja',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Shfleto faqet me këtë prefiks]]',
 'searchprofile-articles' => 'Faqet me përmbajtje',
 'searchprofile-project' => 'Faqet e ndihmës dhe projekteve',
@@ -947,14 +945,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,27 +1493,16 @@ 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 */',
-'handheld.css' => '/* CSSi i vednosun këtu ka me i prekë shfletuesit mobil (të dorës) në dukje e konfigurueme në $wgHandheldStyle */',
 
 # 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 +1537,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..bf6cabe 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' => 'ማጠቃለያው ባዶ ከሆነ ማስታወሻ ይስጠኝ',
@@ -276,7 +274,6 @@ $1',
 'disclaimers' => 'የኃላፊነት ማስታወቂያ',
 'disclaimerpage' => 'Project:አጠቃላይ የሕግ ነጥቦች',
 'edithelp' => 'የማረም መመሪያ',
-'edithelppage' => 'Help:የማዘጋጀት እርዳታ',
 'helppage' => 'Help:ይዞታ',
 'mainpage' => 'ዋናው ገጽ',
 'mainpage-description' => 'ዋና ገጽ',
@@ -808,7 +805,6 @@ $1ን ወይም ማንም ሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
 'searchmenu-legend' => 'የፍለጋ ምርጫዎች',
 'searchmenu-exists' => "'''\"[[:\$1]]\" የሚባል መጣጥፍ በዚሁ ዊኪ ላይ አለ።'''",
 'searchmenu-new' => "'''\"[[:\$1]]\" የሚባል መጣጥፍ ይፈጠር?'''",
-'searchhelp-url' => 'Help:ይዞታ',
 'searchprofile-articles' => 'ይዞታ ያላቸው መጣጥፎች',
 'searchprofile-project' => 'የመርሃግብሩ ገጾች',
 'searchprofile-images' => 'ፋይሎች',
@@ -846,13 +842,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 +1528,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 +2142,7 @@ $1',
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ስፋት',
 'exif-imagelength' => 'ቁመት',
 'exif-compression' => 'የመጨመቅ ዘዴ',
@@ -2260,7 +2249,7 @@ $1',
 'exif-cameraownername' => 'ባለ ካሜራ',
 'exif-personinimage' => 'የታየው ሰው',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'ያልተጨመቀ',
 
 'exif-unknowndate' => 'ያልታወቀ ቀን',
@@ -2528,13 +2517,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..f9fb9b0 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',
@@ -372,7 +371,6 @@ $1",
 'disclaimers' => 'Alvertencias chenerals',
 'disclaimerpage' => 'Project:Alvertencias chenerals',
 'edithelp' => 'Aduya ta editar pachinas',
-'edithelppage' => "Help:Cómo s'edita una pachina",
 'helppage' => 'Help:Aduya',
 'mainpage' => 'Portalada',
 'mainpage-description' => 'Portalada',
@@ -626,10 +624,8 @@ Talment ya ha cambiato a suya clau u ha demandato una nueva clau temporal.',
 
 # Special:PasswordReset
 'passwordreset' => "Restablir a clau d'acceso",
-'passwordreset-text' => "Completar ista forma ta recibir un recordatorio por correu con os detalles d'a suya cuenta.",
 'passwordreset-legend' => "Restablir a clau d'acceso",
 'passwordreset-disabled' => "S'ha desactivau o restablimiento de claus en ista wiki.",
-'passwordreset-pretext' => "{{PLURAL:$1||Introduzca uno d'os siguients datos}}",
 'passwordreset-username' => "Nombre d'usuario:",
 'passwordreset-domain' => 'Dominio:',
 'passwordreset-capture' => 'Veyer o mensache resultant?',
@@ -840,6 +836,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.
@@ -1059,7 +1056,6 @@ Asegure-se que iste cambio no trencará a continidat de l'historial d'a pachina.
 'searchmenu-legend' => 'Opcions de busca',
 'searchmenu-exists' => "'''Bi ha una pachina clamada \"[[\$1]]\" en ista wiki'''",
 'searchmenu-new' => "'''Creyar a pachina \"[[:\$1]]\" en ista wiki!'''",
-'searchhelp-url' => 'Help:Aduya',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Veyer pachinas con iste prefixo]]',
 'searchprofile-articles' => 'Pachinas de conteniu',
 'searchprofile-project' => "Pachinas d'aduya y d'o prochecto",
@@ -1101,15 +1097,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 +1633,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 +2016,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 +2704,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 +2717,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 +2758,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 +2860,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 +3038,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 +3440,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..4a22667 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Altai uul
  * @author Gott wisst
  * @author JJohnson
  * @author Omnipaedista
@@ -30,483 +31,507 @@ $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 behealdungtæl mid trametum þā ic scieppe and ymelum þā ic hlade on nett.',
+'tog-watchdefault' => 'Ēacnian mīn behealdungetæl mid trametum and ymelum þā ic adihte.',
+'tog-watchmoves' => 'Ēacnian mīn behealdungtæl mid trametum and ymelum þā ic wege.',
+'tog-watchdeletion' => 'Ēacnian mīn behealdungæ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 þætte webbsēcend sette trametas on horde',
+'tog-enotifwatchlistpages' => 'Sendan mē spearcǣrend þǣr tramet oþþe ymele on mīnum behealdungtæle sīe andwended.',
+'tog-enotifusertalkpages' => 'Sendan mē spearcǣrend þǣr mīnes brūcendtrametes mōtung sī andwended',
+'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 behealdendra 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 adihtunge sceortnesse',
+'tog-watchlisthideown' => 'Hȳdan mīna adihtunga wiþ þæt behealdungtæl',
+'tog-watchlisthidebots' => 'Hȳdan searuþrǣla adihtunga wiþ þæt behealdungtæl',
+'tog-watchlisthideminor' => 'Hȳdan lytela adihtunga wiþ þæt behealdungtæl',
+'tog-watchlisthideliu' => 'Hȳdan adihtunga fram inmeldodum brūcendum wiþ þæt behealdungtæl',
+'tog-watchlisthideanons' => 'Hȳdan adihtunga fram uncūðum brūcendum wiþ þæt behealdungtæl',
+'tog-watchlisthidepatrolled' => 'Hȳdan weardoda adihtunga wiþ þæt behealdungtæ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 gewunelicu 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',
-'jan' => 'Ǣr Ȝē',
+'december-gen' => 'Ǣrran Gēolan',
+'jan' => 'Ǣr Gē',
 '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:Innoþ',
-'mainpage' => 'Hēafodsīde',
-'mainpage-description' => 'Hēafodsīde',
+'disclaimerpage' => 'Project:Gemǣne ætsacung',
+'edithelp' => 'Help on adihtunge',
+'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',
+
+# Virus scanner
+'virus-badscanner' => "Јастыра конфигурация: Јарты јок сканер ''$1''",
+'virus-unknownscanner' => 'Јарты јок антивирус:',
 
 # 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.",
+'welcomeuser' => 'Wilcume, $1!',
+'yourname' => 'Þīn brūcendnama:',
+'userlogin-yourname' => 'Brūcendnama:',
+'userlogin-yourname-ph' => 'Inwrīt þīnne brūcendnaman',
+'yourpassword' => 'Þafungword:',
+'userlogin-yourpassword' => 'Þafungword',
+'userlogin-yourpassword-ph' => 'Inwrīt þīn þafungword',
+'createacct-yourpassword-ph' => 'Inwrīt þafungword',
+'yourpasswordagain' => 'Wrītan þafungword eft:',
+'createacct-yourpasswordagain' => 'Asēð þafungword',
+'createacct-yourpasswordagain-ph' => 'Wrīt þafungword eft',
+'remembermypassword' => 'Gemynan mīne inmeldunge on þissum webbsēcende (oþ $1 {{PLURAL:$1|dæg|daga}} lengest)',
+'userlogin-remembermypassword' => 'Ætfeolan mīnre inmeldunge',
+'yourdomainname' => 'Þīn geweald:',
+'password-change-forbidden' => 'Þū ne canst awendan þafungword on þissum wiki.',
 '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',
+'loginprompt' => 'Þū scealt þafian cȳþþu grētunga tō inmeldienne in {{SITENAME}}.',
+'userlogin' => 'Inmeldian / wyrcan reccinge',
 'userloginnocreate' => 'Inmeldian',
 'logout' => 'Ūtmeldian',
 'userlogout' => 'Ūtmeldian',
-'notloggedin' => 'Ne inȝemelded',
-'nologinlink' => 'Hordcleofan scieppan',
-'createaccount' => 'Hordcleofan scieppan',
+'notloggedin' => 'Nā ingemeldod',
+'userlogin-noaccount' => 'Слерде аккаунт јок по?',
+'userlogin-joinproject' => '{{SITENAME}} кирер',
+'nologin' => 'Слерде аккаунт јок по? $1.',
+'nologinlink' => 'Scieppan reccinge',
+'createaccount' => 'Scieppan reccinge',
+'gotaccount' => 'Белен аккаунт бар ба? $1.',
 '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',
-'nowiki_tip' => 'Ƿiki ȝeƿeorc forȝietan',
+'nowiki_sample' => 'Unendebyrdodne traht hēr settan',
+'nowiki_tip' => 'Wiki endebyrdunge forgietan',
 'image_sample' => 'Bisen.jpg',
-'image_tip' => 'Impod biliþ',
+'image_tip' => 'Ingesett ymele',
 'media_sample' => 'Bisen.ogg',
-'media_tip' => 'Fīlhlenċe',
-'sig_tip' => 'Þīn namanseȝn mid tīdstempunge',
-'hr_tip' => 'Brād līn (ne oft brūcan)',
+'media_tip' => 'Ymelan hlenca',
+'sig_tip' => 'Þīn selfmearc mid tīdmearce',
+'hr_tip' => 'Brād līn (ne brūc oft)',
 
 # Edit pages
 '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',
+'minoredit' => 'Þēos is lytel adihtung',
+'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 adihtunge stǣ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',
@@ -516,437 +541,429 @@ folcliċum āgnunge oþþe ȝelīċum frēom horde (sēo $1 for āscungum).
 'revdelete-hide-comment' => 'Ādihtcƿide hȳdan',
 'revdelete-hide-user' => 'Ādihteres brūcendnama/IP address hȳdan',
 'revdelete-radio-same' => '(ne hƿeorfan)',
-'revdelete-radio-set' => 'Ȝēa',
-'revdelete-radio-unset' => 'Nā',
-'revdel-restore' => 'scēaƿnesse hƿeorfan',
-'pagehist' => 'Sīdan stǣr',
+'revdelete-radio-set' => 'Gēa',
+'revdelete-radio-unset' => 'Nese',
+'revdel-restore' => 'andwendan īwunge',
+'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:Innoþ',
-'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!'''",
+'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',
-'yourgender' => 'Ȝecynd:',
-'gender-male' => 'Ƿer',
-'gender-female' => 'Frēo',
-'email' => 'E-ǣrende',
+'yourvariant' => 'Sprǣce wendung:',
+'yourgender' => 'Gecynd:',
+'gender-male' => 'Wer',
+'gender-female' => 'Wīf',
+'email' => 'Spearcǣrend',
 
 # User rights
-'userrights-user-editname' => 'Brūcendnama ƿrītan:',
-'editusergroup' => 'Ādihtan Brūcendsamþrēatas',
-'userrights-editusergroup' => 'Brūcenda clīeƿenas ādihtan:',
-'saveusergroups' => 'Brūcenda clīeƿenas sparian',
-'userrights-groupsmember' => 'Ȝesīþ þæs:',
+'userrights-user-editname' => 'Wrīt brūcendnaman:',
+'editusergroup' => 'Adihtan brūcendhēapas',
+'userrights-editusergroup' => 'Adihtan brūcendhēapas',
+'saveusergroups' => 'Hordian brūcendhēapas',
+'userrights-groupsmember' => 'Gesīþ lōcaþ tō:',
 'userrights-reason' => 'Racu:',
 
 # Groups
-'group' => 'Clīeƿen:',
+'group' => 'Hēap:',
 'group-user' => 'Brūcendas:',
-'group-bot' => 'Searuþralas',
-'group-sysop' => 'Beƿitendas',
-'group-bureaucrat' => 'Tōþeȝnas',
-'group-suppress' => 'Oferȝesihta',
+'group-bot' => 'Searuþrǣlas',
+'group-sysop' => 'Bewitendas',
+'group-bureaucrat' => 'Þegnas',
+'group-suppress' => 'Ofergesihta',
 'group-all' => '(eall)',
 
-'group-user-member' => '{{GENDER:$1|brūcend}}',
-'group-bot-member' => 'searuþræl',
-'group-sysop-member' => 'beƿitend',
+'group-user-member' => '{{GENDER:$1|brūcend|brūcicge}}',
+'group-bot-member' => '{{GENDER:$1|searuþrǣl}}',
+'group-sysop-member' => '{{GENDER:$1|bewitend|bewiticge}}',
 'group-suppress-member' => 'oferȝesiht',
 
-'grouppage-sysop' => '{{ns:project}}:Beƿitendas',
+'grouppage-sysop' => '{{ns:project}}:Bewitendas',
 
 # Special:Log/newusers
-'newuserlogpage' => 'Brūcenda ȝesceaft ȝetalu',
+'newuserlogpage' => 'Brūcenda scieppunge ealdhord',
 
 # User rights log
 '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',
-'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',
+'rcnotefrom' => "Niðer sind þā andwendunga fram '''$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 inmeldode brūcendas',
+'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ȝ',
-'rc-enhanced-expand' => 'Ȝehanda sēon (þearf JavaScript)',
-'rc-enhanced-hide' => 'Ȝehanda hȳdan',
+'boteditletter' => 'þr',
+'rc_categories_any' => 'Ǣnig',
+'rc-enhanced-expand' => 'Īwan stafas (þearf JavaScript)',
+'rc-enhanced-hide' => 'Hȳdan stafas',
 
 # 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',
+'filehist-dimensions' => 'Micelnesse gemetu',
+'filehist-filesize' => 'Ymelan micelness',
+'filehist-comment' => 'Ymbsprǣc',
+'filehist-missing' => 'Yemele is æfweard',
+'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',
+'activeusers' => 'Getæl hwætra brūcenda',
 
 # 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 +978,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',
 
@@ -1043,105 +1059,105 @@ Bidde cēos ōðerne naman.',
 'importfailed' => 'Inbringung tōsǣlede: $1',
 'importnotext' => 'Ǣmtiȝ oþþe nān traht',
 'importsuccess' => 'Inbringoþ ȝesǣled!',
-'import-noarticle' => 'Nān sīde to inbringenne!',
+'import-noarticle' => 'Nān tramet tō inbringenne!',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'Þīnu brūcendsīde',
-'tooltip-pt-mytalk' => 'Þīnu ȝespreċsīde',
-'tooltip-pt-preferences' => 'Þīna forebearƿan',
-'tooltip-pt-watchlist' => 'Sēo ȝetalu sīdena þe ƿæccest þū for hƿearfum',
-'tooltip-pt-mycontris' => 'Ȝetalu þīnra forðunga',
-'tooltip-pt-login' => 'Man þē byldeþ to inmeldienne; þēah, þis nis ābeden',
+'tooltip-pt-userpage' => 'Þīn brūcendtramet',
+'tooltip-pt-mytalk' => 'Þīn mōtung',
+'tooltip-pt-preferences' => 'Þīna fōreberunga',
+'tooltip-pt-watchlist' => 'Getæl trameta þā behieltst þū ymbe andwendunga',
+'tooltip-pt-mycontris' => 'Getæl þīnra forðunga',
+'tooltip-pt-login' => 'Man þē byldeþ to inmeldienne; þēah, þis nis abeden',
 '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-talk' => 'Mōtung ymbe þone innungtramet',
+'tooltip-ca-edit' => 'Þū meaht þisne tramet adihtan. Brūc lā þone fōrebysene cnæpp ǣr þū hordie.',
+'tooltip-ca-addsection' => 'Beginnan nīwne dǣl',
+'tooltip-ca-viewsource' => 'Þes tramet is borgen.
+Þū canst his fruman sēon.',
+'tooltip-ca-history' => 'Ǣrran 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.',
-'svg-long-desc' => 'SVG fīl, rihte $1 × $2 pixels, fīlmiċelu: $3',
-'show-big-image' => 'Fulmiċelu',
+'file-nohires' => 'Þǣr nis nǣnig māre micelness.',
+'svg-long-desc' => 'SVG ymele, rihte $1 × $2 pixels, ymelan micelness: $3',
+'show-big-image' => 'Full micelness',
 
 # 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',
+'ilsubmit' => 'Sēcan',
 'bydate' => 'be tælmearce',
 
 # Metadata
 'metadata' => 'Metacȳþþu',
-'metadata-expand' => 'Oferȝehanda sēon',
-'metadata-collapse' => 'Oferȝehanda hȳdan',
+'metadata-expand' => 'Īwan ēacnode stafas',
+'metadata-collapse' => 'Hȳdan ēacnode stafas',
 
-# EXIF tags
-'exif-imagewidth' => 'Ƿīdnes',
+# Exif tags
+'exif-imagewidth' => 'Wīdnes',
 'exif-imagelength' => 'Hīehþ',
 'exif-compression' => 'Ȝeþryccungmōd',
-'exif-ycbcrpositioning' => 'Y and C ȝesetednes',
+'exif-ycbcrpositioning' => 'Y and C gesetednes',
 'exif-imagedescription' => 'Biliðes nama',
 '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-whitebalance' => 'Hwītes blēos emnett',
 'exif-sharpness' => 'Scearpnes',
 'exif-gpslatituderef' => 'Norþ oþþe sūþ brǣdu',
 'exif-gpslatitude' => 'Brǣdu',
@@ -1150,7 +1166,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 +1219,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 +1235,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 +1272,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 cbd5c61..ef59a3e 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,39 +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-showjumplinks' => 'Ù\85Ù\83Ù\86 Ù\88صÙ\84ات "اذÙ\87ب Ø¥Ù\84Ù\89" Ø§Ù\84Ù\85ساعدة',
-'tog-uselivepreview' => 'استخدم الاستعراض السريع (جافاسكريبت) (تجريبي)',
+'tog-fancysig' => 'عامل التوقيع كنصّ ويكي (بلا رابط تلقائي)',
+'tog-showjumplinks' => 'Ù\81عÙ\91Ù\84 Ø±Ù\88ابط "اذÙ\87ب Ø¥Ù\84Ù\89" Ø§Ù\84Ù\85عاÙ\88Ù\86ة',
+'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' => 'أزÙ\84 Ø§Ù\84Ù\81رÙ\82 Ø¨Ø¹Ø¯ Ø§Ù\84Ù\82Ù\8aاÙ\85 Ø¨استرجاع',
-'tog-useeditwarning' => 'حذّرني عندما أغادر تحرير صفحة ذات تغييرات غير محفوظة',
+'tog-norollbackdiff' => 'أزÙ\84 Ø§Ù\84Ù\81رÙ\82 Ø¨Ø¹Ø¯ Ø¥Ø­Ø¯Ø§Ø« استرجاع',
+'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' => 'خط بزوائد',
@@ -578,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' => 'صفحات تحتوي روابط ملفات معطوبة',
+'broken-file-category' => 'صفحات تحوي روابط ملفات معطوبة',
 
-'about' => 'عن',
+'about' => 'عن هذه الويكي',
 'article' => 'صفحة محتوى',
 'newwindow' => '(تفتح في نافذة جديدة)',
 'cancel' => 'ألغِ',
@@ -606,7 +620,7 @@ $messages = array(
 'morenotlisted' => 'يوجد المزيد غير مسرود...',
 'mypage' => 'صفحة',
 'mytalk' => 'نقاش',
-'anontalk' => 'النقاش لعنوان الأيبي هذا',
+'anontalk' => 'نقاش عنوان آي‌بي هذا',
 'navigation' => 'إبحار',
 'and' => '&#32;و',
 
@@ -622,97 +636,96 @@ $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 تعديلات|$1 تعديلاً|$1 تعديل}}',
-'protect' => 'احÙ\85',
-'protect_change' => 'غير',
+'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:محتويات',
 'mainpage' => 'الصفحة الرئيسية',
 'mainpage-description' => 'الصفحة الرئيسية',
@@ -722,54 +735,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' => 'ملف',
@@ -779,80 +792,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' => "'''تحذير:''' أنت تقوم بتحرير صفحة تستخدم في الواجهة النصية للبرنامج.
@@ -889,9 +902,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' => 'أنت لا يمكنك تغيير كلمات السر على هذا الويكي.',
@@ -904,18 +926,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}} كوكيز لتسجيل الدخول.
@@ -982,7 +1024,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' => 'رفض طلب خروجك لأنه يبدو كأنه أرسل عن طريق متصفح معطوب أو وسيط تخزين.',
 
@@ -1009,38 +1051,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' => 'تغيير عنوان البريد الإلكتروني',
@@ -1261,6 +1301,7 @@ $2
 يبدو أنه تم حذفها.',
 'edit-conflict' => 'تضارب تحريري.',
 'edit-no-change' => 'تعديلك تم تجاهله، لأنه لم يحدث أي تعديل للنص.',
+'postedit-confirmation' => 'تعديلك حفظ.',
 'edit-already-exists' => 'لم يمكن إنشاء صفحة جديدة.
 هي موجودة بالفعل.',
 'defaultmessagetext' => 'نص الرسالة الافتراضي',
@@ -1513,7 +1554,6 @@ $1",
 'searchmenu-legend' => 'خيارات البحث',
 'searchmenu-exists' => "*الصفحة '''[[$1]]'''",
 'searchmenu-new' => "'''أنشئ الصفحة \"[[:\$1]]\" في هذا الويكي!'''",
-'searchhelp-url' => 'Help:محتويات',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|تصفح الصفحات بهذه البادئة]]',
 'searchprofile-articles' => 'صفحات المحتوى',
 'searchprofile-project' => 'صفحات المساعدة والمشروع',
@@ -1557,6 +1597,7 @@ $1",
 'searchdisabled' => 'البحث في {{SITENAME}} معطل.
 يمكنك البحث من خلال جوجل في الوقت الحالي.
 لاحظ أن فهارسه لمحتوى {{SITENAME}} ربما تكون غير محدثة.',
+'search-error' => 'حدث خطأ ما أثناء البحث: $1',
 
 # Preferences page
 'preferences' => 'تفضيلات',
@@ -1700,6 +1741,7 @@ $1",
 'userrights-notallowed' => 'حسابك لا يمتلك إذنا لإضافة أو إزالة صلاحيات المستخدمين.',
 'userrights-changeable-col' => 'المجموعات التي يمكنك تغييرها',
 'userrights-unchangeable-col' => 'المجموعات التي لا يمكنك تغييرها',
+'userrights-conflict' => 'تضارب في صلاحيات المستخدمين. طبّق تغييراتك مجدّدا',
 
 # Groups
 'group' => 'المجموعة:',
@@ -2449,6 +2491,15 @@ $1',
 'listusers-noresult' => 'لم يتم إيجاد مستخدم.',
 'listusers-blocked' => '(ممنوع)',
 
+# Special:ActiveUsers
+'activeusers' => 'قائمة المستخدمين النشطين',
+'activeusers-intro' => 'هذه قائمة بالمستخدمين الذين مارسوا نوعاً من النشاط خلال {{PLURAL:$1||اليوم الماضي|اليومين الماضيين|ال$1 أيام الماضية|ال$1 يوماً ماضياً|ال$1 يوم ماضي}}.',
+'activeusers-count' => '{{PLURAL:$1|لا أفعال|فعل واحد|فعلان اثنان|$1 أفعال|$1 فعلاً|$1 فعل}} منذ {{PLURAL:$3||يوم|يومين|$3 أيام|$3 يوماً|$1 يوم}}',
+'activeusers-from' => 'اعرض المستخدمين بدءاً من:',
+'activeusers-hidebots' => 'أخف البوتات',
+'activeusers-hidesysops' => 'أخف الإداريين',
+'activeusers-noresult' => 'لم يعثر على أي مستخدمين',
+
 # Special:ListGroupRights
 'listgrouprights' => 'صلاحيات مجموعات المستخدمين',
 'listgrouprights-summary' => 'التالي قائمة بمجموعات المستخدمين المعرفة في هذا الويكي، بصلاحياتهم المصاحبة.
@@ -2526,8 +2577,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 صفحة}}.',
@@ -2950,6 +3001,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' => 'لا يمكنك منع أو رفع منع مستخدمين آخرين لأنك ممنوع',
@@ -3116,6 +3168,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' => 'تعذر إنشاء ملف الصورة المصغرة المؤقت',
@@ -3273,7 +3327,6 @@ $1',
 'modern.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة مودرن */',
 'vector.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة فكتور */',
 'print.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على ناتج الطباعة */',
-'handheld.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على الأجهزة المحمولة بالاعتماد على الواجهة المضبوطة في $wgHandheldStyle */',
 'noscript.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على المستخدمين الذين الجافاسكريبت لديهم معطلة */',
 'group-autoconfirmed.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على المستخدمين المؤكدين تلقائيا فقط */',
 'group-bot.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على البوتات فقط */',
@@ -3447,11 +3500,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' => 'الصيغة كالتالي:
 
@@ -3481,7 +3548,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'العرض',
 'exif-imagelength' => 'الارتفاع',
 'exif-bitspersample' => 'بت لكل مكونة',
@@ -3664,7 +3731,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',
@@ -4198,12 +4265,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' => 'بحث عن ملفات مكررة',
@@ -4294,23 +4366,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' => 'حذف{{GENDER:$2|ت}} $1 الصفحة $3',
-'logentry-delete-restore' => 'استعاد $1 صفحة $3',
-'logentry-delete-event' => '$1 غير خاصية العرض لـ {{PLURAL:$5|مدخل السجل|$5 مدخلات السجل}} في $3: $4',
-'logentry-delete-revision' => 'غيّر{{GENDER:$2|ت}} $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' => 'غيّر{{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' => 'غيّر $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' => 'اسم المستخدم مخفي',
@@ -4319,20 +4394,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 e496c00..87a308d 100644 (file)
@@ -344,7 +344,6 @@ $1',
 'disclaimers' => 'ܠܐ ܡܫܬܐܠܢܘܬܐ',
 'disclaimerpage' => 'Project:ܠܐ ܡܫܬܐܠܢܘܬܐ ܓܘܢܝܬܐ',
 'edithelp' => 'ܥܘܕܪܢܐ ܠܫܚܠܦܬܐ',
-'edithelppage' => 'Help:ܫܚܠܦܬܐ',
 'helppage' => 'Help:ܚܒܝܫܬ̈ܐ',
 'mainpage' => 'ܦܐܬܐ ܪܝܫܝܬܐ',
 'mainpage-description' => 'ܦܐܬܐ ܪܝܫܝܬܐ',
@@ -435,9 +434,14 @@ $1',
 ܚܕ ܟܡܐ ܡܢ ܦܐܬܬ̈ܐ ܡܬܚܙܝܢ ܐܝܟ ܕܗܘ ܐܢܬ ܥܠܝܠܐ ܐܝܬܝܟ ܥܕܡܐ ܕܐܣܦܩܬ ܠܦܐܬܬ̈ܐ ܠܒܝܟܬ̈ܐ ܕܡܦܐܬܢܐ ܕܝܠܟ.",
 'welcomeuser' => 'ܒܫܝܢܐ $1!',
 'yourname' => 'ܫܡܐ ܕܡܦܠܚܢܐ:',
+'userlogin-yourname' => 'ܫܡܐ ܕܡܦܠܚܢܐ',
+'userlogin-yourname-ph' => 'ܐܥܠ ܫܡܐ ܕܡܦܠܚܢܐ ܕܝܠܟ',
 'yourpassword' => 'ܡܠܬܐ ܕܥܠܠܐ:',
+'userlogin-yourpassword' => 'ܡܠܬܐ ܕܥܠܠܐ',
+'userlogin-yourpassword-ph' => 'ܐܥܠ ܡܠܬܐ ܕܥܠܠܐ ܕܝܠܟ',
 'yourpasswordagain' => 'ܟܬܘܒ ܡܠܬܐ ܕܥܠܠܐ ܙܒܢܬܐ ܐܚܪܬܐ:',
 'remembermypassword' => 'ܕܟܘܪ ܥܠܠܬܝ ܥܠ ܡܦܐܬܢܐ ܗܢܐ (ܠܡܬܚܐ ܥܠܝܐ ܕ $1 {{PLURAL:$1|ܝܘܡܐ|ܝܘܡܬ̈ܐ}})',
+'userlogin-remembermypassword' => 'ܫܒܘܩ ܠܝ ܥܠܝܠܐ ܒܚܘܫܒܢܝ',
 'login' => 'ܥܘܠ',
 'nav-login-createaccount' => 'ܥܘܠ / ܒܪܝ ܚܘܫܒܢܐ',
 'loginprompt' => 'ܐܠܨܐ ܠܡܦܐܬܢܐ ܕܝܠܟ ܕܣܡܟ ܠܩܘܩܝܙ (cookies) ܠܥܠܠܬܐ ܒ {{SITENAME}}.',
@@ -446,14 +450,21 @@ $1',
 'logout' => 'ܦܠܘܛ',
 'userlogout' => 'ܦܠܘܛ',
 'notloggedin' => 'ܠܝܬܝܟ ܥܠܝܠܐ',
+'userlogin-noaccount' => 'ܠܝܬ ܠܟ ܚܘܫܒܢܐ؟',
+'userlogin-joinproject' => 'ܢܩܦ ܥܡ {{SITENAME}}',
 'nologin' => "ܠܝܬ ܠܟ ܚܘܫܒܢܐ؟ '''$1'''.",
 'nologinlink' => 'ܒܪܝ ܚܘܫܒܢܐ',
 'createaccount' => 'ܒܪܝ ܚܘܫܒܢܐ',
 'gotaccount' => "ܐܝܬ ܠܟ ܚܘܫܒܢܐ؟ '''$1'''.",
 'gotaccountlink' => 'ܥܘܠ',
 'userlogin-resetlink' => 'ܐܬܢܫܝܬ ܝܕ̈ܥܬܐ ܕܥܠܠܐ؟',
+'userlogin-resetpassword-link' => 'ܫܚܠܦ ܡܠܬܐ ܕܥܠܠܐ',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|ܥܘܕܪܢܐ ܒܥܠܠܐ ܠܚܘܫܒܢܐ]]',
+'createacct-join' => 'ܐܥܠ ܝܕ̈ܥܬܐ ܕܝܠܟ ܠܬܚܬ',
+'createacct-emailrequired' => 'ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ',
 'createaccountmail' => 'ܐܦܠܚ ܡܠܬܐ ܕܥܠܠܐ ܙܒܢܢܝܬܐ ܘܫܕܪ ܠܗ ܥܠ ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ ܬܘܚܡܐ ܠܬܚܬ',
 'createaccountreason' => 'ܥܠܬܐ',
+'createacct-benefit-heading' => 'ܝܬܒܐ ܕ{{SITENAME}} ܐܣܬܝܡ ܒܝܕ ܐܢܫ̈ܐ ܐܟܘܬܟ.',
 'badretype' => 'ܡܠܬܐ ܕܥܠܠܐ ܟܬܒܬ ܐܢܬ ܠܐ ܐܘܝܢܬܐ.',
 'userexists' => 'ܫܡܐ ܕܡܦܠܚܢܐ ܕܐܥܠܬ ܫܩܝܠܐ ܐܝܬܘܗܝ.
 ܫܦܝܪܐܝܬ ܓܒܝ ܫܡܐ ܐܚܪܢܐ.',
@@ -492,7 +503,6 @@ $1',
 # Special:PasswordReset
 'passwordreset' => 'ܣܘܡ ܡܠܬܐ ܕܥܠܠܐ ܙܒܢ ܐܚܪܝܢ',
 'passwordreset-legend' => 'ܣܘܡ ܡܠܬܐ ܕܥܠܠܐ ܙܒܢ ܐܚܪܝܢ',
-'passwordreset-pretext' => '{{PLURAL:$1||ܐܥܠ ܚܕ ܡܢ ܡܢܘܬ̈ܐ ܕܝܕ̈ܥܬܐ ܠܬܬܚܬ}}',
 'passwordreset-username' => 'ܫܡܐ ܕܡܦܠܚܢܐ:',
 'passwordreset-domain' => 'ܪܘܚܬܐ:',
 'passwordreset-email' => 'ܡܘܢܥܐ ܕܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ:',
@@ -536,8 +546,8 @@ $1',
 'accmailtitle' => 'ܡܠܬܐ ܕܥܠܠܐ ܫܕܪܬ',
 'newarticle' => '(ܚܕܬܐ)',
 'newarticletext' => "ܐܬܬ ܒܬܪ ܐܣܪܐ ܕܦܐܬܐ ܕܠܐ ܐܬܬܣܝܡܬ ܥܕܡܫ.
-ܠܣܘܝܡܐ ܕܦܐܬܐ ܗܕܐ, ܫܪܝ ܠܟܬܒܬܐ ܒܣܢܕܘܩܐ ܠܬܚܬ (ܚܙܝ [[{{MediaWiki:Helppage}}|ܦܐܬܐ ܕܥܘܕܪܢܐ]] ܠܐܚܪܢܐ ܝܕ̈ܥܬܐ).
-ܐܢ ܐܬܬ ܠܗܪܟܐ ܦܘܕܐܝܬ, ܕܘܫ ܠܦܪܡܝܬܐ ܕ '''ܠܒܣܬܪ back''' ܒܡܦܐܬܢܐ ܕܝܠܟ.",
+ܠܣܘܝܡܐ ܕܦܐܬܐ ܗܕܐ، ܫܪܝ ܠܟܬܒܬܐ ܒܣܢܕܘܩܐ ܠܬܚܬ (ܚܙܝ [[{{MediaWiki:Helppage}}|ܦܐܬܐ ܕܥܘܕܪܢܐ]] ܠܐܚܪܢܐ ܝܕ̈ܥܬܐ).
+ܐܢ ܐܬܬ ܠܗܪܟܐ ܦܘܕܐܝܬ، ܟܒܘܫ ܥܠ ܦܪܡܝܬܐ ܕ '''ܠܒܣܬܪ back''' ܒܡܦܐܬܢܐ ܕܝܠܟ.",
 'updated' => '(ܐܬܚܕܬ)',
 'note' => "'''ܡܥܝܪܢܘܬܐ:'''",
 'previewnote' => "'''ܕܟܪ ܕܗܢܘ ܚܝܪܐ ܩܕܡܝܐ ܒܠܚܘܕ'''.
@@ -671,7 +681,6 @@ $1',
 'searchmenu-legend' => 'ܓܒܝܬ̈ܐ ܕܒܨܝܐ',
 'searchmenu-exists' => "'''ܐܝܬ ܦܐܬܐ ܒܫܡ \"[[:\$1]]\" ܥܠ ܗܢܐ ܘܝܩܝ'''",
 'searchmenu-new' => "'''ܒܪܝ ܦܐܬܐ \"[[:\$1]]\" ܥܠ ܗܢܐ ܘܝܩܝ!'''",
-'searchhelp-url' => 'Help:ܚܒܝܫܬ̈ܐ',
 'searchprofile-articles' => 'ܦܐܬܬ̈ܐ ܕܚܒܝܫܬ̈ܐ',
 'searchprofile-project' => 'ܦܐܬܬ̈ܐ ܕܬܪ̈ܡܝܬܐ ܘܕܥܘܕܪܢܐ',
 'searchprofile-images' => 'ܡܝܕ̈ܝܐ ܣܓܝܐ̈ܐ (Multimedia)',
@@ -1179,6 +1188,14 @@ $1',
 'listusers-noresult' => 'ܠܐ ܐܫܬܟܚ ܡܦܠܚܢܐ ܚܕ.',
 'listusers-blocked' => '(ܚܪܝܡܐ)',
 
+# Special:ActiveUsers
+'activeusers' => 'ܡܟܬܒܘܬܐ ܕܗܕ̈ܡܐ ܙܪ̄ܝܙܐ',
+'activeusers-count' => '$1 {{PLURAL:$1|ܥܒܕܐ|ܥܒܕ̈ܐ}} ܒ {{PLURAL:$3|ܝܘܡܐ ܐܚܪܝܐ|$3 ܝܘܡܬ̈ܐ ܐܚܪ̈ܝܐ}}',
+'activeusers-from' => 'ܚܘܝ ܡܦܠܚܢ̈ܐ ܕܫܪܐ ܥܡ:',
+'activeusers-hidebots' => 'ܛܫܝ ܒܘܬ̈ܐ (bots)',
+'activeusers-hidesysops' => 'ܛܫܝ ܡܕܒܪ̈ܢܐ',
+'activeusers-noresult' => 'ܠܐ ܐܫܬܟܚ ܡܦܠܚܢ̈ܐ ܐܢܫ̈ܝܢ.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'ܙܕ̈ܩܐ ܕܟܢܘܫܬܐ ܕܡܦܠܚܢ̈ܐ',
 'listgrouprights-group' => 'ܟܢܘܫܬܐ',
@@ -1233,7 +1250,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' => 'ܨܒܝܢܝܘܬ̈ܐ ܕܪ̈ܗܝܬܐ',
@@ -1347,7 +1364,7 @@ $1',
 'blanknamespace' => '(ܪܫܝܬܐ)',
 
 # Contributions
-'contributions' => 'ܫܘܬܦܘ̈ܬܐ ܕܡܦܠܚܢܐ',
+'contributions' => 'ܫܘܬܦܘ̈ܬܐ {{GENDER:$1|ܕܡܦܠܚܢܐ|ܕܡܦܠܚܢܬܐ}}',
 'contributions-title' => 'ܫܘܬܦܘ̈ܬܐ ܕܡܦܠܚܢܐ ܠ$1',
 'mycontris' => 'ܫܘܬܦܘ̈ܬܐ',
 'contribsub2' => 'ܕ $1 ($2)',
@@ -1635,7 +1652,7 @@ $1',
 'metadata-expand' => 'ܚܘܝ ܐܪ̈ܝܟܬܐ ܪ̈ܘܝܚܬܐ',
 'metadata-collapse' => 'ܛܫܝ ܐܪ̈ܝܟܬܐ ܪ̈ܘܝܚܬܐ',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ܦܬܘܐ',
 'exif-imagelength' => 'ܐܘܪܟܐ',
 'exif-xresolution' => 'ܢܩܕܘܬܐ ܐܘܦܩܝܬܐ',
@@ -1765,11 +1782,6 @@ $1',
 'version-poweredby-others' => 'ܐܚܪ̈ܢܐ',
 'version-software-version' => 'ܨܚܚܐ',
 
-# Special:FilePath
-'filepath' => 'ܫܒܝܠܐ ܕܠܦܦܐ',
-'filepath-page' => 'ܠܦܦܐ',
-'filepath-submit' => 'ܙܠ',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ܒܨܝ ܥܠ ܠܦܦ̈ܐ ܥܦܝܦ̈ܐ',
 'fileduplicatesearch-legend' => 'ܒܨܝܐ ܥܠ ܥܘܦܦܐ',
index 7ece867..b965f8c 100644 (file)
@@ -192,7 +192,6 @@ $messages = array(
 'disclaimers' => 'Tukuldungun ñi pin ley',
 'disclaimerpage' => 'Project:Katrütuwün ñi llowdüngun',
 'edithelp' => 'Kellü wirin',
-'edithelppage' => 'Help:Chum wiringekey pakina',
 'helppage' => 'Help:Trokiñdungu',
 'mainpage' => 'Ñidol Wülngiñ',
 'mainpage-description' => 'Ñidol Wülngiñ',
@@ -407,7 +406,6 @@ Rulpakünuy feychi kangelkülelu dungu.",
 'viewprevnext' => 'Pen ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''Müley kiñe wülngiñ «[[:$1]]» pingelu feychi wiki mew'''",
 'searchmenu-new' => "'''¡Llitun pakina «[[:$1]]» tüfachi wiki mew!'''",
-'searchhelp-url' => 'Help:Trokiñdungu',
 'searchprofile-articles' => 'Trokiñdungu wülngiñ',
 'searchprofile-project' => 'Kellu wülngiñ ka Deumandungu wülngiñ',
 'searchprofile-images' => 'Fill dungu (adentun, dungun, fidew)',
@@ -636,7 +634,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 +886,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..b0d0406 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',
@@ -259,7 +257,6 @@ $1',
 'disclaimers' => 'Inḍaraṫ',
 'disclaimerpage' => 'Project:Inḍaraṫ ĝammin',
 'edithelp' => 'Mosaĝada',
-'edithelppage' => 'Help:Kifaċ tṣayeb ċi ṣ-ṣefḫa',
 'helppage' => 'Help:Meḍmon',
 'mainpage' => 'Ṣ-Ṣefḫa l-owla',
 'mainpage-description' => 'Ṣ-Ṣefḫa l-owla',
@@ -543,10 +540,8 @@ ymkn ṫkon bddalṫiha bĝda wlla ṫlbti klmṫ srr mo'qaṫa jdida.",
 
 # Special:PasswordReset
 'passwordreset' => 'ĝawd klmṫ s-srr',
-'passwordreset-text' => 'ĝmmer had l-istimara baċ iwṣlek email ṫaĝ ṫdkir b-ṫṫafaṣil dl-ḫisab ṫaĝk.',
 'passwordreset-legend' => 'ĝawd klmṫ s-srr',
 'passwordreset-disabled' => 'maymkn-ċ ṫĝawd klmṫ s-srr f-had l-wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||kṫb wḫda mn l-bayanaṫ l-ṫḫṫ}}',
 'passwordreset-username' => 'smiṫ l-mosṫĥdim:',
 'passwordreset-email' => 'ĝonwan l-email:',
 'passwordreset-emailtitle' => 'ṫafaṣil l-ḫisab f-{{SITENAME}}',
@@ -931,7 +926,6 @@ $1",
 'searchmenu-legend' => 'khiyarat lbaht',
 'searchmenu-exists' => "'''ḫṫṫa ṣfḫa f-had l-wiki ma smiṫha \"[[:\$1]]\".'''",
 'searchmenu-new' => "'''ṣayb f-had l-wiki ṣfḫṫ \"[[:\$1]]\"!'''",
-'searchhelp-url' => 'Help:Meḍmon',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ṫṣffeh ṣfaḫi b-had ṣ-ṣabiqa]]',
 'searchprofile-articles' => 'sfht mohtawa',
 'searchprofile-project' => 'sfhai dyal lmossada ol mchroa',
@@ -976,15 +970,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 +1359,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 +1660,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 +2151,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 +2204,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 +2608,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..2d42bac 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' => 'ابدا',
@@ -518,7 +517,7 @@ $messages = array(
 'lastmodifiedat' => 'الصفحه دى اتعدلت اخر مره فى $1,‏ $2.',
 'viewcount' => 'الصفحة دى اتدخل عليها{{PLURAL:$1|مرة واحدة|مرتين|$1 مرات|$1 مرة}}.',
 'protectedpage' => 'صفحه محميه',
-'jumpto' => 'نُط على:',
+'jumpto' => 'روح على:',
 'jumptonavigation' => 'استكشاف',
 'jumptosearch' => 'تدوير',
 'view-pool-error' => 'متأسفين, السيرفرات عليها حمل كبير دلوقتى.
@@ -540,7 +539,6 @@ $1',
 'disclaimers' => 'تنازل عن مسئوليه',
 'disclaimerpage' => 'Project:تنازل عن مسئوليه عمومى',
 'edithelp' => 'مساعده فى التعديل',
-'edithelppage' => 'Help:تعديل',
 'helppage' => 'Help:محتويات',
 'mainpage' => 'الصفحه الرئيسيه',
 'mainpage-description' => 'الصفحه الرئيسيه',
@@ -980,6 +978,8 @@ $2',
 'edit-no-change' => 'تعديلك تم تجاهله، لأن ما حصلش أى تعديل للنص.',
 'edit-already-exists' => 'لم يمكن إنشاء صفحة جديدة.
 هى موجودة بالفعل.',
+'editwarning-warning' => 'لو سيبت الصفحه دى ممكن يخلّيك تضيّع اى تغييرات عملتها.
+لو انت مسجّل دخولك, ممكن تعطّل التحذير ده من الجزء بتاع "تعديل" فى تفضيلاتك.',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'تحذير: الصفحه دى فيهااستدعاءات دالة محلل كثيرة مكلفة.
@@ -1200,7 +1200,6 @@ $1",
 'searchmenu-legend' => 'اختيارات التدوير',
 'searchmenu-exists' => "*الصفحة '''[[$1]]'''",
 'searchmenu-new' => "'''ابتدى الصفحه \"[[:\$1]]\" ع الويكى دا!'''",
-'searchhelp-url' => 'Help:محتويات',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|استعرض الصفحات اللى بتبتدى بالبريفيكس دا]]',
 'searchprofile-articles' => 'صفحات محتوى',
 'searchprofile-project' => 'صفحات  المساعده و المشروع',
@@ -1245,14 +1244,6 @@ $1",
 ممكن تدور فى جوجل دلوقتي.
 لاحظ أن فهارسه لمحتوى {{SITENAME}} يمكن تكون مش متحدثة.',
 
-# Quickbar
-'qbsettings' => 'البار السريع',
-'qbsettings-none' => 'ما فى ش',
-'qbsettings-fixedleft' => 'متثبت فى الشمال',
-'qbsettings-fixedright' => 'متثبت فى اليمين',
-'qbsettings-floatingleft' => 'عايم على الشمال',
-'qbsettings-floatingright' => 'عايم على اليمين',
-
 # Preferences page
 'preferences' => 'تفضيلات',
 'mypreferences' => 'تفضيلاتى',
@@ -1716,7 +1707,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 +2079,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,12 +2308,12 @@ $1',
 'blanknamespace' => '(رئيسى)',
 
 # Contributions
-'contributions' => 'تعديلات اليوزر',
+'contributions' => 'تعديلات اليوزر {{GENDER:$1|اليوزر|اليوزره}}',
 'contributions-title' => 'مساهمات اليوزر ل$1',
 'mycontris' => 'تعديلاتى',
 'contribsub2' => 'لليوزر $1 ($2)',
 'nocontribs' => 'مالقيناش   تغييرات تطابق المحددات دي.',
-'uctop' => '(فوق)',
+'uctop' => '(آخر تعديل)',
 'month' => 'من شهر (واللى قبل كده):',
 'year' => 'من سنة (واللى قبل كده):',
 
@@ -2738,27 +2728,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 +2766,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 +2862,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'العرض',
 'exif-imagelength' => 'الطول',
 'exif-bitspersample' => 'بتس لكل مكون',
@@ -3004,7 +2978,7 @@ $1',
 'exif-gpsdatestamp' => 'تاريخ GPS',
 'exif-gpsdifferential' => 'تصحيح GPS التفاضلي',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'مش مضغوط',
 'exif-compression-6' => 'جيه بى إى جي',
 
@@ -3385,13 +3359,6 @@ $5
 'version-software-product' => 'المنتج',
 'version-software-version' => 'النسخه',
 
-# Special:FilePath
-'filepath' => 'مسار ملف',
-'filepath-page' => 'الملف:',
-'filepath-submit' => 'المسار',
-'filepath-summary' => 'الصفحة المخصوصة دى بتعرض المسار الكامل  بتاع ملف.
-الصور بتتعرض  بدقة كاملة، أنواع الملفات التانية ح تشتغل فى البرنامج بتاعهم مباشرة.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'دور على الملفات المتكررة',
 'fileduplicatesearch-summary' => 'دور على الملفات المتكررة على اساس قيمة الهاش بتاعتها.',
index f4f242e..90f53d8 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
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Bishnu Saikia
+ * @author Britul
  * @author Chaipau
  * @author Gahori
  * @author Gitartha.bordoloi
@@ -183,7 +184,7 @@ $digitGroupingPattern = "##,##,###";
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'সংযোগ সমূহ অধোৰেখিত কৰক:',
+'tog-underline' => 'সংযোগসমূহ অধোৰেখিত কৰক:',
 'tog-justify' => 'দফাৰ সীমা সমান কৰাক',
 'tog-hideminor' => 'সাম্প্ৰতিক সাল-সলনিত অগুৰুত্বপূৰ্ণ সম্পাদনা নেদেখুৱাব',
 'tog-hidepatrolled' => 'সাম্প্ৰতিক সাল-সলনিত তহলদাৰী সম্পাদনা নেদেখুৱাব',
@@ -212,8 +213,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 +226,7 @@ $messages = array(
 'tog-diffonly' => 'পার্থক্যৰ তলত পৃষ্ঠাৰ বিষয়বস্তু নেদেখুৱাব',
 'tog-showhiddencats' => 'নিহিত শ্ৰেণী সমূহ দেখুৱাওক',
 'tog-norollbackdiff' => 'পূৰ্বৱত কৰা পাছত পাৰ্থক্য নেদেখুৱাব',
+'tog-useeditwarning' => 'সালসলনি সংৰক্ষণ নকৰাকৈ সম্পাদনা পৃষ্ঠা ত্যাগৰ সময়ত মোক সাৱধান কৰক',
 
 'underline-always' => 'সদায়',
 'underline-never' => 'কেতিয়াও নহয়',
@@ -240,14 +240,14 @@ $messages = array(
 'editfont-serif' => 'চেৰিফ ফন্ট',
 
 # Dates
-'sunday' => 'দà§\87à¦\93à¦\81বাৰ',
+'sunday' => 'দেওবাৰ',
 'monday' => 'সোমবাৰ',
 'tuesday' => 'মঙ্গলবাৰ',
 'wednesday' => 'বুধবাৰ',
 'thursday' => 'বৃহস্পতিবাৰ',
 'friday' => 'শুক্ৰবাৰ',
 'saturday' => 'শণিবাৰ',
-'sun' => 'দেও',
+'sun' => 'দেও',
 'mon' => 'সোম',
 'tue' => 'মংগল',
 'wed' => 'বুধ',
@@ -282,7 +282,7 @@ $messages = array(
 'feb' => 'ফেব্ৰুৱাৰী:',
 'mar' => 'মাৰ্চ',
 'apr' => 'এপ্ৰিল',
-'may' => 'মে',
+'may' => "মে'",
 'jun' => 'জুন',
 'jul' => 'জুলাই',
 'aug' => 'আগষ্ট',
@@ -290,6 +290,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,19 +370,20 @@ $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' => 'এই পৃষ্ঠাখন বিলোপ কৰক',
+'undeletethispage' => 'এই পৃষ্ঠা পুনৰুদ্ধাৰ কৰক',
 'undelete_short' => '{{PLURAL:$1|বিলোপিত পৃষ্ঠাৰ|$1 সংখ্যক বিলোপিত পৃষ্ঠাৰ}} পূৰ্ববৎকৰণ',
 'viewdeleted_short' => '{{PLURAL:$1| এটা বিলুপ্ত সম্পাদনা|$1 টা বিলুপ্ত সম্পাদনা}} দেখুৱাওক',
 'protect' => 'সুৰক্ষিত কৰক',
@@ -424,7 +437,6 @@ $1',
 'disclaimers' => 'দায়লুপ্তি',
 'disclaimerpage' => 'Project:সাধাৰণ দায়লুপ্তি',
 'edithelp' => 'সম্পাদনাৰ বাবে সহায়',
-'edithelppage' => 'Help:সম্পাদনা',
 'helppage' => 'Help:সমল',
 'mainpage' => 'বেটুপাত',
 'mainpage-description' => 'বেটুপাত',
@@ -527,7 +539,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 +550,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' => 'হুকৰ দ্বাৰা সম্পাদনা প্ৰত্যাখ্যান কৰা হৈছে ।
 ইয়াৰ কোনো ব্যাখ্যা নাই ।',
@@ -571,6 +583,8 @@ $2',
 'namespaceprotected' => "আপোনাৰ '''$1''' নামস্থানৰ পৃষ্ঠাসমূহ সম্পাদনা কৰাৰ অধিকাৰ নাই।",
 'customcssprotected' => 'এই CSS পৃষ্ঠা সম্পাদনা কৰাৰ অধিকাৰ আপোনাৰ নাই, কাৰণ ইয়াত আন সদস্যৰ ব্যক্তিগত পছন্দসমূহত আছে ।',
 'customjsprotected' => 'এই জাভালিপিৰ পৃষ্ঠা সম্পাদনা কৰাৰ অধিকাৰ আপোনাৰ নাই, কাৰণ ইয়াত আন সদস্যৰ ব্যক্তিগত পছন্দসমূহত আছে ।',
+'mycustomcssprotected' => 'এই CSS পৃষ্ঠা সম্পাদনা কৰিবলৈ আপোনাৰ অনুমতি নাই।',
+'mycustomjsprotected' => 'এই JavaScript পৃষ্ঠা সম্পাদনা কৰিবলৈ আপোনাৰ অনুমতি নাই।',
 'ns-specialprotected' => 'বিশেষ পৃষ্ঠা সম্পাদিত কৰিব নোৱাৰি।',
 'titleprotected' => "[[User:$1|$1]] সদস্যজনে এই শিৰোনাণমাৰ লিখনী লিখা ৰোধ কৰিছে ।
 ইয়াৰ কাৰণ হৈছে ''$2'' ।",
@@ -596,9 +610,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 +634,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 +708,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 বজাত নিশ্চিত কৰা হৈছিল ।',
@@ -678,7 +721,7 @@ $2',
 'cannotchangeemail' => 'এই ৱিকিত একাউন্ট ই-মেইল ঠিকনা সলনি কৰিব পৰা নাযায়',
 'emaildisabled' => 'এই ছাইটে ইমেইল পঠিয়াব নোৱাৰে',
 'accountcreated' => "একাউণ্ট সৃষ্টি কৰা হ'ল",
-'accountcreatedtext' => "$1ৰ কাৰণে সদস্য একাউণ্ট সৃষ্টি কৰা হ'ল।",
+'accountcreatedtext' => "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]])ৰ কাৰণে সদস্য একাউণ্ট সৃষ্টি কৰা হ'ল।",
 'createaccount-title' => '{{SITENAME}}ৰ কাৰণে একাউণ্ট সৃষ্টি কৰক।',
 'createaccount-text' => 'আপোনাৰ ই-মেইল ঠিকনাৰ কাৰণে {{SITENAME}} ($4)ত "$2" নামৰ কোনোবাই, "$3" গুপ্তশব্দ দি সদস্যভুক্তি কৰিছে। অনুগ্ৰহ কৰি আপুনি প্ৰৱেশ কৰক আৰু গুপ্তশব্দটো সলনি কৰক।
 
@@ -703,7 +746,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 +755,18 @@ $2',
 'resetpass-wrong-oldpass' => 'অস্থায়ী বা সাম্প্ৰতিক গুপ্তশব্দ গ্ৰহণযোগ্য নহয় ।
 হয়টো আপুনি ইতিমধ্যেই সফলভাবে আপুনাৰ গুপ্তশব্দ সলনি কৰিছিল বা এটা নতুন অস্থায়ী গুপ্তশব্দৰ বাবে অনুৰোধ কৰিছিল ।',
 'resetpass-temp-password' => 'অস্থায়ী গুপ্তশব্দ:',
+'resetpass-abort-generic' => 'এটা এক্সটেন্‌ছনৰদ্বাৰা গুপ্তশব্দ সলনি কাৰ্য বাতিল কৰা হৈছে।',
 
 # Special:PasswordReset
-'passwordreset' => 'গুপ্তশব্দ ন-কৈ বহাওক',
-'passwordreset-text' => ' আপোনাৰ গুপ্তশব্দ ন-কৈ বহুৱাবলৈ তলৰ প্ৰপত্ৰ সম্পূৰ্ণ কৰক।',
+'passwordreset' => 'à¦\97à§\81পà§\8dতশবà§\8dদ à¦¨-à¦\95à§\88 à¦¬à¦¹à§\81ৱাà¦\93à¦\95',
+'passwordreset-text-one' => 'আপোনাৰ গুপ্তশব্দ ন-কৈ বহুৱাবলৈ এই প্ৰপত্ৰ পূৰণ কৰক।',
 '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 +783,7 @@ $2
 অস্থায়ী গুপ্তশব্দ: $2',
 'passwordreset-emailsent' => 'এখন গুপ্তশব্দ উদ্ধাৰ ই-মেইল পঠিওৱা হৈছে।',
 'passwordreset-emailsent-capture' => 'এখন গুপ্তশব্দ উদ্ধাৰ ইমেইল পঠিওৱা হৈছে, এইখন তলত দেখা পাব।',
-'passwordreset-emailerror-capture' => "এখন গুপ্তশব্দ উদ্ধাৰ ইমেইল সৃষ্টি কৰা হ'ল কিন্তু সদস্যজনলৈ পঠিয়াব পৰা নগ'ল, এইখন তলত দেখুওৱা হৈছে: $1",
+'passwordreset-emailerror-capture' => "এখন গুপ্তশব্দ উদ্ধাৰ ইমেইল সৃষ্টি কৰা হ'ল, কিন্তু {{GENDER:$2|সদস্যজনলৈ}} পঠিয়াব পৰা নগ'ল। সেইখন তলত দেখুওৱা হৈছে: $1",
 
 # Special:ChangeEmail
 'changeemail' => 'ই-মেইল ঠিকনা সলনি কৰক',
@@ -775,7 +819,7 @@ $2
 'summary' => 'সাৰাংশ:',
 'subject' => 'বিষয় / শীৰ্ষক:',
 'minoredit' => 'এইটো এটা অগুৰুত্বপূৰ্ণ সম্পাদনা',
-'watchthis' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\9fà§\8b লক্ষ্য কৰক',
+'watchthis' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\96ন লক্ষ্য কৰক',
 'savearticle' => 'পৃষ্ঠা সাঁচক',
 'preview' => 'খচৰা',
 'showpreview' => 'খচৰা চাওক',
@@ -791,7 +835,7 @@ $2
 যদি আকৌ এবাৰ যদি \"{{int:savearticle}}\" টিপে, তেনেহলে সম্পাদনা শিৰোনামা অবিহনে সংৰক্ষিত হব।",
 'summary-preview' => 'সাৰাংশৰ খচৰা:',
 'subject-preview' => 'বিষয়/শিৰোনামাৰ খচৰা:',
-'blockedtitle' => 'সদসà§\8dযà¦\9cনà¦\95 à¦\85বৰোধ কৰা হৈছে',
+'blockedtitle' => 'সদসà§\8dযà¦\9cনà¦\95 à¦\85ৱৰোধ কৰা হৈছে',
 'blockedtext' => "'''আপোনাৰ সদস্যনাম অথবা আই-পি ঠিকনা অৱৰোধ কৰা হৈছে ।'''
 
 $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
@@ -897,7 +941,7 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 'creating' => '$1 পৃষ্ঠাখন আপুনি সৃষ্টি কৰি আছে',
 'editingsection' => '$1 (অনুচ্ছেদ) সম্পাদনা কৰি আছে',
 'editingcomment' => '$1 (নতুন অনুচ্ছেদ) সম্পাদনা কৰি আছে',
-'editconflict' => 'সম্পাদনা দ্বন্দ: $1',
+'editconflict' => 'সম্পাদনা দ্বন্দ্ব: $1',
 'explainconflict' => "আপুনি সম্পাদনা আৰম্ভ কৰাৰ পাছত আন কোনোবাই এই পৃষ্ঠাখন সলনি কৰিলে।
 পাঠ্য-স্থানৰ উপৰ ভাগত এই পৃষ্ঠাৰ প্ৰচলিত পাঠ্য দিয়া হৈছে।
 আপোনাৰ সলনিসমূহ পাঠ্য-স্থানৰ তলৰ ভাগত দেখুওৱা হৈছে।
@@ -958,19 +1002,21 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 ইয়াৰ কোনো ব্যাখ্যা নাই ।',
 'edit-gone-missing' => 'পৃষ্ঠাখন নবীকৰণ কৰিব পৰা নগ’ল ।
 সম্ভৱতঃ পৃষ্ঠাখন বিলোপ কৰা হৈছে ।',
-'edit-conflict' => 'সম্পাদনা দ্বন্দ ।',
+'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' => '[[$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 +1119,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 +1142,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 +1217,7 @@ $1",
 # Merge log
 'mergelog' => 'অভিলেখ একত্ৰীকৰণ',
 'pagemerge-logentry' => "[[$1]] [[$2]]-ত মিলোৱা হ'ল (সংশোধনসমূহ $3-লৈ)",
-'revertmerge' => 'à¦\8fà¦\95তà§\8dৰিকৰণ বাতিল কৰক',
+'revertmerge' => 'à¦\8fà¦\95তà§\8dৰà§\80কৰণ বাতিল কৰক',
 'mergelogpagetext' => 'এখন পৃষ্ঠাৰ ইতিহাস আন এখনৰ লগত কৰা একত্ৰীকৰণৰ সকলোতকৈ শেহতীয়া তালিকা তলত দিয়া হ’ল ।',
 
 # Diffs
@@ -1199,7 +1245,7 @@ $1",
 'searchsubtitleinvalid' => "আপোনাৰ অনুসন্ধান হ'ল '''$1'''",
 'toomanymatches' => "বহুত বেছি মিল পোৱা গৈছে, সন্ধান-শব্দ সলনি কৰিবলৈ অনুৰোধ কৰা হ'ল",
 'titlematches' => 'পৃষ্ঠাৰ শিৰোনামা মিলিছে',
-'notitlematches' => 'à¦\8fà¦\9fাà¦\93 à¦ªà§\83ষà§\8dঠাৰ শিৰোনামা মিলা নাই',
+'notitlematches' => 'à¦\8fà¦\96ন à¦ªà§\83ষà§\8dঠাৰà§\8b শিৰোনামা মিলা নাই',
 'textmatches' => 'পৃষ্ঠাৰ পাঠ মিলিছে',
 'notextmatches' => 'কোনো পৃষ্ঠাৰ পাঠ মিলা নাই',
 'prevn' => 'পূৰ্বৱৰ্তী {{PLURAL:$1|$1}}টা',
@@ -1211,7 +1257,6 @@ $1",
 'searchmenu-legend' => 'সন্ধান বিকল্পসমূহ',
 'searchmenu-exists' => 'এই ৱিকিত "[[:$1]]" নামৰ পৃষ্ঠা এখন আছে ।',
 'searchmenu-new' => "'''এই ৱিকিত \"[[:\$1]]\" পৃষ্ঠাখন সৃষ্টি কৰক!'''",
-'searchhelp-url' => 'Help:সমল',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|এই উপসৰ্গ থকা পৃষ্ঠাসমূহ ব্ৰাউজ কৰক]]',
 'searchprofile-articles' => 'বিষয়বস্তুৰ পৃষ্ঠা',
 'searchprofile-project' => 'সহায় আৰু প্ৰকল্প পৃষ্ঠাসমূহ',
@@ -1255,15 +1300,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 +1309,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 +1409,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 +1444,8 @@ $1",
 'userrights-notallowed' => 'সদস্যৰ অধিকাৰ যোগ কৰিবলৈ বা আঁতৰ কৰিবলৈ আপোনাৰ একাউণ্টৰ অনুমতি নাই ।',
 'userrights-changeable-col' => 'আপুনি সলনি কৰিব পৰা গোটসমূহ',
 'userrights-unchangeable-col' => 'আপুনি সলনি কৰিব নোৱাৰা গোটসমূহ',
+'userrights-conflict' => 'সদস্য অধিকাৰ দ্বন্দ্ব! অনুগ্ৰহ কৰি আপোনাৰ সালসলনি আকৌ এবাৰ প্ৰয়োগ কৰক।',
+'userrights-removed-self' => 'আপুনি সফলতাৰে নিজৰ অধিকাৰসমূহ আঁতৰ কৰিলে। গতিকে আপুনি এতিয়া এই পৃষ্ঠা চাব নোৱাৰে।',
 
 # Groups
 'group' => 'গোট:',
@@ -1451,7 +1490,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' => 'ৰাইট এ.পি.আই.ৰ ব্যৱহাৰ',
@@ -1477,6 +1516,9 @@ $1",
 'right-editusercssjs' => 'আন সদস্যৰ CSS আৰু JavaScript  সম্পাদনা কৰক',
 'right-editusercss' => 'আন সদস্যৰ CSS ফাইল সম্পাদনা কৰক',
 'right-edituserjs' => 'আন সদস্যৰ JavaScript ফাইল  সম্পাদনা কৰক',
+'right-editmyusercss' => 'আপোনাৰ নিজৰ সদস্য CSS ফাইলসমূহ সম্পাদনা কৰক।',
+'right-editmyuserjs' => 'আপোনাৰ নিজৰ সদস্য JavaScript ফাইলসমূহ সম্পাদনা কৰক',
+'right-viewmywatchlist' => 'আপোনাৰ নিজৰ লক্ষ্য-তালিকা চাওক',
 'right-rollback' => 'শেষৰজন সদস্যই এখন নিৰ্দিষ্ট পৃষ্টাত কৰা সম্পাদনা পূৰ্বৰ অৱস্থালৈ ঘূৰাই আনক',
 'right-markbotedits' => 'ৰ’ল্ড-বেক সম্পাদনাসমূহ বট সম্পাদনা বুলি চিহ্নিত কৰক',
 'right-noratelimit' => 'গতি সীমাৰ দ্বাৰা প্ৰভাৱিত নহ’ব',
@@ -1816,7 +1858,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 +2017,10 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 তাৰ সলনি সেইবোৰত উপযুক্ত পৃষ্ঠাৰ লগত সংযোগ থাকিব পাৰে।
 [[MediaWiki:Disambiguationspage]]ৰ পৰা সংযোগ থকা কোনো সাঁচ ব্যৱহাৰ কৰিলে এখন পৃষ্ঠাক দ্ব্যৰ্থতা দূৰীকৰণ পৃষ্ঠা হিছাপে গণ্য কৰা হয়।",
 
+'pageswithprop' => 'পৃষ্ঠা উপাদান সম্বলিত পৃষ্ঠাসমূহ',
+'pageswithprop-legend' => 'পৃষ্ঠা উপাদান সম্বলিত পৃষ্ঠাসমূহ',
+'pageswithprop-text' => 'বিশেষ পৃষ্ঠা উপাদান ব্যৱহাৰ কৰা পৃষ্ঠাসমূহ ইয়াত তালিকাভুক্ত কৰা হৈছে।',
+'pageswithprop-prop' => 'উপাদান নাম:',
 'pageswithprop-submit' => 'যাওক',
 
 'doubleredirects' => 'দ্বি-পুনঃনিৰ্দেশিত',
@@ -2142,9 +2187,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 +2272,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|পৃষ্ঠা|পৃষ্ঠা}} আছে ।',
@@ -2483,7 +2528,7 @@ $1',
 'mycontris' => 'বৰঙণিসমূহ',
 'contribsub2' => '$1 ৰ কাৰণে ($2)',
 'nocontribs' => 'এই গুণসমূহৰ লগত মিল থকা কোনো সালসলনি পোৱা নগ’ল ।',
-'uctop' => '(à¦\93পৰত)',
+'uctop' => '(বৰà§\8dতমান)',
 'month' => 'এই মাহৰ পৰা (আৰু আগৰ):',
 'year' => 'এই বছৰৰ পৰা (আৰু আগৰ):',
 
@@ -2816,6 +2861,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 +2921,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 +3055,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|অপুনৰ্নিৰ্দেশ নাই|অপুনৰ্নিৰ্দেশসমূহ}})',
@@ -3021,6 +3070,7 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 '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' => 'তথ্য',
@@ -3029,6 +3079,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 +3159,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 +3207,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 +3385,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 +3805,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' => 'প্ৰতিলিপি পৃষ্ঠাসমূহ অনুসন্ধান কৰক',
@@ -3832,17 +3907,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 +3942,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 +4003,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 +4024,7 @@ $5
 'duration-centuries' => '$1 {{PLURAL:$1|শতাব্দী|শতাব্দী}}',
 'duration-millennia' => '$1 {{PLURAL:$1|সহস্ৰাব্দ|সহস্ৰাব্দ}}',
 
+# Image rotation
+'rotate-comment' => 'ছবিখন ঘড়ীৰ কাটাৰ দিশত $1 {{PLURAL:$1|ডিগ্ৰী}} ঘূৰোৱা হৈছে।',
+
 );
index 216c52f..c12139b 100644 (file)
  */
 
 $namespaceNames = array(
-       NS_MEDIA            => 'Media',
+       NS_MEDIA            => 'Medios',
        NS_SPECIAL          => 'Especial',
        NS_TALK             => 'Alderique',
        NS_USER             => 'Usuariu',
        NS_USER_TALK        => 'Usuariu_alderique',
        NS_PROJECT_TALK     => '$1_alderique',
-       NS_FILE             => 'Archivu',
-       NS_FILE_TALK        => 'Archivu_alderique',
+       NS_FILE             => 'Ficheru',
+       NS_FILE_TALK        => 'Ficheru_alderique',
        NS_MEDIAWIKI        => 'MediaWiki',
        NS_MEDIAWIKI_TALK   => 'MediaWiki_alderique',
        NS_TEMPLATE         => 'Plantía',
        NS_TEMPLATE_TALK    => 'Plantía_alderique',
-       NS_HELP             => 'Aida',
-       NS_HELP_TALK        => 'Aida_alderique',
+       NS_HELP             => 'Ayuda',
+       NS_HELP_TALK        => 'Ayuda_alderique',
        NS_CATEGORY         => 'Categoría',
        NS_CATEGORY_TALK    => 'Categoría_alderique',
 );
 
 $namespaceAliases = array(
-       'Imaxe' => NS_FILE,
-       'Imaxe alderique' => NS_FILE_TALK,
+       'Imaxe'               => NS_FILE,
+       'Imaxe alderique'     => NS_FILE_TALK,
        'Discusión'           => NS_TALK,
        'Usuariu_discusión'   => NS_USER_TALK,
        '$1_discusión'        => NS_PROJECT_TALK,
        'Imaxen'              => NS_FILE,
        'Imaxen_discusión'    => NS_FILE_TALK,
+       'Archivu'             => NS_FILE,
+       'Archivu_alderique'   => NS_FILE_TALK,
        'MediaWiki_discusión' => NS_MEDIAWIKI_TALK,
        'Plantilla'           => NS_TEMPLATE,
        'Plantilla_discusión' => NS_TEMPLATE_TALK,
-       'Ayuda'               => NS_HELP,
        'Ayuda_discusión'     => NS_HELP_TALK,
+       'Aida'                => NS_HELP,
+       'Aida_alderique'      => NS_HELP_TALK,
        'Categoría_discusión' => NS_CATEGORY_TALK,
 );
 
 $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 +81,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",
@@ -110,7 +114,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',
@@ -166,6 +170,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}}',
@@ -199,14 +215,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',
@@ -215,7 +231,7 @@ $messages = array(
 'vector-action-protect' => 'Protexer',
 'vector-action-undelete' => 'Restaurar',
 'vector-action-unprotect' => 'Camudar la proteición',
-'vector-simplesearch-preference' => 'Activar la barra de gueta simplificada (namái apariencia Vector)',
+'vector-simplesearch-preference' => 'Activar la barra de búsqueda simplificada (namái tema Vector)',
 'vector-view-create' => 'Crear',
 'vector-view-edit' => 'Editar',
 'vector-view-history' => 'Ver historial',
@@ -230,8 +246,8 @@ $messages = array(
 'returnto' => 'Tornar a $1.',
 'tagline' => 'De {{SITENAME}}',
 'help' => 'Ayuda',
-'search' => 'Guetar',
-'searchbutton' => 'Guetar',
+'search' => 'Buscar',
+'searchbutton' => 'Buscar',
 'go' => 'Dir',
 'searcharticle' => 'Dir',
 'history' => 'Historial de la páxina',
@@ -247,6 +263,7 @@ $messages = array(
 'create-this-page' => 'Crear esta páxina',
 'delete' => 'Desaniciar',
 'deletethispage' => 'Desaniciar esta páxina',
+'undeletethispage' => 'Restaurar esta páxina',
 'undelete_short' => 'Restaurar {{PLURAL:$1|una edición|$1 ediciones}}',
 'viewdeleted_short' => 'Ver {{PLURAL:$1|una edición desaniciada|$1 ediciones desaniciaes}}',
 'protect' => 'Protexer',
@@ -267,7 +284,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',
@@ -280,12 +297,12 @@ $messages = array(
 'protectedpage' => 'Páxina protexida',
 '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.
+'jumptosearch' => 'buscar',
+'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',
@@ -293,14 +310,13 @@ $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",
-'edithelppage' => 'Help:Cómo editar una páxina',
 'helppage' => 'Help:Conteníu',
 'mainpage' => 'Portada',
 'mainpage-description' => 'Portada',
@@ -312,7 +328,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]].',
@@ -342,11 +358,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',
@@ -383,11 +399,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',
@@ -401,7 +417,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',
@@ -411,8 +427,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.',
@@ -423,16 +439,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.',
@@ -445,20 +461,22 @@ 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.",
+'mycustomcssprotected' => 'Nun tien permisu pa editar esta páxina CSS.',
+'mycustomjsprotected' => 'Nun tien permisu pa editar esta páxina JavaScript.',
 '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»",
-'exception-nologin' => 'Non identificáu',
+'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' => 'Nun anició sesión',
 'exception-nologin-text' => "Esta páxina o aición necesita qu'anicies sesión nesta wiki.",
 
 # Virus scanner
@@ -473,143 +491,174 @@ 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.",
-'login' => 'Identificase',
-'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',
-'userlogout' => 'Colar',
-'notloggedin' => 'Non identificáu',
+'login' => 'Entrar',
+'nav-login-createaccount' => 'Entrar / crear cuenta',
+'loginprompt' => "Ha de tener les «cookies» activaes p'aniciar sesión en {{SITENAME}}.",
+'userlogin' => 'Entrar / crear cuenta',
+'userloginnocreate' => 'Aniciar sesión',
+'logout' => 'Salir',
+'userlogout' => 'Salir',
+'notloggedin' => 'Nun anició sesión',
+'userlogin-noaccount' => '¿Nun tien una cuenta?',
+'userlogin-joinproject' => 'Xunise a {{SITENAME}}',
 'nologin' => '¿Nun tienes una cuenta? $1.',
 'nologinlink' => 'Crear una cuenta',
 'createaccount' => 'Crear una cuenta',
-'gotaccount' => '¿Ya tienes una cuenta? $1.',
-'gotaccountlink' => 'Identificase',
-'userlogin-resetlink' => "¿Escaecisti los datos d'identificación?",
+'gotaccount' => '¿Yá tienes una cuenta? $1.',
+'gotaccountlink' => 'Entrar',
+'userlogin-resetlink' => "¿Escaeció los datos d'accesu?",
+'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 anició 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.",
+Tien les «cookies» desactivaes.
+Por favor activeles y anicie sesión col nuevu nome d'usuariu y contraseña.",
 'nocookieslogin' => '{{SITENAME}} usa «cookies» pa identificar a los usuarios.
-Tienes les «cookies» desactivaes.
-Por favor actívales y vuelvi intentalo.',
+Tien les «cookies» desactivaes.
+Por favor activeles y vuelva 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.",
+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.",
+'accountcreatedtext' => "Creóse la cuenta d'usuariu pa [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|alderique]]).",
 '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',
+'login-abort-generic' => 'Falló la 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' => 'Complete esti formulariu pa reaniciar la contraseña.',
-'passwordreset-legend' => 'Reaniciar clave',
-'passwordreset-disabled' => 'Los reanicios de clave tán desactivaos nesta wiki.',
+'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-pretext' => "{{PLURAL:$1||Escribi ún de los elementos de los datos d'abaxo}}",
 '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' => "Dalguién (seique vusté, dende la direición IP $1)solicitó'l reaniciu de la so contraseña de {{SITENAME}} ($4).
@@ -629,16 +678,16 @@ $2
 {{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",
+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 al usuariu: $1",
+'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-no-info' => "Has tar identificáu p'acceder direutamente a esta páxina.",
+'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' => "Tien d'aniciar sesión pa entrar direutamente a esta páxina.",
 'changeemail-oldemail' => 'Direición de corréu electrónicu actual:',
 'changeemail-newemail' => 'Direición de corréu electrónicu nueva:',
 'changeemail-none' => '(nengún)',
@@ -654,8 +703,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',
@@ -668,7 +717,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',
@@ -676,78 +725,75 @@ Clave provisional: $2",
 'showpreview' => 'Amosar previsualización',
 'showlivepreview' => 'Vista rápida',
 '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.''",
+'anoneditwarning' => "'''Avisu:''' Nun anició sesión.
+La direición IP quedará grabada 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.
+Pues ponete'n contautu con $1 o con otru de los [[{{MediaWiki:Grouppage-sysop}}|alministradores]] 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.
+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 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.',
+'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 clave xenerada al debalu pal usuariu [[User talk:$1|$1]].
+'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.''
-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.",
+''Esta ye la páxina d'alderique pa un usuariu anónimu qu'inda nun creó una cuenta o que nun la usa.''
+Poro, tenemos qu'usar la direición numbérica IP pa identificalu/la.
+Esa IP pue tar compartida por varios usuarios.
+Si ye un usuariu anónimu y cree qu'hai comentarios irrelevantes empobinaos a vusté, por favor, [[Special:UserLogin/signup|cree una cuenta]] o [[Special:UserLogin/signup|anicie sesión]] 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],
+Pue [[Special:Search/{{PAGENAME}}|buscar esti títulu de páxina]] n\'otres páxines,
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar los rexistros rellacionaos],
 o [{{fullurl:{{FULLPAGENAME}}|action=edit}} editar esta páxina]</span>.',
 'noarticletext-nopermission' => 'Nestos momentos nun hai testu nesta páxina.
-Pues [[Special:Search/{{PAGENAME}}|guetar esti títulu de páxina]] n\'otres páxines o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} guetar los rexistros rellacionaos]</span>, pero nun tienes permisu pa crear esta páxina.',
+Pue [[Special:Search/{{PAGENAME}}|buscar esti títulu de páxina]] n\'otres páxines o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar los rexistros rellacionaos]</span>, pero nun tiene permisu pa crear esta páxina.',
 'missing-revision' => 'La revisión #$1 de la páxina llamada "{{PAGENAME}}" nun esiste.
 
 De vezu la causa d\'esto ye siguir un enllaz antiguu del historial a una páxina que se desanició.
@@ -755,42 +801,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)',
@@ -803,12 +850,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!'''",
@@ -822,7 +869,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:',
@@ -832,8 +879,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.',
@@ -848,19 +895,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 facer que se pierda cualesquier cambiu fechu.
-Si aniciasti sesión, puedes desactivar esti avisu na seición "Edición" de les tos preferencies.',
+'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',
@@ -872,14 +920,14 @@ Si aniciasti sesión, puedes desactivar esti avisu na seición "Edición" de les
 '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',
@@ -887,18 +935,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''",
@@ -914,7 +962,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',
@@ -968,7 +1016,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.',
@@ -978,7 +1026,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]].",
@@ -986,18 +1034,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.'''",
@@ -1083,8 +1131,8 @@ De vezu la causa d'esto ye siguir un enllaz de diferencia antiguu a una páxina
 Se puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistru de desanicios].",
 
 # Search results
-'searchresults' => 'Resultaos de la gueta',
-'searchresults-title' => 'Resultaos de guetar "$1"',
+'searchresults' => 'Resultaos de la busca',
+'searchresults-title' => 'Resultaos de buscar "$1"',
 'searchresulttext' => 'Pa más información tocante a busques en {{SITENAME}}, vete a [[{{MediaWiki:Helppage}}|{{int:help}}]].',
 'searchsubtitle' => 'Buscasti \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|toles páxines qu\'emprimen con "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|toles páxines qu\'enllacien a "$1"]])',
 'searchsubtitleinvalid' => "Buscasti '''$1'''",
@@ -1102,7 +1150,6 @@ Se puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FU
 'searchmenu-legend' => 'Opciones de busca',
 'searchmenu-exists' => "'''Hai una páxina nomada \"[[\$1]]\" nesta wiki'''",
 'searchmenu-new' => "'''¡Crear la páxina \"[[:\$1]]\" nesta wiki!'''",
-'searchhelp-url' => 'Help:Conteníos',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Restolar páxines con esti prefixu]]',
 'searchprofile-articles' => 'Páxines de conteníu',
 'searchprofile-project' => 'Páxines de proyeutu y ayuda',
@@ -1113,7 +1160,7 @@ Se puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FU
 'searchprofile-project-tooltip' => 'Buscar en $1',
 'searchprofile-images-tooltip' => 'Buscar ficheros',
 'searchprofile-everything-tooltip' => "Buscar tol conteníu (incluyendo páxines d'alderique)",
-'searchprofile-advanced-tooltip' => 'Guetar nos espacios de nomes personalizaos',
+'searchprofile-advanced-tooltip' => 'Buscar nos espacios de nomes personalizaos',
 'search-result-size' => '$1 ({{PLURAL:$2|1 pallabra|$2 pallabres}})',
 'search-result-category-size' => '{{PLURAL:$1|1 miembru|$1 miembros}} ({{PLURAL:$2|1 subcategoría|$2 subcategories}}, {{PLURAL:$3|1 ficheru|$3 ficheros}})',
 'search-result-score' => 'Relevancia: $1%',
@@ -1124,7 +1171,7 @@ Se puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FU
 'search-interwiki-default' => '$1 resultaos:',
 'search-interwiki-more' => '(más)',
 'search-relatedarticle' => 'Rellacionáu',
-'mwsuggest-disable' => 'Desactivar les suxerencies de gueta',
+'mwsuggest-disable' => 'Desactivar les suxerencies de busca',
 'searcheverything-enable' => 'Buscar en tolos espacios de nome',
 'searchrelated' => 'rellacionáu',
 'searchall' => 'toos',
@@ -1133,8 +1180,8 @@ Se puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FU
 'showingresultsheader' => "{{PLURAL:$5|Resultáu '''$1''' de '''$3'''|Resultaos '''$1 - $2''' de '''$3'''}} pa '''$4'''",
 'nonefound' => "'''Nota''': De mou predetermináu namái se busca en dellos espacios de nomes. Prueba a poner delantre de la to consulta ''all:'' pa buscar en tol conteníu (inxiriendo páxines d'alderique, plantíes, etc.), o usa como prefixu l'espaciu de nome deseáu.",
 'search-nonefound' => 'Nun hebo resultaos que casaren cola consulta.',
-'powersearch' => 'Gueta avanzada',
-'powersearch-legend' => 'Gueta avanzada',
+'powersearch' => 'Busca avanzada',
+'powersearch-legend' => 'Busca avanzada',
 'powersearch-ns' => 'Buscar nos espacios de nome:',
 'powersearch-redir' => 'Llistar redireiciones',
 'powersearch-field' => 'Buscar',
@@ -1143,14 +1190,14 @@ 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.",
-'search-error' => 'Hebo un error al guetar: $1',
+'search-error' => 'Hebo un error al buscar: $1',
 
 # Preferences page
 'preferences' => 'Preferencies',
 'mypreferences' => 'Preferencies',
 'prefs-edits' => "Númberu d'ediciones:",
-'prefsnologin' => 'Non identificáu',
-'prefsnologintext' => 'Necesites tar <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} identificáu]</span> pa camudar les preferencies d\'usuariu.',
+'prefsnologin' => 'Nun anició sesión',
+'prefsnologintext' => 'Necesita <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} aniciar sesión]</span> pa camudar la configuración d\'usuariu.',
 'changepassword' => 'Camudar la clave',
 'prefs-skin' => 'Apariencia',
 'skin-preview' => 'Vista previa',
@@ -1180,7 +1227,7 @@ Se puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FU
 'prefs-edit-boxsize' => "Tamañu de la ventana d'edición.",
 'rows' => 'Fileres:',
 'columns' => 'Columnes:',
-'searchresultshead' => 'Guetar',
+'searchresultshead' => 'Buscar',
 'resultsperpage' => 'Resultaos por páxina:',
 'stub-threshold' => 'Llímite superior pa considerar como <a href="#" class="stub">enllaz a entamu</a> (bytes):',
 'stub-threshold-disabled' => 'Desactivao',
@@ -1210,9 +1257,9 @@ Equí tienes un valor al debalu que pues usar: $1",
 'timezoneregion-indian' => 'Océanu Índicu',
 'timezoneregion-pacific' => 'Océanu Pacíficu',
 'allowemail' => 'Dexar a los otros usuarios mandate correos',
-'prefs-searchoptions' => 'Guetar',
+'prefs-searchoptions' => 'Buscar',
 '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',
@@ -1283,10 +1330,12 @@ Esta información sedrá pública.",
 'userrights-reason' => 'Motivu:',
 'userrights-no-interwiki' => "Nun tienes permisu pa editar los derechos d'usuariu n'otres wikis.",
 'userrights-nodatabase' => 'La base de datos $1 nun esiste o nun ye llocal.',
-'userrights-nologin' => "Has tar [[Special:UserLogin|identificáu]] con una cuenta d'alministrador p'asignar derechos d'usuariu.",
+'userrights-nologin' => "Tien d'[[Special:UserLogin|aniciar sesión]] con una cuenta d'alministrador pa dar permisos d'usuariu.",
 '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.",
+'userrights-removed-self' => 'Retiró correutamente los sos propios drechos. Poro, yá nun tendrá accesu a esta páxina.',
 
 # Groups
 'group' => 'Grupu:',
@@ -1357,6 +1406,10 @@ Esta información sedrá pública.",
 'right-editusercssjs' => "Editar los archivos CSS y JS d'otros usuarios",
 'right-editusercss' => "Editar los archivos CSS d'otros usuarios",
 'right-edituserjs' => "Editar los archivos JS d'otros usuarios",
+'right-editmyusercss' => "Editar los propios ficheros CSS d'usuariu",
+'right-editmyuserjs' => "Editar los propios ficheros JavaScript d'usuariu",
+'right-viewmywatchlist' => 'Ver la llista de vixilancia propia',
+'right-editmywatchlist' => 'Editar la llista de vixilancia propia. Tenga en cuenta que dalgunes aiciones amestarán páxines igual, inda ensin esti permisu.',
 'right-rollback' => "Revertir rápido a un usuariu qu'editó una páxina determinada",
 'right-markbotedits' => 'Marcar les ediciones revertíes como ediciones de bot',
 'right-noratelimit' => 'Nun tar afeutáu polos llímites de tasa',
@@ -1418,6 +1471,8 @@ Esta información sedrá pública.",
 'action-userrights-interwiki' => "editar los drechos d'usuariu d'usuarios d'otres wikis",
 'action-siteadmin' => 'candar o descandar la base de datos',
 'action-sendemail' => 'unviar correos',
+'action-editmywatchlist' => 'editar la llista de vixilancia',
+'action-viewmywatchlist' => 'ver la llista de vixilancia propia',
 
 # Recent changes
 'nchanges' => '{{PLURAL:$1|un cambiu|$1 cambios}}',
@@ -1470,8 +1525,8 @@ Esta información sedrá pública.",
 'uploadbtn' => 'Xubir ficheru',
 'reuploaddesc' => 'Cancelar la xubida y tornar al formulariu de xubíes',
 'upload-tryagain' => 'Unviar descripción camudada del ficheru',
-'uploadnologin' => 'Non identificáu',
-'uploadnologintext' => 'Tienes que tar [[Special:UserLogin|identificáu]] pa poder xubir archivos.',
+'uploadnologin' => 'Nun anició sesión',
+'uploadnologintext' => "Tien d'$1 pa xubir ficheros.",
 'upload_directory_missing' => 'El direutoriu de xubida ($1) nun esiste y nun pudo ser creáu pol sirvidor de web.',
 'upload_directory_read_only' => "El sirvidor nun pue modificar el direutoriu de xubida d'archivos ($1).",
 'uploaderror' => 'Error de xubida',
@@ -1764,15 +1819,15 @@ Hai disponible una [[Special:WhatLinksHere/$2|llista completa]].",
 'morelinkstoimage' => 'Ver [[Special:WhatLinksHere/$1|más enllaces]] a esti archivu.',
 'linkstoimage-redirect' => '$1 (redireición de ficheru) $2',
 'duplicatesoffile' => "{{PLURAL:$1|El siguiente archivu ye un duplicáu|Los siguientes $1 archivos son duplicaos}} d'esti archivu ([[Special:FileDuplicateSearch/$2|más detalles]]):",
-'sharedupload' => "Esti ficheru ye de $1 y se pue usar n'otros proyeutos.",
+'sharedupload' => 'Esti ficheru ye de $1 y puen usalu otros proyeutos.',
 'sharedupload-desc-there' => 'Esti ficheru ye de $1 y puen usalu otros proyeutos.
 Llea la [páxina de descripción del ficheru $2] pa más información.',
 'sharedupload-desc-here' => "Esti ficheru ye de $1 y puen usalu otros proyeutos.
 La descripción de la [$2 páxina de descripción del ficheru] s'amuesa darréu.",
-'sharedupload-desc-edit' => "Esti ficheru ye de $1 y se pue usar n'otros proyeutos.
-Seique quieras camudar la descripción de la so [páxina de descripción de ficheru $2] allí.",
-'sharedupload-desc-create' => "Esti ficheru ye de $1 y se pue usar n'otros proyeutos.
-Seique quieras camudar la descripción de la so [páxina de descripción de ficheru $2] allí.",
+'sharedupload-desc-edit' => 'Esti ficheru ye de $1 y puen usalu otros proyeutos.
+Seique quieras camudar la descripción de la so [páxina de descripción de ficheru $2] allí.',
+'sharedupload-desc-create' => 'Esti ficheru ye de $1 y puen usalu otros proyeutos.
+Seique quieras camudar la descripción de la so [páxina de descripción de ficheru $2] allí.',
 'filepage-nofile' => 'Nun esiste dengún ficheru con esti nome.',
 'filepage-nofile-link' => 'Nun esiste ficheru dalu con esti nome, pero pues [$1 xubilu].',
 'uploadnewversion-linktext' => "Xubir una nueva versión d'esta imaxe",
@@ -1963,7 +2018,7 @@ Date cuenta de qu'otros sitios web puen enllazar a un ficheru con una URL direut
 'booksources' => 'Fontes de llibros',
 'booksources-search-legend' => 'Busca de fontes de llibros',
 'booksources-go' => 'Dir',
-'booksources-text' => "Esta ye una llista d'enllaces a otros sitios que vienden llibros nuevos y usaos, y que puen tener más información sobre llibros que pueas tar guetando:",
+'booksources-text' => "Esta ye una llista d'enllaces a otros sitios que vienden llibros nuevos y usaos, y que puen tener más información sobre los llibros que ta buscando:",
 'booksources-invalid-isbn' => 'El códigu ISBN que puxisti nun paez que valga; mira que te vien copiáu de la fonte orixinal.',
 
 # Special:Log
@@ -2015,10 +2070,10 @@ Ver tamién les [[Special:WantedCategories|categoríes más buscaes]].",
 'sp-deletedcontributions-contribs' => 'collaboraciones',
 
 # Special:LinkSearch
-'linksearch' => "Gueta d'enllaces esternos",
+'linksearch' => "Busca d'enllaces esternos",
 'linksearch-pat' => 'Patrón de busca:',
 'linksearch-ns' => 'Espaciu de nomes:',
-'linksearch-ok' => 'Guetar',
+'linksearch-ok' => 'Buscar',
 'linksearch-text' => 'Se puen usar comodinos como "*.wikipedia.org".
 Necesita polo menos un dominiu de primer nivel, como "*.org".<br />
 {{PLURAL:$2|Protocolu almitíu|Protocolos almitíos}}: <code>$1</code> (el predetermináu ye http:// si nun se conseña dengún protocolu).',
@@ -2031,6 +2086,15 @@ Necesita polo menos un dominiu de primer nivel, como "*.org".<br />
 'listusers-noresult' => "Nun s'atoparon usuarios.",
 'listusers-blocked' => '(bloquiau)',
 
+# Special:ActiveUsers
+'activeusers' => "Llista d'usuarios activos",
+'activeusers-intro' => "Esta ye una llista d'usuarios que tuvieron alguna mena d'actividá hai menos de $1 {{PLURAL:$1|día|díes}}.",
+'activeusers-count' => '$1 {{PLURAL:$1|edición|ediciones}} {{PLURAL:$3|nel caberu día|nos caberos $3 díes}}',
+'activeusers-from' => 'Amosar usuarios principiando dende:',
+'activeusers-hidebots' => 'Anubrir bots',
+'activeusers-hidesysops' => 'Anubrir alministradores',
+'activeusers-noresult' => "Nun s'alcontraron usuarios.",
+
 # Special:ListGroupRights
 'listgrouprights' => "Drechos de los grupos d'usuariu",
 'listgrouprights-summary' => "La siguiente ye una llista de grupos d'usuariu definíos nesta wiki, colos sos drechos d'accesu asociaos.
@@ -2108,8 +2172,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}}.',
@@ -2332,7 +2396,7 @@ Consulta'l [[Special:Log/delete|rexistru d'esborraos]] pa ver los esborraos y re
 'undelete-search-title' => 'Buscar páxines desaniciaes',
 'undelete-search-box' => 'Buscar páxines desaniciaes',
 'undelete-search-prefix' => "Amosar páxines qu'empecipien por:",
-'undelete-search-submit' => 'Guetar',
+'undelete-search-submit' => 'Buscar',
 'undelete-no-results' => "Nun s'atoparon páxines afechisques a la busca nel archivu d'esborraos.",
 'undelete-filename-mismatch' => "Nun se pue restaurar la revisión del archivu con fecha $1: el nome d'archivu nun concuaya",
 'undelete-bad-store-key' => "Nun se pue restaurar la revisión del archivu con fecha $1: yá nun esistía l'archivu nel momentu d'esborralu.",
@@ -2380,7 +2444,7 @@ La cabera entrada del rexistru de bloqueos s'ufre darréu pa referencia:",
 'sp-contributions-search' => 'Buscar contribuciones',
 'sp-contributions-username' => "Direición IP o nome d'usuariu:",
 'sp-contributions-toponly' => 'Amosar namái les ediciones que son les caberes revisiones',
-'sp-contributions-submit' => 'Guetar',
+'sp-contributions-submit' => 'Buscar',
 
 # What links here
 'whatlinkshere' => "Lo qu'enllaza equí",
@@ -2466,7 +2530,7 @@ Mira na [[Special:BlockList|llista de bloqueos]] pa revisar los bloqueos.',
 'blocklist-by' => 'Alministración de bloqueos',
 'blocklist-params' => 'Parámetros de bloquéu',
 'blocklist-reason' => 'Motivu',
-'ipblocklist-submit' => 'Guetar',
+'ipblocklist-submit' => 'Buscar',
 'ipblocklist-localblock' => 'Bloquéu llocal',
 'ipblocklist-otherblocks' => '{{PLURAL:$1|Otru bloquéu|Otros bloqueos}}',
 'infiniteblock' => 'pa siempre',
@@ -2674,7 +2738,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:',
@@ -2685,6 +2749,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',
@@ -2772,7 +2838,7 @@ Guárdalu nel ordenador y xúbilu equí.",
 'tooltip-pt-mycontris' => 'Llista de les tos collaboraciones',
 'tooltip-pt-login' => "T'encamentamos que t'identifiques, anque nun ye obligatorio",
 'tooltip-pt-anonlogin' => "T'encamentamos que t'identifiques, anque nun ye obligatorio.",
-'tooltip-pt-logout' => 'Colar',
+'tooltip-pt-logout' => 'Salir',
 'tooltip-ca-talk' => 'Alderique tocante al conteníu de la páxina',
 'tooltip-ca-edit' => "Pues editar esta páxina. Por favor usa'l botón de vista previa enantes de guardar los cambios.",
 'tooltip-ca-addsection' => 'Emprima una seición nueva',
@@ -2839,7 +2905,6 @@ Pues ver el so códigu fonte.',
 '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 */',
@@ -2894,7 +2959,7 @@ Probablemente tea causao por un enllaz a un sitiu esternu de la llista prieta.',
 'pageinfo-length' => 'Llonxitú de la páxina (en bytes)',
 'pageinfo-article-id' => 'ID de la páxina',
 'pageinfo-language' => 'Llingua del conteníu de la páxina',
-'pageinfo-robot-policy' => 'Estáu del motor de gueta',
+'pageinfo-robot-policy' => 'Estáu del motor de busca',
 'pageinfo-robot-index' => 'Pue ser índiz',
 'pageinfo-robot-noindex' => 'Nun pue ser índiz',
 'pageinfo-views' => 'Númberu de visites',
@@ -2998,7 +3063,7 @@ Al executalu pues comprometer el to sistema.",
 'newimages-label' => "Nome d'archivu (o una parte d'él):",
 'showhidebots' => '($1 bots)',
 'noimages' => 'Nun hai nada que ver.',
-'ilsubmit' => 'Guetar',
+'ilsubmit' => 'Buscar',
 'bydate' => 'por fecha',
 'sp-newimages-showfrom' => "Amosar los archivos nuevos emprimando dende'l $1 a les $2",
 
@@ -3007,11 +3072,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:
 
@@ -3041,7 +3120,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',
@@ -3219,7 +3298,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',
@@ -3555,7 +3634,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'",
@@ -3639,19 +3718,24 @@ 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',
 'fileduplicatesearch-summary' => 'Busca archivos duplicaos basándose nos sos valores fragmentarios.',
 'fileduplicatesearch-legend' => 'Buscar duplicaos',
 'fileduplicatesearch-filename' => 'Nome del ficheru:',
-'fileduplicatesearch-submit' => 'Guetar',
+'fileduplicatesearch-submit' => 'Buscar',
 'fileduplicatesearch-info' => '$1 × $2 píxeles<br />Tamañu del archivu: $3<br />Triba MIME: $4',
 'fileduplicatesearch-result-1' => 'L\'archivu "$1" nun tien duplicáu idénticu.',
 'fileduplicatesearch-result-n' => 'L\'archivu "$1" tien {{PLURAL:$2|un duplicáu idénticu|$2 duplicaos idénticos}}.',
@@ -3665,7 +3749,7 @@ Les imáxenes amuésense a resolución completa; les demás tribes d'archivu exe
 * <span class="mw-specialpagecached">Páxines especiales en caché (seique nun tean actualizaes).</span>',
 'specialpages-group-maintenance' => 'Informes de mantenimientu',
 'specialpages-group-other' => 'Otres páxines especiales',
-'specialpages-group-login' => 'Identificase / crear cuenta',
+'specialpages-group-login' => 'Entrar / crear cuenta',
 'specialpages-group-changes' => 'Cambeos recientes y rexistros',
 'specialpages-group-media' => 'Informes multimedia y xubíes',
 'specialpages-group-users' => 'Usuarios y drechos',
@@ -3720,7 +3804,7 @@ Les imáxenes amuésense a resolución completa; les demás tribes d'archivu exe
 'dberr-problems' => '¡Sentímoslo! Esti sitiu ta esperimentando dificultaes téuniques.',
 'dberr-again' => 'Tenta esperar dellos minutos y recargar.',
 'dberr-info' => '(Nun se pue contautar cola base de datos del sirvidor: $1)',
-'dberr-usegoogle' => 'Pues probar a guetar con Google mentanto.',
+'dberr-usegoogle' => 'Pue probar a buscar con Google mentanto.',
 'dberr-outofdate' => 'Atalanta que los sos índices del nuesu conteníu seique nun tean actualizaos.',
 'dberr-cachederror' => 'Esta ye una copia na caché de la páxina que se pidiera, y pue que nun tea actualizada.',
 
@@ -3737,10 +3821,11 @@ Les imáxenes amuésense a resolución completa; les demás tribes d'archivu exe
 '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',
+'sqlite-has-fts' => '$1 con sofitu pa busca de testu completu',
+'sqlite-no-fts' => '$1 ensin sofitu pa busca de testu completu',
 
 # New logging system
 'logentry-delete-delete' => '$1 {{GENDER:$2|desanició}} la páxina $3',
@@ -3795,7 +3880,7 @@ D\'otra miente, pues usar el formulariu cenciellu d\'abaxo. El to comentariu apa
 'feedback-bugnew' => "Yá lo comprobé. Informar d'esti fallu nuevu",
 
 # Search suggestions
-'searchsuggest-search' => 'Guetar',
+'searchsuggest-search' => 'Buscar',
 'searchsuggest-containing' => 'que contién...',
 
 # API errors
index 7895ca4..a9643d8 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 !',
@@ -313,7 +311,6 @@ $messages = array(
 'disclaimers' => 'Walzera',
 'disclaimerpage' => 'Project:Jadif walzereem',
 'edithelp' => 'Pomara',
-'edithelppage' => 'Help:Tokinde bubetat',
 'helppage' => 'Help:Pomara',
 'mainpage' => 'Emudexo',
 'mainpage-description' => 'Emudexo',
@@ -823,7 +820,6 @@ Ta ropasusu warzafu bu yo va [[Special:Search|aneyara ko wiki]] yawal.',
 'viewprevnext' => 'Va ($1 {{int:pipe-separator}} $2) ik ($3) disukel.',
 'searchmenu-exists' => "'''Ixam bu yoltkirafu gu \"[[:\$1]]\" dene bati wiki.'''",
 'searchmenu-new' => "'''Redura va bu \"[[:\$1]]\" den bati wiki!'''",
-'searchhelp-url' => 'Help:Pomara',
 'searchprofile-articles' => 'Teliz',
 'searchprofile-project' => 'Pomarabu ik abdumimaksbu',
 'searchprofile-images' => 'Jonkanaca',
@@ -864,14 +860,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 +931,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 +1415,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 +1460,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 +2034,7 @@ Kotari milconyafi gluyasiki roklon zo krafiar.',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Mantuca',
 'exif-imagelength' => 'Ontinuca',
 'exif-compression' => 'Raxivaracave',
@@ -2121,7 +2109,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 +2218,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 +2339,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..10f43a0 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',
@@ -324,7 +322,6 @@ $1',
 'disclaimers' => 'Məsuliyyətdən imtina',
 'disclaimerpage' => 'Project:Məsuliyyətdən imtina',
 'edithelp' => 'Redaktə kömək',
-'edithelppage' => 'Help:Redaktə',
 'helppage' => 'Help:Mündəricat',
 'mainpage' => 'Ana Səhifə',
 'mainpage-description' => 'Ana Səhifə',
@@ -585,10 +582,8 @@ Ola bilər siz parolu müvəffəqiyyətlə dəyişmisiniz yaxud müvəqqəti par
 
 # Special:PasswordReset
 'passwordreset' => 'Parolu yenilə',
-'passwordreset-text' => 'Akkauntunuz haqqında xatırlatmanı elektron poçt vasitəsilə ala bilməniz üçün bu formanı doldurun.',
 'passwordreset-legend' => 'Parolu yenilə',
 'passwordreset-disabled' => 'Yenidən qurulma parolu bu vikidə işləmir',
-'passwordreset-pretext' => '{{PLURAL:$1||Enter one of the pieces of data below}}',
 'passwordreset-username' => 'İstifadəçi adı:',
 'passwordreset-domain' => 'Domen:',
 'passwordreset-email' => 'E-mail ünvanı:',
@@ -733,6 +728,7 @@ Məlumat üçün aşağıda bu səhifənin tarixçəsindən müvafiq silmə qeyd
 Çox güman ki, səhifə silinmişdir.',
 'edit-conflict' => 'Düzəlişlər münaqişəsi',
 'edit-no-change' => 'Sizin redaktələr qeydə alınmamışdır. Belə ki, mətndə heç bir düzəliş edilməmişdir.',
+'postedit-confirmation' => 'Redaktəniz qeyd edildi.',
 'edit-already-exists' => 'Yeni səhifəni yaratmaq mümkün deyil.
 Belə ki, bu adda səhifə artıq mövcuddur.',
 
@@ -911,7 +907,6 @@ $1",
 'searchmenu-legend' => 'Axtarış kriteriyaları',
 'searchmenu-exists' => "'''Bu vikidə \"[[:\$1]]\" adında səhifə mövcuddur'''",
 'searchmenu-new' => "'''Bu vikidə \"[[:\$1]]\" səhifəsini yarat!'''",
-'searchhelp-url' => 'Help:Mündəricət',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Bu cür prefiksli səhifələri göstər]]',
 'searchprofile-articles' => 'Məqalələr',
 'searchprofile-project' => 'Kömək və Layihə səhifələri',
@@ -952,14 +947,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 +1380,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 +1714,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 +2267,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 +2278,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 +2320,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 +2401,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 +2444,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 +2570,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 +2874,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 f6b0ea9..b11b106 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' => 'دَییشیکلیک قیساسی بوش قالاندا منی بیلدیر',
@@ -328,7 +326,6 @@ $1',
 'disclaimers' => 'رد ائتمک',
 'disclaimerpage' => 'Project:عمومی رد ائتمک',
 'edithelp' => 'ديَیشیکلیک‌لر اوچون یاردیم',
-'edithelppage' => 'Help:دَییشدیرمه',
 'helppage' => 'Help:ایچینده‌کیلر',
 'mainpage' => 'آنا صحیفه',
 'mainpage-description' => 'آنا صحیفه',
@@ -620,10 +617,8 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'رمزی یئنی‌له',
-'passwordreset-text' => 'رمزینیزی یئنیله‌مک اوچون بو فورمو دولدورون.',
 'passwordreset-legend' => 'رمزی یئنی‌له',
 'passwordreset-disabled' => 'بو ویکی‌ده رمزی یئنی‌له‌مک باغلانیب‌دیر.',
-'passwordreset-pretext' => '{{PLURAL:$1|آشاغیداکی وئری پارچالارینین بیرینی وئرین}}',
 'passwordreset-username' => 'ایستیفاده‌چی آدی:',
 'passwordreset-domain' => 'دامنه:',
 'passwordreset-capture' => 'سون نتیجه ایمیل گؤستریلسین؟',
@@ -1095,7 +1090,6 @@ $1",
 'searchmenu-legend' => 'آختارماق تنظیملری',
 'searchmenu-exists' => "'''بو ویکی‌ده «[[:$1]]» آدلی صحیفه واردیر.'''",
 'searchmenu-new' => "'''بو ویکی‌ده «[[:$1]]» صحیفه‌‌سینی يارات!'''",
-'searchhelp-url' => 'Help:ایچینده‌کیلر',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1| بو اؤن‌اک ایله اولان صحیفه‌لری آختار]]',
 'searchprofile-articles' => 'مقاله‌لر',
 'searchprofile-project' => 'یاردیم و پروژه صحیفه‌لری',
@@ -2021,6 +2015,15 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization صحیفه‌‌سین
 'listusers-noresult' => 'هئچ ایستیفاده‌چی تاپیلمادی.',
 'listusers-blocked' => '(باغلانیب)',
 
+# Special:ActiveUsers
+'activeusers' => 'چالیشان ایستیفاده‌چیلرین لیستی',
+'activeusers-intro' => 'بوردا سون {{PLURAL:$1|بیر|$1}} گون‌ده بیر ایشلر گؤرن ایستیفاده‌چیلرین لیستی گؤستریلیر.',
+'activeusers-count' => 'سون {{PLURAL:$3|گون|$3 گون}}‌ده، {{PLURAL:$1|$1}} چالیشما',
+'activeusers-from' => 'بوندان باشلایاراق ایستیفاده‌چیلری گؤستر:',
+'activeusers-hidebots' => 'بوتلاری گیزلت',
+'activeusers-hidesysops' => 'ایداره‌چیلری گیزلت',
+'activeusers-noresult' => 'هئچ ایستیفاده‌چی تاپیلمادی.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'ایستیفاده‌چی قروپ حاقلاری',
 'listgrouprights-summary' => 'آشاغیدا، بو ویکی‌ده تانیلان ایستیفاده‌چی گروپلاری و اونلارین حاقلاری گؤستریلیر.
@@ -2097,8 +2100,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|صحیفه}} وار.',
@@ -2994,7 +2997,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'گئنیش‌لیک',
 'exif-imagelength' => 'اوزوناسی',
 'exif-bitspersample' => 'هر جز دا نقطه',
@@ -3172,7 +3175,7 @@ $1',
 'exif-originalimageheight' => 'شکیلین کسیلمه دن اوولکی اوجالیقی',
 'exif-originalimagewidth' => 'شکیلین کسیلمه دن اوولکی گئنیش‌لیگی',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'سیخیلمامیش',
 'exif-compression-2' => 'پسوورد قویماق سی‌سی‌آی‌تی‌تی ۳  گروه دا بیر بعدی هافمن روشی ایله اوزوناسی اوستونده دییشیلیب',
 'exif-compression-3' => 'رمز قرار وئرمک سی‌سی‌آی‌تی‌تی قروپ ۳',
@@ -3584,13 +3587,6 @@ $5
 'version-entrypoints-header-entrypoint' => 'گیریش نقطه‌‌سی',
 'version-entrypoints-header-url' => 'اینترنت آدرسی',
 
-# Special:FilePath
-'filepath' => 'فايل يولو',
-'filepath-page' => 'فایل:',
-'filepath-submit' => 'گئت',
-'filepath-summary' => 'بو اؤزل صحیفه‌‌ بیر فايل اوچون تام يولو گتیرر. 
-شکیللر تام تصویرین گؤستریلیر، دیگر فايل نؤولری ایله باغلی پروقراملاری بیرباشا ایشه باشلايیر.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'دوبلیکات فايل آختاریشی',
 'fileduplicatesearch-summary' => 'تعمین ائتمک ديَری دؤشه‌مه‌سینده بنزر فايللاری آختار.',
index 03952be..8ce0fcd 100644 (file)
@@ -177,8 +177,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Битте күҙәтеү исемлегенә өҫтәгән ҡулланыусылар һанын күрһәтергә',
 'tog-oldsig' => 'Хәҙерге имза:',
 'tog-fancysig' => 'Имзаның үҙ вики-тамғаһы (автоматик һылтанмаһыҙ)',
-'tog-externaleditor' => 'Махсус билдәләнмәһә, тышҡы мөхәррирләүсе ҡулланырға (белгестәр өсөн генә, компьютер махсус көйләнгән булырға тейеш)',
-'tog-externaldiff' => 'Махсус билдәләнмәһә, версияларҙы сағыштырыу өсөн тышҡы программа ҡулланырға (белгестәр өсөн генә, компьютер махсус көйләнгән булырға тейеш)',
 'tog-showjumplinks' => '«Күс» ярҙамсы һылтанмалары асылһын',
 'tog-uselivepreview' => 'Тиҙ ҡарап алыуҙы ҡулланырға (JavaScript, эксперименталь)',
 'tog-forceeditsummary' => 'Төҙәтеүҙе тасуирлау юлы тултырылмаһа, мине киҫәт',
@@ -192,6 +190,7 @@ $messages = array(
 'tog-diffonly' => 'Версия сағыштырыу аҫтында бит эстәлеге күрһәтелмәһен',
 'tog-showhiddencats' => 'Йәшерен категорияларҙы күрһәтергә',
 'tog-norollbackdiff' => 'Кире ҡайтарыуҙан һуң версия айырмалары күрһәтелмәһен',
+'tog-useeditwarning' => 'Мөхәррирләү битенән үҙгәртеүҙәрҙе һаҡламайынса сыҡҡан ваҡытта мине киҫәтергә',
 
 'underline-always' => 'Һәр ваҡыт',
 'underline-never' => 'Бер ҡасан да',
@@ -255,6 +254,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|Категория|Категория}}',
@@ -280,6 +291,7 @@ $messages = array(
 'newwindow' => '(яңы биттә)',
 'cancel' => 'Бөтөрөргә',
 'moredotdotdot' => 'Дауамы...',
+'morenotlisted' => 'Башҡа бер нимә лә юҡ...',
 'mypage' => 'Бит',
 'mytalk' => 'Әңгәмә',
 'anontalk' => 'Был IP-адресының фекер алышыу бите',
@@ -388,7 +400,6 @@ $1',
 'disclaimers' => 'Яуаплылыҡтан баш тартыу',
 'disclaimerpage' => 'Project:Яуаплылыҡтан баш тартыу',
 'edithelp' => 'Төҙәтеү белешмәһе',
-'edithelppage' => 'Help:Төҙәтеү белешмәһе',
 'helppage' => 'Help:Белешмә',
 'mainpage' => 'Баш бит',
 'mainpage-description' => 'Баш бит',
@@ -482,7 +493,7 @@ $1
 'enterlockreason' => 'Ябылыу сәбәбен һәм ваҡытын белдерегеҙ.',
 'readonlytext' => 'Яңы мәҡәләләр өҫтәү һәм мәғлүмәттәр базаһындағы башҡа үҙгәртеүҙәр хәҙер ябылған. Был планлы хеҙмәтләндереү сәбәпле булыуы мөмкин, аҙаҡтан нормаль хәлгә ҡайтасаҡ.
 
-Ябыусы хәким ҡалдырған аңлатма:
+Ябыусы хаким ҡалдырған аңлатма:
 $1',
 'missing-article' => 'Мәғлүмәттәр базаһында «$1» $2 битенең һоралған тексты табылманы.
 
@@ -563,12 +574,16 @@ $2',
 'welcomecreation-msg' => 'Иҫәп яҙыуығыҙ яһалды.
 Шәхси [[Special:Preferences|{{SITENAME}} көйләүҙәрен]] үҙегеҙгә уңайлы итеп үҙгәртергә онотмағыҙ.',
 'yourname' => 'Ҡатнашыусы исеме',
-'yourpassword' => 'Һеҙҙең пароль',
-'yourpasswordagain' => 'Паролде ҡабаттан яҙыу',
-'remembermypassword' => 'Был компьютерҙа паролемде иҫләргә ($1 {{PLURAL:$1|көндән|көндән}} күп түгел)',
+'userlogin-yourname' => 'Ҡулланыусы исеме',
+'yourpassword' => 'Серһүҙ',
+'userlogin-yourpassword' => 'Серһүҙ',
+'userlogin-yourpassword-ph' => 'Яңы серһүҙҙе яҙығыҙ',
+'yourpasswordagain' => 'Серһүҙҙе ҡабаттан яҙыу',
+'remembermypassword' => 'Был компьютерҙа серһүҙемде иҫләргә ($1 {{PLURAL:$1|көндән|көндән}} күп түгел)',
+'userlogin-remembermypassword' => 'Системала ҡалырға',
 'securelogin-stick-https' => 'Танылғандан һуң HTTPS менән бәйләнеште ҡалдырырға',
 'yourdomainname' => 'Һеҙҙең домен',
-'password-change-forbidden' => 'Был викила паролегеҙҙе үҙгәртә алмайһығыҙ.',
+'password-change-forbidden' => 'Был викила серһүҙегеҙҙе үҙгәртә алмайһығыҙ.',
 'externaldberror' => 'Тышҡы мәғлүмәт базаһы менән танылғанда хата барлыҡҡа килде йәки тышҡы үҙ көйләүҙәрегеҙҙе үҙгәртер өсөн хоҡуҡтарығыҙ етәрле түгел.',
 'login' => 'Танышыу йәки теркәлеү',
 'nav-login-createaccount' => 'Танышыу йәки теркәлеү',
@@ -586,12 +601,12 @@ $2',
 'userlogin-resetlink' => 'Танылыу мәғлүмәттәрен оноттоғоҙмо?',
 'createaccountmail' => 'эл. почта буйынса',
 'createaccountreason' => 'Сәбәп:',
-'badretype' => 'Һеҙ кереткән паролдәр тап килмәйҙәр.',
+'badretype' => 'Һеҙ кереткән серһүҙҙәр тап килмәй.',
 'userexists' => 'Керетелгән исем ҡулланыла инде.
 Зинһар, башҡа исем һайлағыҙ.',
 'loginerror' => 'Танылыу хатаһы',
 'createaccounterror' => 'Иҫәп яҙыуын яһап булмай: $1',
-'nocookiesnew' => 'Иҫәп яҙыуы яһалды, ләкин һеҙ танылмағанһығыҙ. {{SITENAME}} ҡатнашыусыны таныу өсөн «cookies» ҡуллана. Һеҙҙә «cookies» тыйылған. Зинһар, уларға рөхсәт бирегеҙ, шунан яңы ҡатнашыусы исеме һәм пароль менән танылығыҙ.',
+'nocookiesnew' => 'Иҫәп яҙыуы яһалды, ләкин һеҙ танылмағанһығыҙ. {{SITENAME}} ҡатнашыусыны таныу өсөн «cookies» ҡуллана. Һеҙҙә «cookies» тыйылған. Зинһар, уларға рөхсәт бирегеҙ, шунан яңынан ҡатнашыусы исеме һәм серһүҙ менән танылығыҙ.',
 'nocookieslogin' => '{{SITENAME}} ҡатнашыусыны таныу өсөн «cookies» ҡуллана. Һеҙҙә «cookies» тыйылған. Зинһар, уға рөхсәт бирегеҙ һәм яңынан керегеҙ.',
 'nocookiesfornew' => 'Иҫәп яҙмаһы булдырылманы, сөнки уның сығанағын тикшереү мөмкин түгел.
 "Сookies" эшләй икәнлеген тикшерегеҙ, битте яңыртығыҙ  һәм яңынан ҡабатлап ҡарағыҙ.',
@@ -604,25 +619,25 @@ $2',
 'nosuchusershort' => '$1 исемле ҡулланыусы юҡ. Исемде тикшерегеҙ.',
 'nouserspecified' => 'Һеҙ ҡатнашыусы исемен күрһәтергә тейеш.',
 'login-userblocked' => 'Был ҡатнашыусыға рөхсәт юҡ.  Исеме тыйылған.',
-'wrongpassword' => 'Һеҙ ҡулланған пароль ҡабул ителмәй. Яңынан яҙып ҡарағыҙ.',
-'wrongpasswordempty' => 'Зинһар, буш булмаған пароль керетегеҙ.',
-'passwordtooshort' => 'Ð\9fаÑ\80олÑ\8c кәмендә $1 {{PLURAL:$1|символдан}} торорға тейеш.',
-'password-name-match' => 'Керетелгән пароль ҡулланыусы исеменән айырылырға тейеш.',
-'password-login-forbidden' => 'Был ҡатнашыусы исемен һәм паролде ҡулланыу тыйылған',
-'mailmypassword' => 'Яңы пароль ебәрергә',
-'passwordremindertitle' => '{{SITENAME}} өсөн яңы ваҡытлыса пароль',
-'passwordremindertext' => 'Кемдер (бәлки, һеҙ, IP-адресы: $1) {{SITENAME}} ($4) өсөн яңы пароль һоратты. $2 ҡатнашыусыһы өсөн ваҡытлыса яңы пароль яһалды: $3. Әгәр был һеҙ булһағыҙ, системага керегеҙ һәм паролде алмаштырығыҙ. Яңы пароль $5 {{PLURAL:$5|көн}} ғәмәлдә буласаҡ.
-
-Әгәр һеҙ паролде алмаштырыуҙы һоратмаған йәки онотоп кире иҫләгән булһағыҙ һәм үҙгәртергә теләмәһәгеҙ, был хәбәргә иғтибар итмәгеҙ һәм элекке паролегеҙҙе ҡулланыуығыҙҙы дауам итегеҙ.',
+'wrongpassword' => 'Һеҙ ҡулланған серһүҙ ҡабул ителмәй. Яңынан яҙып ҡарағыҙ.',
+'wrongpasswordempty' => 'Зинһар, буш булмаған серһүҙ керетегеҙ.',
+'passwordtooshort' => 'СеÑ\80Ò»Ò¯Ò\99 кәмендә $1 {{PLURAL:$1|символдан}} торорға тейеш.',
+'password-name-match' => 'Керетелгән серһүҙ ҡулланыусы исеменән айырылырға тейеш.',
+'password-login-forbidden' => 'Был ҡатнашыусы исемен һәм серһүҙҙе ҡулланыу тыйылған',
+'mailmypassword' => 'Яңы серһүҙ ебәрергә',
+'passwordremindertitle' => '{{SITENAME}} өсөн яңы ваҡытлыса серһүҙ',
+'passwordremindertext' => 'Кемдер (бәлки, һеҙ, IP-адресы: $1) {{SITENAME}} ($4) өсөн яңы серһүҙ һоратты. $2 ҡатнашыусыһы өсөн ваҡытлыса яңы серһүҙ яһалды: $3. Әгәр был һеҙ булһағыҙ, системага керегеҙ һәм серһүҙ алмаштырығыҙ. Яңы серһүҙ $5 {{PLURAL:$5|көн}} ғәмәлдә буласаҡ.
+
+Әгәр һеҙ серһүҙҙе алмаштырыуҙы һоратмаған йәки онотоп кире иҫләгән булһағыҙ һәм үҙгәртергә теләмәһәгеҙ, был хәбәргә иғтибар итмәгеҙ һәм элекке серһүҙегеҙҙе ҡулланыуығыҙҙы дауам итегеҙ.',
 'noemail' => '$1 исемле ҡулланыусы өсөн электрон почта адресы белдерелмәгән.',
 'noemailcreate' => 'Дөрөҫ электрон почта адресы күрһәтеү кәрәк',
-'passwordsent' => 'Яңы пароль $1 исемле ҡатнашыусының электрон почта адресына ебәрелде.
+'passwordsent' => 'Яңы серһүҙ $1 исемле ҡатнашыусының электрон почта адресына ебәрелде.
 
-Зинһар, паролде алғас, системаға яңынан керегеҙ.',
-'blocked-mailpassword' => 'Һеҙҙең IP-адресығыҙҙан мөхәррирләү тыйылған, шул сәбәпле пароль тергеҙеү ғәмәле лә блокланған.',
+Зинһар, серһүҙҙе алғас, системаға яңынан керегеҙ.',
+'blocked-mailpassword' => 'Һеҙҙең IP-адресығыҙҙан мөхәррирләү тыйылған, шул сәбәпле серһүҙ тергеҙеү ғәмәле лә блокланған.',
 'eauthentsent' => 'Күрһәтелгән электрон почта адресына адресты үҙгәртеүҙе раҫлауығыҙ өсөн хат ебәрелде. Хатта, был адрес һеҙҙеке булғанын раҫлау өсөн ниндәй ғәмәлдәрҙе үтәү кәрәкле икәне тураһында мәғлүмәт бар.',
-'throttled-mailpassword' => 'Ð\9fаÑ\80олде иҫләтеү ғәмәле {{PLURAL:$1|һуңғы $1 сәғәт}} эсенде ҡулланылды инде.
\9dаÑ\81аÑ\80 Ð½Ð¸Ó\99Ñ\82ле Ò¡Ñ\83лланÑ\8bÑ\83Ò\99аÑ\80Ò\93а Ò¡Ð°Ñ\80Ñ\88Ñ\8b, Ð¿Ð°Ñ\80олде иҫләтеү ғәмәлен {{PLURAL:$1|сәғәт|$1 сәғәт}} эсендә бер тапҡыр ғына ҡулланырға була.',
+'throttled-mailpassword' => 'СеÑ\80Ò»Ò¯Ò\99Ò\99е иҫләтеү ғәмәле {{PLURAL:$1|һуңғы $1 сәғәт}} эсенде ҡулланылды инде.
\9dаÑ\81аÑ\80 Ð½Ð¸Ó\99Ñ\82ле Ò¡Ñ\83лланÑ\8bÑ\83Ò\99аÑ\80Ò\93а Ò¡Ð°Ñ\80Ñ\88Ñ\8b, Ð¡ÐµÑ\80Ò»Ò¯Ò\99 иҫләтеү ғәмәлен {{PLURAL:$1|сәғәт|$1 сәғәт}} эсендә бер тапҡыр ғына ҡулланырға була.',
 'mailerror' => 'Хат ебәреү хатаһы: $1',
 'acct_creation_throttle_hit' => 'Һеҙҙең IP-адрестан бер тәүлек эсендә {{PLURAL:$1|$1 иҫәп яҙыуы}} яһалды инде, был һан был ваҡыт аралығы өсөн максимум һан. Шул сәбәпле, был IP-адресына эйә ҡулланыусылар, хәҙерге ваҡытта яңы иҫәп яҙыуы яһай алмайҙар.',
 'emailauthenticated' => 'Электрон почта адресығыҙ раҫланды: $3, $2.',
@@ -636,9 +651,9 @@ $2',
 'accountcreated' => 'Иҫәп яҙыуы яһалды',
 'accountcreatedtext' => '$1 исемле ҡулланыусы өсөн исәп яҙыуы яһалды.',
 'createaccount-title' => '{{SITENAME}}: теркәлеү',
-'createaccount-text' => 'Кемдер, электрон почта адресығыҙҙы күрһәтеп, {{SITENAME}} ($4) проектында «$3» пароле менән «$2» исемле иҫәп яҙыуы теркәне. Һеҙҙең кереүегеҙ һәм паролегеҙҙе алмаштырыуығыҙ кәрәк.
+'createaccount-text' => 'Кемдер, электрон почта адресығыҙҙы күрһәтеп, {{SITENAME}} ($4) проектында «$3» пароле менән «$2» исемле иҫәп яҙыуы теркәне. Һеҙҙең кереүегеҙ һәм серһүҙегеҙҙе алмаштырыуығыҙ кәрәк.
 
-Иҫәп яҙыуы яңылыш яһалһа был хатҡа иғтибар итмәгеҙ.',
+Иҫәп яҙыуы яңылыш яһалһа, был хатҡа иғтибар итмәгеҙ.',
 'usernamehasherror' => 'Ҡулланыусы исемендә "#" символы була алмай',
 'login-throttled' => 'Һеҙ системала артыҡ күп танылырға тырыштығыҙ.
 Зинһар, ҡабатламаҫтан алда бераҙ көтөгөҙ.',
@@ -651,32 +666,30 @@ $2',
 'user-mail-no-addy' => 'Электрон почта адресы булмайынса электрон хәбәр ебәреп ҡараны',
 
 # Change password dialog
-'resetpass' => 'Ð\9fаÑ\80олде үҙгәртеү',
-'resetpass_announce' => 'Һеҙ системала электрон почта аша алынған ваҡытлыса пароль менән танылдығыҙ. Системаға кереүҙә тамалау өсөн яңы пароль булдырығыҙ.',
-'resetpass_header' => 'Иҫәп яҙыуы паролен үҙгәртеү',
-'oldpassword' => 'Иҫке пароль:',
-'newpassword' => 'Яңы пароль:',
-'retypenew' => 'Ð\9fаÑ\80олде яңынан керетегеҙ:',
-'resetpass_submit' => 'Ð\9fаÑ\80олÑ\8c ҡуйырға һәм танышырға',
-'resetpass_success' => 'Ð\9fаÑ\80олегеҙ уңышлы үҙгәртелде! Системала танышыу бара...',
-'resetpass_forbidden' => 'Ð\9fаÑ\80олде үҙгәртеп булмай',
+'resetpass' => 'СеÑ\80Ò»Ò¯Ò\99Ò\99е үҙгәртеү',
+'resetpass_announce' => 'Һеҙ системала электрон почта аша алынған ваҡытлыса серһүҙ менән танылдығыҙ. Системаға кереүҙә тамалау өсөн яңы серһүҙ булдырығыҙ.',
+'resetpass_header' => 'Иҫәп яҙыуы серһүҙен үҙгәртеү',
+'oldpassword' => 'Иҫке серһүҙ:',
+'newpassword' => 'Яңы серһүҙ:',
+'retypenew' => 'СеÑ\80Ò»Ò¯Ò\99Ò\99е яңынан керетегеҙ:',
+'resetpass_submit' => 'СеÑ\80Ò»Ò¯Ò\99 ҡуйырға һәм танышырға',
+'resetpass_success' => 'СеÑ\80Ò»Ò¯Ò\99егеҙ уңышлы үҙгәртелде! Системала танышыу бара...',
+'resetpass_forbidden' => 'СеÑ\80Ò»Ò¯Ò\99Ò\99е үҙгәртеп булмай',
 'resetpass-no-info' => 'Был битте туранан ҡарау өсөн һеҙгә системала танылырға кәрәк.',
-'resetpass-submit-loggedin' => 'Ð\9fаÑ\80олде үҙгәртергә',
+'resetpass-submit-loggedin' => 'СеÑ\80Ò»Ò¯Ò\99Ò\99е үҙгәртергә',
 'resetpass-submit-cancel' => 'Бөтөрөргә',
-'resetpass-wrong-oldpass' => 'Хаталы ваҡытлыса йәки ағымдағы пароль.
-Һеҙ, бәлки, паролегеҙҙе алмаштырғанһығыҙ йәки яңы пароль һоратҡанһығыҙ.',
-'resetpass-temp-password' => 'Ваҡытлыса пароль',
+'resetpass-wrong-oldpass' => 'Хаталы ваҡытлыса йәки ағымдағы серһүҙ.
+Һеҙ, бәлки, серһүҙегеҙҙе алмаштырғанһығыҙ йәки яңы серһүҙ һоратҡанһығыҙ.',
+'resetpass-temp-password' => 'Ваҡытлыса серһүҙ',
 
 # Special:PasswordReset
-'passwordreset' => 'Паролде ташлатыу',
-'passwordreset-text' => 'Иҫәп яҙыуығыҙ мәғлүмәттәрен хат аша алыу өсөн киләһе форманы тултырығыҙ.',
-'passwordreset-legend' => 'Паролде ташлатыу',
-'passwordreset-disabled' => 'Был викила паролде ташлатыу ғәмәлдә түгел',
-'passwordreset-pretext' => '{{PLURAL:$1||аҫта күрһәтелгән мәғлүмәттәрҙең бер киҫәген керетегеҙ}}',
+'passwordreset' => 'Серһүҙҙе ташлатыу',
+'passwordreset-legend' => 'Серһүҙҙе ташлатыу',
+'passwordreset-disabled' => 'Был викила серһүҙҙе ташлатыу ғәмәлдә түгел',
 'passwordreset-username' => 'Ҡулланыусы исеме:',
 'passwordreset-domain' => 'Домен:',
 'passwordreset-capture' => 'Хәбәрҙең һуңғы хәлен ҡарарғамы?',
-'passwordreset-capture-help' => 'Әгәр был билдәне ҡуйһағыҙ, ҡулланыусыға ебәрелгән ваҡытлыса пароль һеҙгә күрһәтеләсәк.',
+'passwordreset-capture-help' => 'Әгәр был билдәне ҡуйһағыҙ, ҡулланыусыға ебәрелгән ваҡытлыса серһүҙ һеҙгә күрһәтеләсәк.',
 'passwordreset-email' => 'Электрон почта адресы:',
 'passwordreset-emailtitle' => '{{SITENAME}} иҫәп яҙыуы мәғлүмәттәре',
 'passwordreset-emailtext-ip' => 'Берәү (бәлки һәҙ, $1 IP-адресынан ) {{SITENAME}} ($4) проектындағы иҫәп яҙыуығыҙҙы хәтерләтеүҙе һоратты.
@@ -684,18 +697,18 @@ $2',
 
 $2
 
-Был ваҡытлыса {{PLURAL:$3|пароль|паролдәр}} {{PLURAL:$5|$5 көн}} ғәмәлдә буласаҡ.
-Һеҙ системала танылырға һәм яңы пароль һайларға тейешһегеҙ.
-Әгәр, һеҙ быны һоратмаған булһағыҙ йәки элекке паролегеҙҙе киренән иҫләһәгеҙ һәм уны үҙгәртергә теләмәһәгеҙ, был хатҡа иғтибар итмәгеҙ һәм элекке паролегеҙҙе ҡулланыуҙы дауам итегеҙ.',
+Был ваҡытлыса {{PLURAL:$3|серһүҙ|серһүҙҙәр}} {{PLURAL:$5|$5 көн}} ғәмәлдә буласаҡ.
+Һеҙ системала танылырға һәм яңы серһүҙ һайларға тейешһегеҙ.
+Әгәр, һеҙ быны һоратмаған булһағыҙ йәки элекке серһүҙегеҙҙе киренән иҫләһәгеҙ һәм уны үҙгәртергә теләмәһәгеҙ, был хатҡа иғтибар итмәгеҙ һәм элекке серһүҙегеҙҙе ҡулланыуҙы дауам итегеҙ.',
 'passwordreset-emailtext-user' => '{{SITENAME}} проектындағы $1 ҡулланыусыһы {{SITENAME}} ($4) проектындағы иҫәп яҙыуығыҙҙы хәтерләтеүҙе һоратты. Киләһе ҡулланыусы {{PLURAL:$3|иҫәп яҙыуы|иҫәп яҙыуҙары}} был электрон почта адресы менән бәйле:
 
 $2
 
-Был ваҡытлыса {{PLURAL:$3|пароль|паролдәр}} {{PLURAL:$5|$5 көн}} ғәмәлдә буласаҡ.
-Һеҙ системала танылырға һәм яңы пароль һайларға тейешһегеҙ.
-Әгәр, һеҙ быны һоратмаған булһағыҙ йәки элекке паролегеҙҙе киренән иҫләһәгеҙ һәм уны үҙгәртергә теләмәһәгеҙ, был хатҡа иғтибар итмәгеҙ һәм элекке паролегеҙҙе ҡулланыуҙы дауам итегеҙ.',
+Был ваҡытлыса {{PLURAL:$3|серһүҙ|серһүҙҙәр}} {{PLURAL:$5|$5 көн}} ғәмәлдә буласаҡ.
+Һеҙ системала танылырға һәм яңы серһүҙ һайларға тейешһегеҙ.
+Әгәр, һеҙ быны һоратмаған булһағыҙ йәки элекке серһүҙегеҙҙе киренән иҫләһәгеҙ һәм уны үҙгәртергә теләмәһәгеҙ, был хатҡа иғтибар итмәгеҙ һәм элекке серһүҙеҙҙе ҡулланыуҙы дауам итегеҙ.',
 'passwordreset-emailelement' => 'Ҡулланыусы исеме: $1
-Ваҡытлыса пароль: $2',
+Ваҡытлыса серһүҙ: $2',
 'passwordreset-emailsent' => 'Электрон почта аша иҫләтеү хаты ебәрелде.',
 'passwordreset-emailsent-capture' => 'Ебәрелгән хәтерләтеү хәбәре түбәндә күрһәлгән.',
 'passwordreset-emailerror-capture' => 'Килеп сыҡҡан хәтерләтеү хәбәре түбәндә күрһәтелгән, тик уны ебәреү уңышһыҙ тамамланды. Сәбәбе:$1',
@@ -703,12 +716,12 @@ $2
 # Special:ChangeEmail
 'changeemail' => 'Электрон почта адресын үҙгәртергә',
 'changeemail-header' => 'Электрон почта адресын үҙгәртеү',
-'changeemail-text' => 'Электрон почта адресығыҙҙы үҙгәртеү өсөн түбәндәге форманы тултырығыҙ. Үҙгәртеүҙәрҙе раҫлау өсөн паролегеҙҙе керетеү кәрәк буласаҡ.',
+'changeemail-text' => 'Электрон почта адресығыҙҙы үҙгәртеү өсөн түбәндәге форманы тултырығыҙ. Үҙгәртеүҙәрҙе раҫлау өсөн серһүҙегеҙҙе керетеү кәрәк буласаҡ.',
 'changeemail-no-info' => 'Был биткә туранан ирешеү өсөн һеҙгә системала танылыу кәрәк.',
 'changeemail-oldemail' => 'Хәҙерге электрон почта адресы:',
 'changeemail-newemail' => 'Яңы электрон почта адресы:',
 'changeemail-none' => '(юҡ)',
-'changeemail-password' => '{{SITENAME}} прокты өсөн паролегеҙ:',
+'changeemail-password' => '{{SITENAME}} прокты өсөн серһүҙегеҙ:',
 'changeemail-submit' => 'Адресты үҙгәртергә',
 'changeemail-cancel' => 'Кире алырға',
 
@@ -751,30 +764,30 @@ $2
 'blockedtitle' => 'Ҡулланыусы блокланған',
 'blockedtext' => "'''Иҫәп яҙыуығыҙ йәки IP-адресығыҙ блокланған.'''
 
-Блоклаусы хәким: $1.
+Блоклаусы хаким: $1.
 Белдерелгән сәбәп: ''$2''.
 
 * Блоклау башланған ваҡыт: $8
 * Блоклау  аҙағы: $6
 * Блоклауҙар һаны: $7
 
-Һеҙ $1 йәки башҡа [[{{MediaWiki:Grouppage-sysop}}|хәкимгә]] блоклау буйынса һорауҙарығыҙҙы ебәрә алаһығыҙ.
-Иҫегеҙҙе тотоғоҙ: әгәр һеҙ теркәлмәгән һәм электрон почта адресығыҙҙы раҫламаған булһағыҙ ([[Special:Preferences|көйләүҙәрем битендә]]), хәкимгә хат ебәрә алмайһығыҙ. Шулай ук блоклау ваҡытында һеҙҙең хат ебәреү мөмкинлегегеҙ сикләгән булырға ла мөмкин.
+Һеҙ $1 йәки башҡа [[{{MediaWiki:Grouppage-sysop}}|хакимгә]] блоклау буйынса һорауҙарығыҙҙы ебәрә алаһығыҙ.
+Иҫегеҙҙе тотоғоҙ: әгәр һеҙ теркәлмәгән һәм электрон почта адресығыҙҙы раҫламаған булһағыҙ ([[Special:Preferences|көйләүҙәрем битендә]]), хакимгә хат ебәрә алмайһығыҙ. Шулай ук блоклау ваҡытында һеҙҙең хат ебәреү мөмкинлегегеҙ сикләгән булырға ла мөмкин.
 Һеҙҙең IP-адрес — $3, блоклау идентификаторы — #$5.
 Хаттарҙа был мәғлүмәттәрҙе күрһәтергә онотмағыҙ.",
-'autoblockedtext' => "Һеҙҙең IP-адресығыҙ автоматик рәүештә блокланған. Сәбәбе, был адрес элек блокланған ҡулланыусыларҙың береһе тарафынан ҡулланылған. Блоклаусы хәким ($1) киләһе сәбәпте белдергән:
+'autoblockedtext' => "Һеҙҙең IP-адресығыҙ автоматик рәүештә блокланған. Сәбәбе, был адрес элек блокланған ҡулланыусыларҙың береһе тарафынан ҡулланылған. Блоклаусы хаким ($1) киләһе сәбәпте белдергән:
 
 :«$2»
 
-Блоклаусы хәким: $1.
+Блоклаусы хаким: $1.
 Белдерелгән сәбәп: ''$2''.
 
 * Блоклау башланған ваҡыт: $8
 * Блоклау  аҙағы: $6
 * Блоклауҙар һаны: $7
 
-Һеҙ $1 йәки башҡа [[{{MediaWiki:Grouppage-sysop}}|хәкимгә]] блоклау буйынса һорауҙарығыҙҙы ебәрә алаһығыҙ.
-Иҫегеҙҙе тотоғоҙ: әгәр һеҙ теркәлмәгән һәм электрон почта адресығыҙҙы раҫламаған булһағыҙ ([[Special:Preferences|көйләүҙәрем битендә]]), хәкимгә хат ебәрә алмайһығыҙ. Шулай ук блоклау ваҡытында һеҙҙең хат ебәреү мөмкинлегегеҙ сикләгән булырға ла мөмкин.
+Һеҙ $1 йәки башҡа [[{{MediaWiki:Grouppage-sysop}}|хакимгә]] блоклау буйынса һорауҙарығыҙҙы ебәрә алаһығыҙ.
+Иҫегеҙҙе тотоғоҙ: әгәр һеҙ теркәлмәгән һәм электрон почта адресығыҙҙы раҫламаған булһағыҙ ([[Special:Preferences|көйләүҙәрем битендә]]), хакимгә хат ебәрә алмайһығыҙ. Шулай ук блоклау ваҡытында һеҙҙең хат ебәреү мөмкинлегегеҙ сикләгән булырға ла мөмкин.
 Һеҙҙең IP-адрес — $3, блоклау идентификаторы — #$5.
 Хаттарҙа был мәғлүмәттәрҙе күрһәтергә онотмағыҙ.",
 'blockednoreason' => 'сәбәп белдерелмәгән',
@@ -787,10 +800,10 @@ $2
 'loginreqtitle' => 'Танылыу кәрәк',
 'loginreqlink' => 'танылыу',
 'loginreqpagetext' => 'Башҡа биттәрҙе ҡарау өсөн $1 кәрәк.',
-'accmailtitle' => 'Ð\9fаÑ\80олÑ\8c ебәрелде.',
-'accmailtext' => "[[User talk:$1|$1]] ҡулланыусыһы өсөн яһалған пароль $2 адресына ебәрелде.
+'accmailtitle' => 'СеÑ\80Ò»Ò¯Ò\99 ебәрелде.',
+'accmailtext' => "[[User talk:$1|$1]] ҡулланыусыһы өсөн яһалған серһүҙ $2 адресына ебәрелде.
 
-Системала танылғандан һуң ''[[Special:ChangePassword|паролегеҙҙе үҙгәртә алаһығыҙ]]''.",
+Системала танылғандан һуң ''[[Special:ChangePassword|серһүҙегеҙҙе үҙгәртә алаһығыҙ]]''.",
 'newarticle' => '(Яңы)',
 'newarticletext' => "Һеҙ һылтанма буйынса әлегә яһалмаған биткә күстегеҙ.
 Яңы бит яһар өсөн аҫтағы тәҙрәгә текст керетегеҙ (тулыраҡ мәғлүмәт өсөн [[{{MediaWiki:Helppage}}|ярҙам битен]] ҡарағыҙ).
@@ -844,9 +857,9 @@ $2
 Мәҡәлә текстын боҙолоуҙан һаҡлау өсөн үҙгәртеүегеҙ кире алынды.
 Бындай хәлдәр хаталы аноним web-проксилар ҡулланғанда килеп сығырға мөмкин.",
 'edit_form_incomplete' => "'''Мөхәррирләү формаһының ҡайһы өлөштәре серверға барып етмәне. Төҙәтеүҙәрегеҙҙе яҡшы итеп тикшерегеҙ һәм яңынан ҡабатлағыҙ.'''",
-'editing' => 'Мөхәрирләү  $1',
+'editing' => 'Мөхәррирләү  $1',
 'creating' => 'Төҙөү $1',
-'editingsection' => 'Мөхәрирләү  $1 (секция)',
+'editingsection' => 'Мөхәррирләү  $1 (секция)',
 'editingcomment' => '$1 мөхәррирләнә (яңы бүлек)',
 'editconflict' => 'Мөхәррирләү конфликты: $1',
 'explainconflict' => 'Һеҙ был битте мөхәррирләгән ваҡытта кемдер яңы үҙгәрештәр керетте.
@@ -871,12 +884,12 @@ $2
 'readonlywarning' => "'''КИҪӘТЕҮ: Техник хеҙмәтләндереү сәбәпле мәғлүмәттәр базаһы блокланған, шунлыҡтан үҙгәртеүҙәрегеҙҙе хәҙер һаҡлай алмайһығыҙ.'''
 Тексты аҙаҡтан ҡулланыу өсөн файлда һаҡлап тора алаһығыҙ.
 
әким белдергән сәбәп: $1",
аким белдергән сәбәп: $1",
 'protectedpagewarning' => "'''КИҪӘТЕҮ: Һеҙ был битте үҙгәртә алмайһығыҙ, был хоҡуҡҡа хакимдәр генә эйә.'''
 Белешмә өсөн түбәндә һуңғы үҙгәртеү тураһында мәғлүмәт бирелә:",
 'semiprotectedpagewarning' => "'''Киҫәтеү:''' был бит һаҡланған. Уны теркәлгән ҡулланыусылар ғына үҙгәртә ала.
 Белешмә өсөн түбәндә һуңғы үҙгәртеү тураһында мәғлүмәт бирелә:",
-'cascadeprotectedwarning' => "'''КИҪӘТЕҮ:''' Был битте тик хәкимдәр генә үҙгәртә ала, сөнки ул эҙмә-эҙлекле һаҡлау ҡуйылған {{PLURAL:$1|киләһе биткә|киләһе биттәргә}} керә:",
+'cascadeprotectedwarning' => "'''КИҪӘТЕҮ:''' Был битте тик хакимдәр генә үҙгәртә ала, сөнки ул эҙмә-эҙлекле һаҡлау ҡуйылған {{PLURAL:$1|киләһе биткә|киләһе биттәргә}} керә:",
 'titleprotectedwarning' => "'''Киҫәтеү: Бындый исемле бит һаҡланған, уны үҙгәртеү өсөн [[Special:ListGroupRights|тейешле хоҡуҡҡа]] эйә булыу кәрәк.'''
 Белешмә өсөн түбәндә һуңғы үҙгәртеү тураһында мәғлүмәт бирелә:",
 'templatesused' => 'Был биттә ҡулланылған {{PLURAL:$1|ҡалып|ҡалыптар}}:',
@@ -912,6 +925,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' => 'викияҙма',
@@ -1030,7 +1045,7 @@ $3 белдергән сәбәп: ''$2''",
 'revdelete-selected' => "'''[[:$1]] битенең {{PLURAL:$2|һайланған версияһы|һайланған версиялары}}:'''",
 'logdelete-selected' => "'''Яҙманың {{PLURAL:$1|һайланған яҙыуы|һайланған яҙыуҙары}}:'''",
 'revdelete-text' => "'''Биттәрҙең юйылған версиялары һәм ваҡиғалар, бит тарихында һәм яҙмаларҙа күрһәтеләсәк, ләкин уларҙың эстәлектәренең бер өлөшө ябай ҡулланыусыларға асыҡ булмаясаҡ.'''
-{{SITENAME}} проектының хәкимдәре йәшерен эстәлеккә керә һәм өҫтәмә сикләүҙәр ҡуйылған осраҡтарҙан тыш, ошо уҡ арайөҙ аша тергеҙә аласаҡтар.",
+{{SITENAME}} проектының хакимдәре йәшерен эстәлеккә керә һәм өҫтәмә сикләүҙәр ҡуйылған осраҡтарҙан тыш, ошо уҡ арайөҙ аша тергеҙә аласаҡтар.",
 'revdelete-confirm' => 'Зинһар, был ғәмәлде үтәргә теләүегеҙҙе, буласаҡ һөҙөмтәләрҙә аңлауығыҙҙы, [[{{MediaWiki:Policy-url}}|ҡағиҙәләр]] буйынса эшләүегеҙҙе раҫлағыҙ.',
 'revdelete-suppress-text' => "Йәшереү '''тик''' киләһе осраҡтарҙа ғына башҡарыла:
 
@@ -1042,11 +1057,11 @@ $3 белдергән сәбәп: ''$2''",
 'revdelete-hide-name' => 'Ғәмәлде һәм маҡсатын йәшерергә',
 'revdelete-hide-comment' => 'Үҙгәртеү тасуирламаларын йәшерергә',
 'revdelete-hide-user' => 'Мөхәррирләүсенең исемен/IP-адресын йәшерергә',
-'revdelete-hide-restricted' => 'Мәғлүмәттәрҙе хәкимдәрҙән дә йәшерергә',
+'revdelete-hide-restricted' => 'Мәғлүмәттәрҙе хакимдәрҙән дә йәшерергә',
 'revdelete-radio-same' => '(үҙгәртмәҫкә)',
 'revdelete-radio-set' => 'Эйе',
 'revdelete-radio-unset' => 'Юҡ',
-'revdelete-suppress' => 'Мәғлүмәттәрҙе шулай уҡ хәкимдәрҙән дә йәшерергә',
+'revdelete-suppress' => 'Мәғлүмәттәрҙе шулай уҡ хакимдәрҙән дә йәшерергә',
 'revdelete-unsuppress' => 'Тергеҙелгән версияларҙан бар сикләүҙәрҙе алырға',
 'revdelete-log' => 'Сәбәп:',
 'revdelete-submit' => 'Һайланған {{PLURAL:$1|версия|версиялар}} өсөн ҡулланырға',
@@ -1071,7 +1086,7 @@ $1",
 'revdelete-no-change' => "'''Иғтибар:'''  $2 $1 ваҡытлы яҙыу, һоратылған күренеүсәнлек көйләүҙәренә эйә.",
 'revdelete-concurrent-change' => '$2, $1 ваҡытлы яҙманы үҙгәртеүҙә хата: һеҙ уны үҙгәртергә тырышҡан ваҡытта уның статусын башҡа берәү үҙгәрткән.
 Зинһар, яҙмаларҙы ҡарағыҙ.',
-'revdelete-only-restricted' => '$2, $1 ваҡытлы яҙманы йәшереүҙә хата: башҡа йәшереү көйләүҙәренең береһен һайламайынса яҙманы хәкимдәрҙән йәшерә алмайһығыҙ.',
+'revdelete-only-restricted' => '$2, $1 ваҡытлы яҙманы йәшереүҙә хата: башҡа йәшереү көйләүҙәренең береһен һайламайынса яҙманы хакимдәрҙән йәшерә алмайһығыҙ.',
 'revdelete-reason-dropdown' => '* Ғәҙәттәге юйыу сәбәптәре
 ** Авторлыҡ хоҡуҡтарын боҙоу
 ** Урынһыҙ комментарий йәки шәхси мәғлүмәт
@@ -1089,8 +1104,8 @@ $1",
 
 # History merging
 'mergehistory' => 'Үҙгәртеүҙәр тарихын берләштерергә',
-'mergehistory-header' => 'Был бит, ике биттең үҙгәртеүҙәр тарихын берләштерергә мөмкинселек бирә.
ыл үҙгәртеүҙең, бит тарихын, боҙмайынса, дауам иттерәсәген тикшерегеҙ.',
+'mergehistory-header' => 'Был бит, ике биттең үҙгәртеүҙәр тарихын берләштереү мөмкинлеген бирә.
ерләштереүҙең үҙгәртеүҙәр тарихын боҙмауын тикшерегеҙ.',
 'mergehistory-box' => 'Ике биттең үҙгәртеүҙәр тарихын берләштерергә',
 'mergehistory-from' => 'Сығанаҡ бит:',
 'mergehistory-into' => 'Маҡсат бит:',
@@ -1152,17 +1167,16 @@ $1",
 'searchmenu-legend' => 'Эҙләү көйләүҙәре',
 'searchmenu-exists' => "'''Был вики-проектта «[[:$1]]» бите бар'''",
 'searchmenu-new' => "'''Был википроектта \"[[:\$1]]\" бите булдырырға.'''",
-'searchhelp-url' => 'Help:Эстәлек',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Был префикслы биттәрҙе күрһәтергә]]',
 'searchprofile-articles' => 'Эстәлек биттәре',
-'searchprofile-project' => 'Ярҙам һәм проект биттәре',
+'searchprofile-project' => 'Ярҙамсы һәм проект биттәре',
 'searchprofile-images' => 'Мультимедиа',
 'searchprofile-everything' => 'Барыһы',
 'searchprofile-advanced' => 'Киңәйтелгән',
 '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 һүҙ|$2 һүҙ}})',
 'search-result-category-size' => '{{PLURAL:$1|$1 ағза}} ({{PLURAL:$2|$2 эске категория}}, {{PLURAL:$3|$3 файл}})',
@@ -1196,22 +1210,13 @@ $1",
 Хәҙергә эҙләүҙе Google менән үтәй алаһығыҙ.
 Тик унда {{SITENAME}} өсөн индекслауҙың иҫке булыуы мөмкинлеген онотмағыҙ.',
 
-# Quickbar
-'qbsettings' => 'Тиҙ күсеү',
-'qbsettings-none' => 'Һис бере',
-'qbsettings-fixedleft' => 'Һулда нығытылған',
-'qbsettings-fixedright' => 'Уңда нығытылған',
-'qbsettings-floatingleft' => 'Һулда күсеүсе',
-'qbsettings-floatingright' => 'Уңда күсеүсе',
-'qbsettings-directionality' => 'Беркетелгән, телегеҙҙең яҙыу йүнәлешенә бәйле',
-
 # Preferences page
 'preferences' => 'Көйләүҙәр',
 'mypreferences' => 'Көйләүҙәр',
 'prefs-edits' => 'Төҙәтеүҙәр һаны:',
 'prefsnologin' => 'Танылмағанһығыҙ',
 'prefsnologintext' => 'Ҡатнашыусы көйләүҙәрен үҙгәртеү өсөн, һеҙ <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}}танылырға]</span> тейешһегеҙ.',
-'changepassword' => 'Ð\9fаÑ\80олде үҙгәртергә',
+'changepassword' => 'СеÑ\80Ò»Ò¯Ò\99Ò\99е үҙгәртергә',
 'prefs-skin' => 'Күренеш',
 'skin-preview' => 'Алдан байҡау',
 'datedefault' => 'Ғәҙәттәге',
@@ -1228,7 +1233,7 @@ $1",
 'prefs-watchlist-edits-max' => 'Иң күбе: 1000',
 'prefs-watchlist-token' => 'Күҙәтеү исемлеге токены:',
 'prefs-misc' => 'Башҡа көйләүҙәр',
-'prefs-resetpass' => 'Ð\9fаÑ\80олде үҙгәртергә',
+'prefs-resetpass' => 'СеÑ\80Ò»Ò¯Ò\99Ò\99е үҙгәртергә',
 'prefs-changeemail' => 'Электрон почта адресын үҙгәртергә',
 'prefs-setemail' => 'Электрон почта адресын көйләү',
 'prefs-email' => 'Электрон почта көйләүҙәре',
@@ -1304,8 +1309,8 @@ $1",
 'email' => 'Электрон почта',
 'prefs-help-realname' => 'Ысын исемегеҙ (теләк буйынса).
 Әгәр уны күрһәтһәгеҙ, битте кемдең төҙәткәнен күрһәткәндә ҡулланыласаҡ.',
-'prefs-help-email' => 'Электрон почта (теләк буйынса). Күрһәтелгән булһа, ғәмәлдә булған паролегеҙҙе онотҡан осраҡта адресығыҙға яңы пароль ебәреләсәк.
-Шулай уҡ башҡа ҡатнашыусылар менән үҙ битегеҙ аша, электрон почтағыҙҙың адресын күрһәтмәйенсә, тура бәйләнешкә инергә мөмкинселек бирә.',
+'prefs-help-email' => 'Электрон почта (теләк буйынса). Күрһәтелгән булһа, ғәмәлдә булған серһүҙегеҙҙе онотҡан осраҡта адресығыҙға яңы серһүҙ ебәреләсәк.
+Шулай уҡ башҡа ҡатнашыусылар менән үҙ битегеҙ аша, электрон почтағыҙҙың адресын күрһәтмәйенсә, тура бәйләнешкә инергә мөмкинлек бирә.',
 'prefs-help-email-others' => 'Ул шулай уҡ башҡа ҡулланыусыларға, шәхси битегеҙҙәге һылтанма аша, һеҙҙән менән бәйләнешкә инергә рөхсәт бирәсәк.
 Һеҙҙең почта адресығыҙ уларға күрһәтелмәйәсәк.',
 'prefs-help-email-required' => 'Электрон почта адресы кәрәк.',
@@ -1345,7 +1350,7 @@ $1",
 'userrights-reason' => 'Сәбәп:',
 'userrights-no-interwiki' => 'Һеҙҙең башҡа вики-проекттарҙа ҡатнашыусыларҙың хоҡуҡтарын үҙгәртергә хоҡуҡтарығыҙ юҡ.',
 'userrights-nodatabase' => '$1 базаһы юҡ йәки урындағы (локаль) база түгел.',
-'userrights-nologin' => 'Ҡатнашыусыларҙың хоҡуҡтарын билдәләр өсөн, һеҙ хәким хоҡуҡтары менән [[Special:UserLogin|танылырға]] тейешһегеҙ.',
+'userrights-nologin' => 'Ҡатнашыусыларҙың хоҡуҡтарын билдәләр өсөн, һеҙ хаким хоҡуҡтары менән [[Special:UserLogin|танылырға]] тейешһегеҙ.',
 'userrights-notallowed' => 'Һеҙҙең иҫәп яҙыуығыҙҙан ҡатнашыусыларҙың хоҡуҡтарын өҫтәү йәки алыу рөхсәт ителмәгән.',
 'userrights-changeable-col' => 'Һеҙ үҙгәртә алған төркөмдәр',
 'userrights-unchangeable-col' => 'Һеҙ үҙгәртә алмаған төркөмдәр',
@@ -1355,7 +1360,7 @@ $1",
 'group-user' => 'Ҡулланыусылар',
 'group-autoconfirmed' => 'Автоматик раҫланған ҡулланыусылар',
 'group-bot' => 'Боттар',
-'group-sysop' => 'Хәкимдәр',
+'group-sysop' => 'Хакимдәр',
 'group-bureaucrat' => 'Бюрократтар',
 'group-suppress' => 'Тикшереүселәр',
 'group-all' => '(бөтә)',
@@ -1405,7 +1410,7 @@ $1",
 'right-deletedtext' => 'Биттең юйылған өлгөләре араһындағы юйылған текстты һәм үҙгәртеүҙәрҙе ҡарау',
 'right-browsearchive' => 'Юйылған биттәрҙе эҙләү',
 'right-undelete' => 'Юйылған биттәрҙе кире ҡайтарыу',
-'right-suppressrevision' => 'Биттәрҙең хәкимдәрҙән йәшерелгән өлгөләрен ҡарау һәм тергеҙеү',
+'right-suppressrevision' => 'Биттәрҙең хакимдәрҙән йәшерелгән өлгөләрен ҡарау һәм тергеҙеү',
 'right-suppressionlog' => 'Шәхси журналдарҙы ҡарау',
 'right-block' => 'Башҡа ҡатнашыусыларға мөхәррирләүҙе тыйыу',
 'right-blockemail' => 'Электрон почтаға хат ебәреүҙе тыйыу',
@@ -1434,7 +1439,7 @@ $1",
 'right-siteadmin' => 'Мәғлүмәттәр базаһын асыу һәм ябыу',
 'right-override-export-depth' => '5-се тәрәнлеккә тиклем бәйле биттәре менән бергә биттәрҙе сығарыу',
 'right-sendemail' => 'Башҡа ҡатнашыусыларға электрон почта аша хат ебәреү',
-'right-passwordreset' => 'Ð\9fаÑ\80олде Ñ\8fÒ£Ñ\8bÑ\80Ñ\82Ñ\8bÑ\83 Ñ\85Ó\99бÓ\99Ñ\80Ò\99Ó\99Ñ\80ен ҡарау',
+'right-passwordreset' => 'СеÑ\80Ò»Ò¯Ò\99Ò\99е Ñ\8fÒ£Ñ\8bÑ\80Ñ\82Ñ\8bÑ\83 Ð¾Ñ\81Ñ\80аҡÑ\82аÑ\80Ñ\8bн ҡарау',
 
 # Special:Log/newusers
 'newuserlogpage' => 'Яңы ҡулланыусы яҙмалары',
@@ -1753,7 +1758,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>
@@ -1767,7 +1771,7 @@ $1',
 Бәлки, һеҙгә сайт бушыраҡ саҡта ҡабатлап ҡарарға кәрәктер.',
 
 'license' => 'Рөхсәтнамә:',
-'license-header' => 'Рөхсәтнамә',
+'license-header' => 'Рөхсәтнәмә',
 'nolicense' => 'Бер нимә лә һайланмаған',
 'license-nopreview' => '(Ҡарап сығыу мөмкин түгел)',
 'upload_source_url' => '(Дөрөҫ, дөйөм ҡулланыу өсөн асыҡ URL-адрес)',
@@ -2028,7 +2032,7 @@ $1',
 'prevpage' => 'Алдағы бит ($1)',
 'allpagesfrom' => 'Ошондай хәрефтәрҙән башланған биттәрҙе күрһәтергә:',
 'allpagesto' => 'Ошоға бөткән биттәрҙе күрһәтергә:',
-'allarticles' => 'Бөтә мәҡәләләр',
+'allarticles' => 'Барлыҡ мәҡәләләр',
 'allinnamespace' => 'Бөтә биттәр (Исемдәре «$1» арауығында)',
 'allnotinnamespace' => 'Бөтә биттәр («$1» исемдәр арауығынан башҡа)',
 'allpagesprev' => 'Алдағы',
@@ -2076,6 +2080,15 @@ $1',
 'listusers-noresult' => 'Ҡатнашыусылар табылманы',
 'listusers-blocked' => '(бикләнгән)',
 
+# Special:ActiveUsers
+'activeusers' => 'Әүҙем ҡатнашыусылар исемлеге',
+'activeusers-intro' => 'Был — һуңғы $1 {{PLURAL:$1|көн}} эсендә ниҙер башҡарған ҡатнашыусылар исемлеге.',
+'activeusers-count' => 'һуңғы $3 {{PLURAL:$3|көн}} эсендә $1 {{PLURAL:$1|үҙгәртеү}}',
+'activeusers-from' => 'Ошондай хәрефтәрҙән башланған ҡатнашыусыларҙы күрһәтергә:',
+'activeusers-hidebots' => 'Боттарҙы йәшерергә',
+'activeusers-hidesysops' => 'Хакимдәрҙе йәшерергә',
+'activeusers-noresult' => 'Ҡатнашыусылар табылманы',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Ҡатнашыусылар төркөмө хоҡуҡтары',
 'listgrouprights-summary' => 'Түбәндә был вики-проектта билдәләнгән ҡатнашыусы төркөмдәре килтерелгән һәм уларҙың хоҡуҡтары күрһәтелгән.
@@ -2152,9 +2165,9 @@ $1',
 'notanarticle' => 'Мәҡәлә түгел',
 'notvisiblerev' => 'Башҡа ҡатнашыусы тарафынан керетелгән һуңғы өлгө юйылған',
 'watchnochange' => 'Күрһәтелгән арауыҡта күҙәтеүҙәр исемлегенән бер ни ҙә үҙгәрмәгән.',
-'watchlist-details' => 'Һеҙҙең күҙәтеү исемлегегеҙҙә, фекер алышыу биттәрен һанамағанда, {{PLURAL:$1|$1 бит|$1 бит}} бар.',
-'wlheader-enotif' => 'Электрон почта аша белдереү һайланған',
-'wlheader-showupdated' => "Һеҙҙең аҙаҡҡы кереүегеҙҙән һуң үҙгәргән биттәр '''ҡалын''' шрифт менән күрһәтелгән.",
+'watchlist-details' => 'Һеҙҙең күҙәтеү исемлегегеҙҙә, фекерләшеү биттәрен һанамағанда, {{PLURAL:$1|$1 бит|$1 бит}} бар.',
+'wlheader-enotif' => 'Электрон почта аша белдереү һайланған',
+'wlheader-showupdated' => "Һеҙҙең аҙаҡҡы кереүегеҙҙән һуң үҙгәргән биттәр '''ҡалын''' шрифт менән күрһәтелгән.",
 'watchmethod-recent' => 'күҙәтелгән биттәр өсөн аҙаҡҡы үҙгәртеүҙәрҙе ҡарау',
 'watchmethod-list' => 'аҙаҡҡы үҙгәртеүҙәр өсөн күҙәтелгән биттәрҙе ҡарау',
 'watchlistcontains' => 'Һеҙҙең күҙәтеү исемлегендә $1 {{PLURAL:$1|бит|бит}}бар.',
@@ -2299,7 +2312,7 @@ $2 өлгөһөнә ҡайтыу.',
 'protect-default' => 'Бар ҡулланыусыларға рөхсәт бирергә',
 'protect-fallback' => '«$1» рөхсәте кәрәк',
 'protect-level-autoconfirmed' => 'Яңы һәм теркәлмәгән ҡулланыусыларҙан һаҡларға',
-'protect-level-sysop' => 'Хәкимдәр генә',
+'protect-level-sysop' => 'Хакимдәр генә',
 'protect-summary-cascade' => 'эҙмә-эҙлекле',
 'protect-expiring' => '$1 бөтә (UTC)',
 'protect-expiring-local' => '$1 тамамлана',
@@ -2352,7 +2365,7 @@ $2 өлгөһөнә ҡайтыу.',
 Бындай ваҡытта һеҙ һуңғы юйылған өлгөләрҙе һайлауҙы алырға йәки күрһәтергә тейешһегеҙ.',
 'undeletehistorynoadmin' => 'Мәҡәлә юйылған.
 Түбәндә юйыу сәбәптәре һәм мәҡәләне юйғанға тиклем мөхәррирләүсе ҡатнашыусылар исемлеге килтерелгән. 
-Юйылған мәҡәләне хәкимдәр генә ҡарай ала.',
+Юйылған мәҡәләне хакимдәр генә ҡарай ала.',
 'undelete-revision' => '$1 битенең $3 ҡатнашыусыһының ($4 $5 мөхәррирләгән) юйылған өлгөһө:',
 'undeleterevision-missing' => 'Был өлгө дөрөҫ түгел йәки бөтөнләй юҡ.
 Һеҙ дөрөҫ булмаған һылтанма аша кергәнһегеҙ йәки был өлгө архивтан юйылған, булырға тейеш.',
@@ -2415,7 +2428,7 @@ $1',
 'sp-contributions-deleted' => 'ҡулланыусының юйылған өлөшө',
 'sp-contributions-uploads' => 'тейәүҙәр',
 'sp-contributions-logs' => 'журналдар',
-'sp-contributions-talk' => 'фекер алышыу',
+'sp-contributions-talk' => 'фекерләшеү',
 'sp-contributions-userrights' => 'ҡатнашыусы хоҡуҡтарын идаралау',
 'sp-contributions-blocked-notice' => 'Әлеге ваҡытта был ҡатнашыусы бикле.
 Түбәндә бикләү яҙмаларынан һуңғы ҡатнашыусыны бикләү яҙмаһы килтерелгән:',
@@ -2548,7 +2561,7 @@ $1 ҡатнашыусыһын бикләү сәбәбе: "$2"',
 'block-log-flags-nousertalk' => 'үҙенең фекер алышыу битен мөхәррирләй алмай',
 'block-log-flags-angry-autoblock' => 'киңәйтелгән авто бикләү һайланған',
 'block-log-flags-hiddenname' => 'ҡатнашыусы исеме йәшерелгән',
-'range_block_disabled' => 'Хәкимдәргә бикләү арауыҡтарын булдырыу тыйылған.',
+'range_block_disabled' => 'Хакимдәргә бикләү арауыҡтарын булдырыу тыйылған.',
 'ipb_expiry_invalid' => 'Тамамланыу ваҡыты дөрөҫ түгел.',
 'ipb_expiry_temp' => 'Бикләү ваҡытында ҡатнашыусы исеме йәшерелһә, бикләү ваҡыты сикһеҙ булырға тейеш.',
 'ipb_hide_invalid' => 'Иҫәп яҙмаһын йәшереү мөмкин түгел, ул бигерәк күп үҙгәртеүҙәр яһаған, булырға тейеш.',
@@ -2684,9 +2697,9 @@ $1 ҡатнашыусыһын бикләү сәбәбе: "$2"',
 'imageinvalidfilename' => 'Файл исеме дөрөҫ түгел',
 'fix-double-redirects' => 'Элекке исемгә һылтанған йүнәлтеүҙәрҙе төҙәтергә',
 'move-leave-redirect' => 'Йүнәлтеүҙе ҡалдырырға',
-'protectedpagemovewarning' => "'''Киҫәтеү: ''' Һеҙ был биттең исемен үҙгәртә алмайһығыҙ, был хоҡуҡҡа хәкимдәр генә эйә. 
+'protectedpagemovewarning' => "'''Киҫәтеү: ''' Һеҙ был биттең исемен үҙгәртә алмайһығыҙ, был хоҡуҡҡа хакимдәр генә эйә. 
 Белешмә өсөн түбәндә журналдағы һуңғы яҙма килтерелгән:",
-'semiprotectedpagemovewarning' => "'''Киҫәтеү: ''' Был бит һаҡланған. Һеҙ уның исемен үҙгәртә алмайһығыҙ, был хоҡуҡҡа хәкимдәр генә эйә. 
+'semiprotectedpagemovewarning' => "'''Киҫәтеү: ''' Был бит һаҡланған. Һеҙ уның исемен үҙгәртә алмайһығыҙ, был хоҡуҡҡа хакимдәр генә эйә. 
 Белешмә өсөн түбәндә журналдағы һуңғы яҙма килтерелгән:",
 'move-over-sharedrepo' => '[[:$1]] файлы дөйөм һаҡлағыста бар. Файлдың исемен бындай исемгә үҙгәртеү дөйөм һаҡлағыстағы файлдың өҫтөнә яҙҙырылыуына килтерәсәк.',
 'file-exists-sharedrepo' => 'Һайланған файл исеме дөйөм һаҡлағыста ҡулланыла инде. 
@@ -2797,7 +2810,7 @@ $1 ҡатнашыусыһын бикләү сәбәбе: "$2"',
 
 # Import log
 'importlogpage' => 'Тейәү яҙмалары журналы',
-'importlogpagetext' => 'Хәкимдәр тарафынан башҡа вики проекттарҙан биттәрҙе һәм уларҙың үҙгәртеүҙәр тарихын тейәү.',
+'importlogpagetext' => 'Хакимдәр тарафынан башҡа вики проекттарҙан биттәрҙе һәм уларҙың үҙгәртеүҙәр тарихын тейәү.',
 'import-logentry-upload' => '[[$1]] битен файлдан тейәгән',
 'import-logentry-upload-detail' => '$1 {{PLURAL:$1|өлгө|өлгө}}',
 'import-logentry-interwiki' => '$1 битен вики проекттары-ара тейәгән',
@@ -2817,7 +2830,7 @@ JavaScript тикшереү',
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Ҡулланыусы битегеҙ',
 'tooltip-pt-anonuserpage' => 'IP адресығыҙ өсөн ҡатнашыусы бите',
-'tooltip-pt-mytalk' => 'Фекер алышыу битегеҙ',
+'tooltip-pt-mytalk' => 'Фекерләшеү битегеҙ',
 'tooltip-pt-anontalk' => 'IP адресығыҙ өсөн фекер алышыу бите',
 'tooltip-pt-preferences' => 'Көйләүҙәрегеҙ',
 'tooltip-pt-watchlist' => 'Һеҙ күҙәткән биттәр исемлеге',
@@ -2825,7 +2838,7 @@ JavaScript тикшереү',
 'tooltip-pt-login' => 'Бында теркәлеү үтергә була, әммә был эш мәжбүри түгел.',
 'tooltip-pt-anonlogin' => 'Бында танылыу үтергә була, әммә был эш мәжбүри түгел.',
 'tooltip-pt-logout' => 'Сығырға',
-'tooltip-ca-talk' => 'Биттең эстәлеге тураһында фекер алышыу',
+'tooltip-ca-talk' => 'Биттең эстәлеге тураһында фекерләшеү',
 'tooltip-ca-edit' => 'Һеҙ был битте үҙгәртә алаһығыҙ. Зинһар, яҙып ҡуйыр алдынан ҡарап сығығыҙ',
 'tooltip-ca-addsection' => 'Яңы бүлек эшләргә',
 'tooltip-ca-viewsource' => 'Был бит үҙгәртеүҙән һаҡланған.
@@ -2951,11 +2964,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' => 'Векторлы',
 
@@ -3065,7 +3074,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Киңлек',
 'exif-imagelength' => 'Бейеклек',
 'exif-bitspersample' => 'Төҫтәрҙең тәрәнлеге',
@@ -3243,7 +3252,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, факслы кодлау',
@@ -3658,13 +3667,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' => 'Бер иш файлдарҙы хэш-кодтары буйынса эҙләү.',
@@ -3778,8 +3780,8 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
 'revdelete-content-unhid' => 'эстәлек күрһәтелде',
 'revdelete-summary-unhid' => 'төҙәтеү аңлатмаһы асылды',
 'revdelete-uname-unhid' => 'ҡатнашыусы исеме күрһәтелде',
-'revdelete-restricted' => 'хәкимдәргә ҡаршы ҡулланылған сикләүҙәр',
-'revdelete-unrestricted' => 'хәкимдәрҙән алынған сикләүҙәр',
+'revdelete-restricted' => 'хакимдәргә ҡаршы ҡулланылған сикләүҙәр',
+'revdelete-unrestricted' => 'хакимдәрҙән алынған сикләүҙәр',
 'logentry-move-move' => '$1 $3 битенең исемен үҙгәртте. Яңы исеме: $4',
 'logentry-move-move-noredirect' => '$1 $3 битенең исемен йүнәлтеү ҡуймайынса үҙгәртте. Яңы исеме: $4',
 'logentry-move-move_redir' => '$1 $3 битенең исемен йүнәлтеү өҫтөнән үҙгәртте. Яңы исеме: $4',
index 3132f72..84315ca 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Als-Holder
  * @author Bua333
+ * @author Geitost
  * @author Malafaya
  * @author Man77
  * @author Merlissimo
@@ -88,8 +89,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 +102,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',
@@ -298,7 +298,6 @@ $1",
 'disclaimers' => 'Impressum',
 'disclaimerpage' => 'Project:Impressum',
 'edithelp' => 'Huif fias Werkln',
-'edithelppage' => 'Help:Werkln',
 'helppage' => 'Help:Inhoidsvazeichnis',
 'mainpage' => 'Hoamseitn',
 'mainpage-description' => 'Hoamseitn',
@@ -465,7 +464,7 @@ Beochtt ower, daas oanige Seiten noh åzoang kennern, daas du ågmödt bist, só
 'logout' => 'Obmöden',
 'userlogout' => 'Auslogga',
 'notloggedin' => 'Ned ågmödt',
-'nologin' => "Du host koa Nutzakonto? '''$1'''.",
+'nologin' => 'Du host koa Nutzakonto? $1.',
 'nologinlink' => 'A neichs Nutzakonto olegn',
 'createaccount' => 'Nutzakonto olegn',
 'gotaccount' => "Hosd scho a Nutzakonto? '''$1'''.",
@@ -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..87978dc
--- /dev/null
@@ -0,0 +1,736 @@
+<?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',
+'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..04ea2b0 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' => 'من آ هال دی وهدی وارد کتن یک هالیکین خلاصه ی اصلاح',
@@ -365,7 +363,6 @@ $1',
 'disclaimers' => 'بی میاری گیان',
 'disclaimerpage' => 'Project:عمومی بی میاریگان',
 'edithelp' => 'کمک اصلاح',
-'edithelppage' => 'Help:اصلاح',
 'helppage' => 'Help:محتوا',
 'mainpage' => 'صفحه اصلی',
 'mainpage-description' => 'صفحه اصلی',
@@ -958,7 +955,6 @@ $1",
 'searchmenu-legend' => 'گزینه یان گردگ',
 'searchmenu-exists' => "'''صفحه گون نام \"[[\$1]]\" ته ای ویکی نیستن'''",
 'searchmenu-new' => "'''شر کن صفحه ای \"[[:\$1]]\" ته ای ویکی!'''",
-'searchhelp-url' => 'Help:محتوا',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|بروز صفحات گون پیش وند]]',
 'searchprofile-articles' => 'صفحات محتوا',
 'searchprofile-project' => 'کمک و صفحات پروژه ای',
@@ -1001,14 +997,6 @@ $1",
 شما نونیت بگردیت چه طرق گوگل هم زمان.
 توجه که اندیکس آن {{SITENAME}} محتوا شاید تاریح گوستگین بنت.',
 
-# Quickbar
-'qbsettings' => 'میله سریع',
-'qbsettings-none' => 'هچ یک',
-'qbsettings-fixedleft' => 'چپ ثابت',
-'qbsettings-fixedright' => 'راست ثابت',
-'qbsettings-floatingleft' => 'چپ شناور',
-'qbsettings-floatingright' => 'راست شناور',
-
 # Preferences page
 'preferences' => 'ترجیحات',
 'mypreferences' => 'منی ترجیحات',
@@ -1767,8 +1755,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 +2397,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 +2469,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 +2525,7 @@ Variants for Chinese language
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'پهنات',
 'exif-imagelength' => 'بلندی',
 'exif-bitspersample' => 'بیت ته جز',
@@ -2660,7 +2641,7 @@ Variants for Chinese language
 'exif-gpsdatestamp' => 'تاریح جی پی اس',
 'exif-gpsdifferential' => 'اصلاح متفاوت جی پی اس',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'کمپرس نه بوتت',
 'exif-compression-6' => 'جیی پی ای جی',
 
@@ -3038,13 +3019,6 @@ $5
 'version-software-product' => 'محصول',
 'version-software-version' => 'نسخه',
 
-# Special:FilePath
-'filepath' => 'مسیر فایل',
-'filepath-page' => 'فایل:',
-'filepath-submit' => 'مسیر',
-'filepath-summary' => 'ای حاصین صفحه مسیر کامل په یک فایل پیش داریت.
-تصاویر گون وضوح کامل پیش دارگ بنت و دگه نوع فایلان گون وتی برنامه یانش مستقیما پچ بنت.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'گردگ په کپی  فایلان',
 'fileduplicatesearch-summary' => 'گردگ په کپی فایلان په اساس درهمین ارزش.',
index 35d80f0..15e8731 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}}',
@@ -287,6 +296,7 @@ $messages = array(
 'create-this-page' => 'Muknaon ining pahina',
 'delete' => 'Puraon',
 'deletethispage' => 'Puraon ining pahina',
+'undeletethispage' => 'Balikon sa pagkapura ining pahina',
 'undelete_short' => 'Bawia an pagpurà kan {{PLURAL:$1|sarong pagliwat|$1 mga pagliwat}}',
 'viewdeleted_short' => 'Hilngon {{PLURAL:$1|sarong pinara na pagliwat|$1 mga pinara na pagliwat}}',
 'protect' => 'Protektari',
@@ -313,13 +323,13 @@ $messages = array(
 'categorypage' => 'Tanawon an pahina nin kategorya',
 'viewtalkpage' => 'Tanawon an orolayan',
 'otherlanguages' => 'Sa ibang mga lengguwahe',
-'redirectedfrom' => '(Piglikay halì sa $1)',
-'redirectpagesub' => 'Ilikáy an pahina',
-'lastmodifiedat' => 'Huring pigbàgo an pahinang iní $2 kan $1.',
-'viewcount' => 'Binukasán ining pahina nin {{PLURAL:$1|sarong beses|nin $1 beses}}.',
+'redirectedfrom' => '(Redirektado gikan sa $1)',
+'redirectpagesub' => 'Redirektang pahina',
+'lastmodifiedat' => 'Ining pahina huring pinagbago kan $1, mga alas $2.',
+'viewcount' => 'Ining pahina pinaglaog nin {{PLURAL:$1|sarong beses|nin $1 beses}}.',
 'protectedpage' => 'Protektadong pahina',
 'jumpto' => 'Magluksó sa:',
-'jumptonavigation' => 'paglibotlibot',
+'jumptonavigation' => 'nabigasyon',
 'jumptosearch' => 'hanapon',
 'view-pool-error' => 'Sori tabi, an mga server kargado sa oras na ini.
 Grabe kadakol an mga paragamit na pinagprubaran mahiling an pahinang ini.
@@ -332,25 +342,24 @@ $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' => 'Dapít sa {{SITENAME}}',
-'aboutpage' => 'Project:Manonongód',
-'copyright' => 'Makukua an laog sa $1.',
-'copyrightpage' => '{{ns:project}}:Mga derechos nin parásurat',
-'currentevents' => 'Mga pangyayari sa ngunyán',
+'aboutpage' => 'Project:Mapanonongód',
+'copyright' => 'An kalamnan manunumpungan sa laog kan $1.',
+'copyrightpage' => '{{ns:project}}:Mga Katanosang pansurat',
+'currentevents' => 'Sa ngunyan na mga pangyayari',
 'currentevents-url' => 'Project:Mga pangyayari sa ngunyán',
-'disclaimers' => 'Mga pagpabayà',
-'disclaimerpage' => 'Project:Pangkagabsán na pagpabayà',
-'edithelp' => 'Paghirá kan pagtabang',
-'edithelppage' => 'Help:Pagliwát',
-'helppage' => 'Help:Mga laóg',
+'disclaimers' => 'Mga Pangindahan',
+'disclaimerpage' => 'Project:Pangkagabsán na pangindahan',
+'edithelp' => 'Pantabang sa pagliliwat',
+'helppage' => 'Help:Mga Kalamnan',
 'mainpage' => 'Panginot na Pahina',
 'mainpage-description' => 'Panginot na Pahina',
-'policy-url' => 'Project:Palakáw',
+'policy-url' => 'Project:Kalakawan',
 'portal' => 'Portal kan komunidad',
 'portal-url' => 'Project:Portal kan Komunidad',
-'privacy' => 'Palakáw nin pribasidad',
-'privacypage' => 'Project:Palakaw nin pribasidad',
+'privacy' => 'Kalakawan nin pribasidad',
+'privacypage' => 'Project:Kalakawan nin Pribasidad',
 
-'badaccess' => 'Salang permiso',
+'badaccess' => 'Kasalaan sa permiso',
 'badaccess-group0' => 'Dai ka tinotogotan na gibohon an aksyon na saimong hinahagad.',
 'badaccess-groups' => 'An aksyon na saimong pinaghahagad limitado sa mga parágamit na {{PLURAL:$2|an grupo|saro sa mga grupo}}: $1.',
 
@@ -371,7 +380,7 @@ $1',
 'editold' => 'Liwatón',
 'viewsourceold' => 'hilingón an ginikánan',
 'editlink' => 'liwatón',
-'viewsourcelink' => 'hilingón an toltólan',
+'viewsourcelink' => 'tanawon an ginikanan',
 'editsectionhint' => 'Liwatón an seksyon: $1',
 'toc' => 'Mga laóg',
 'showtoc' => 'ipahilíng',
@@ -380,9 +389,9 @@ $1',
 'collapsible-expand' => 'Pinahalawig',
 'thisisdeleted' => 'Hilingón o isulít an $1?',
 'viewdeleted' => 'Hilingón an $1?',
-'restorelink' => '{{PLURAL:$1|sarong pinarang paghirá|$1 na pinarang paghirá}}',
+'restorelink' => '{{PLURAL:$1|sarong pinagpurang pagliwat|$1 na pinagpurang mga pagliwat}}',
 'feedlinks' => 'Hungit:',
-'feed-invalid' => 'Bawal na tipo nin hungit na subkripsyon.',
+'feed-invalid' => 'Imbalidong tipo nin hungit sa subkripsyon.',
 'feed-unavailable' => 'Mayò an mga sindikasyon na hungit',
 'site-rss-feed' => '$1 Hungit nin RSS',
 'site-atom-feed' => '$1 Hungit nin Atomo',
@@ -489,6 +498,8 @@ $2',
 'namespaceprotected' => "Mayô kang permisong maghirá kan mga páhina sa '''$1''' ngaran-espacio.",
 'customcssprotected' => 'Ika mayong permiso sa pagliwat kaining pahinang CSS, nin huli ta ini naglalaman kan personal na panuytoy (settings) kan ibang paragamit.',
 'customjsprotected' => 'Ika mayong permiso sa pagliwat kaining pahinang JavaScript, nin huli ta ini naglalaman kan personal na panuytoy (settings) kan ibang paragamit.',
+'mycustomcssprotected' => 'Ika mayo nin permiso sa pagliwat kaining CSS na pahina.',
+'mycustomjsprotected' => 'Ika mayo nin permiso sa pagliwat kaining JavaScript na pahina.',
 'ns-specialprotected' => 'An mga pahinang nasa {{ns:special}} na liang-liang dai pwedeng hirahón.',
 'titleprotected' => 'Ining titulo pinagprotektaran poon pagkamukna ni [[User:$1|$1]].
 An rason na pinagtao iyo na "\'\'$2\'\'".',
@@ -514,9 +525,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 +549,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 +621,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.',
@@ -596,7 +636,7 @@ Pakilaog sana tabi nin sarong tugmadong koreo o pabayae na mayong laman an surat
 'cannotchangeemail' => 'An panindog na address sa e-surat dati mariribayan sa Wiki na ini.',
 'emaildisabled' => 'Ining sayt dae makakapagpadara nin mga e-surat.',
 'accountcreated' => 'Panindog pinagmukna na',
-'accountcreatedtext' => 'An paragamit na panindog para sa $1 pinagmukna na.',
+'accountcreatedtext' => 'An paragamit na panindog para sa [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) pinagmukna na.',
 'createaccount-title' => 'Panindog na pagmukna para sa {{SITENAME}}',
 'createaccount-text' => 'May tawong nagmukna nin sarong panindog na gamit an saimong address na e-surat sa {{SITENAME}} ($4) na may ngaran na "$2, na may sikretong panlaog na "$3".',
 'usernamehasherror' => 'Paragamit na ngaran dae puwede na igwang simbolikong mga kabtang',
@@ -628,25 +668,27 @@ 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-text-one' => 'Kumpletuhon ining porma sa pagliwat otro kan saimong pasa-taramon.',
+'passwordreset-text-many' => '{{PLURAL:$1|Ikaag an saro sa mga pedaso nin datos sa pagliwat otro kan saimong pasa-taramon.}}',
 '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 +699,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 +876,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.'''
@@ -873,12 +915,14 @@ Ini dae tabi nagtao nin kapaliwanagan.',
 Ini minapahiwatig tabi na pinagpura na.',
 'edit-conflict' => 'Igwang iregularidad sa pagliwat.',
 'edit-no-change' => 'An saimong pagliwat pinagbalewala, nin huli ta mayong pagbabago an pinaghimo sa teksto.',
+'postedit-confirmation' => 'An saimong niliwat ipinagtagama na.',
 'edit-already-exists' => 'Dai maggibo an bàgong pahina.
 Igwa na kaini.',
 'defaultmessagetext' => 'Tugmadong mensahe sa teksto',
 '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',
@@ -1122,7 +1166,6 @@ An mga detalye mapuwedeng matatagboan sa [{{fullurl:{{#Special:Log}}/delete|page
 'searchmenu-legend' => 'Opsyon sa paghahanap',
 'searchmenu-exists' => "'''Igwa nin sarong pahina na pinagngaranan na \"[[:\$1]]\" sa wiking ini.'''",
 'searchmenu-new' => "'''Muknaon an pahina \"[[:\$1]]\" sa wiking ini!'''",
-'searchhelp-url' => 'Help:Mga laog',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Kilyawon an mga pahina sa paagi kainin enotang panigmit]]',
 'searchprofile-articles' => 'Mga pahina nin laog',
 'searchprofile-project' => 'Mga pahina nin Tabang asin Proyekto',
@@ -1144,7 +1187,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 +1207,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 +1352,8 @@ 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.',
+'userrights-removed-self' => 'Saimong matrayumpong pinagtangkas an sadire mong mga katanosan. Sa siring, ika dae na tabi makakalaog sa pahinang ini.',
 
 # Groups
 'group' => 'Grupo:',
@@ -1387,6 +1424,8 @@ An saimong e-surat na adres dae ipagbuyagyag kunsoarin na an ibang paragamit mak
 'right-editusercssjs' => 'Liwaton an CSS asin JavaScript na mga sagunson kan ibang mga paragamit',
 'right-editusercss' => 'Liwaton an CSS na mga sagunson kan ibang mga paragamit',
 'right-edituserjs' => 'Liwaton an JavaScript na mga sagunson kan ibang mga paragamit',
+'right-editmyusercss' => 'Liwaton an saimong sadireng paragamit na sagunson sa CSS',
+'right-editmyuserjs' => 'Liwaton an saimong sadireng paragamit na sagunson sa JavaScript',
 'right-rollback' => 'Hidaling ibalik an mga niliwat kan huring paragamit na nagliwat nin sarong partikular na pahina',
 'right-markbotedits' => 'Markahan an pinagbalik na mga niliwat bilang bot na panliwat',
 'right-noratelimit' => 'Dae magin apektado sa paagi kan rata nin mga sagkodan',
@@ -1719,7 +1758,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 +1912,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 +2084,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 +2149,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 +2169,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}}.',
@@ -2376,7 +2420,7 @@ $1",
 'mycontris' => 'Mga Kaarambagan',
 'contribsub2' => 'Para sa $1 ($2)',
 'nocontribs' => 'Mayong mga pagbabago na nahanap na kapadis sa ining mga criteria.',
-'uctop' => '(alituktok)',
+'uctop' => '(sa ngunyan)',
 'month' => 'Poon bulan (asin mas amay):',
 'year' => 'Poon taon (asin mas amay):',
 
@@ -2540,6 +2584,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 +2612,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 +2743,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 +2945,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 +2975,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 +3052,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 +3100,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 +3279,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 +3692,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 +3729,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 +3793,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 +3821,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 +3889,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 +3910,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..ea6f66a 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Cesco
+ * @author Geitost
  * @author Jim-by
  * @author Kaganer
  * @author LexArt
@@ -119,8 +120,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 +133,7 @@ $messages = array(
 'tog-diffonly' => 'Не паказваць рэшты старонкі пад розніцай',
 'tog-showhiddencats' => 'Паказаць схаваныя катэгорыі',
 'tog-norollbackdiff' => 'Не паказваць розніцу ў выніку адкату',
+'tog-useeditwarning' => 'Папярэдзіць мяне, калі я пакідаю старонку з незахаванымі праўкамі',
 
 'underline-always' => 'Заўсёды',
 'underline-never' => 'Ніколі',
@@ -197,6 +197,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|Катэгорыя|Катэгорыі}}',
@@ -222,6 +234,7 @@ $messages = array(
 'newwindow' => '(адкрыецца ў новым акне)',
 'cancel' => 'Нічога',
 'moredotdotdot' => 'Яшчэ...',
+'morenotlisted' => 'Больш нічога няма...',
 'mypage' => 'Уласная старонка',
 'mytalk' => 'Размовы',
 'anontalk' => 'Размова для гэтага IP',
@@ -255,6 +268,7 @@ $messages = array(
 'namespaces' => 'Прасторы імёнаў',
 'variants' => 'Варыянты',
 
+'navigation-heading' => 'Навігацыя',
 'errorpagetitle' => 'Памылка',
 'returnto' => 'Вярнуцца да $1.',
 'tagline' => 'З пляцоўкі {{SITENAME}}.',
@@ -276,6 +290,7 @@ $messages = array(
 'create-this-page' => 'Стварыць старонку',
 'delete' => 'сцерці',
 'deletethispage' => 'Сцерці гэту старонку',
+'undeletethispage' => 'Аднавіць гэту старонку',
 'undelete_short' => 'Аднавіць {{PLURAL:$1|адну праўку|$1 правак}}',
 'viewdeleted_short' => 'Паказаць {{PLURAL:$1|адну сцёртую праўку|$1 сцёртыя праўкі}}',
 'protect' => 'Ахова',
@@ -329,7 +344,6 @@ $1',
 'disclaimers' => 'Адмова ад адказнасці',
 'disclaimerpage' => 'Project:Агульная адмова ад адказнасці',
 'edithelp' => 'Даведка рэдактарскага акна',
-'edithelppage' => 'Help:Праўка',
 'helppage' => 'Help:Змест',
 'mainpage' => 'Галоўная старонка',
 'mainpage-description' => 'Першая старонка',
@@ -352,6 +366,8 @@ $1',
 'youhavenewmessages' => 'Вы маеце $1 ($2).',
 'newmessageslink' => 'новыя паведамленні',
 'newmessagesdifflink' => 'розн. з найноўшай версіяй',
+'youhavenewmessagesfromusers' => 'Вы атрымалі $1 ад {{PLURAL:$3|$3 ўдзельніка|$3 удзельнікаў}} ($2).',
+'youhavenewmessagesmanyusers' => 'Вы атрымалі $1 ад мноства карыстальнікаў ($2).',
 'youhavenewmessagesmulti' => 'У вас ёсць новыя паведамленні на $1',
 'editsection' => 'правіць',
 'editold' => 'правіць',
@@ -487,9 +503,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' => 'Ваш дамен',
 'externaldberror' => 'Або памылка вонкавай аўтэнтыкацыі ў базе дадзеных, або вам не дазволена абнаўляць свой вонкавы рахунак.',
@@ -501,7 +526,7 @@ $2',
 'logout' => 'Выйсці з сістэмы',
 'userlogout' => 'Выйсці з сістэмы',
 'notloggedin' => 'Не ўвайшоў',
-'nologin' => "Не маеце рахунку? '''$1'''.",
+'nologin' => 'Не маеце рахунку? $1.',
 'nologinlink' => 'Завесці рахунак',
 'createaccount' => 'Стварыць рахунак',
 'gotaccount' => "Ужо маеце рахунак? '''$1'''.",
@@ -588,10 +613,8 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Выслаць мне новы пароль',
-'passwordreset-text' => 'Запоўніце гэтую форму, каб атрымаць па электроннай пошце напамін вашага акаўнта.',
 'passwordreset-legend' => 'Пераўстанавіць пароль',
 'passwordreset-disabled' => 'Функцыя пераўсталёўкі пароля адключаная на гэтай вікі.',
-'passwordreset-pretext' => '{{PLURAL:$1||Калі ласка, увядзіце адзін з фрагментаў дадзеных ніжэй}}',
 'passwordreset-username' => 'Імя ўдзельніка',
 'passwordreset-domain' => 'Дамен:',
 'passwordreset-capture' => 'Праглядзець напісаны ліст?',
@@ -743,6 +766,7 @@ $2
 'updated' => '(абноўлена)',
 'note' => "'''Заўвага:'''",
 'previewnote' => "'''Памятайце, гэта папярэдні паказ; праўкі яшчэ не замацаваныя!'''",
+'continue-editing' => 'Працягнуць рэдагаванне',
 'previewconflict' => 'Гэта папярэдні паказ магчымага выніку замацоўвання актуальнага стану крынічнага тэксту ў верхнім тэкставым полі.',
 'session_fail_preview' => "'''Не ўдалося апрацаваць вашую праўку, таму што сервер згубіў звесткі аб вашым сеансе.
 Паспрабуйце, калі ласка, ізноў. Калі і тады не атрымаецца, паспрабуйце [[Special:UserLogout|выйсці з сістэмы]] і зайсці ізноў.'''",
@@ -813,8 +837,17 @@ $2
 Здаецца, што яна была сцёртая.',
 'edit-conflict' => 'Канфлікт правак.',
 'edit-no-change' => 'Вашая праўка была праігнараваная, таму што не мяняўся тэкст.',
+'postedit-confirmation' => 'Вашая праўка была захаваная.',
 'edit-already-exists' => 'Не ўдалося стварыць новую старонку.
 Такая ўжо існуе.',
+'editwarning-warning' => 'Выхад з гэтай старонкі прывядзе да страты правак, якія вы зрабілі. 
+Калі Вы зарэгістраваныя ў сістэме, Вы можаце адключыць гэта папярэджанне ў закладцы "Праца" Вашых настаўленняў.',
+
+# Content models
+'content-model-wikitext' => 'вікі-тэкст',
+'content-model-text' => 'звычайны тэкст',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "Увага: На старонцы занадта шмат працаёмістых зваротаў да парсера.
@@ -1033,7 +1066,6 @@ $1",
 'searchmenu-legend' => 'Настаўленні пошуку',
 'searchmenu-exists' => "'''На вікі ёсць старонка \"[[:\$1]]\"'''",
 'searchmenu-new' => "'''Стварыць на гэтай вікі старонку \"[[:\$1]]\"'''",
-'searchhelp-url' => 'Help:Змест',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Паказаць старонкі з гэтым прэфіксам]]',
 'searchprofile-articles' => 'Артыкулы',
 'searchprofile-project' => 'Старонкі даведкі і праекта',
@@ -1075,15 +1107,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 +1148,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 +1379,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' => 'Сачыць за найбольш актуальнымі змяненнямі ў віксе праз гэты струмень навін.',
@@ -1372,7 +1395,7 @@ $1",
 'rcshowhideliu' => '$1 пазнаных удзельнікаў',
 'rcshowhideanons' => '$1 ананімных удзельнікаў',
 'rcshowhidepatr' => '$1 ухваленых правак',
-'rcshowhidemine' => '$1 Ñ\83ласных правак',
+'rcshowhidemine' => '$1 Ñ\9eласных правак',
 'rclinks' => 'Паказаць апошнія $1 зменаў за мінулыя $2 дзён<br />$3',
 'diff' => 'розн.',
 'hist' => 'гіст.',
@@ -1516,9 +1539,9 @@ $1',
 '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-file-error-text' => 'Унутраная памылка пры спробе стварыць на серверы тымчасовы файл. Звярніцеся да аднаго з [[Special:ListUsers/sysop|адміністратараў]].',
 'upload-misc-error' => 'Нявызначаная памылка пры ўкладанні',
-'upload-misc-error-text' => 'Нявызначаная памылка пры ўкладанні. Праверце правільнасць і даступнасць URL і паспрабуйце ізноў. Калі праблема трывалая, звярніцеся да аднаго з [[Special:ListUsers/sysop|сістэмных адміністратараў]].',
+'upload-misc-error-text' => 'Нявызначаная памылка пры ўкладанні. Праверце правільнасць і даступнасць URL і паспрабуйце ізноў. Калі праблема трывалая, звярніцеся да аднаго з [[Special:ListUsers/sysop|адміністратараў]].',
 'upload-too-many-redirects' => 'Занадта шмат перасылак за гэтым адрасам (URL)',
 'upload-unknown-size' => 'Невядомы памер',
 'upload-http-error' => 'Памылка HTTP: $1',
@@ -1600,7 +1623,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>
@@ -1933,6 +1955,7 @@ $1',
 'mailnologin' => 'Няма эл.адрасу',
 'mailnologintext' => 'Трэба [[Special:UserLogin|ўвайсці ў сістэму]] і мець пацверджаны адрас эл.пошты ў сваіх [[Special:Preferences|настáўленнях]], каб слаць эл.пошту іншым удзельнікам.',
 'emailuser' => 'Эл.пошта ўдзельніка',
+'emailuser-title-notarget' => 'Напісанне электроннага ліста ўдзельніку',
 'emailpage' => 'Зварот да ўдзельніка праз эл.пошту',
 'emailpagetext' => 'Тут можна выслаць эл.пошту гэтаму ўдзельніку.
 Адрас эл.пошты, уведзены вамі ў [[Special:Preferences|сваіх настаўленнях]], з\'явіцца ў полі "From" вашага ліста, і атрымальнік зможа адказаць на ваш ліст.',
@@ -1987,8 +2010,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 +2247,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' => 'журналы',
@@ -2710,20 +2733,20 @@ $1',
 
 # Info page
 'pageinfo-title' => 'Інфармацыя для "$1"',
-'pageinfo-header-edits' => 'Змены',
+'pageinfo-header-basic' => 'Агульныя звесткі',
+'pageinfo-header-edits' => 'Гісторыя правак',
+'pageinfo-robot-index' => 'Індэксуюцца',
+'pageinfo-robot-noindex' => 'Не індэксуюцца',
 'pageinfo-views' => 'Колькасць праглядаў',
 'pageinfo-watchers' => 'Колькасць назіральнікаў',
-'pageinfo-edits' => 'Колькасць правак:',
-'pageinfo-authors' => 'Колькасць розных аўтараў',
+'pageinfo-lastuser' => 'Апошні рэдактар',
+'pageinfo-lasttime' => 'Дата апошняй праўкі',
+'pageinfo-edits' => 'Агульная колькасць правак',
+'pageinfo-authors' => 'Агульная колькасць розных аўтараў',
 
 # Skin names
-'skinname-standard' => 'Класіка',
-'skinname-nostalgia' => 'Настальгія',
 'skinname-cologneblue' => 'Сіні Кёльн',
 'skinname-monobook' => 'Манабук',
-'skinname-myskin' => 'Майскін',
-'skinname-chick' => 'Чык',
-'skinname-simple' => 'Проста',
 'skinname-modern' => 'Сучаснасць',
 
 # Patrolling
@@ -2823,7 +2846,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Шырыня',
 'exif-imagelength' => 'Вышыня',
 'exif-bitspersample' => 'Бітаў на кампанент',
@@ -3002,7 +3025,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, факсавае кадзіраванне',
@@ -3395,13 +3418,8 @@ MediaWiki распаўсюджваецца, спадзеючыся на прыд
 'version-software' => 'Устаноўленыя праграмныя прадукты',
 'version-software-product' => 'Прадукт',
 'version-software-version' => 'Версія',
-
-# Special:FilePath
-'filepath' => 'Шлях да файла',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Пуск',
-'filepath-summary' => 'Гэтая адмысловая старонка вяртае поўны шлях да файла.
-Выявы паказваюцца ў поўным памеры, іншыя тыпы файлаў адкрываюцца ў прыпісаных да іх праграмах.',
+'version-entrypoints-header-entrypoint' => 'Кропка ўваходу',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Пошук дублікатных файлаў',
@@ -3423,7 +3441,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 cd930b1..5ae99fe 100644 (file)
  * @author Cesco
  * @author Crt
  * @author EugeneZelenko
+ * @author Geitost
  * @author Jim-by
  * @author Kaganer
+ * @author Nemo bis
  * @author Red Winged Duck
  * @author Renessaince
  * @author Wizardist
@@ -367,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|Катэгорыя|Катэгорыі|Катэгорыі}}',
@@ -448,6 +462,7 @@ $messages = array(
 'create-this-page' => 'Стварыць гэтую старонку',
 'delete' => 'Выдаліць',
 'deletethispage' => 'Выдаліць гэтую старонку',
+'undeletethispage' => 'Аднавіць гэту старонку',
 'undelete_short' => 'Аднавіць $1 {{PLURAL:$1|рэдагаваньне|рэдагаваньні|рэдагаваньняў}}',
 'viewdeleted_short' => 'Паказаць $1 {{PLURAL:$1|выдаленае рэдагаваньне|выдаленыя рэдагаваньні|выдаленых рэдагаваньняў}}',
 'protect' => 'Абараніць',
@@ -501,7 +516,6 @@ $1',
 'disclaimers' => 'Адмова ад адказнасьці',
 'disclaimerpage' => 'Project:Адмова ад адказнасьці',
 'edithelp' => 'Дапамога ў рэдагаваньні',
-'edithelppage' => 'Help:Рэдагаваньне',
 'helppage' => 'Help:Зьмест',
 'mainpage' => 'Галоўная старонка',
 'mainpage-description' => 'Галоўная старонка',
@@ -648,6 +662,8 @@ $2',
 'namespaceprotected' => "Вы ня маеце правоў на рэдагаваньне старонак у прасторы назваў '''$1'''.",
 'customcssprotected' => 'Вы ня маеце правоў на рэдагаваньне гэтай CSS-старонкі, таму што яна ўтрымлівае пэрсанальныя налады іншага ўдзельніка.',
 'customjsprotected' => 'Вы ня маеце правоў на рэдагаваньне гэтай старонкі JavaScript, таму што яна ўтрымлівае пэрсанальныя налады іншага ўдзельніка.',
+'mycustomcssprotected' => 'Вы ня маеце дазволу рэдагаваць гэтую CSS-старонку.',
+'mycustomjsprotected' => 'Вы ня маеце дазволу рэдагаваць гэтую JavaScript-старонку.',
 'ns-specialprotected' => 'Немагчыма рэдагаваць спэцыяльныя старонкі.',
 'titleprotected' => "Стварэньне старонкі з такой назвай было забароненае ўдзельнікам [[User:$1|$1]].
 Прычына забароны: ''$2''.",
@@ -673,9 +689,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' => 'Вы ня можаце зьмяняць паролі ў гэтай вікі.',
@@ -688,18 +713,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 для ўваходу ў сыстэму.
@@ -751,7 +796,7 @@ $2',
 'cannotchangeemail' => 'Электронная пошта рахунку ня можа быць зьмененая ў {{GRAMMAR:месны|{{SITENAME}}}}.',
 'emaildisabled' => 'Гэты сайт ня можа адсылаць электронныя лісты.',
 'accountcreated' => 'Рахунак створаны',
-'accountcreatedtext' => 'Рахунак удзельніка для $1 быў створаны.',
+'accountcreatedtext' => 'Рахунак {{GENDER:$1|удзельніка|удзельніцы}} [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|гутаркі]]) быў створаны.',
 'createaccount-title' => 'Стварэньне рахунку ў {{GRAMMAR:месны|{{SITENAME}}}}',
 'createaccount-text' => 'Нехта стварыў рахунак «$2» у {{GRAMMAR:месны|{{SITENAME}}}} ($4) для Вашага адрасу электроннай пошты. Пароль для гэтага рахунку — «$3». Вам трэба ўвайсьці і зьмяніць Ваш пароль зараз.
 
@@ -785,14 +830,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-emaildisabled' => 'Функцыі e-mail у гэтай вікі былі адключаныя.',
-'passwordreset-pretext' => '{{PLURAL:$1||Увядзіце ніжэй частку зьвестак}}',
 'passwordreset-username' => 'Імя ўдзельніка:',
 'passwordreset-domain' => 'Дамэн:',
 'passwordreset-capture' => 'Паказаць канчатковы электронны ліст?',
@@ -819,7 +865,7 @@ $2
 Часовы пароль: $2',
 'passwordreset-emailsent' => 'Ліст пра скіданьне паролю быў дасланы.',
 'passwordreset-emailsent-capture' => 'Ліст пра скіданьне паролю быў дасланы, што паказана ніжэй.',
-'passwordreset-emailerror-capture' => 'Ліст пра скіданьне паролю быў створаны і паказаны ніжэй, але не ўдалося адправіць яго карыстальніку: $1',
+'passwordreset-emailerror-capture' => 'Ліст пра скіданьне паролю быў створаны і паказаны ніжэй, але не ўдалося адправіць яго {{GENDER:$2|ўдзельніку|ўдзельніцы}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Зьмяніць адрас электроннай пошты',
@@ -1027,14 +1073,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' => 'УÑ\81е Ð·Ñ\80обленÑ\8bÑ\8f Ð\92амÑ\96 Ð·Ñ\8cменÑ\8b Ð¼Ð¾Ð³Ñ\83Ñ\86Ñ\8c Ð±Ñ\8bÑ\86Ñ\8c Ñ\81Ñ\82Ñ\80аÑ\87анÑ\8bÑ\8f, ÐºÐ°Ð»Ñ\96 Ð\92Ñ\8b Ð¿Ð°ÐºÑ\96неÑ\86е Ð³Ñ\8dÑ\82Ñ\83Ñ\8e Ñ\81Ñ\82аÑ\80онкÑ\83.
\9aалÑ\96 Ð\92Ñ\8b Ñ\9eвайÑ\88лÑ\96 Ñ\9e Ñ\81Ñ\8bÑ\81Ñ\82Ñ\8dмÑ\83, Ð\92Ñ\8b Ð¼Ð¾Ð¶Ð°Ñ\86е Ð°Ð´ÐºÐ»Ñ\8eÑ\87Ñ\8bÑ\86Ñ\8c Ð³Ñ\8dÑ\82ае Ð¿Ð°Ð¿Ñ\8fÑ\80Ñ\8dджанÑ\8cне Ñ\83 Ñ\81Ñ\8dкÑ\86Ñ\8bÑ\96 Â«{{int:prefs-editing}}» Ð\92ашых наладаў.',
+'editwarning-warning' => 'Ð\9fакÑ\96нÑ\83Ñ\9eÑ\88Ñ\8b Ð³Ñ\8dÑ\82Ñ\83Ñ\8e Ñ\81Ñ\82аÑ\80онкÑ\83, Ð²Ñ\8b Ð¼Ð¾Ð¶Ð°Ñ\86е Ñ\81Ñ\82Ñ\80аÑ\86Ñ\96Ñ\86Ñ\8c Ñ\83Ñ\81е Ñ\9eнеÑ\81енÑ\8bÑ\8f Ð·Ñ\8cменÑ\8b.
\9aалÑ\96 Ð²Ñ\8b Ñ\9eвайÑ\88лÑ\96 Ñ\9e Ñ\81Ñ\8bÑ\81Ñ\82Ñ\8dмÑ\83, Ð\92Ñ\8b Ð¼Ð¾Ð¶Ð°Ñ\86е Ð°Ð´ÐºÐ»Ñ\8eÑ\87Ñ\8bÑ\86Ñ\8c Ð³Ñ\8dÑ\82ае Ð¿Ð°Ð¿Ñ\8fÑ\80Ñ\8dджанÑ\8cне Ñ\9e Ñ\81Ñ\8dкÑ\86Ñ\8bÑ\96 Â«Ð Ñ\8dдагаванÑ\8cне» Ð²ашых наладаў.',
 
 # Content models
 'content-model-wikitext' => 'вікі-тэкст',
@@ -1276,7 +1323,6 @@ $1",
 'searchmenu-legend' => 'Налады пошуку',
 'searchmenu-exists' => "* Старонка '''[[$1]]'''",
 'searchmenu-new' => "'''Стварыць старонку «[[:$1|$1]]» у {{GRAMMAR:месны|{{SITENAME}}}}!'''",
-'searchhelp-url' => 'Help:Зьмест',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Праглядзець старонкі з гэтым прэфіксам]]',
 'searchprofile-articles' => 'Старонкі са зьместам',
 'searchprofile-project' => 'Старонкі дапамогі і праекту',
@@ -1462,6 +1508,8 @@ $1",
 'userrights-notallowed' => 'Ваш рахунак ня мае права прызначаць ці выдаляць правы ўдзельнікам.',
 'userrights-changeable-col' => 'Групы, якія Вы можаце мяняць',
 'userrights-unchangeable-col' => 'Групы, якія Вы ня можаце мяняць',
+'userrights-conflict' => 'Канфлікт правоў удзельнікаў! Калі ласка, захавайце зьмены яшчэ раз.',
+'userrights-removed-self' => 'Вы пасьпяхова пазбавілі сябе ўласных правоў. З гэтай прычыны вы больш ня маеце доступу да гэтай старонкі.',
 
 # Groups
 'group' => 'Група:',
@@ -1532,6 +1580,10 @@ $1",
 'right-editusercssjs' => 'рэдагаваньне CSS і JS файлаў іншых удзельнікаў',
 'right-editusercss' => 'рэдагаваньне CSS файлаў іншых удзельнікаў',
 'right-edituserjs' => 'рэдагаваньне JS файлаў іншых удзельнікаў',
+'right-editmyusercss' => 'рэдагаваць уласныя карыстальніцкія CSS-файлы',
+'right-editmyuserjs' => 'рэдагаваць уласныя карыстальніцкія JavaScript-файлы',
+'right-viewmywatchlist' => 'праглядаць уласны сьпіс назіраньня',
+'right-editmywatchlist' => 'рэдагаваць уласны сьпіс назіраньня (некаторыя дзеяньні будуць дадаваць туды старонкі нават бяз гэтага права)',
 'right-rollback' => 'хуткі адкат правак апошняга ўдзельніка, які рэдагаваў старонку',
 'right-markbotedits' => 'пазначэньне адкатаў як рэдагаваньне робатам',
 'right-noratelimit' => 'няма абмежаваньняў па хуткасьці',
@@ -1593,6 +1645,8 @@ $1",
 'action-userrights-interwiki' => 'рэдагаваньне правоў удзельнікаў у іншых вікі',
 'action-siteadmin' => 'блякаваньне і разблякаваньне базы зьвестак',
 'action-sendemail' => 'адпраўляць лісты іншым удзельнікам',
+'action-editmywatchlist' => 'рэдагаваць ваш сьпіс назіраньня',
+'action-viewmywatchlist' => 'праглядаць ваш сьпіс назіраньня',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|зьмена|зьмены|зьменаў}}',
@@ -1647,7 +1701,7 @@ $1",
 'reuploaddesc' => 'Скасаваць загрузку і вярнуцца да формы загрузкі',
 'upload-tryagain' => 'Даслаць зьмененае апісаньне файла',
 'uploadnologin' => 'Вы не ўвайшлі ў сыстэму',
-'uploadnologintext' => 'Вам трэба [[Special:UserLogin|ўвайсьці ў сыстэму]] для загрузкі файлаў.',
+'uploadnologintext' => 'Вам трэба $1, каб загружаць файлы.',
 'upload_directory_missing' => 'Загрузачная дырэкторыя ($1) адсутнічае і ня можа быць створаная сэрвэрам.',
 'upload_directory_read_only' => 'Сэрвэр ня мае правоў на запіс у дырэкторыю загружаных файлаў ($1).',
 'uploaderror' => 'Памылка загрузкі',
@@ -1764,11 +1818,11 @@ $1',
 'upload-proto-error-text' => 'Аддаленая загрузка файлаў патрабуе URL-адрас, які пачынаецца з <code>http://</code> альбо <code>ftp://</code>.',
 'upload-file-error' => 'Унутраная памылка',
 'upload-file-error-text' => 'Адбылася ўнутраная памылка пад час спробы стварыць часовы файл на сэрвэры.
-Калі ласка, зьвярніцеся да [[Special:ListUsers/sysop|сыстэмнага адміністратара]].',
+Калі ласка, зьвярніцеся да [[Special:ListUsers/sysop|адміністратара]].',
 'upload-misc-error' => 'Невядомая памылка загрузкі',
 'upload-misc-error-text' => 'Адбылася невядомая памылка пад час загрузкі.
 Калі ласка, упэўніцеся, што URL-адрас слушны, і паспрабуйце ізноў.
-Калі памылка паўтарыцца, зьвярніцеся да [[Special:ListUsers/sysop|сыстэмнага адміністратара]].',
+Калі памылка паўтарыцца, зьвярніцеся да [[Special:ListUsers/sysop|адміністратара]].',
 'upload-too-many-redirects' => 'URL-адрас утрымлівае зашмат перанакіраваньняў',
 'upload-unknown-size' => 'Невядомы памер',
 'upload-http-error' => 'Узьнікла памылка HTTP: $1',
@@ -2188,6 +2242,15 @@ $1',
 'listusers-noresult' => 'Удзельнікі ня знойдзеныя.',
 'listusers-blocked' => '({{GENDER:$1|заблякаваны|заблякаваная}})',
 
+# Special:ActiveUsers
+'activeusers' => 'Сьпіс актыўных удзельнікаў',
+'activeusers-intro' => 'Гэта сьпіс удзельнікаў, якія былі актыўнымі на працягу $1 {{PLURAL:$1|апошняга дня|апошніх дзён|апошніх дзён}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|дзеяньне|дзеяньні|дзеяньняў}} за $3 {{PLURAL:$3|апошні дзень|апошнія дні|апошніх дзён}}',
+'activeusers-from' => 'Паказваць ўдзельнікаў, пачынаючы з:',
+'activeusers-hidebots' => 'Схаваць робатаў',
+'activeusers-hidesysops' => 'Схаваць адміністратараў',
+'activeusers-noresult' => 'Удзельнікі ня знойдзеныя.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Правы групаў удзельнікаў',
 'listgrouprights-summary' => 'Ніжэй пададзены сьпіс групаў удзельнікаў {{GRAMMAR:родны|{{SITENAME}}}}, разам зь іх правамі.
@@ -2265,8 +2328,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|старонка|старонкі|старонак}}.',
@@ -2519,7 +2582,7 @@ $1',
 'mycontris' => 'Унёсак',
 'contribsub2' => 'Для $1 ($2)',
 'nocontribs' => 'Ня знойдзена зьменаў, якія адпавядаюць гэтым крытэрыям.',
-'uctop' => ' (апошняя)',
+'uctop' => '(апошняя)',
 'month' => 'Ад месяца (і раней):',
 'year' => 'Ад году (і раней):',
 
@@ -2843,6 +2906,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' => 'Немагчыма стварыць часовы файл мініятуры',
@@ -3149,11 +3214,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' => 'Фармат наступны:
 
@@ -3182,7 +3261,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Шырыня',
 'exif-imagelength' => 'Вышыня',
 'exif-bitspersample' => 'Глыбіня колеру',
@@ -3361,7 +3440,7 @@ $1',
 'exif-originalimageheight' => 'Вышыня выявы да кадраваньня',
 'exif-originalimagewidth' => 'Шырыня выявы да кадраваньня',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Нясьціснуты',
 'exif-compression-2' => 'CCITT Група 3 аднамернае абноўленае кадаваньне адлегласьці Хафмана',
 'exif-compression-3' => 'CCITT Група 3 факсымільнае кадаваньне',
@@ -3786,12 +3865,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' => 'Пошук дублікатаў файлаў',
@@ -3884,6 +3968,7 @@ MediaWiki распаўсюджваецца з надзеяй, што будзе
 'htmlform-selectorother-other' => 'Іншае',
 'htmlform-no' => 'Не',
 'htmlform-yes' => 'Так',
+'htmlform-chosen-placeholder' => 'Выберыце варыянт',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 з падтрымкай поўнатэкстнага пошуку',
index 594eafe..ba53d21 100644 (file)
  * @author DCLXVI
  * @author Daggerstab
  * @author Dimi z
+ * @author Geitost
  * @author Kaganer
+ * @author Simona
  * @author Spiritia
  * @author Stanqo
+ * @author Termininja
  * @author Turin
  * @author Urhixidur
  * @author Vladimir Penov
@@ -266,10 +269,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 +282,7 @@ $messages = array(
 'tog-diffonly' => 'Без показване на съдържанието на страницата при преглед на разлики',
 'tog-showhiddencats' => 'Показване на скритите категории',
 'tog-norollbackdiff' => 'Пропускане на разликовата връзка след извършване на отмяна на редакции',
+'tog-useeditwarning' => 'Предупреждаване при опит за напускане на страница, отворена в режим на редактиране, без да са запазени промените',
 
 'underline-always' => 'Винаги',
 'underline-never' => 'Никога',
@@ -346,6 +346,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|Категория|Категории}}',
@@ -479,7 +491,6 @@ $1',
 'disclaimers' => 'Условия за ползване',
 'disclaimerpage' => 'Project:Условия за ползване',
 'edithelp' => 'Помощ при редактиране',
-'edithelppage' => 'Help:Редактиране',
 'helppage' => 'Help:Съдържание',
 'mainpage' => 'Начална страница',
 'mainpage-description' => 'Начална страница',
@@ -623,6 +634,8 @@ $2',
 'namespaceprotected' => "Нямате права за редактиране на страници в именно пространство '''$1'''.",
 'customcssprotected' => 'Нямате права за редактиране на тази CSS страница, защото тя съдържа чужди потребителски настройки.',
 'customjsprotected' => 'Нямате права за редактиране на тази Джаваскрипт страница, защото тя съдържа чужди потребителски настройки.',
+'mycustomcssprotected' => 'Нямате права за редактиране на тази CSS страница.',
+'mycustomjsprotected' => 'Нямате права за редактиране на тази JavaScript страница.',
 'ns-specialprotected' => 'Специалните страници не могат да бъдат редактирани.',
 'titleprotected' => "Тази страница е била защитена срещу създаване от [[User:$1|$1]].
 Посочената причина е ''$2''.",
@@ -644,8 +657,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 +681,24 @@ $2',
 'logout' => 'Излизане',
 'userlogout' => 'Излизане',
 'notloggedin' => 'Не сте влезли',
-'nologin' => "Нямате потребителско име? '''$1'''.",
+'userlogin-noaccount' => 'Нямате сметка?',
+'userlogin-joinproject' => 'Присъединяване към {{SITENAME}}',
+'nologin' => 'Нямате потребителско име? $1.',
 'nologinlink' => 'Създаване на сметка',
 'createaccount' => 'Регистриране',
 'gotaccount' => "Имате ли вече сметка? '''$1'''.",
 'gotaccountlink' => 'Влизане',
 'userlogin-resetlink' => 'Забравени данни за влизане в системата?',
+'userlogin-resetpassword-link' => 'Възстановяване на паролата',
+'createacct-emailrequired' => 'Адрес за електронна поща',
+'createacct-emailoptional' => 'Адрес за електронна поща (незадължително)',
 'createaccountmail' => 'Използване на временна парола, която се изпраща по електронната поща, посочена по-долу',
 'createaccountreason' => 'Причина:',
+'createacct-reason' => 'Причина',
+'createacct-imgcaptcha-ph' => 'Въведете текста, който виждате по-горе',
+'createacct-submit' => 'Създаване на сметката',
+'createacct-benefit-heading' => '{{SITENAME}} се създава от хора като вас.',
+'createacct-benefit-body2' => '{{PLURAL:$1|страница|страници}}',
 'badretype' => 'Въведените пароли не съвпадат.',
 'userexists' => 'Въведеното потребителско име вече се използва.
 Изберете друго име.',
@@ -719,7 +749,7 @@ $2',
 'cannotchangeemail' => 'Адресите за електронна поща на сметките не могат да бъдат променяни в това уики.',
 'emaildisabled' => 'Този сайт не може да изпраща е-поща.',
 'accountcreated' => 'Потребителската сметка беше създадена',
-'accountcreatedtext' => 'Потребителската сметка за $1 беше създадена.',
+'accountcreatedtext' => 'Потребителската сметка [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|беседа]]) беше създадена.',
 'createaccount-title' => 'Създаване на сметка за {{SITENAME}}',
 'createaccount-text' => 'Някой е създал сметка за $2 в {{SITENAME}} ($4) и е посочил този адрес за електронна поща. Паролата за „$2“ е „$3“. Необходимо е да влезете в системата и да смените паролата си.
 
@@ -755,10 +785,8 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Възстановяване на парола',
-'passwordreset-text' => 'Попълването на формуляра ще доведе до възстановяване на паролата.',
 'passwordreset-legend' => 'Възстановяване на парола',
 'passwordreset-disabled' => 'Възстановяването на паролата е изключено в това уики.',
-'passwordreset-pretext' => '{{PLURAL:$1||Въведете някоя от информациите по-долу}}',
 'passwordreset-username' => 'Потребителско име:',
 'passwordreset-domain' => 'Домейн:',
 'passwordreset-capture' => 'Преглеждане на електронното писмо?',
@@ -990,6 +1018,7 @@ $2
 Вероятно междувременно е била изтрита.',
 'edit-conflict' => 'Редакционен конфликт.',
 'edit-no-change' => 'Вашата редакция беше игнорирана, тъй като не съдържа промени по текста.',
+'postedit-confirmation' => 'Вашата редакция беше съхранена',
 'edit-already-exists' => 'Не можа да се създаде нова страница.
 Такава вече съществува.',
 'defaultmessagetext' => 'Текст на съобщението по подразбиране',
@@ -997,6 +1026,8 @@ $2
 'invalid-content-data' => 'Невалидни данни за съдържание',
 'content-not-allowed-here' => '
 На страницата [[$2]] не е позволено използването на $1',
+'editwarning-warning' => 'Ако излезете от тази страница, може да загубите всички незапазени промени, които сте направили. 
+Ако сте влезли в системата, можете да изключите това предупреждение през меню "Редактиране" във вашите лични настройки.',
 
 # Content models
 'content-model-wikitext' => 'уикитекст',
@@ -1229,7 +1260,6 @@ $1",
 'searchmenu-legend' => 'Настройки на търсенето',
 'searchmenu-exists' => "'''Съществува страница с името „[[:$1]]“ в това уики.'''",
 'searchmenu-new' => "'''Създаване на страницата „[[:$1]]“ в това уики!'''",
-'searchhelp-url' => 'Help:Съдържание',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Преглеждане на страниците с тази представка]]',
 'searchprofile-articles' => 'Съдържателни страници',
 'searchprofile-project' => 'Помощни и проектни страници',
@@ -2072,6 +2102,15 @@ $1',
 'listusers-noresult' => 'Няма намерени потребители.',
 'listusers-blocked' => '(блокиран)',
 
+# Special:ActiveUsers
+'activeusers' => 'Списък на активните потребители',
+'activeusers-intro' => 'Това е списък на потребителите, които са демонстрирали някаква активност през {{PLURAL:$1|последния|последните}} $1 {{PLURAL:$1|ден|дни}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|действие|действия}} за {{PLURAL:$3|последния ден|последните $3 дни}}',
+'activeusers-from' => 'Показване на потребителите, започвайки от:',
+'activeusers-hidebots' => 'Скриване на ботовете',
+'activeusers-hidesysops' => 'Скриване на администраторите',
+'activeusers-noresult' => 'Няма намерени потребители.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Права по потребителски групи',
 'listgrouprights-summary' => 'По-долу на тази страница е показан списък на групите потребители в това уики с асоциираните им права за достъп. Допълнителна информация за отделните права може да бъде намерена [[{{MediaWiki:Listgrouprights-helppage}}|тук]].',
@@ -2146,8 +2185,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 страници}}.',
@@ -3003,7 +3042,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Ширина',
 'exif-imagelength' => 'Височина',
 'exif-bitspersample' => 'Дълбочина на цвета (битове)',
@@ -3158,7 +3197,7 @@ $1',
 'exif-originalimageheight' => 'Височина на изображението преди намаляването',
 'exif-originalimagewidth' => 'Ширина на изображението преди намаляването',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Некомпресиран',
 
 'exif-copyrighted-true' => 'С авторски права',
@@ -3543,13 +3582,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 ae393f0..66f8c79 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' => 'कभी ना',
@@ -214,7 +236,6 @@ $1',
 'disclaimers' => 'अस्विकरण',
 'disclaimerpage' => 'Project:सामान्य अस्विकरण',
 'edithelp' => 'मदद सम्पादन',
-'edithelppage' => 'Help:सम्पादन',
 'helppage' => 'Help:सामग्री',
 'mainpage' => 'मुख्य पन्ना',
 'mainpage-description' => 'पहिलका पन्ना',
@@ -451,7 +472,6 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 'searchmenu-legend' => 'खोज विकल्प',
 'searchmenu-exists' => "'''इ विकि पर ''[[:$1]]'' नाम से एगो पन्ना उपलब्ध बा'''",
 'searchmenu-new' => "'''इ विकि पर ''[[:$1]]'' नाम से पन्ना बनाईं'''",
-'searchhelp-url' => 'Help:सामग्री',
 'searchmenu-prefix' => '[[विशेष:उपसर्ग सूची/$1|इ उपसर्ग साथे पन्ना ब्राउज करीं]]',
 'searchprofile-articles' => 'सामग्री पन्ना',
 'searchprofile-project' => 'मदद आ परियोजना पन्ना',
@@ -729,7 +749,7 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 'metadata-expand' => 'विस्तृत विवरण देखाईं',
 'metadata-collapse' => 'विस्तृत विवरण छुपाँईं',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'चौड़ाई',
 'exif-imagelength' => 'ऊँचाई',
 'exif-bitspersample' => 'अवयव प्रति बीट',
index bcb5714..64744a9 100644 (file)
@@ -384,7 +384,6 @@ $1",
 'disclaimers' => 'Panyangkalan',
 'disclaimerpage' => 'Project:Panyangkalan umum',
 'edithelp' => 'Patulung mambabak',
-'edithelppage' => 'Help:Pambabakan',
 'helppage' => 'Help:Isi',
 'mainpage' => 'Tungkaran Tatambaian',
 'mainpage-description' => 'Tungkaran Tatambaian',
@@ -674,10 +673,8 @@ Pian pinanya sudah barhasil maubah katasunduk Pian atawa maminta sabuting katasu
 
 # Special:PasswordReset
 'passwordreset' => 'Bulikakan setelan katasunduk',
-'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}}',
 'passwordreset-username' => 'Ngaran pamakai:',
 'passwordreset-domain' => 'Dumain:',
 'passwordreset-capture' => 'Tiringikah kulihan suril?',
@@ -1148,7 +1145,6 @@ Catatan bahwasa mamuruk tautan napigasi akan mambulikakan setelan kolum ngini.',
 'searchmenu-legend' => 'Papilihan manggagai',
 'searchmenu-exists' => "'''Ada tungkaran bangaran \"[[:\$1]]\" dalam wiki ini.'''",
 'searchmenu-new' => "'''Maulah tungkaran \"[[:\$1]]\" dalam wiki ngini!'''",
-'searchhelp-url' => 'Help:Isi',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Janaki daptar tungkaran lawan awalan ngini]]',
 'searchprofile-articles' => 'Tungkaran isi',
 'searchprofile-project' => 'Tutungkaran Patulung wan Rangka gawian',
@@ -2044,6 +2040,15 @@ Protokol nang didukung: <code>$1</code> (jangan tambahakan dalam panggagaian Pia
 'listusers-noresult' => 'Kadada pamuruk tatamu.',
 'listusers-blocked' => '(diblukir)',
 
+# Special:ActiveUsers
+'activeusers' => 'Daptar pamuruk aktip',
+'activeusers-intro' => 'Ngini adalah sabuah daptar papamuruk sabuah bantuk kagiatan dalam tauncit $1 {{PLURAL:$1|hari|hahari}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|babak|babakan}} dalam tauncit {{PLURAL:$3|hari|$3 hahari}}',
+'activeusers-from' => 'Manampaiakan papamuruk mulai matan:',
+'activeusers-hidebots' => 'Sungkupakan bot',
+'activeusers-hidesysops' => 'Sungkupakan pambakal',
+'activeusers-noresult' => 'Kadada papamuruk tatamu.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Galambang hak pamuruk',
 'listgrouprights-summary' => 'Barikut adalah sabuah daptar matan galambang pamuruk nang ada di wiki ngini, lawan hak ungkai masing-masing.
@@ -2120,7 +2125,7 @@ Paubahan-paubahan salanjutnya pada tungkaran ngini dan tungkaran pamandiran tara
 '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'''",
+'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}}.',
@@ -3002,7 +3007,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',
@@ -3180,7 +3185,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',
@@ -3596,13 +3601,6 @@ Pian saharusnya [{{SERVER}}{{SCRIPTPATH}}/COPYING sabuting salinan Lisansi Publi
 '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.',
index aa27579..022836f 100644 (file)
@@ -79,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' => 'আমার তৈরি পাতা এবং আপলোড করা ফাইলগুললো আমার নজরতালিকায় যোগ করা হোক',
@@ -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,7 +240,7 @@ $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' => 'পড়ুন',
@@ -239,7 +251,7 @@ $messages = array(
 
 'navigation-heading' => 'পরিভ্রমণ মেনু',
 'errorpagetitle' => 'ত্রুটি',
-'returnto' => '$1 à¦¶à¦¿à¦°à§\8bনামà§\87র à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ à¦«à§\87রত à¦¯à¦¾à¦¨à¥¤',
+'returnto' => '$1 পাতায় ফেরত যান।',
 'tagline' => '{{SITENAME}} থেকে',
 'help' => 'সাহায্য',
 'search' => 'অনুসন্ধান',
@@ -254,11 +266,12 @@ $messages = array(
 'print' => 'মুদ্রণ',
 'view' => 'দেখাও',
 'edit' => 'সম্পাদনা',
-'create' => 'তৈরি করো',
+'create' => 'তৈরি',
 'editthispage' => 'সম্পাদনা করুন',
 'create-this-page' => 'পাতাটি তৈরি করো',
 'delete' => 'অপসারণ',
 'deletethispage' => 'এই পাতাটি মুছে ফেলুন',
+'undeletethispage' => 'এই পাতাটি মুছো না',
 'undelete_short' => 'পুনঃস্থাপন {{PLURAL:$1|১টি সম্পাদনা|$1টি সম্পাদনাসমূহ}}',
 'viewdeleted_short' => '{{PLURAL:$1| টি অপসারিত সম্পাদনা|$1 টি অপসারিত সম্পাদনা}} দেখাও',
 'protect' => 'সুরক্ষা',
@@ -270,7 +283,7 @@ $messages = array(
 'talkpage' => 'আলোচনা করুন',
 'talkpagelinktext' => 'আলোচনা',
 'specialpage' => 'বিশেষ পাতা',
-'personaltools' => 'নিà¦\9cসà§\8dব à¦¹à¦¾à¦¤à¦¿à¦¯à¦¼à¦¾à¦°সমূহ',
+'personaltools' => 'নিà¦\9cসà§\8dব à¦¸à¦°à¦\9eà§\8dà¦\9cামসমূহ',
 'postcomment' => 'নতুন অনুচ্ছেদ',
 'articlepage' => 'নিবন্ধ দেখুন',
 'talk' => 'আলোচনা',
@@ -312,7 +325,6 @@ $1',
 'disclaimers' => 'দাবিত্যাগ',
 'disclaimerpage' => 'Project:সাধারণ দাবিত্যাগ',
 'edithelp' => 'সম্পাদনা সহায়িকা',
-'edithelppage' => 'Help:কিভাবে একটি পাতা সম্পাদনা করবেন',
 'helppage' => 'Help:সূচী',
 'mainpage' => 'প্রধান পাতা',
 'mainpage-description' => 'প্রধান পাতা',
@@ -460,6 +472,8 @@ $2',
 'namespaceprotected' => "'''$1''' নামস্থানে কোন পাতা আপনার সম্পাদনা করার অনুমতি নেই।",
 'customcssprotected' => 'আপনার এই সিএসএস পাতাটি সম্পাদনা করার অনুমতি নেই, কারণ এ পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।',
 'customjsprotected' => 'আপনার এই জাভাস্ক্রিপ্ট পাতাটি সম্পাদনা করার অনুমতি নেই, কারণ এ পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।',
+'mycustomcssprotected' => 'আপনার এই সিএসএস পাতাটি সম্পাদনা করার অনুমতি নেই।',
+'mycustomjsprotected' => 'আপনার এই জাভাস্ক্রিপ্ট পাতাটি সম্পাদনা করার অনুমতি নেই।',
 'ns-specialprotected' => '{{ns:special}} নামস্থানে পাতাসমূহ সম্পাদনা করা যাবে না।',
 'titleprotected' => "[[User:$1|$1]]-কে এই শিরোনামের পাতা সৃষ্টি করতে বাধা দেয়া হচ্ছে। কারণ: ''$2''।",
 'filereadonlyerror' => '"$1" ফাইলটিকে পরিবর্তন করা সম্ভব হচ্ছে না কারন "$2" ফাইল রিপোসিটোরি রিড-অনলি-মোডে আছে।
@@ -484,9 +498,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 +522,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) এর মাধ্যমে ব্যবহারকারীদের লগ-ইন সম্পন্ন করা হয়। আপনার ব্রাঊজারে কুকি বন্ধ করে দেওয়া আছে। কুকি চালু করে আবার চেষ্টা করুন।',
@@ -555,7 +598,7 @@ $2',
 'cannotchangeemail' => 'একাউন্ট ইমেইল ঠিকানা এই উইকিতে পরিবর্তন করা যাবে না।',
 'emaildisabled' => 'এই সাইটটিতে ই-মেইল প্রদানের সুবিধা নেই।',
 'accountcreated' => 'অ্যাকাউন্ট তৈরি করা হয়েছে',
-'accountcreatedtext' => '$1 এর জন্য ব্যবহারকারী অ্যাকাউন্ট তৈরি করা হয়েছে।',
+'accountcreatedtext' => '[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|আলাপ]]) এর জন্য ব্যবহারকারী অ্যাকাউন্ট তৈরি করা হয়েছে।',
 'createaccount-title' => '{{SITENAME}}-এর জন্য অ্যাকাউন্ট সৃষ্টি',
 'createaccount-text' => 'কেউ $2-এর জন্য {{SITENAME}}-এ একটি অ্যাকাউন্ট সৃষ্টি করেছেন ($4)। "$2"-এর জন্য শব্দচাবি হল "$3"। আপনার এখন অ্যাকাউন্টে প্রবেশ করে শব্দচাবি পরিবর্তন করা উচিত।
 
@@ -589,13 +632,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' => 'অনুসন্ধানের ফলাফলের ইমেইল দেখুন?',
@@ -625,7 +670,7 @@ $2
 অস্থায়ী শব্দচাবি: $2',
 'passwordreset-emailsent' => 'শব্দচাবি বদলের একটি ই-মেইল পাঠানো হয়েছে।',
 'passwordreset-emailsent-capture' => 'স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল করা হয়েছে, যা নিচে দেখানো হচ্ছে।',
-'passwordreset-emailerror-capture' => 'স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল তৈরী করা হয়েছিল, যা নিচে দেখানো হচ্ছে, তবে $1 ব্যবহারকারীকে এটি পাঠানো যায়নি!',
+'passwordreset-emailerror-capture' => 'স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল তৈরী করা হয়েছিল, যা নিচে দেখানো হচ্ছে, তবে $1 {{GENDER:$2|ব্যবহারকারীকে}} এটি পাঠানো যায়নি!',
 
 # Special:ChangeEmail
 'changeemail' => 'ই-মেইল ঠিকানা পরিবর্তন',
@@ -726,7 +771,9 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 একাধিক ব্যবহারকারী এরকম একটি আইপি ঠিকানা ব্যবহার করতে পারেন।
 আপনি যদি একজন বেনামী ব্যবহারকারী হয়ে থাকেন এবং যদি অনুভব করেন যে আপনার প্রতি অপ্রাসঙ্গিক মন্তব্য করা হয়েছে, তাহলে অন্যান্য বেনামী ব্যবহারকারীর সাথে ভবিষ্যতে বিভ্রান্তি এড়াতে অনুগ্রহ করে [[Special:UserLogin/signup|একটি অ্যাকাউন্ট তৈরি করুন]] অথবা  [[Special:UserLogin|অ্যাকাউন্টে প্রবেশ করুন]]।''",
 'noarticletext' => 'বর্তমানে এই পাতায় কোন লেখা নেই।
-আপনি চাইলে অন্যান্য পাতায় [[Special:Search/{{PAGENAME}}| এই শিরোনামটি অনুসন্ধান করতে পারেন]], <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} এ সম্পর্কিত লগ অনুসন্ধান করতে পারেন], কিংবা [{{fullurl:{{FULLPAGENAME}}|action=edit}} এই পাতাটি সম্পাদনা করতে পারেন]</span>।',
+আপনি চাইলে অন্যান্য পাতায় [[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>, কিন্তু আপনার এই পাতাটি তৈরী করার অনুমতি নেই।',
 'missing-revision' => '"{{PAGENAME}}" এর #$1তম সংস্করণটি প্রদর্শন সম্ভব নয়।
@@ -799,9 +846,9 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 'cascadeprotectedwarning' => "'''সতর্কীকরণ:''' এই পাতাটি বন্ধ করা হয়েছে, যাতে কেবল প্রশাসকের ক্ষমতাবিশিষ্ট ব্যবহারকারীরা এটি সম্পাদনা করতে পারেন, কারণ এই পাতাটি নিচের প্রপাতাকারে সুরক্ষিত (cascade-protected) {{PLURAL:$1|টি পাতায়|টি পাতায়}} অন্তর্ভুক্ত আছে:",
 'titleprotectedwarning' => "'''সতর্কীকরণ: এই পাতাটির ব্যবহার সীমিত করা হয়েছে, যাতে কেবলমাত্র [[Special:ListGroupRights|এই নির্দিষ্ট অনুমতিপ্রাপ্ত]] ব্যবহারকারী এটি তৈরি করতে পারেন।'''
 আপনার সুবিধার্থে পাতাটির সাম্প্রতিক সংরক্ষণ লগের বিবরণ নিচে দেওয়া হলো।",
-'templatesused' => 'à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ à¦¬à§\8dযবহà§\83ত {{PLURAL:$1|à¦\9fà§\87মà§\8dপলà§\87à¦\9f|à¦\9fà§\87মà§\8dপলেটসমূহ}}:',
+'templatesused' => 'à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ à¦¬à§\8dযবহà§\83ত {{PLURAL:$1|à¦\9fà§\87মপà§\8dলà§\87à¦\9f|à¦\9fà§\87মপà§\8dলেটসমূহ}}:',
 'templatesusedpreview' => 'এই প্রাকদর্শনে ব্যবহৃত {{PLURAL:$1|টেম্পলেট| টেম্পলেটসমূহ}}:',
-'templatesusedsection' => 'à¦\8fà¦\87 à¦\85নà§\81à¦\9aà§\8dà¦\9bà§\87দà§\87 à¦¬à§\8dযবহà§\83ত {{PLURAL:$1|à¦\9fà§\87মà§\8dপলà§\87à¦\9f|à¦\9fà§\87মà§\8dপলেটসমূহ}}:',
+'templatesusedsection' => 'à¦\8fà¦\87 à¦\85নà§\81à¦\9aà§\8dà¦\9bà§\87দà§\87 à¦¬à§\8dযবহà§\83ত {{PLURAL:$1|à¦\9fà§\87মপà§\8dলà§\87à¦\9f|à¦\9fà§\87মপà§\8dলেটসমূহ}}:',
 'template-protected' => '(সুরক্ষিত)',
 'template-semiprotected' => '(অর্ধ-সুরক্ষিত)',
 'hiddencategories' => 'এ পাতাটি যে {{PLURAL:$1|1 লুকায়িত বিষয়শ্রেণীর|$1 লুকায়িত বিষয়শ্রেণীসমূহের}} সদস্য:',
@@ -827,6 +874,7 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 সম্ভবতঃ পাতাটি মুছে ফেলা হয়েছে।',
 'edit-conflict' => 'সম্পাদনা সংঘাত।',
 'edit-no-change' => 'আপনার সম্পাদনাটি উপেক্ষা করা হয়েছে, কারণ লেখাতে কোনো পরিবর্তন করা হয়নি।',
+'postedit-confirmation' => 'আপনার সম্পাদনা সংরক্ষিত হয়েছে।',
 'edit-already-exists' => 'নতুন পাতা সৃষ্টি করা যায়নি।
 পাতাটি ইতিমধ্যেই বিদ্যমান।',
 'defaultmessagetext' => 'আদি টেক্সট',
@@ -834,7 +882,7 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 'invalid-content-data' => 'ভুল কন্টেন্ট ডাটা',
 'content-not-allowed-here' => '"$1" কন্টেন্টটি [[$2]] পাতায় অনুমোদিত নয়',
 'editwarning-warning' => 'এই পাতাটি ত্যাগ করলে আপনার আপনার করা পরিবর্তনগুলো হারিয়ে যেতে পারে।
-আপনি যদি লগইন করা থাকেন, আপনি এই সতর্কীকরণ বার্তাটি আপনার পছন্দের "{{int:prefs-editing}}" অনুচ্ছেদ থেকে নিস্ক্রিয় করতে পারেন।',
+আপনি যদি লগইন করা থাকেন, আপনি এই সতর্কীকরণ বার্তাটি আপনার পছন্দের "সম্পাদনা" অনুচ্ছেদ থেকে নিস্ক্রিয় করতে পারেন।',
 
 # Content models
 'content-model-wikitext' => 'উইকিটেক্সট',
@@ -1076,7 +1124,6 @@ $1",
 'searchmenu-legend' => 'অনুসন্ধান অপশন',
 'searchmenu-exists' => "'''এই উইকিতে \"[[:\$1]]\" নামে একটি পাতা রয়েছে'''",
 'searchmenu-new' => "'''\"[[:\$1]]\" পাতাটি এই উইকিতে তৈরি করুন!'''",
-'searchhelp-url' => 'Help:সহায়িকা',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|এই প্রিফিক্স রয়েছে এমন পাতা দেখুন]]',
 'searchprofile-articles' => 'বিষয়বস্তুর পাতা',
 'searchprofile-project' => 'সহায়িকা এবং প্রকল্প পাতা',
@@ -1118,6 +1165,7 @@ $1",
 'powersearch-togglenone' => 'কিছু নয়',
 'search-external' => 'বহিঃস্থ অনুসন্ধান',
 'searchdisabled' => '{{SITENAME}} অনুসন্ধান এখন নিষ্ক্রিয় আছে। আপনি গুগলের মাধ্যমে অনুসন্ধান চালাতে পারেন। লক্ষ্য করুন যে {{SITENAME}}-এর বিষয়বস্তুর উপর গুগলের ইন্ডেক্সগুলি হালনাগাদ না-ও করা থাকতে পারে।',
+'search-error' => 'অনুসন্ধানের সময় একটি ত্রুটি হয়েছে: $1',
 
 # Preferences page
 'preferences' => 'আমার পছন্দ',
@@ -1202,6 +1250,7 @@ $1",
 'yourrealname' => 'আসল নাম *',
 'yourlanguage' => 'ভাষা:',
 'yourvariant' => 'বিষয়বস্তুর ভাষার বিকল্প:',
+'prefs-help-variant' => 'উইকিতে কন্টেন্ট পাতা দেখার জন্য আপনার পছন্দের বৈশিষ্ট।',
 'yournick' => 'স্বাক্ষর:',
 'prefs-help-signature' => 'আলাপ পাতায় আপনার মন্তব্য অবশ্যই "<nowiki>~~~~</nowiki>" চিহ্ন দ্বারা স্বাক্ষরিত হতে হবে, যা স্বয়ংক্রিয়ভাবে আপনার স্বাক্ষর ও সময় সংযুক্ত করবে।',
 'badsig' => 'অবৈধ স্বাক্ষর; এইচটিএমএল ট্যাগ পরীক্ষা করুন।',
@@ -1258,6 +1307,7 @@ $1",
 'userrights-notallowed' => 'আপনার অ্যাকাউন্ট থেকে ব্যবহারকারী অধিকার যুক্ত বা অপসারণ করার অনুমতি নেই।',
 'userrights-changeable-col' => 'দল যা আপনি পরিবর্তন করতে পারেন',
 'userrights-unchangeable-col' => 'দল যা আপনি পরিবর্তন করতে পারবেন না',
+'userrights-conflict' => 'ব্যবহারকারী অধিকার দ্বন্দ্ব! অনুগ্রহ করে পুনরায় চেষ্টা করুন।',
 
 # Groups
 'group' => 'দল:',
@@ -1303,6 +1353,7 @@ $1",
 'right-purge' => 'নিশ্চিতকরণ ছাড়াই সাইটের ক্যাশ পার্জ করুন',
 'right-autoconfirmed' => 'অর্ধ-সুরক্ষিত পাতা সম্পাদনা',
 'right-bot' => 'সয়ংক্রিয় পদ্ধতি হিসাবে চিহ্নিত করণ',
+'right-nominornewtalk' => 'বার্তা লেখার মত আলাপ পাতায় কোনো অনুল্লেখ্য সম্পাদনা নেই',
 'right-apihighlimits' => 'API কোয়েরি হিসাবে আরও উচ্চ লিমিট ব্যবহার করুন',
 'right-writeapi' => 'write API এর ব্যবহার',
 'right-delete' => 'পাতা মুছে ফেলুন',
@@ -1327,6 +1378,8 @@ $1",
 'right-editusercssjs' => 'অন্য ব্যবহারকারীগণের CSS এবং JS ফাইল সম্পাদনা',
 'right-editusercss' => 'অন্য ব্যবহারকারীগণের CSS ফাইল সম্পাদনা',
 'right-edituserjs' => 'অন্য ব্যবহারকারীগণের JS ফাইল সম্পাদনা',
+'right-editmyusercss' => 'আপনার নিজস্ব ব্যবহারকারী সিএসএস ফাইল সম্পাদনা করুন',
+'right-editmyuserjs' => 'আপনার নিজস্ব ব্যবহারকারী জাভাস্ক্রিপ্ট ফাইল সম্পাদনা করুন',
 'right-rollback' => 'একটি নির্দিষ্ট পাতার সর্বশেষ ব্যবহারকারীর সম্পদনা পূর্বাবস্থায় ফিরিয়ে আনুন',
 'right-markbotedits' => 'রোলড-ব্যাক সম্পাদনাসমূহকে বট সম্পাদনা হিসেবে চিহ্নিত করো',
 'right-noratelimit' => 'রেট লিমিটের ভিত্তিতে পরিবর্তন হবে না',
@@ -1727,6 +1780,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
@@ -1980,6 +2034,15 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 'listusers-noresult' => 'কোন ব্যবহারকারী খুঁজে পাওয়া যায়নি।',
 'listusers-blocked' => '(ব্লককৃত)',
 
+# Special:ActiveUsers
+'activeusers' => 'সক্রিয় ব্যবহারকারী তালিকা',
+'activeusers-intro' => 'এটি ব্যবহারকারী তালিকা যাদের $1 {{PLURAL:$1|দিনে|দিনে}} যেকোন কর্মকান্ড রয়েছে।',
+'activeusers-count' => 'গত {{PLURAL:$3|দিনে}} সর্বমোট {{PLURAL:$1|পদ}} সংখ্যা $1',
+'activeusers-from' => 'ব্যবহারকারী দেখাও যাদের নাম এই অক্ষর দিয়ে শুরু:',
+'activeusers-hidebots' => 'বট লুকাও',
+'activeusers-hidesysops' => 'প্রশাসক লুকাও',
+'activeusers-noresult' => 'কোনো ব্যবহারকারী পাওয়া যায়নি।',
+
 # Special:ListGroupRights
 'listgrouprights' => 'দলগত ব্যবহারকারী অধিকার',
 'listgrouprights-summary' => 'এই উইকির ব্যবহারকারীদের একটি গ্রুপগুলোর তালিকা দেখানো হচ্ছে, সাথে গ্রুপের কার্যপরিধিও উল্লেখ করা হয়েছে।
@@ -2058,8 +2121,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|পাতা|পাতা}} রয়েছে।',
@@ -2305,7 +2368,7 @@ $1',
 'mycontris' => 'অবদান',
 'contribsub2' => '$1 ($2)-এর জন্য',
 'nocontribs' => 'এই শর্তগুলির সাথে মিলে যায়, এমন কোন পরিবর্তন খুঁজে পাওয়া যায়নি।',
-'uctop' => '(শà§\80রà§\8dষ)',
+'uctop' => '(বরà§\8dতমান)',
 'month' => 'এই মাস (বা তার আগে) থেকে:',
 'year' => 'এই বছর (এবং তার আগে) থেকে:',
 
@@ -2467,7 +2530,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' => 'আপনি নিজেকে আনব্লক করতে পারবেন না',
 
@@ -2506,6 +2571,17 @@ $1',
 
 '''সতর্কীকরণ!'''
 কোন জনপ্রিয় পাতার ক্ষেত্রে এই পরিবর্তনটি খুবই আকস্মিক হতে পারে; অগ্রসর হবার আগে এই কাজটির ফলাফল কী হতে পারে, সে ব্যাপারে অনুগ্রহ করে নিশ্চিত হোন।",
+'movepagetext-noredirectfixer' => "নিচের ফর্মটি ব্যবহার করে একটি পাতার শিরোনাম পরিবর্তন করা যাবে, এবং সেই সাথে নতুন শিরোনামে এর সমগ্র ইতিহাস স্থানান্তর করা যাবে।
+পুরনো শিরোনামটি নতুন শিরোনামটির প্রতি একটি পুনর্নির্দেশনা ধারণ করবে।
+[[Special:DoubleRedirects|দ্বি-পুনর্নির্দেশনা]] বা [[Special:BrokenRedirects|অচল পুনর্নির্দেশনাগুলি]] পরীক্ষা করে দেখতে ভুলবেন না।
+সংযোগগুলি যাতে তাদের লক্ষ্যে পৌঁছায়, তা নিশ্চিত করার দায়িত্ব আপনার।
+
+লক্ষ্য করুন যে যদি নতুন শিরোনামে ইতিমধ্যেই একটি পাতা থেকে থাকে, তবে উৎস পাতাটি সেই শিরোনামে স্থানান্তর করা হবে '''না''', যদি না নতুন শিরোনামের পাতাটি খালি থাকে বা একটি পুননির্দেশনা হয় এবং এর কোন অতীত সম্পাদনা ইতিহাস না থাকে। 
+অর্থাৎ আপনি ভুল করে নাম পরিবর্তন করলে সহজেই পুরনো নামে ফেরত যেতে পারবেন, কিন্তু ইতিমধ্যে বিদ্যমান কোন পাতার উপরে লিখতে পারবেন না।
+
+'''সতর্কীকরণ!'''
+কোন জনপ্রিয় পাতার ক্ষেত্রে এই পরিবর্তনটি খুবই আকস্মিক হতে পারে;
+অগ্রসর হবার আগে এই কাজটির ফলাফল কী হতে পারে, সে ব্যাপারে অনুগ্রহ করে নিশ্চিত হোন।",
 'movepagetalktext' => "পাতাটির সাথে সাথে সংশ্লিষ্ট আলোচনা পাতাটিও স্বয়ংক্রিয়ভাবে সরানো হবে '''যদি না:'''
 *খালি নয় এমন একটি আলাপ পাতা নতুন শিরোনামটির অধীনে ইতিমধ্যেই বিদ্যমান থাকে, অথবা
 *আপনি নিচের বাক্সটি থেকে টিক সরিয়ে নিতে পারেন।
@@ -2556,6 +2632,7 @@ $1',
 'immobile-target-namespace-iw' => 'পাতা স্থানান্তরের ক্ষেত্রে ইন্টারউইকি লিংক ব্যবহার করা যাবে না।',
 'immobile-source-page' => 'এই পাতাটির স্থানান্তর সম্ভব নয়।',
 'immobile-target-page' => 'গন্তব্য শিরোনামে স্থানান্তর করা যাবে না।',
+'bad-target-model' => 'আপনার উল্লেখিত কন্টেন্ট মডেলটি আলাদা। $1 থেকে $2 কনভার্ট করা যাচ্ছে না।',
 'imagenocrossnamespace' => 'কোনো ফাইল ফাইলনয় এমন নামস্থানে স্থানান্তর সম্ভব নয়',
 'nonfile-cannot-move-to-file' => 'কোনো ফাইলনয় এমন কোনো পাতা ফাইল নামস্থানে স্থানান্তর সম্ভব নয়',
 'imagetypemismatch' => 'নতুন ফাইল এক্সটেনশনটি ফাইলের ধরনের সাথে মিলছে না',
@@ -2589,7 +2666,8 @@ $1',
 'export-addnstext' => 'নামস্থান থেকে পাতা যুক্ত করুন:',
 'export-addns' => 'যোগ',
 'export-download' => 'ফাইল হিসেবে সংরক্ষণ করা হোক',
-'export-templates' => 'টেম্পলেট অন্তর্ভুক্তি',
+'export-templates' => 'টেমপ্লেট অন্তর্ভুক্তি',
+'export-pagelinks' => 'সম্পর্কিত পাতাগুলো এই ধাপ পর্যন্ত যুক্ত করো:',
 
 # Namespace 8 related
 'allmessages' => 'সিস্টেম বার্তাসমূহ',
@@ -2600,6 +2678,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' => 'পরিবর্তিত',
@@ -2611,6 +2690,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' => 'অস্থায়ী থাম্বনেইল ফাইল তৈরী করা সম্ভব নয়',
@@ -2618,6 +2699,7 @@ $1',
 'thumbnail_invalid_params' => 'থাম্বনেইল প্যারামিটারগুলি অবৈধ',
 'thumbnail_dest_directory' => 'গন্তব্য ডিরেক্টরি তৈরি করা যায়নি',
 'thumbnail_image-type' => 'চিত্রের ধরন সমর্থন করে না',
+'thumbnail_gd-library' => 'অসম্পূর্ণ জিডি লাইব্রেরী কনফিগারেশন: $1 ফাংশন নেই',
 'thumbnail_image-missing' => 'ফাইলটি খুজে পাওয়া যাচ্ছে না: $1',
 
 # Special:Import
@@ -2631,6 +2713,7 @@ $1',
 'import-interwiki-templates' => 'সকল টেম্পলেট অন্তর্ভুক্ত',
 'import-interwiki-submit' => 'আমদানি',
 'import-interwiki-namespace' => 'গন্তব্য নামস্থান:',
+'import-interwiki-rootpage' => 'মূল পাতা (ঐচ্ছিক):',
 'import-upload-filename' => 'ফাইলনাম:',
 'import-comment' => 'মন্তব্য:',
 'importtext' => 'অনুগ্রহ করে ফাইলটি উৎস উইকি থেকে [[Special:Export|এক্সপোর্ট ইউটিলিটি]] ব্যবহার করে এক্সপোর্ট করুন।
@@ -2664,6 +2747,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" নামস্থানে উপপাতা তৈরী অনুমোদিত নয়।',
@@ -2781,6 +2865,7 @@ $1',
 
 # Info page
 'pageinfo-title' => '"$1" এর তথ্য',
+'pageinfo-not-current' => 'দুঃখিত, পুরাতন সংস্করণের জন্য এই তথ্য প্রদর্শন সম্ভব নয়।',
 'pageinfo-header-basic' => 'সাধারণ তথ্য',
 'pageinfo-header-edits' => 'সম্পাদনা ইতিহাস',
 'pageinfo-header-restrictions' => 'পাতা সুরক্ষা',
@@ -2795,6 +2880,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|পুনর্নির্দেশ নেই|পুনর্নির্দেশ নেই}})',
@@ -2809,18 +2895,24 @@ $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
@@ -2833,6 +2925,8 @@ $1',
 'markedaspatrollederror' => 'পরীক্ষিত বলে চিহ্নিত করা যাবে না',
 'markedaspatrollederrortext' => 'পরীক্ষিত বলে চিহ্নিত করতে আপনাকে একটি সংস্করণ নির্দিষ্ট  করতে হবে।',
 'markedaspatrollederror-noautopatrol' => 'আপনার নিজের পাতাকে পরীক্ষিত বলে চিহ্নিত করার অনুমতি আপনার নেই।',
+'markedaspatrollednotify' => '$1 এর পরিবর্তন পরীক্ষিত হিসাবে চিহ্নিত করা হয়েছে।',
+'markedaspatrollederrornotify' => 'পরীক্ষিত হিসাবে চিহ্নিত করতে ব্যর্থ।',
 
 # Patrol log
 'patrol-log-page' => 'পরীক্ষণ লগ',
@@ -2896,11 +2990,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 বছর}}',
 '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' => 'ফরম্যাটটি এরকম:
 
@@ -2927,7 +3035,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'চওড়া',
 'exif-imagelength' => 'লম্বা',
 'exif-bitspersample' => 'উপাদানপ্রতি বিট',
@@ -3105,8 +3213,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' => 'পাবলিক ডোমেইন',
@@ -3175,6 +3286,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' => 'রেড-আই হ্রাস মোড',
@@ -3277,6 +3389,7 @@ $1',
 'exif-ycbcrpositioning-2' => 'কো-সাইটেড',
 
 'exif-dc-contributor' => 'অবদানকারী',
+'exif-dc-coverage' => 'মিডিয়া ফাইলের বিশেষ অথবা অস্থায়ী ক্ষেত্র',
 'exif-dc-date' => 'তারিখ',
 'exif-dc-publisher' => 'প্রকাশক',
 'exif-dc-relation' => 'সম্পর্কিত মিডিয়া',
@@ -3350,6 +3463,30 @@ $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' => 'ইমেইল নিশ্চিতকরণ বাতিল করুন',
@@ -3409,6 +3546,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' => 'লোডিং… প্রস্তুত!',
@@ -3446,8 +3591,42 @@ $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|আলাপ]])',
+'timezone-utc' => 'ইউটিসি',
 
 # Core parser functions
 'unknown_extension_tag' => 'অজানা এক্সটেনশন ট্যাগ "$1"',
@@ -3473,6 +3652,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' => 'সংস্করণ',
@@ -3480,12 +3665,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' => 'ডুপ্লিকেট ফাইলের জন্য অনুসন্ধান',
@@ -3535,7 +3725,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' => 'সম্পাদনা',
@@ -3574,6 +3766,9 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'htmlform-submit' => 'জমা দাও',
 'htmlform-reset' => 'পরিবর্তন বাতিল',
 'htmlform-selectorother-other' => 'অন্য',
+'htmlform-no' => 'না',
+'htmlform-yes' => 'হ্যাঁ',
+'htmlform-chosen-placeholder' => 'অপশন নির্বাচন করুন',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 সহ পূর্ণ টেক্সট সার্চ সমর্থন',
@@ -3611,10 +3806,13 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 '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' => 'বাতিল',
@@ -3664,7 +3862,7 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'api-error-ok-but-empty' => 'অভ্যন্তরীণ ত্রুটি: সার্ভার হতে কোন সাড়া পাওয়া যাচ্ছে না।',
 'api-error-overwrite' => 'ইতিমধ্যেই রয়েছে এমন কোনো ফাইলের প্রতিস্থাপন গ্রহণযোগ্য নয়।',
 'api-error-stashfailed' => 'অভ্যন্তরীণ ত্রুটি: সার্ভার অস্থায়ী ফাইলটি সংরক্ষণ করতে ব্যর্থ হয়েছে।',
-'api-error-publishfailed' => 'à¦\85ভà§\8dযনà§\8dতরà§\80ন à¦¤à§\8dরà§\81à¦\9fি: à¦¸à¦¾à¦°à§\8dভার à¦\9fà§\87মà§\8dপরারি à¦«à¦¾à¦\87লà¦\9fি à¦ªà§\8dরà¦\95াশ à¦\95রতà§\87 à¦ªà¦¾à¦°à¦\9bà§\87 à¦¨à¦¾।',
+'api-error-publishfailed' => 'à¦\85ভà§\8dযনà§\8dতরà§\80ন à¦¤à§\8dরà§\81à¦\9fি: à¦¸à¦¾à¦°à§\8dভার à¦\85সà§\8dথায়à§\80 à¦«à¦¾à¦\87লà¦\9fি à¦ªà§\8dরà¦\95াশ à¦\95রতà§\87 à¦¬à§\8dযরà§\8dথ à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।',
 'api-error-timeout' => 'কাঙ্খিত সময়ের মধ্যে সার্ভারের কোন সাড়া পাওয়া যায়নি।',
 'api-error-unclassified' => 'একটি অজানা ত্রুটি দেখা দিয়েছে',
 'api-error-unknown-code' => 'অজানা ত্রুটি: "$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..6f14682 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' => 'সুপৌনা',
@@ -286,7 +285,6 @@ $1',
 'disclaimers' => 'দাবি বেলানি',
 'disclaimerpage' => 'Project:ইজ্জু দাবি বেলানি',
 'edithelp' => 'পতানি পাংলাক',
-'edithelppage' => 'Help:কিসাদে_পাতা_আহান_পতানি',
 'helppage' => 'Help:পাংলাক',
 'mainpage' => 'পয়লা পাতা',
 'mainpage-description' => 'পয়লা পাতা',
@@ -711,6 +709,8 @@ $2',
 'edit-conflict' => 'পতানিত বেসেপ ইসে',
 'edit-already-exists' => 'নুৱা পাতাহান হঙকরানি নাইল।
 পাতাএহান আগেত্তর আসে।',
+'editwarning-warning' => 'পাতা এহান বেলিয়া গেলেগা তি সিলকরিসত অতা মাঙুইতে পারে।
+তি লগইন করিসতগ ইলে, এরে সিঙকরানির পৌ এহান তর "পতানি" থাকেত্ত আরুম করানি পারর।',
 
 # Parser/template warnings
 'post-expand-template-inclusion-warning' => "'''সিঙুইস:''' টেমপ্লেটের ইনক্লুড অংতাহান ডাঙর অসে। টেমপ্লেট কতহান তিলকরানি নুওয়ারতে পারে।",
@@ -840,7 +840,6 @@ $2',
 'searchmenu-legend' => 'বিসারানির অপশনহানি',
 'searchmenu-exists' => "'''উইকি এহাত \"[[:\$1]]\" নাঙে পাতা আহান আসে'''",
 'searchmenu-new' => "'''\"[[:\$1]]\" নাঙর পাতাহান এরে উইকিত হঙকর!'''",
-'searchhelp-url' => 'Help:পাংলাক',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|এরে prefix এতাল আসে পাতাহানি]]',
 'searchprofile-articles' => 'কন্টেন্টর পাতাহানি',
 'searchprofile-project' => 'পাঙলাক বারো প্রকল্পর পাতা',
@@ -880,14 +879,6 @@ $2',
 'powersearch-togglenone' => 'কিত্তাউ নেই',
 'search-external' => 'বারেদে বিসারা',
 
-# Quickbar
-'qbsettings' => 'কুইকবার',
-'qbsettings-none' => 'কিত্তাউ নেই',
-'qbsettings-fixedleft' => 'লেপ্পা বিঙ',
-'qbsettings-fixedright' => 'লেপ্পা বাত',
-'qbsettings-floatingleft' => 'বাহের বিঙ',
-'qbsettings-floatingright' => 'বাহের বাত',
-
 # Preferences page
 'preferences' => 'পছনহানি',
 'mypreferences' => 'মর পছন',
@@ -1676,11 +1667,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 df3b608..82f8325 100644 (file)
  * @author Candalua
  * @author Fohanno
  * @author Fulup
+ * @author Geitost
  * @author Gwendal
  * @author Gwenn-Ael
  * @author Kaganer
  * @author Malafaya
+ * @author Nemo bis
  * @author VIGNERON
  * @author Y-M D
  * @author לערי ריינהארט
@@ -420,7 +422,6 @@ $1',
 'disclaimers' => 'Kemennoù',
 'disclaimerpage' => 'Project:Kemenn hollek',
 'edithelp' => 'Skoazell',
-'edithelppage' => 'Help:Penaos kemmañ traoù er pennadoù',
 'helppage' => 'Help:Skoazell',
 'mainpage' => 'Degemer',
 'mainpage-description' => 'Degemer',
@@ -589,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ñ.",
@@ -604,12 +611,16 @@ Na zisoñjit ket resisaat ho [[Special:Preferences|penndibaboù evit {{SITENAME}
 'logout' => 'Digevreañ',
 'userlogout' => 'Digevreañ',
 'notloggedin' => 'Digevreet',
-'nologin' => "N'hoc'h eus kont ebet ? '''$1'''.",
+'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.',
@@ -651,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.",
@@ -700,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 ?',
@@ -937,6 +946,7 @@ 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',
@@ -1183,7 +1193,6 @@ Gallout a reot kavout munudoù e [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'searchmenu-legend' => 'Dibarzhioù klask',
 'searchmenu-exists' => "'''Ur bajenn anvet\"[[:\$1]]\" zo war ar wiki-mañ'''",
 'searchmenu-new' => "'''Krouiñ ar bajenn \"[[:\$1]]\" war ar wiki-mañ !'''",
-'searchhelp-url' => 'Help:Skoazell',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Furchal er pajennoù a grog gant ar rakger-mañ]]',
 'searchprofile-articles' => 'Pajennoù gant boued',
 'searchprofile-project' => 'Pajennoù skoazell ha pajennoù ar raktres',
@@ -1552,7 +1561,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ñ',
@@ -1682,11 +1691,11 @@ $1",
 'upload-proto-error-text' => 'Rekis eo an URLoù a grog gant <code>http://</code> pe <code>ftp://</code> evit enporzhiañ.',
 'upload-file-error' => 'Fazi diabarzh',
 'upload-file-error-text' => "Ur fazi diabarzh zo c'hoarvezet en ur grouiñ ur restr da c'hortoz war ar servijer.
-Kit e darempred gant [[Special:ListUsers/sysop|unan eus merourien ar reizhiad]].",
+Kit e darempred gant [[Special:ListUsers/sysop|unan eus merourien]].",
 'upload-misc-error' => 'Fazi kargañ dianav',
 'upload-misc-error-text' => "Ur fazi dianav zo bet e-ser kargañ.
 Gwiriit eo reizh an URL hag e c'hall bezañ tizhet ha klaskit en-dro.
-Ma talc'h ar gudenn, kit e darempred gant [[Special:ListUsers/sysop|merourien ar reizhiad]].",
+Ma talc'h ar gudenn, kit e darempred gant [[Special:ListUsers/sysop|merourien]].",
 'upload-too-many-redirects' => 'Re a adkasoù zo en URL-mañ.',
 'upload-unknown-size' => 'Ment dianav',
 'upload-http-error' => 'Ur fazi HTTP zo bet : $1',
@@ -2099,6 +2108,15 @@ Rekis eo dezho un domani a-us da nebeutañ evel, da skouer, "*.org".<br />
 'listusers-noresult' => "N'eus bet kavet implijer ebet.",
 'listusers-blocked' => '(stanket)',
 
+# Special:ActiveUsers
+'activeusers' => 'Roll an implijerien oberiant',
+'activeusers-intro' => 'Setu aze ur roll eus an implijerien zo bet oberiant mui pe vui e-pad an $1 {{PLURAL:$1|deiz|deiz}} diwezhañ.',
+'activeusers-count' => '$1 {{PLURAL:$1|oberiadenn}} abaoe an {{PLURAL:$3|deiz|$3 deiz}} diwezhañ',
+'activeusers-from' => 'Diskouez an implijerien adal :',
+'activeusers-hidebots' => 'Kuzhat ar robotoù',
+'activeusers-hidesysops' => 'Kuzhat ar verourien',
+'activeusers-noresult' => "N'eus bet kavet implijer ebet.",
+
 # Special:ListGroupRights
 'listgrouprights' => 'Gwirioù ar strolladoù implijer',
 'listgrouprights-summary' => 'Da-heul ez eus ur roll eus ar strolladoù implijerien termenet war ar wiki-mañ, gant ar gwirioù moned stag outo.
@@ -2179,8 +2197,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ñ',
@@ -2449,8 +2467,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',
@@ -2891,7 +2909,6 @@ Talvezout a ra da ouzhpennañ un displegadenn er c\'hombod diverrañ.',
 '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 */',
@@ -3084,7 +3101,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ù',
@@ -3262,7 +3279,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',
@@ -3693,13 +3710,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.',
@@ -3789,6 +3799,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 2a4a3c2..253b2c7 100644 (file)
  * @author DzWiki
  * @author Edinwiki
  * @author Fulup
+ * @author Geitost
  * @author Kaganer
  * @author Kal-El
  * @author Malafaya
+ * @author Nemo bis
  * @author Palapa
  * @author Seha
  * @author Smooth O
@@ -330,7 +332,7 @@ $messages = array(
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Stil slova područja uređivanja:',
-'editfont-default' => 'Po podešavanjima preglednika',
+'editfont-default' => 'Po postavkama preglednika',
 'editfont-monospace' => 'Slova sa jednostrukim razmakom',
 'editfont-sansserif' => 'Slova bez serifa',
 'editfont-serif' => 'Slova serif',
@@ -386,6 +388,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. juni',
+'july-date' => '$1. juli',
+'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}}',
@@ -411,6 +425,7 @@ $messages = array(
 'newwindow' => '(otvara se u novom prozoru)',
 'cancel' => 'Poništite',
 'moredotdotdot' => 'Još...',
+'morenotlisted' => 'Više nije prikazano...',
 'mypage' => 'Korisnička stranica',
 'mytalk' => 'Razgovor',
 'anontalk' => 'Razgovor za ovu IP adresu',
@@ -491,7 +506,7 @@ $messages = array(
 'viewhelppage' => 'Pogledajte stranicu za pomoć',
 'categorypage' => 'Pogledaj stranicu kategorije',
 'viewtalkpage' => 'Pogledaj raspravu',
-'otherlanguages' => 'Ostali jezici',
+'otherlanguages' => 'Na drugim jezicima',
 'redirectedfrom' => '(Preusmjereno sa $1)',
 'redirectpagesub' => 'Preusmjeri stranicu',
 'lastmodifiedat' => 'Ova stranica je posljednji put izmijenjena $2, $1',
@@ -519,7 +534,6 @@ $1',
 'disclaimers' => 'Odricanje odgovornosti',
 'disclaimerpage' => 'Project:Uslovi korištenja, pravne napomene i odricanje odgovornosti',
 'edithelp' => 'Pomoć pri uređivanju stranice',
-'edithelppage' => 'Help:Uređivanje',
 'helppage' => 'Help:Sadržaj',
 'mainpage' => 'Početna strana',
 'mainpage-description' => 'Početna strana',
@@ -649,7 +663,7 @@ Podaci koji se ovdje nalaze ne moraju biti aktuelni.',
 'wrong_wfQuery_params' => 'Netačni parametri za wfQuery()<br />
 Funkcija: $1<br />
 Pretraga: $2',
-'viewsource' => 'pogledaj kod',
+'viewsource' => 'Pogledaj izvor',
 'viewsource-title' => 'Prikaz izvora stranice $1',
 'actionthrottled' => 'Akcija je usporena',
 'actionthrottledtext' => 'Kao anti-spam mjera, ograničene su vam izmjene u određenom vremenu, i trenutačno ste dostigli to ograničenje. Pokušajte ponovo poslije nekoliko minuta.',
@@ -689,9 +703,18 @@ 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' => 'Potvrdite šifru/lozinku',
+'createacct-yourpasswordagain-ph' => 'Unesite šifru/lozinku opet',
 'remembermypassword' => 'Zapamti moju šifru na ovom računaru (najviše $1 {{PLURAL:$1|dan|dana|dana}})',
+'userlogin-remembermypassword' => 'Ostavi me prijavljen',
+'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.',
@@ -704,14 +727,33 @@ Ne zaboravite da prilagodite sebi svoja [[Special:Preferences|{{SITENAME}} pode
 'logout' => 'Odjavi me',
 'userlogout' => 'Odjavi me',
 'notloggedin' => 'Niste prijavljeni',
-'nologin' => "Nemate korisničko ime? '''$1'''.",
+'userlogin-noaccount' => 'Nemate korisnički račun?',
+'userlogin-joinproject' => 'Pridružite se {{SITENAME}}',
+'nologin' => 'Nemate korisničko ime? $1.',
 'nologinlink' => 'Napravite nalog',
-'createaccount' => 'Napravi nalog',
+'createaccount' => 'Napravi korisnički račun',
 'gotaccount' => "Imate nalog? '''$1'''.",
 'gotaccountlink' => 'Prijavi se',
 'userlogin-resetlink' => 'Zaboravili ste detalje vaše prijave?',
-'createaccountmail' => 'e-poštom',
+'userlogin-resetpassword-link' => 'Resetirajte svoju šifru/lozinku',
+'helplogin-url' => 'Help:Prijavljivanje',
+'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)',
+'createacct-email-ph' => 'Unesite Vašu adresu e-pоšte',
+'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-reason-ph' => 'Zašto pravite još jedan korisnički račun?',
+'createacct-captcha' => 'Sigurnosna provjera',
+'createacct-imgcaptcha-ph' => 'Unesite tekst koji vidite iznad',
+'createacct-submit' => 'Napravite svoj korisnički račun',
+'createacct-benefit-heading' => '{{SITENAME}} je napravljen od strane ljudi kao što ste Vi.',
+'createacct-benefit-body1' => '{{PLURAL:$1|izmjena|izmjene}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|stranica|stranice|stranica}}',
+'createacct-benefit-body3' => 'nedavni {{PLURAL:$1|doprinosa}}',
 '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.',
@@ -766,7 +808,7 @@ Molimo vas da unesete ispravnu adresu ili ostavite prazno polje.',
 'cannotchangeemail' => 'Na ovom wikiju ne možete promijeniti e-mail adresu računa.',
 'emaildisabled' => 'Ova web-stranica ne može da šalje e-poruke.',
 'accountcreated' => 'Korisnički račun je napravljen',
-'accountcreatedtext' => 'Korisnički račun za $1 je napravljen.',
+'accountcreatedtext' => 'Korisnički račun za [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|razgovor]]) je napravljen.',
 'createaccount-title' => 'Pravljenje korisničkog računa za {{SITENAME}}',
 'createaccount-text' => 'Neko je napravio korisnički račun za vašu e-mail adresu na {{SITENAME}} ($4) sa imenom "$2", i sa šifrom "$3".
 Trebali biste se prijaviti i promjeniti šifru.
@@ -791,7 +833,7 @@ Da biste završili prijavu, morate unijeti novu šifru ovdje:',
 'resetpass_header' => 'Obnovi šifru za račun',
 'oldpassword' => 'Stara šifra:',
 'newpassword' => 'Nova šifra:',
-'retypenew' => 'Ukucajte ponovo novu šifru:',
+'retypenew' => 'Unesite ponovo novu šifru:',
 'resetpass_submit' => 'Odredi šifru i prijavi se',
 'resetpass_success' => 'Vaša šifra je uspiješno promjenjena! Prijava u toku...',
 'resetpass_forbidden' => 'Šifre ne mogu biti promjenjene',
@@ -804,35 +846,27 @@ 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-text-one' => 'Ispunite ovaj obrazac da biste resetovali Vašu šifru/lozinku.',
 '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-email' => 'Adresa e-pošte:',
 '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.',
-'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:
+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:
 
 $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 originalne šifre, a ne želite je više 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 originalne šifre, a ne želite je više promijeniti, možete zanemariti ovu poruku i nastaviti koristiti staru šifru.',
 'passwordreset-emailelement' => 'Korisničko ime: $1
 Privremena šifra: $2',
 'passwordreset-emailsent' => 'E-mail podsjetnik je poslan.',
@@ -1058,14 +1092,17 @@ Nije ponuđeno nikakvo objašnjenje.',
 Izgleda da je obrisana.',
 'edit-conflict' => 'Sukob izmjena.',
 'edit-no-change' => 'Vaša izmjena je ignorirana, jer nije bilo promjena teksta stranice.',
+'postedit-confirmation' => 'Vaša izmjena je sačuvana.',
 'edit-already-exists' => 'Stranica nije mogla biti kreirana.
 Izgleda da već postoji.',
 'defaultmessagetext' => 'Uobičajeni tekst poruke',
+'content-not-allowed-here' => 'Sadržaj napisan u obliku "$1" nije dozvoljen na stranici [[$2]]',
 'editwarning-warning' => 'Napuštanje ove stranice može dovesti do gubitka svih promjena koje ste načinili.
 Ako ste prijavljeni, možete isključiti ovo upozorenje u "{{int:prefs-editing}}" dijelu vaših opcija.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
+'content-model-text' => 'obični tekst',
 'content-model-javascript' => 'JavaScript',
 'content-model-css' => 'CSS',
 
@@ -1279,6 +1316,10 @@ Korištenje navigacionih linkova će resetovati ovaj stupac.',
 'editundo' => 'ukloni ovu izmjenu',
 'diff-multi' => '({{plural:$1|Nije prikazana jedna međurevizija|Nisu prikazane $1 međurevizije|Nije prikazano $1 međurevizija}} od {{PLURAL:$2|jednog korisnika|$2 korisnika}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Jedna međurevizija|$1 međurevizije|$1 međurevizija}} od više od $2 {{PLURAL:$2|korisnika|korisnika}} {{PLURAL:$1|nije prikazana|nisu prikazane}})',
+'difference-missing-revision' => '{{PLURAL:$2|Jedna izmjena|$2 izmjene}} od ove razlike ($1) ne {{PLURAL:$2|postoji|postoje}}.
+
+Ovo se obično dešava kada pratite zastarjelu vezu na stranice koja je obrisana.
+Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokol brisanja].',
 
 # Search results
 'searchresults' => 'Rezultati pretrage',
@@ -1300,7 +1341,6 @@ Korištenje navigacionih linkova će resetovati ovaj stupac.',
 'searchmenu-legend' => 'Opcije pretrage',
 'searchmenu-exists' => "'''Postoji stranica pod nazivom \"[[:\$1]]\" na ovoj wiki'''",
 'searchmenu-new' => "'''Napravi stranicu \"[[:\$1|\$1]]\" na ovoj wiki!'''",
-'searchhelp-url' => 'Help:Sadržaj',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Pregledaj stranice sa ovim prefiksom]]',
 'searchprofile-articles' => 'Stranice sadržaja',
 'searchprofile-project' => 'Stranice pomoći i projekta',
@@ -1344,11 +1384,11 @@ Pokušajte u Vaš upit uključiti prefiks ''all:'' da bi ste pretražili sav sad
 '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.',
 
 # Preferences page
-'preferences' => 'Podešavanja',
+'preferences' => 'Postavke',
 'mypreferences' => 'Postavke',
 'prefs-edits' => 'Broj izmjena:',
 'prefsnologin' => 'Niste prijavljeni',
-'prefsnologintext' => 'Da biste mogli podešavati korisnička podešavanja, morate <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} biti prijavljeni]</span>.',
+'prefsnologintext' => 'Da biste mogli podešavati korisničke postavke, morate <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} biti prijavljeni]</span>.',
 'changepassword' => 'Promijeni šifru',
 'prefs-skin' => 'Koža',
 'skin-preview' => 'Pregled',
@@ -1371,7 +1411,7 @@ Pokušajte u Vaš upit uključiti prefiks ''all:'' da bi ste pretražili sav sad
 'prefs-setemail' => 'Postavite e-mail adresu',
 'prefs-email' => 'E-mail opcije',
 'prefs-rendering' => 'Izgled',
-'saveprefs' => 'Sačuvajte podešavanja',
+'saveprefs' => 'Sačuvaj',
 'resetprefs' => 'Vrati podešavanja',
 'restoreprefs' => 'Vrati sve pretpostavljene postavke',
 'prefs-editing' => 'Veličine tekstualnog polja',
@@ -1389,7 +1429,7 @@ Pokušajte u Vaš upit uključiti prefiks ''all:'' da bi ste pretražili sav sad
 'prefs-help-watchlist-token' => 'Popunjavanjem ovog polja tajnim ključem će generisati RSS fid za Vaš spisak praćenja.
 Svako ko zna ključ u ovom polju će biti u mogućnosti da pročita Vaš spisak praćenja, tako da trebate izabrati sigurnu vrijednost.
 Ovdje su navedene neke nasumično odabrane vrijednosti koje možete koristiti: $1',
-'savedprefs' => 'Vaša podešavanja su sačuvana.',
+'savedprefs' => 'Vaše postavke su sačuvane.',
 'timezonelegend' => 'Vremenska zona:',
 'localtime' => 'Lokalno vrijeme:',
 'timezoneuseserverdefault' => 'Koristi postavke wikija ($1)',
@@ -1486,6 +1526,7 @@ Ako izaberete da date ime, biće korišteno za pripisivanje za vaš rad.',
 'userrights-notallowed' => 'Vaš račun nema privilegije da dodaje ili oduzima prava korisnika.',
 'userrights-changeable-col' => 'Grupe koje možete mijenjati',
 'userrights-unchangeable-col' => 'Grupe koje ne možete mijenjati',
+'userrights-conflict' => 'Sukob u korisničkim pravima! Molimo pošaljite Vaše promjene ponovno.',
 
 # Groups
 'group' => 'Grupa:',
@@ -1830,6 +1871,9 @@ Ako se problem ne riješi, kontaktirajte [[Special:ListUsers/sysop|administrator
 'backend-fail-closetemp' => 'Ne mogu zatvoriti privremenu datoteku.',
 'backend-fail-read' => 'Ne mogu čitati datoteku $1.',
 'backend-fail-create' => 'Ne mogu napraviti datoteku $1.',
+'backend-fail-readonly' => 'Skladišna osnova "$1" je trenutno samo za čitanje. Navedeni razlog je: "$2"',
+'backend-fail-synced' => 'Datoteka "$1" je u nekonzistentnom stanju u internom skladištu',
+'backend-fail-internal' => 'Došlo je do nepoznate greške u skladišnoj osnovi "$1".',
 'backend-fail-contenttype' => 'Ne mogu da utvrdim kakav sadržaj ima datoteka koju treba da smjestim u "$1".',
 
 # Lock manager
@@ -2209,6 +2253,15 @@ Podržani protokoli: <code>$1</code> (ne dodavajte bilo koji od ovih u vašu pre
 'listusers-noresult' => 'Nije pronađen korisnik.',
 'listusers-blocked' => '(blokiran)',
 
+# Special:ActiveUsers
+'activeusers' => 'Spisak aktivnih korisnika',
+'activeusers-intro' => 'Ovo je spisak korisnika koji su napravili neku aktivnost u {{PLURAL:$1|zadnji $1 dan|zadnja $1 dana|zadnjih $1 dana}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|izmjena|izmjene|izmjena}} u {{PLURAL:$3|posljednji $3 dan|posljednja $3 dana|posljednjih $3 dana}}',
+'activeusers-from' => 'Prikaži korisnike koji počinju sa:',
+'activeusers-hidebots' => 'Sakrij botove',
+'activeusers-hidesysops' => 'Sakrij administratore',
+'activeusers-noresult' => 'Nije pronađen korisnik.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Prava korisničkih grupa',
 'listgrouprights-summary' => 'Slijedi spisak korisničkih grupa na ovoj wiki, s njihovim pravima pristupa.
@@ -2288,8 +2341,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}}.',
@@ -2432,8 +2485,8 @@ Slijede trenutne postavke stranice '''$1''':",
 'protect-cascadeon' => 'Ova stranica je tenutno zaštićena jer je uključena u {{PLURAL:$1|stranicu, koja ima|stranice, koje imaju|stranice, koje imaju}} uključenu prenosnu zaštitu.
 Možete promijeniti stepen zaštite ove stranice, ali to neće uticati na prenosnu zaštitu.',
 'protect-default' => 'Dopusti svim korisnicima',
-'protect-fallback' => 'Potrebno je imati "$1" ovlasti',
-'protect-level-autoconfirmed' => 'Blokiraj nove i neregistrovane korisnike',
+'protect-fallback' => 'Dozvolite samo korisnicima sa "$1" ovlastima/privilegijama',
+'protect-level-autoconfirmed' => 'Dopustite samo automatski potvrđenim korisnicima',
 'protect-level-sysop' => 'Dozvoli samo administratorima',
 'protect-summary-cascade' => 'prenosna zaštita',
 'protect-expiring' => 'ističe $1 (UTC)',
@@ -2950,7 +3003,7 @@ Nedostaje privremeni folder.',
 'tooltip-pt-anonuserpage' => 'Korisnička stranica za ip koju Vi uređujete kao',
 'tooltip-pt-mytalk' => 'Vaša stranica za razgovor',
 'tooltip-pt-anontalk' => 'Razgovor o doprinosu sa ove IP adrese',
-'tooltip-pt-preferences' => 'Moja podešavanja',
+'tooltip-pt-preferences' => 'Vaše postavke',
 'tooltip-pt-watchlist' => 'Spisak članaka koje pratite.',
 'tooltip-pt-mycontris' => 'Spisak vašeg doprinosa',
 'tooltip-pt-login' => 'Predlažemo da se prijavite, ali nije obvezno.',
@@ -3021,7 +3074,6 @@ Dopušta unos razloga u sažetak.',
 'monobook.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste Monobook 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. */',
@@ -3068,6 +3120,7 @@ Ovo je vjerovatno izazvao vezom ka vanjskoj nepoželjnoj stranici.',
 'pageinfo-language' => 'Jezik sadržaja stranice',
 'pageinfo-views' => 'Broj pogleda',
 'pageinfo-watchers' => 'Broj pratitelja stranice',
+'pageinfo-few-watchers' => 'Manje od $1 {{PLURAL:$1|pratioca|pratilaca}}',
 'pageinfo-redirects-name' => 'Preusmjeravanja na ovu stranicu',
 'pageinfo-subpages-name' => 'Podstranice ove stranice',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|preusmjerenje|preusmjerenja}}; $3 {{PLURAL:$3|nepreusmjerenje|nepreusmjerenja}})',
@@ -3087,7 +3140,10 @@ Ovo je vjerovatno izazvao vezom ka vanjskoj nepoželjnoj stranici.',
 'pageinfo-contentpage' => 'Broji se kao stranica sa sadržajem',
 'pageinfo-contentpage-yes' => 'Da',
 'pageinfo-protect-cascading-yes' => 'Da',
+'pageinfo-category-info' => 'Informacije o kategoriji',
 'pageinfo-category-pages' => 'Broj stranica',
+'pageinfo-category-subcats' => 'Broj podkategorija',
+'pageinfo-category-files' => 'Broj datoteka',
 
 # Skin names
 'skinname-cologneblue' => 'Kelnsko plavo',
@@ -3138,6 +3194,7 @@ $1',
 'file-nohires' => 'Veća rezolucija nije dostupna.',
 'svg-long-desc' => 'SVG fajl, dozvoljeno $1 × $2 piksela, veličina fajla: $3',
 'svg-long-desc-animated' => 'Animirana SVG datoteka, nominalno: $1 × $2 piksela, veličina datoteke: $3',
+'svg-long-error' => 'Nevaljana SVG datoteka: $1',
 'show-big-image' => 'Vidi sliku u punoj veličini (rezoluciji)',
 'show-big-image-preview' => 'Veličina ovog prikaza: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Druga rezolucija|Ostale rezolucije}}: $1.',
@@ -3167,9 +3224,24 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 minuta|$1 minute|$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 sad',
+
+# Human-readable timestamps
+'hours-ago' => 'prije $1 {{PLURAL:$1|sat|sata|sati}}',
+'minutes-ago' => 'prije $1 {{PLURAL:$1|minute|minute|minuta}}',
+'seconds-ago' => 'prije $1 {{PLURAL:$1|sekunde|sekunde|sekundi}}',
+'monday-at' => 'Ponedeljak 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:
@@ -3199,7 +3271,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',
@@ -3377,7 +3449,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',
@@ -3661,6 +3733,7 @@ Ovaj kod za potvrdu će isteći u $4.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Međuwiki umetanje je isključeno]',
 'scarytranscludefailed' => '[Neuspješno preusmjerenje šablona na $1]',
+'scarytranscludefailed-httpstatus' => '[Preuzimanje šablona nije uspjelo za $1: HTTP $2]',
 'scarytranscludetoolong' => '[URL je predugačak]',
 
 # Delete conflict
@@ -3838,6 +3911,7 @@ Također možete [[Special:EditWatchlist|koristiti standardni uređivač]].',
 'version-license' => 'Licenca',
 'version-poweredby-credits' => "Ova wiki je zasnovana na '''[//www.mediawiki.org/ MediaWiki]''', autorska prava zadržana © 2001-$1 $2.",
 'version-poweredby-others' => 'ostali',
+'version-credits-summary' => 'Željeli bismo se zahvaliti sljedećim ljudima na njihovom doprinosu [[Special:Version|MediaWikiju]].',
 'version-license-info' => 'Mediawiki je slobodni softver, možete ga redistribuirati i/ili mijenjati pod uslovima GNU opće javne licence kao što je objavljeno od strane Fondacije Slobodnog Softvera, bilo u verziji 2 licence, ili (po vašoj volji) nekoj od kasniji verzija.
 
 Mediawiki se distriburia u nadi da će biti korisna, ali BEZ IKAKVIH GARANCIJA, čak i bez ikakvih posrednih garancija o KOMERCIJALNOSTI ili DOSTUPNOSTI ZA ODREĐENU SVRHU. Pogledajte GNU opću javnu licencu za više detalja.
@@ -3849,12 +3923,13 @@ 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-submit' => 'Idi',
+'redirect-value' => 'Vrijednost:',
+'redirect-user' => 'Korisnički ID',
+'redirect-revision' => 'Verzija stranice',
+'redirect-file' => 'Naziv datoteke',
+'redirect-not-exists' => 'Vrijednost nije pronađena',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Pretraga za duplim datotekama',
@@ -3944,6 +4019,9 @@ Slike su prikazane u punoj veličini, ostale vrste datoteka su prikazane direktn
 'htmlform-submit' => 'Pošalji',
 'htmlform-reset' => 'Vrati izmjene',
 'htmlform-selectorother-other' => 'Ostalo',
+'htmlform-no' => 'Ne',
+'htmlform-yes' => 'Da',
+'htmlform-chosen-placeholder' => 'Izaberite opciju',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 sa podrškom pretrage cijelog teksta',
@@ -3952,15 +4030,15 @@ Slike su prikazane u punoj veličini, ostale vrste datoteka su prikazane direktn
 # New logging system
 '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:|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-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',
@@ -3969,20 +4047,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-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-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' => '$1 je {{GENDER:$2|napravio|napravila}} korisnički račun $3',
+'logentry-newusers-byemail' => 'Korisnički račun $3 je {{GENDER:$2|napravio|napravila}} $1 i lozinka/šifra je poslana putem e-maila',
+'logentry-newusers-autocreate' => 'Korisnički račun $1 je automatski {{GENDER:$2|napravljen}}',
+'logentry-rights-rights' => '$1 je {{GENDER:$2|promijenio|promijenila|promijenio}} članstvo grupe za $3 iz $4 u $5',
 'logentry-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
@@ -4058,4 +4136,7 @@ Inače, možete ispuniti jednostavan obrazac ispod. Vaš komentar biti će dodan
 'duration-centuries' => '$1 {{PLURAL:$1|vijek|vijeka|vijekova}}',
 'duration-millennia' => '$1 {{PLURAL:$1|milenij|milenija}}',
 
+# Image rotation
+'rotate-comment' => 'Slika rotirana za $1 {{PLURAL:$1|stepen|stepeni}} u smjeru kazaljke na satu',
+
 );
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..fa32955
--- /dev/null
@@ -0,0 +1,50 @@
+<?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';
+
+$namespaceNames = array(
+       NS_MEDIA            => 'Меди',
+       NS_SPECIAL          => 'Тусхай',
+       NS_TALK             => 'Хэлэлсэхэ',
+       NS_USER             => 'Хэрэглэгшэ',
+       NS_USER_TALK        => 'Хэрэглэгшые_хэлэлсэхэ',
+       NS_PROJECT_TALK     => '$1_тухай_хэлэлсэхэ',
+       NS_FILE             => 'Файл',
+       NS_FILE_TALK        => 'Файл_хэлэлсэхэ',
+       NS_MEDIAWIKI_TALK   => 'MediaWiki_хэлэлсэхэ',
+       NS_TEMPLATE         => 'Загбар',
+       NS_TEMPLATE_TALK    => 'Загбар_хэлэлсэхэ',
+       NS_HELP             => 'Туһаламжа',
+       NS_HELP_TALK        => 'Туһаламжа_хэлэлсэл',
+       NS_CATEGORY         => 'Категори',
+       NS_CATEGORY_TALK    => 'Категори_хэлэлсэхэ',
+);
+
+$namespaceAliases = array(
+       # Russian namespaces
+       'Обсуждение'                         => NS_TALK,
+       'Участник'                           => NS_USER,
+       'Обсуждение_участника'               => NS_USER_TALK,
+       'Обсуждение_{{GRAMMAR:genitive|$1}}' => NS_PROJECT_TALK,
+       'Обсуждение_файла'                   => NS_FILE_TALK,
+       'Обсуждение_MediaWiki'               => NS_MEDIAWIKI_TALK,
+       'Обсуждение_шаблона'                 => NS_TEMPLATE_TALK,
+       'Справка'                            => NS_HELP,
+       'Обсуждение_справки'                 => NS_HELP_TALK,
+       'Категория'                          => NS_CATEGORY,
+       'Обсуждение_категории'               => NS_CATEGORY_TALK,
+);
+
+// Remove Russian gender aliases
+$namespaceGenderAliases = array();
+
index 6f4fda0..6cc809e 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
@@ -30,6 +32,7 @@
  * @author Pitort
  * @author Pérez
  * @author Qllach
+ * @author QuimGil
  * @author SMP
  * @author Smeira
  * @author Solde
@@ -329,7 +332,7 @@ $messages = array(
 'about' => 'Quant a',
 'article' => 'Pàgina de contingut',
 'newwindow' => '(obre en una nova finestra)',
-'cancel' => 'Cancel·lar',
+'cancel' => 'Cancel·la',
 'moredotdotdot' => 'Més...',
 'morenotlisted' => 'Més no en la llista...',
 'mypage' => 'Pàgina',
@@ -440,13 +443,12 @@ $1",
 'disclaimers' => 'Avís general',
 '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',
-'portal' => 'Portal comunitari',
-'portal-url' => 'Project:Portal',
+'portal' => 'Portal de la comunitat',
+'portal-url' => 'Project:Portal de la comunitat',
 'privacy' => 'Política de privadesa',
 'privacypage' => 'Project:Política de privadesa',
 
@@ -609,13 +611,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' => "Recorda'm",
-'userlogin-signwithsecure' => 'Inicia la sessió amb un servidor segur',
+'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.',
@@ -636,12 +643,30 @@ No oblideu de canviar les vostres [[Special:Preferences|preferències de {{SITEN
 'gotaccount' => 'Ja teniu un compte? $1.',
 'gotaccountlink' => 'Inicia una sessió',
 'userlogin-resetlink' => "Heu oblidat les vostres dades d'accés?",
-'createaccountmail' => "Utilitza una contrasenya aleatòria temporal i envia-la a l'adreça de correu electrònic especificat a continuació",
+'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.',
@@ -688,7 +713,7 @@ Introduïu una adreça amb un format adequat o bé buideu el camp.",
 'cannotchangeemail' => 'No podeu canviar adreces de correu electrònic en aquest wiki.',
 'emaildisabled' => 'El lloc no pot enviar correus electrònics.',
 'accountcreated' => "S'ha creat el compte",
-'accountcreatedtext' => "S'ha creat el compte d'usuari de $1.",
+'accountcreatedtext' => "S'ha creat el compte d'usuari de [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|discussió]]).",
 'createaccount-title' => "Creació d'un compte a {{SITENAME}}",
 'createaccount-text' => "Algú ha creat un compte d'usuari anomenat $2 al projecte {{SITENAME}}
 ($4) amb la vostra adreça de correu electrònic. La contrasenya per a l'usuari «$2» és «$3». Hauríeu d'accedir al compte i canviar-vos aquesta contrasenya quan abans millor.
@@ -723,13 +748,13 @@ 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 reinicialitzar la vostra contrasenya',
 '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?',
@@ -752,7 +777,7 @@ Hauríeu d'entrar ara per fixar una nova contrasenya. Si algú que no sou vós 
 Contrasenya temporal: $2",
 '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 reinicialització de contrasenya, que es mostra a continuació, però ha fallat l'enviament a l'usuari: $1",
+'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',
@@ -840,7 +865,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]].
 
@@ -960,6 +985,7 @@ 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',
@@ -967,7 +993,7 @@ Ja existeix.",
 '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ó «{{int:prefs-editing}}» de les vostres preferències.",
+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',
@@ -1208,7 +1234,6 @@ Es pot trobar més informació en el [{{fullurl:{{#Special:Log}}/delete|page={{F
 'searchmenu-legend' => 'Opcions de cerca',
 'searchmenu-exists' => "'''Hi ha una pàgina anomenada «[[:$1]]» en aquest wiki'''",
 'searchmenu-new' => "'''Creeu la pàgina «[[:$1]]» en aquest wiki!'''",
-'searchhelp-url' => 'Help:Ajuda',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Mostra pàgines amb aquest prefix]]',
 'searchprofile-articles' => 'Pàgines de contingut',
 'searchprofile-project' => "Pàgines d'ajuda i de projecte",
@@ -1249,6 +1274,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.',
+'search-error' => "S'ha produït un error durant la recerca: $1",
 
 # Preferences page
 'preferences' => 'Preferències',
@@ -1521,7 +1547,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}}',
@@ -1576,8 +1602,7 @@ Les pàgines de la vostra [[Special:Watchlist|llista de seguiment]] apareixen en
 'reuploaddesc' => 'Torna al formulari per apujar.',
 'upload-tryagain' => 'Envia la descripció del fitxer modificat',
 'uploadnologin' => 'No heu iniciat una sessió',
-'uploadnologintext' => "Heu d'[[Special:UserLogin|iniciar una sessió]]
-per a penjar-hi fitxers.",
+'uploadnologintext' => 'Heu de $1 per a penjar-hi fitxers.',
 'upload_directory_missing' => "No s'ha trobat el directori de càrrega ($1) i tampoc no ha pogut ser creat pel servidor web.",
 'upload_directory_read_only' => 'El servidor web no pot escriure al directori de càrrega ($1)',
 'uploaderror' => "S'ha produït un error en l'intent de carregar",
@@ -1794,7 +1819,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)',
 
@@ -2104,6 +2129,15 @@ Es necessita com a mínim un domini de primer nivell, per exemple "*.org".<br />
 'listusers-noresult' => "No s'han trobat coincidències de noms d'usuaris. Si us plau, busqueu també amb variacions per majúscules i minúscules.",
 'listusers-blocked' => '({{GENDER:$1|blocat|blocada}})',
 
+# 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|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',
+'activeusers-noresult' => "No s'han trobat usuaris.",
+
 # Special:ListGroupRights
 'listgrouprights' => "Drets dels grups d'usuaris",
 'listgrouprights-summary' => "A continuació hi ha una llista dels grups d'usuaris definits en aquest wiki, així com dels seus drets d'accés associats.
@@ -2124,10 +2158,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',
@@ -2184,8 +2216,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}}.',
@@ -2290,7 +2322,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.",
 
@@ -2457,7 +2489,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]]'''.",
@@ -2598,6 +2630,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}}.',
@@ -2627,7 +2660,7 @@ 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 pàgina de redirecció al nou títol.
@@ -2847,10 +2880,10 @@ Deseu-lo al vostre ordinador i carregueu-ne una còpia ací.",
 'tooltip-pt-preferences' => 'Les vostres preferències.',
 'tooltip-pt-watchlist' => 'La llista de pàgines de les que estau vigilant els canvis.',
 'tooltip-pt-mycontris' => 'Llista de les vostres contribucions.',
-'tooltip-pt-login' => 'Us animem a registrar-vos, però no és obligatori.',
+'tooltip-pt-login' => 'Us animem a registrar-vos, però no és obligatori',
 'tooltip-pt-anonlogin' => 'Us animem a registrar-vos, però no és obligatori.',
 'tooltip-pt-logout' => "Finalitza la sessió d'usuari",
-'tooltip-ca-talk' => "Discussió sobre el contingut d'aquesta pàgina.",
+'tooltip-ca-talk' => "Discussió sobre el contingut d'aquesta pàgina",
 'tooltip-ca-edit' => 'Podeu modificar aquesta pàgina. Si us plau, previsualitzeu-la abans de desar.',
 'tooltip-ca-addsection' => 'Comença una nova secció',
 'tooltip-ca-viewsource' => 'Aquesta pàgina està protegida. Podeu veure el seu codi font.',
@@ -2864,16 +2897,16 @@ Deseu-lo al vostre ordinador i carregueu-ne una còpia ací.",
 'tooltip-ca-unwatch' => 'Suprimiu aquesta pàgina de la vostra llista de seguiment',
 'tooltip-search' => 'Cerca a {{SITENAME}}',
 'tooltip-search-go' => 'Vés a una pàgina amb aquest nom exacte si existeix',
-'tooltip-search-fulltext' => 'Cerca a les pàgines aquest text',
-'tooltip-p-logo' => 'Pàgina principal',
+'tooltip-search-fulltext' => 'Cerca aquest text a les pàgines',
+'tooltip-p-logo' => 'Visiteu la pàgina principal',
 'tooltip-n-mainpage' => 'Visiteu la pàgina principal.',
 'tooltip-n-mainpage-description' => 'Vegeu la pàgina principal',
-'tooltip-n-portal' => 'Sobre el projecte, què podeu fer, on podeu trobar coses.',
+'tooltip-n-portal' => 'Sobre el projecte, què podeu fer, on podeu trobar coses',
 'tooltip-n-currentevents' => "Per trobar informació general sobre l'actualitat.",
-'tooltip-n-recentchanges' => 'La llista de canvis recents a la wiki.',
-'tooltip-n-randompage' => 'Vés a una pàgina aleatòria.',
-'tooltip-n-help' => 'El lloc per esbrinar.',
-'tooltip-t-whatlinkshere' => 'Llista de totes les pàgines viqui que enllacen ací.',
+'tooltip-n-recentchanges' => 'Llista de canvis recents al wiki',
+'tooltip-n-randompage' => "Pàgina a l'atzar",
+'tooltip-n-help' => 'El lloc per saber més coses',
+'tooltip-t-whatlinkshere' => 'Llista de totes les pàgines wiki que enllacen aquí',
 'tooltip-t-recentchangeslinked' => 'Canvis recents a pàgines que enllacen amb aquesta pàgina.',
 'tooltip-feed-rss' => "Canal RSS d'aquesta pàgina",
 'tooltip-feed-atom' => "Canal Atom d'aquesta pàgina",
@@ -3066,11 +3099,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:
 
@@ -3097,7 +3137,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',
@@ -3275,7 +3315,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',
@@ -3695,13 +3735,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.",
@@ -3801,15 +3834,15 @@ Les imatges es mostren en plena resolució; altres tipus de fitxer s'inicien dir
 # New logging system
 'logentry-delete-delete' => '$1 ha esborrat $3',
 'logentry-delete-restore' => '$1 ha restaurat $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 $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-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",
@@ -3821,9 +3854,9 @@ Les imatges es mostren en plena resolució; altres tipus de fitxer s'inicien dir
 '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 ha desplaçat la pàgina $3 a $4 on hi havia una redirecció i sense crear una nova redirecció',
-'logentry-patrol-patrol' => '1 $ va marcar la revisió $ 4 de "$ 3" com a supervisada',
-'logentry-patrol-patrol-auto' => '$1 ha marcat automàticament la versió $4 de la pàgina $3 com a patrullada',
+'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",
@@ -3907,4 +3940,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..d9b8610 100644 (file)
@@ -156,7 +156,6 @@ $messages = array(
 'disclaimers' => 'Mò̤ hô-cáik sĭng-mìng',
 'disclaimerpage' => 'Project:Mò̤ hô-cáik sĭng-mìng',
 'edithelp' => 'Siŭ-gāi bŏng-cô',
-'edithelppage' => 'Help:Siŭ-gāi',
 'helppage' => 'Help:Mŭk-liŏh',
 'mainpage' => 'Tàu Hiĕk',
 'mainpage-description' => 'Tàu Hiĕk',
@@ -359,7 +358,6 @@ Siók-mìng: (dāng) = gâe̤ng dék sĭng bēng-buōng bī-piâng, (sèng) = g
 'prevn' => 'sèng {{PLURAL:$1|$1}} hâung',
 'nextn' => 'â {{PLURAL:$1|$1}} hâung',
 'viewprevnext' => 'Káng ($1 {{int:pipe-separator}} $2) ($3).',
-'searchhelp-url' => 'Help:Mŭk-liŏh',
 'showingresults' => "Hiēng-sê téng #<b>$2</b> kăi-sṳ̄ gì {{PLURAL:$1|'''1'''|'''$1'''}} bĭk giék-guō.",
 'showingresultsnum' => "Hiēng-sê téng #<b>$2</b> kăi-sṳ̄ gì {{PLURAL:$3|'''1'''|'''$3'''}} bĭk giék-guō.",
 
@@ -570,7 +568,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 +828,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 +886,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..a8086a8 100644 (file)
@@ -12,6 +12,7 @@
  * @author Girdi
  * @author Mega programmer
  * @author Sasan700
+ * @author Умар
  */
 
 $fallback = 'ru';
@@ -23,16 +24,16 @@ $namespaceNames = array(
        NS_USER             => 'Декъашхо',
        NS_USER_TALK        => 'Декъашхон_дийцаре',
        NS_PROJECT_TALK     => '{{GRAMMAR:genitive|$1}}_дийцаре',
-       NS_FILE             => 'Ð¥lÑ\83м',
-       NS_FILE_TALK        => 'Ð¥lÑ\83ман_дийцаре',
+       NS_FILE             => 'Файл',
+       NS_FILE_TALK        => 'Файлан_дийцаре',
        NS_MEDIAWIKI        => 'MediaWiki',
        NS_MEDIAWIKI_TALK   => 'MediaWiki_дийцаре',
-       NS_TEMPLATE         => 'Куцкеп',
-       NS_TEMPLATE_TALK    => 'Куцкеп_дийцаре',
-       NS_HELP             => 'Гlо',
-       NS_HELP_TALK        => 'Гlон_дийцаре',
-       NS_CATEGORY         => 'Кадегар',
-       NS_CATEGORY_TALK    => 'Кадегар_дийцаре',
+       NS_TEMPLATE         => 'Кеп',
+       NS_TEMPLATE_TALK    => 'Кепан_дийцаре',
+       NS_HELP             => 'ГӀо',
+       NS_HELP_TALK        => 'ГӀо_дийцаре',
+       NS_CATEGORY         => 'Категори',
+       NS_CATEGORY_TALK    => 'Категорин_дийцаре',
 );
 
 $namespaceAliases = array(
@@ -46,16 +47,24 @@ $namespaceAliases = array(
        'Дийцаре_{{GRAMMAR:genitive|$1}}' => NS_PROJECT_TALK,
        'Сурт'             => NS_FILE,
        'Сурти_дийца'      => NS_FILE_TALK,
+       'Хlум'             => NS_FILE,
+       'Хlуман_дийцаре'   => NS_FILE_TALK,
        'Дийцаре_хlуман'   => NS_FILE_TALK,
        'МедйаВики'        => NS_MEDIAWIKI,
        'МедйаВики_дийца'  => NS_MEDIAWIKI_TALK,
        'MediaWiki_Дийцаре' => NS_MEDIAWIKI_TALK,
        'Дакъан'           => NS_TEMPLATE,
        'Дакъан_дийца'     => NS_TEMPLATE_TALK,
+       'Куцкеп'           => NS_TEMPLATE,
+       'Куцкеп_дийцаре'   => NS_TEMPLATE_TALK,
        'ГІо'              => NS_HELP,
        'ГІодан_дийца'     => NS_HELP_TALK,
+       'Гlо'              => NS_HELP,
+       'Гlон_дийцаре'     => NS_HELP_TALK,
        'Тоба'             => NS_CATEGORY,
-       'Тобан_дийца'      => NS_CATEGORY_TALK
+       'Тобан_дийца'      => NS_CATEGORY_TALK,
+       'Кадегар'          => NS_CATEGORY,
+       'Кадегар_дийцаре'  => NS_CATEGORY_TALK,
 );
 
 // Remove Russian aliases
@@ -217,16 +226,16 @@ $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ам чу',
-'tog-watchdeletion' => 'Тlетоха ас дlайайина агlонаш тергаме могlам чу',
+'tog-watchdeletion' => 'Тlетоха ас дӀаяхина агlонаш тергаме могlам чу',
 'tog-minordefault' => 'Къастам бе нисйиначарн хlумцадеш кегийра долушсанна',
 'tog-previewontop' => 'Чуяккха хьалххьажар рéдоккхучу кора хьалха',
 'tog-previewonfirst' => 'Гайта хьалххьажар рéдоккхуче дехьа волуш',
@@ -238,8 +247,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 +258,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одириг нисйарца',
+'underline-default' => 'Лелайа браузеран нисйарца',
 
 # Font style option in Special:Preferences
-'editfont-style' => 'РéдоккÑ\85Ñ\83чохь долу йозан тайп:',
+'editfont-style' => 'ТадаÑ\80 чохь долу йозан тайп:',
 'editfont-default' => 'Йоза оцу хьажгlодириг нисйинчура',
 'editfont-monospace' => 'Цхьатерра доцу йоза',
 'editfont-sansserif' => 'Аьтта доцу йоза',
@@ -281,60 +289,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Ñ\83мнаÑ\88 Ð¾Ñ\86Ñ\83 ÐºÐ°Ð´ÐµÐ³Ð°Ñ\80 чохь «$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' => 'ФайлаÑ\88 Ð¾Ñ\86Ñ\83 ÐºÐ°Ñ\82егоÑ\80и чохь «$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 +364,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 +383,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 +391,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 +418,16 @@ $messages = array(
 'create' => 'Кхолла',
 'editthispage' => 'Нисйé хlара агlо',
 'create-this-page' => 'Кхолла хlара агlо',
-'delete' => 'Дlадайá',
-'deletethispage' => 'Дlайайá хlара агlо',
+'delete' => 'ДӀаяккха',
+'deletethispage' => 'ДӀаяккха хӀара агӀо',
+'undeletethispage' => 'ХӀара агӀо меттахӀоттор',
 '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' => 'Дийцаре',
@@ -416,11 +440,11 @@ $messages = array(
 'toolbox' => 'Гlирсаш',
 'userpage' => 'Хьажа декъашхочуьна агlоне',
 'projectpage' => 'Хьажа кхолламан агlоне',
-'imagepage' => 'Ð¥Ñ\8cажа Ñ\85\83ман агlоне',
+'imagepage' => 'Ð¥Ñ\8cажа Ñ\84айлан агlоне',
 'mediawikipage' => 'Хьагайта хааман агlо',
 'templatepage' => 'Хьажа куцкепа агlоне',
-'viewhelppage' => 'Схьаэца нисвохаам',
-'categorypage' => 'Хьажа кадегарши агlоне',
+'viewhelppage' => 'Схьаэца нийсвохаам',
+'categorypage' => 'Хьажа категореши агӀоне',
 'viewtalkpage' => 'Хьажа дийцаре',
 'otherlanguages' => 'Кхечу маттахь дерш',
 'redirectedfrom' => '(Дlасахьажийна кху $1)',
@@ -428,15 +452,15 @@ $messages = array(
 'lastmodifiedat' => 'Хlокху агlон тlаьххьаралера хийцам: $2, $1.',
 'viewcount' => 'Хlокху агlонга хьойсина $1 {{PLURAL:$1|за|за|за}}.',
 'protectedpage' => 'Гlароллийца йолу агlо',
-'jumpto' => 'Дехьавала оцу:',
-'jumptonavigation' => 'шавигар',
+'jumpto' => 'Дехьавала/яла оцу:',
+'jumptonavigation' => 'навигаци',
 'jumptosearch' => 'лаха',
 'view-pool-error' => 'Бехк цабиллар доьха, хlинц гlулкхдириг йоьттина йу.
 Каьчна дуккха дехарш хlокху агlонтlе хьажарца.
 Дехар до, собардеш а йуха хьажа хlокху агlонтlе жим тlаьхьо.
 
 $1',
-'pool-timeout' => 'СаÑ\86о Ð²еза хан тlех йаьлла',
+'pool-timeout' => 'Ð\91локÑ\82оÑ\85а еза хан тlех йаьлла',
 'pool-queuefull' => 'Дехаршан чоь йуззина йу',
 'pool-errorunknown' => 'Дойзаш доцу гlалат',
 
@@ -449,16 +473,15 @@ $1',
 'currentevents-url' => 'Project:Хlинцлера хилларш',
 'disclaimers' => 'Бехк тlе ца эцар',
 'disclaimerpage' => 'Project:Бяхк тlецалацар',
-'edithelp' => 'Нисвохаам оцу редаккхарна',
-'edithelppage' => 'Help:Нисвохаам оцу редаккхарна',
+'edithelp' => 'Нийсвохаам оцу тадарна',
 'helppage' => 'Help:Чулацам',
-'mainpage' => 'Коьрта агlо',
+'mainpage' => 'Коьрта агӀо',
 'mainpage-description' => 'Коьрта агlо',
 'policy-url' => 'Project:Бакъо',
-'portal' => 'ЮкÑ\8aаÑ\80алла',
+'portal' => 'ЮкÑ\8aаÑ\80аллин ÐºÐ¾Ð²',
 'portal-url' => 'Project:Юкъараллин ков',
-'privacy' => 'Ð\91алалÑ\8eÑ\82Ñ\82а къайлаха',
-'privacypage' => 'Project:Ð\91алалÑ\8eÑ\82Ñ\82а къайлаха',
+'privacy' => 'Ð\9fолиÑ\82ика къайлаха',
+'privacypage' => 'Project:Ð\9fолиÑ\82ика къайлаха',
 
 'badaccess' => 'Тlекхачарехь гlалат',
 'badaccess-group0' => 'Шуьга кхочуш далур дац дехарца деш дерг',
@@ -474,6 +497,9 @@ $1',
 'youhavenewmessages' => 'Хьуна кхечи $1 ($2).',
 'newmessageslink' => 'керла хаамаш',
 'newmessagesdifflink' => 'тlаьххьара хийцамаш',
+'youhavenewmessagesfromusers' => 'Хьуна кхачанна $1 {{PLURAL:$3|$3 декъашхочунгара|$3 декъашхошкара|$3 декъашхошкара}} ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|керла хаам}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|тӀаьхьара бина хийцамаш}}',
 'youhavenewmessagesmulti' => 'Хьуна кхаьчна керла хаам оцу $1',
 'editsection' => 'нисйé',
 'editsection-brackets' => '[$1]',
@@ -489,7 +515,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екхочучехь яц',
@@ -500,72 +526,129 @@ $1',
 'feed-atom' => 'Атом',
 'feed-rss' => 'RSS',
 'red-link-title' => '$1 (ишта агlо йоцуш йу)',
+'sort-descending' => 'Ма хийла нисяр',
+'sort-ascending' => 'Ма хила нисяр',
 
 # 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' => 'Ишта дийриг дац',
 'nosuchspecialpage' => 'Ишта белха агlо йац',
+'nospecialpagetext' => '<strong>Ишта белхан агӀо яц.</strong>
+
+Белхан агӀонашан могӀам: [[Special:SpecialPages|{{int:specialpages}}]].',
 
 # General errors
 'error' => 'Гlалат',
 'databaseerror' => 'Гlалат хаамийн бухера',
-'readonly' => 'Сацийна дlайаздар хаамийн бухе',
+'laggedslavemode' => 'Тергам бе: агӀона чохь керла йаьхинарш ца хила мега.',
+'readonly' => 'Блоктоьхна дӀайаздар хаамийн бухе',
+'enterlockreason' => 'Билгал де блоктохаран бахьна а и чекх йолу хан а.',
 'missing-article' => 'Хlокху чохь кароезаш йолу хьан дехарца йозан агlонаш цакарийна «$1» $2.
 
 Иштнарг наггахь хуьлу хьажориг дlайаьккхина йалхь йа хийцам бина тиша хьажоригца дехьа вала гlоьртича.
 
 Нагахьсан гlулкх цуьнах доьзна дацахь, хьуна карийна гlирс латточехь гlалат.
\94еÑ\85аÑ\80 Ð´Ð¾, Ñ\85аам Ð±Ðµ Ð¾Ñ\86Ñ\83Ñ\8cнаÑ\85 [[Special:ListUsers/sysop|адаманкÑ\83Ñ\8cйгалÑ\85ога]], Ð³Ð¾Ð¹Ñ\82Ñ\83Ñ\88 URL.',
-'missingarticle-rev' => '(варси № $1)',
+Дехар до, хаам бе оцуьнах [[Special:ListUsers/sysop|куьйгалхога]], гойтуш URL.',
+'missingarticle-rev' => '(верси № $1)',
 'missingarticle-diff' => '(тейп тайпнара: $1, $2)',
 'internalerror' => 'Чоьхьара гlалат',
 'internalerror_info' => 'Чоьхьара гlалат: $1',
+'fileappenderrorread' => 'Тар ца дели еша «$1» тӀетухучу хенахь.',
+'fileappenderror' => 'Тар ца дели тӀетоха «$1» оцунах «$2».',
+'filerenameerror' => 'Файлан «$1» цӀе хийца «$2» йиш яц.',
+'filedeleteerror' => 'ДӀаяккха цатарло файл «$1».',
+'filenotfound' => 'Файл «$1» каро йиш яц.',
+'fileexistserror' => 'Файл «$1» дӀаязяан йиш яц: файл йолуш ю.',
+'cannotdelete' => 'Цатарло дӀаяккха я цӀе хийца «$1».
+АгӀо хьалхо дӀаяккхина хила тарло',
+'cannotdelete-title' => 'Цатарло агӀо дӀаяккха «$1»',
 'badtitle' => 'Цамегаш йолу цlе',
 'badtitletext' => 'Дехарца йолу агlонан цlе нийса яц, йаьсса ю, хила мега нийса ца хlоттийна меттаюкъар йа юкъарвики цlе. Хила мега, цlарца цамагош йолу саберг.',
+'perfcachedts' => 'Лахара хаам схьаэца кэша чура иза тӀаьхьара цӀинялла $1. Кэша чохь латтаё оцул $4 кӀезиг {{PLURAL:$4|дӀаяздарш|дӀаяздарш|дӀаяздарш}}.',
 'viewsource' => 'Хьажар',
-'protectedpagetext' => 'Хlара агlо дlакъойлина йу рé цадаккхийта.',
+'viewsource-title' => 'Агӏона $1 дуьххьарлера йозане хьажар',
+'protectedpagetext' => 'ХӀара агӀо дӀакъойлина йу рé цадаккхийта.',
 'viewsourcetext' => 'Хьоьга далундерг хьажар а дезахь хlокху агlон чура йоза хьаэцар:',
-'protectedinterface' => 'Хlара схьгайтарна гlирса хаамаш латтош йолу агlо йу. Гlуо лелачаьрга гал ца яккхийта, оцун хийцам ба магийна дац.',
+'protectedinterface' => 'ХӀара схьгайтарна гӀирса хаамаш латтош йолу агӀо ю. Куьйгалхошна бен иза хийца цало.',
+'exception-nologin' => 'Ахьа хӀой вовзийтина/йовзийтина вац/яц',
+
+# Virus scanner
+'virus-unknownscanner' => 'йозуш йоцу антивирус:',
 
 # Login and logout pages
+'logouttext' => "'''Хьо аравела/ела.'''
+Хьан йиш ю {{grammar:genitive|{{SITENAME}}}} чохь хьой ца вовзийташ/йовзийташ болх бан я <span class='plainlinks'>[$1 кхин чувала/яла ]</span> хьой чохь хила цӀарца я кхин цӀарца.
+Цхьа йолу агӀонаш чохь хьо хьай цӀарца болх беш сана хила тарло ишта ца хилийта керлаякха браузеран кэш.",
+'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' => 'Дагахь латт ве/е со',
+'userlogin-signwithsecure' => 'Ларийна цхьаьнакхетар',
 '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' => 'Вовзийта хьой',
-'logout' => 'Ара валар',
-'userlogout' => 'Ара валар',
-'notloggedin' => 'Хьо вовзита веза гlирсан',
-'nologin' => "Хlинца дlа вазвин вац? '''$1'''.",
-'nologinlink' => 'Кхолла керла дlавазвалар',
-'createaccount' => 'Дlавазве керла декъашхо',
+'userlogin' => 'Чувалар/ялар я декъашхон дӀаяздар кхоллар',
+'userloginnocreate' => 'Чувалар/ялар',
+'logout' => 'Аравалар/ялар',
+'userlogout' => 'Аравалар/ялар',
+'notloggedin' => 'Хьо вовзийта/йовзийта гlирсан',
+'userlogin-noaccount' => 'Хlинца дlа вазвина/язйина вац/яц?',
+'nologin' => "Хlинца дlа вазвина/язйина вац/яц? '''$1'''.",
+'nologinlink' => 'Кхолла декъашхон дӀаяздар',
+'createaccount' => 'Кхолла декъашхон дӀаяздар',
 'gotaccount' => "Дlавазвелла вуй хьо? '''$1'''.",
-'gotaccountlink' => 'Вовзийта хьой',
+'gotaccountlink' => 'Чувалар/ялар',
+'userlogin-resetlink' => 'Чуволу/йолу хаам биц бела?',
+'helplogin-url' => 'Help:Чувалар/ялар',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Чувала/яла гӀодар]]',
+'createacct-join' => 'ДӀаязбе лахахь хай хаам.',
+'createacct-emailrequired' => 'Электронни почтан адрес',
+'createacct-emailoptional' => 'Электронни почтан адрес (ца яздича мега)',
+'createacct-email-ph' => 'ДӀаязде электронни почтан адрес',
 'createaccountmail' => 'хааман зlене хула',
-'loginerror' => 'Гlалат ду декъашхо вовзарехь',
+'createacct-realname' => 'Хьан цӀе (ца язйича мега)',
+'createaccountreason' => 'Бахьан:',
+'createacct-reason' => 'Бахьна',
+'createacct-reason-ph' => '{{PLURAL:$1|агӀо|агӀонаш}}‎',
+'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|декъашхо|декъашхой}} тӀаьхьарачу хенахь',
+'loginerror' => 'Гlалат ду декъашхо вовзарехь/йовзарехь',
+'createaccounterror' => 'Декъашхон дӀаяздар кхолла йиш яц: $1',
 'nocookiesforlogin' => '{{int:nocookieslogin}}',
-'loginsuccesstitle' => 'Хьо вовзар хаз чакхдели',
+'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 +663,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 +685,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 +700,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 +712,38 @@ $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' => 'Кхин дӀа тадар',
+'session_fail_preview' => 'Сервер лара ца йира ахьа бина хийцамаш дӀаязба. Кхиъ цкъа а гӀортахь.
+Нагахь санна хӀара гӀалат юха а далахь, [[Special:UserLogout|сеанс дӀа а къоьвлин]], юха а системин чувала/яла хьажа.',
+'editing' => 'Тадар: $1',
+'creating' => 'АгӀо кхоллар «$1»',
+'editingsection' => 'Тадар $1 (даакъа)',
+'editingcomment' => 'Тадар $1 (керла даакъа)',
+'editconflict' => 'Тадарна дойнаш: $1',
+'explainconflict' => 'Хьо хӏара агӏо тоеш волчу хенахь, цхьам хийцамаш бина.
+Лакхарчу таяран корехь хьона гуш ду хӏинца агӏона чохь долу йоза.
+Лахарчу корехь ахь бина хийцам бу.
+Хьой бина хийцам лахарчу корера лакхарчу коре баккха.
+Кнопкан «{{int:savearticle}}» тӏетаӏича лакхара корера йоза дӏаязлурду.',
 'yourtext' => 'Хьан йоза',
 'yourdiff' => 'Башхаллаш',
 'copyrightwarning' => "Тергаме хьажа, массо яззаман чутухуш долу йозан хийцам хьажарехь бу, арахоьцушсанна оцу бакъойалар хьоляхь $2 (хьаж. $1).
@@ -646,43 +751,50 @@ $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' => 'Хьажа деригге тептаре',
+'postedit-confirmation' => 'Хьан нисдар дӏайазъдина.',
+
+# 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,14 +802,18 @@ $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
+'rev-deleted-user' => '(авторан цӏе дӏаяйина)',
 'rev-delundel' => 'гайта/къайла',
 'rev-showdeleted' => 'гайта',
 'revdelete-show-file-submit' => 'Хlаъ',
@@ -709,13 +825,15 @@ $1',
 'revdelete-reasonotherlist' => 'Кхин бахьан',
 
 # History merging
+'mergehistory-from' => 'Дуьххьарлера агӀоно',
 'mergehistory-reason' => 'Бахьан:',
 
 # Merge log
 'revertmerge' => 'Йекъа',
 
 # Diffs
-'history-title' => '$1 — хийцаман исторе',
+'history-title' => '$1 — хийцаман истори',
+'difference-title' => '$1 — Версешан башхалла',
 'lineno' => 'Могlа $1:',
 'compareselectedversions' => 'Хаьржиначуьна башхо муха ю хьажа',
 'showhideselectedversions' => 'Гайта/къайлайаха хаьржина башхонаш',
@@ -735,16 +853,15 @@ $1',
 'searchmenu-legend' => 'Лахарна гlирс нисба',
 'searchmenu-exists' => "'''Хlокху вики-кхолламашца йолуш ю ишта агlо «[[:$1]]»'''",
 'searchmenu-new' => "'''Кхолла ишта агlо «[[:$1]]» хlокху вики-кхолламашчохь!'''",
-'searchhelp-url' => 'Help:Чулацам',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Гайта агlонаш ишта хlоттам болуш]]',
 'searchprofile-articles' => 'Къаьстина агlонаш',
 'searchprofile-project' => 'Нисвохааман агlонаш а кхолламаш',
-'searchprofile-images' => 'Ð\9cÑ\8fлÑ\82омÑ\88Ñ\85гl',
+'searchprofile-images' => 'Ð\9cÑ\83лÑ\8cÑ\82имедиа',
 'searchprofile-everything' => 'Массанхьа',
 '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 дешнаш}})',
@@ -754,78 +871,177 @@ $1',
 'search-interwiki-caption' => 'Гергара кхолламаш',
 'search-interwiki-default' => '$1 хилам.:',
 'search-interwiki-more' => '(кхин)',
+'mwsuggest-disable' => 'ДӀабайа лахаран хьехам',
 'searcheverything-enable' => 'Массо цIера анахь лахар',
 'searchrelated' => 'хlоттаделларг',
 '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' => 'Iад йитарца',
 'prefs-beta' => 'Гlоле таронаш',
-'prefs-datetime' => 'Терахь а хан',
+'prefs-datetime' => 'Терахь а хан а',
 'prefs-labs' => 'Муха ю хьажарна таронаш',
+'prefs-user-pages' => 'Декъашхочун агӀо',
 'prefs-personal' => 'Долахь болу хаамаш',
 'prefs-rc' => 'Керла нисдарш',
 'prefs-watchlist' => 'Тергаме могlам',
+'prefs-watchlist-days' => 'Денойн дукхалла:',
+'prefs-watchlist-days-max' => 'Къезиг  $1 {{PLURAL:$1|дена}}',
+'prefs-watchlist-edits' => 'Тергаме могӀам чохь гойтучу нисдаршан максимальни дукхалла:',
+'prefs-watchlist-edits-max' => 'Уггар дукха: 1000',
+'prefs-watchlist-token' => 'Тергаме могӀанан токен:',
 'prefs-misc' => 'Кхин гlирсаш',
 'prefs-resetpass' => 'Хийца ишар',
+'prefs-changeemail' => 'Хийца электрони почт',
+'prefs-email' => 'Электронан почтан параметрш',
 'prefs-rendering' => 'Арахьара хатl',
 'saveprefs' => 'lалашдан',
-'prefs-editing' => 'Редаккхар',
+'restoreprefs' => 'МеттахӀоттабе гӀирс дуьхӀар сана',
+'prefs-editing' => 'Тадар',
+'rows' => 'МогӀанаш:',
+'columns' => 'БӀогӀамаш:',
 'searchresultshead' => 'Лаха',
+'resultsperpage' => 'Карийначу дӀаяздаршан дукхалла:',
+'stub-threshold' => 'Кеч яран доза <a href="#" class="stub">коьртамогӀамна хьажоригаш</a> (байташках):',
+'recentchangesdays' => 'Керла нисдар гайта динахь:',
+'recentchangesdays-max' => 'Къезиг  $1 {{PLURAL:$1|дена}}',
+'recentchangescount' => 'Iад йитарца гойтуш долу нисдаршан дукхалла',
+'prefs-help-recentchangescount' => 'Гойту керла нисдарш, аӀонашан истори, тептарш.',
+'prefs-help-watchlist-token' => 'Кхуза къайлах догӀа яздича хьан тергаме спискан RSS-трансляци кхуллур ю. 
+Массо а догӀа хууш верг трансляци еша йиш йолуш ву. 
+Цундела цхьанне а ца хуу догӀа харжа деза. Хьан йиш ю ца хууш кхоьллина догӀа лелада: $1',
+'savedprefs' => 'Хьан гӀирс Ӏалашбина.',
 'timezonelegend' => 'Сахьатан аса:',
-'prefs-searchoptions' => 'Лахарна гlирс нисба',
-'prefs-files' => 'Хlумнаш',
+'localtime' => 'Меттигера хан:',
+'servertime' => 'Сервера хан:',
+'timezoneregion-asia' => 'Ази',
+'timezoneregion-australia' => 'Австрали',
+'timezoneregion-indian' => 'Индин океан',
+'timezoneregion-pacific' => 'Тийна океан',
+'allowemail' => 'Магийта декъашхошна хьайга электрони почтехула кехат кхехьийта',
+'prefs-searchoptions' => 'Лаха',
+'defaultns' => 'Я лаха лахахь гайтинчу аннашкахь:',
+'default' => 'Iад йитарца',
+'prefs-files' => 'Файлаш',
+'prefs-custom-css' => 'Долахь йолу CSS',
+'prefs-custom-js' => 'Долахь йолу JS',
+'prefs-common-css-js' => 'Юкъара CSS/JS массо кеч даран темашан:',
+'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' => 'Керла куьгтаӀор:',
+'prefs-help-signature' => 'Дийцаре агӀонаш чохь къуьгтаӀо деза символшца «<nowiki>~~~~</nowiki>», цара гойтур ду хьан къуьгтаӀор а хан а.',
 'yourgender' => 'Ву/Йу:',
 'gender-unknown' => 'хlоттийна яц',
 'gender-male' => 'борша',
 'gender-female' => 'сте',
+'prefs-help-gender' => 'ТӀехь доцург: и хаам лелош бу цхьайолу хаамаш чохь декъашхочун пол гучуйоккхуш.
+И хаам массарна гуш хир бу.',
+'email' => 'Email',
 'prefs-help-email' => 'Кехат яздо зlен цlе цахlоттийча аъ хlумма дац, амма иза оьшар ю, нагахь хьуна хьай ишар йицлахь.',
-'prefs-diffs' => 'Башхон варси',
+'prefs-help-email-others' => 'Кхин дӀа цо кхечу декъашхошна йиш хуьлуьйту хьога электронни кехат даийта хьан агӀона чохь йолу хьажориган гӀонца.',
+'prefs-info' => 'Коьрта хаам',
+'prefs-i18n' => 'Юкъардекъа мотт',
+'prefs-signature' => 'КуьгтаӀор',
+'prefs-dateformat' => 'Терахьан формат',
+'prefs-timeoffset' => 'Хенан  гӀирс',
+'prefs-advancedediting' => 'Кхин гӀирс нисбар',
+'prefs-advancedrc' => 'Кхин гӀирс нисбар',
+'prefs-advancedrendering' => 'Кхин гӀирс нисбар',
+'prefs-advancedsearchoptions' => 'Кхин гӀирс нисбар',
+'prefs-advancedwatchlist' => 'Кхин гӀирс нисбар',
+'prefs-displayrc' => 'Гуш болу гӀирсаш',
+'prefs-displaysearchoptions' => 'Гуш болу гӀирсаш',
+'prefs-displaywatchlist' => 'Гуш болу гӀирсаш',
+'prefs-diffs' => 'Башхон верси',
 
 # User rights
 'userrights' => 'Декъашхочуьн бакъона урхалладар',
+'userrights-lookup-user' => 'Декъашхошан бакъонашан урхалладар',
+'userrights-user-editname' => 'Язъе цӀе:',
+'editusergroup' => 'Хийца декъашхон бакъо',
 'editinguser' => "Хийца декъашхочуьна бакъо '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'userrights-editusergroup' => 'Хийца декъашхон бакъо',
+'saveusergroups' => 'Декъашхон бакъонаш ӏалашян',
+'userrights-groupsmember' => 'Декъашхо:',
+'userrights-groupsmember-auto' => 'Бакъонашан тоба:',
+'userrights-groups-help' => 'Хьона хийца ло декъашхочуьн бакъонаш.
+* Бакъона цӏера юххехь билгало елахь, цуна и бакъо йолуш ю.
+* Билгало яцахь — декъашхон и бакъо яц.
+* Знако * билгала до ахьа бакъо еллачул тӏхьа хьона и дӏаяккха лур цахилар.',
+'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 +1050,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ара нисдинарг къастийна жимо долушсан',
@@ -846,12 +1064,13 @@ $1',
 'rclistfrom' => 'Гайта хийцам оцу $1.',
 'rcshowhideminor' => '$1 кегийра нисдарш',
 'rcshowhidebots' => '$1 шабелхалой',
-'rcshowhideliu' => '$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,19 +1086,31 @@ $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' => 'Файлан хийцамаш:',
+'filesource' => 'Хьост:',
+'ignorewarnings' => 'ДӀахедар тергал ца дан',
 'uploadwarning' => 'Дlахьедар',
 'uploadedimage' => 'чуяккхина «[[$1]]»',
+'overwroteimage' => 'Чуяккхина файлан керла верси «[[$1]]»',
+'upload-source' => 'ДIайолалун файл',
+'sourcefilename' => 'ДIайолалун файл:',
+'destfilename' => 'Файлан керла цӀе:',
+'upload-description' => 'Файлах лаьцна',
+'upload-options' => 'Чуякхаран параметраш',
+'watchthisupload' => 'Латайе хlара файл тергаме могlам юкъа',
 'filename-prefix-blacklist' => '#<!-- битийша хlара могlа ша мабарра --> <pre>
 # Бухасиз шолгlа:
 #  * Массо, саболчунтlийра йуьлалуш ерш «#» хуьлу хетаме дерг (могlа чекх балац)
@@ -896,43 +1127,73 @@ PICT # тайп тайпан
  #</pre> <!-- битийша хlара могlа ша мабарра -->',
 
 'license' => 'Бакъойалар:',
+'license-header' => 'Бакъойалар',
+'nolicense' => 'Яц',
 
 # Special:ListFiles
+'listfiles-summary' => 'Лахахь гойтуш ю ерриг файлаш.
+Декъашхо къастичи, цун керла файлаш гойту.',
 'listfiles_search_for' => 'Лаха хIуман цIарца:',
-'imgfile' => 'хlум',
-'listfiles' => 'Хlумнаши могlам',
-'listfiles_name' => 'Хlуман цlе',
+'imgfile' => 'файл',
+'listfiles' => 'Файлаши могӀам',
+'listfiles_date' => 'Терахь',
+'listfiles_name' => 'Файлан цӀе',
 'listfiles_user' => 'Декъашхо',
 'listfiles_size' => 'Барам',
 'listfiles_description' => 'Цуьнах лаьцна',
 
 # File description page
-'file-anchor-link' => ' Хlум',
-'filehist' => 'Хlуман исторе',
-'filehist-help' => 'Тlетаlаде терахь/хан, муха хилла хьажарна и хlум.',
-'filehist-deleteall' => 'дlадайá массо',
-'filehist-deleteone' => 'дlадайá',
+'file-anchor-link' => 'Файл',
+'filehist' => 'Файлан истори',
+'filehist-help' => 'Тlетаlаде терахь/хан, муха хилла хьажарна и файл.',
+'filehist-deleteall' => 'массо дӀаяккха',
+'filehist-deleteone' => 'дӀаяккха',
+'filehist-revert' => 'файл юхаерзо',
 'filehist-current' => 'карара',
 'filehist-datetime' => 'Терахь/Хан',
 'filehist-thumb' => 'Жима',
 'filehist-thumbtext' => 'Жимо башхо оцу $1',
 'filehist-user' => 'Декъашхо',
-'filehist-dimensions' => 'Хlуман барам',
+'filehist-dimensions' => 'Файлан барам',
+'filehist-filesize' => 'Файлан барам',
 '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' => 'Тохарлера верси юхаерзор $1',
+'filerevert-legend' => 'Файлан верси юхаерзо',
+'filerevert-intro' => '<span class="plainlinks">Файл юхаерзош ю \'\'\'[[Media:$1|$1]]\'\'\' оцу [$4 верси $3, $2].</span>',
+'filerevert-comment' => 'Бахьан:',
+'filerevert-defaultcomment' => 'Юхаерзош ю оцу $2, $1 хенахь хила верси',
 'filerevert-submit' => 'Юхаяккха',
+'filerevert-success' => "Юхаерзина файл '''[[Media:$1|$1]]''' оцу [$4 верси $3, $2].",
 
 # 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-reason-dropdown' => '* Даржина долу дӀаяккхаран баьхьанаш 
+** Авторан бакъонаш талхор
+** ЦхӀатера файлаш хилар',
+'filedelete-edit-reasonlist' => 'Бахьанин список нисяр',
 
 # MIME search
 'mimesearch' => 'MIME хула лаха',
@@ -944,13 +1205,13 @@ PICT # тайп тайпан
 'listredirects' => 'ДIасахьажоран могIам',
 
 # Unused templates
-'unusedtemplates' => 'Лелош доцу куцкепаш',
+'unusedtemplates' => 'Лелош доцу кепаш',
 
 # Random page
-'randompage' => 'Цахуаш нисйелла агlо',
+'randompage' => 'Цахууш нисйелла агӀо',
 
 # Random redirect
-'randomredirect' => 'Ца хууш нисделла дIасахьажор',
+'randomredirect' => 'Цахууш нисделла дIасахьажор',
 
 # Statistics
 'statistics' => 'Бухехьдерг',
@@ -960,20 +1221,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 +1244,51 @@ 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' => 'Категореш йоцу файлаш',
+'uncategorizedtemplates' => 'Категореш йоцу кепаш',
+'unusedcategories' => 'Йаьсса категореш',
+'unusedimages' => 'Лелош доцу файлаш',
+'wantedcategories' => 'Оьшуш йолу категореш',
 'wantedpages' => 'Оьшуш йолу агIонаш',
-'wantedfiles' => 'Ð\9eÑ\8cÑ\88Ñ\83Ñ\88 Ð¹Ð¾Ð»Ñ\83 Ñ\85\83мнаш',
-'wantedtemplates' => 'Оьшуш долу куцкепаш',
+'wantedfiles' => 'Ð\9eÑ\8cÑ\88Ñ\83Ñ\88 Ð¹Ð¾Ð»Ñ\83 Ñ\84айлаш',
+'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' => 'Ца Ð¼Ð°Ð³Ð¸Ð¹Ð½Ð° Ð¹Ð¾Ð»Ñ\83 цIераш',
+'protectedtitles' => 'Ð\93IаÑ\80олла Ð´Ð¸Ð½Ð° ц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уш ялахь яцахь а иза хила мега жигара лелош.',
+'notargettitle' => 'Ӏалашо билгал йина яц',
+'nopagetitle' => 'Ишта агӀо яц',
+'nopagetext' => 'Ишта агӀо яц.',
 'pager-newer-n' => '{{PLURAL:$1|алсамо керла|алсамо керланаш|алсамо керлачарех}} $1',
-'pager-older-n' => '{{PLURAL:$1|алсамо къена|алсамо къенанаш|алсамо къеначарех}} $1',
+'pager-older-n' => '{{PLURAL:$1|алсамо шира|алсамо ширниш|алсамо ширачарех}} $1',
 
 # Book sources
 'booksources' => 'Жайнан хьосташ',
@@ -1024,15 +1297,17 @@ PICT # тайп тайпан
 
 # Special:Log
 'specialloguserlabel' => 'Декъашхо:',
-'speciallogtitlelabel' => 'Корта:',
+'speciallogtitlelabel' => 'Ӏалашо (цӀе я декъашхо):',
 'log' => 'Тéптарш',
 '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 +1318,18 @@ 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' => 'Категореш',
+'categoriespagetext' => '{{PLURAL:$1|Лахара категореш чохь ю|Лахара категореш чохь ю}} агӀонаш я медиа-файлаш.
+Кхузахь гойтуш яц [[Special:UnusedCategories|лелош йоцу категореш]].
+Кхин дӀа [[Special:WantedCategories| хийла еза категореш]].',
+'categoriesfrom' => 'Гучé яха категореш, оцу:',
 
 # Special:DeletedContributions
 'deletedcontributions' => 'Декъашхочуьн дlабайина къинхьегам',
+'deletedcontributions-title' => 'ДӀабаьккхина къинхьегам',
 'sp-deletedcontributions-contribs' => 'къинхьегам',
 
 # Special:LinkSearch
@@ -1057,10 +1338,14 @@ PICT # тайп тайпан
 'linksearch-line' => '$2 — хьажориг кху $1',
 
 # Special:ListUsers
+'listusersfrom' => 'ТӀера волавелла декъашхой гайта:',
 'listusers-submit' => 'Гайта',
+'listusers-noresult' => 'Декъашхой цакарий.',
 
 # Special:ActiveUsers
 'activeusers' => 'Жигар декъашхой могlам',
+'activeusers-from' => 'Гучé баха декъашхой, болалуш болу оцу:',
+'activeusers-noresult' => 'Декъашхой цакарий.',
 
 # Special:ListGroupRights
 'listgrouprights' => 'Декъашхойн тобанаши бакъонаш',
@@ -1068,15 +1353,23 @@ PICT # тайп тайпан
 'listgrouprights-helppage' => 'Help:Тобан бакъонаш',
 'listgrouprights-members' => '(тобан могlам)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Декъашхочун хааман кехат',
+'emailuser-title-target' => 'Декъашхочунга кехат яздар',
+'emailuser-title-notarget' => 'Декъашхочунга кехат яздар',
 'defemailsubject' => 'Хаам {{grammar:genitive|{{SITENAME}}}} чура бу',
+'emailusernamesubmit' => 'ДӀадахьийта',
+'email-legend' => '{{grammar:genitive|{{SITENAME}}}} кхечу декъашхочунга кехат дахьийтар',
+'emailfrom' => 'Хьаьнгара',
+'emailto' => 'Хьаьнга:',
 'emailmessage' => 'Хаам:',
+'emailsent' => 'Кехат дӏадахьийтина',
+'emailsenttext' => 'Хьан электроннан хаам дӏабахьийтина.',
 
 # 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 +1378,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,74 +1388,121 @@ 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' => 'Кхин бахьан',
+'deletereason-dropdown' => '* Даржина долу дӀаяккхаран баьхьанаш 
+** зулма  
+** авторан лаамца
+** авторан бакъонаш талхор',
+'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-expiring-local' => 'чекхйолу $1',
 '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-dropdown' => '* ГӀоралла дарна баьхьаш 
+** сих-сиха зулам дар 
+** дуккха спам хилар
+** нисдаршан тӀом 
+** гӀараялл агӀо',
+'protect-edit-reasonlist' => 'Бахьанин список нисяр',
+'protect-expiry-options' => '1 сахьт:1 hour,1 де:1 day,1 кӀиран:1 week,2 кӀиран:2 weeks,1 бутт:1 month,3 бутт:3 months,6 бутт:6 months,1 шо:1 year,цlкъа:infinite',
 'restriction-type' => 'Бакъо:',
-'restriction-level' => 'Тlевитарна локхалла:',
+'restriction-level' => 'ТӀекхочаран локхалла:',
 
 # Restrictions (nouns)
+'restriction-edit' => 'Тадар',
+'restriction-move' => 'ЦӀе хийцар',
 '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}}»'''.",
+'undeletehistory' => 'Агӏо меттахӏотта йича цуьнан хийцаман истори меттахӏотта ло.
+Агӏо дӏаяккхинчул тӏяха юху кхолийна елахь меттахӏоттина йолу версеш гучуер ю керлачу версешна хьалха',
 '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
 'contributions' => 'Декъашхон къинхьегам',
-'contributions-title' => 'Декъашхочуьна къинхьегам $1',
+'contributions-title' => 'Декъашхон къинхьегам $1',
 'mycontris' => 'Сан къинхьегам',
 'contribsub2' => 'Къинхьегам $1 ($2)',
 'uctop' => ' (тlаьхьара)',
@@ -1169,12 +1510,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 +1526,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 +1540,104 @@ PICT # тайп тайпан
 'whatlinkshere-filters' => 'Литтарш',
 
 # Block/unblock
-'blockip' => 'Сацаве',
+'block' => 'Декъашхон блоктохар',
+'blockip' => 'Блоктоха',
+'blockip-legend' => 'Декъашхон блоктохар',
+'blockiptext' => 'Бухахь йолу форманца блоктоха IP-адресна цунтӏера дӏаяздарш ца дайта.
+Блоктоха магийна цо зенаш деш делахь кхин хӏокху [[{{MediaWiki:Policy-url}}|низам ца]].
+Лахахь билгалде блоктохарна бахьна.',
 'ipadressorusername' => 'IP-долу меттиг йа декъашхон цlе:',
+'ipbexpiry' => 'Хан чекхйолу:',
+'ipbreason' => 'Бахьан:',
 'ipbreasonotherlist' => 'Кхин бахьан',
+'ipbreason-dropdown' => '* Белхан некъ дӀакъовлар бахьанаш:
+** Харца хаам бар
+** АгӀонан чураниг дӀаяккхар
+** Спам-хьажорагаш арахьара сайташна
+** МаьӀна доцу текст тӀетохар
+** Декъашхой хьийзабар, кхерамаш тиссар
+** Масийтта лараман яздар зуламан лелаяр
+** Магитина йоцу декъашхон цӀе',
+'ipb-hardblock' => 'Шаш довзийтина болу декъашхошна бехкам бе хӀокху IP-адресца тадарш дан',
+'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-change-block' => 'Юхаблоктоха декъашхон оьцу хийцамашца',
+'ipb-confirm' => 'Бакъде блоктохар',
+'blockipsuccesssub' => 'Блоктохар чакхдели',
+'blockipsuccesstext' => '[[Special:Contributions/$1|«$1»]] {{GENDER:$1|блоктоьхна ву|блоктоьхна ю}}.<br />
+Хьажа. [[Special:BlockList|блоктоьхна 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' => 'Блоктоьхна декъашхой',
+'ipblocklist-legend' => 'Блоктоьхна декъашхо лахар',
+'blocklist-userblocks' => 'ДӀахьулян дӀаяздаршан блоктохарш',
+'blocklist-tempblocks' => 'ДӀахьулян цхьан ханна йолу блоктохарш',
+'blocklist-addressblocks' => 'ДӀахулдан цхьайолу IP адресан блоктохарш',
+'blocklist-rangeblocks' => 'ДӀахьулян блоктоьхна йолу диапазонаш',
+'blocklist-timestamp' => 'Терахь/хан',
+'blocklist-target' => 'Ӏалашо',
+'blocklist-expiry' => 'Чекхйолу',
+'blocklist-by' => 'Цунна блоктоьхана куьйгалхо',
+'blocklist-params' => 'Блоктохаран параметрш',
+'blocklist-reason' => 'Бахьан:',
 'ipblocklist-submit' => 'Лаха',
-'blocklink' => 'сацаве',
-'unblocklink' => 'хьаваста',
-'change-blocklink' => 'хийцам бе сацорна',
+'infiniteblock' => 'хан чаккхе йоцуш',
+'noautoblockblock' => 'ша блоктухарг дӏаяйина',
+'blocklink' => 'блоктоха',
+'unblocklink' => 'дӀаякхаблок',
+'change-blocklink' => 'хийцам бе блоктохарна',
 'contribslink' => 'къинхьегам',
-'blocklogpage' => 'Сацораш долу тептар',
-'blocklogentry' => 'сацийна [[$1]] цхьана ханна $2 $3',
-'unblocklogentry' => 'схьаваьстина $1',
-'block-log-flags-nocreate' => 'цамагдо дlаязвалар дlаязбаларшца',
+'blocklogpage' => 'Блоктоьхарш болу тептар',
+'blocklog-showlog' => '{{GENDER:$1|ХӀокху декъашхон хьалхо блоктоьхна хила}}.
+Лахахь гойту блоктохарш долу тептар:',
+'blocklogentry' => 'блоктоьхна [[$1]] цхьана ханна $2 $3',
+'reblock-logentry' => 'Хийцина  блоктоьхна хан [[$1]] $2 $3',
+'blocklogtext' => 'Блоктохаршна а блокдӀаякхаршна а тептар. Ша блоккхеташ долу IP-адресаш кхузахь гойтуш дац. Кхин. [[Special:BlockList|хӀийнца блоктоьха берш]].',
+'unblocklogentry' => 'дӀаякхинаблок $1',
+'block-log-flags-nocreate' => 'цамагдо керла дӏаяздарш кхоллар',
+'block-log-flags-noautoblock' => 'ша блоктухарг дӏаяйина',
+'ipb-needreblock' => 'ХӀара $1 {{GENDER:$1|блоктоьхна ву|блоктоьхна ю}}. Лаьий хьуна блоктохаран параметрш хийца?',
 
 # 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 +1650,31 @@ 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-exists' => 'Агӏо $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]]»',
+'selfmove' => 'АгӀона цӏе хийца йиш яц: и цӏе хӏокху агӏона йолуш ю.',
+'immobile-source-page' => 'ХӀокху агӏона цӏе хийца йиш яц.',
+'move-leave-redirect' => 'Ӏадйита дӀасахьажориг',
 'protectedpagemovewarning' => "'''Дlахьедар.''' Хlара агlо гlаролла йина йу; цlе хийца йа нисйа а бакъо йолуш адаманкуьйгалхой бе бац.
 Лахахьа тептаро балийна тlаьхьаралера дlаязбина хаам:",
 'semiprotectedpagemovewarning' => "'''Дlахьедо.''' Хlара агlо гlаролла йина йу; дlабазбиначу декъашхошка бе цlе хийцалуш яц.
@@ -1259,10 +1684,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 +1709,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 +1718,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 +1727,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 +1748,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 +1774,6 @@ PICT # тайп тайпан
 'common.css' => '/** Чуйиллина йолу кхузе CSS хир йу лелош масхьа кечйечу чохь */',
 'monobook.css' => '/* Чуйиллина йолу кхузе CSS хир йу лелош масхьа Monobook чохь */',
 'print.css' => '/* Чуйиллина йолу кхузе CSS хир йу лелош масхьа зорба тухучуче чохь */',
-'handheld.css' => '/* Чуйиллина йолу кхузе CSS хир йу лелош масхьа койнаш чохь, дукхах ерг хатl нисдеш оцу $wgHandheldStyle */',
 
 # Scripts
 'common.js' => '/* Чуйиллина йолу кхузе JavaScript ишар гучу ерайу массо декъашхошна оцара схьаелларца хlора агlо */',
@@ -1364,22 +1788,39 @@ PICT # тайп тайпан
 # Spam protection
 'spamprotectiontitle' => 'Совбиларна литтар',
 
+# Info page
+'pageinfo-language' => 'АгӀона мотт',
+'pageinfo-toolboxlink' => 'Агlонах болу бовзам',
+
 # Skin names
-'skinname-standard' => 'Лела ма ярра',
+'skinname-modern' => 'Кхузаманан',
+'skinname-vector' => 'Векторни',
+
+# Patrolling
+'markaspatrolledtext' => 'Пайден агӏо хилар билгало ян',
+'markedaspatrollednotify' => 'АгӀо «$1» пайдане хилар билгалдина',
 
 # 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' => 'файлан барам: $1, MIME-тайп: $2',
+'file-info-size' => '$1 × $2 {{PLURAL:$2|пиксель|пикселш|пикселш}}, файлан барам: $3, MIME-тайп: $4',
+'file-info-size-pages' => '$1 × $2 пикселш, файлан барам: $3, MIME-тайп: $4, $5 {{PLURAL:$5|агӀо|агӀонаш}}',
 'file-nohires' => 'Кхи йоккха гlоле башхо яц.',
-'svg-long-desc' => 'SVG-хlума, хlоттамца $1 × $2 цинташ, хlуман барам: $3',
+'svg-long-desc' => 'SVG-файл, лартӀахь ю $1 × $2 {{PLURAL:$2|пиксель|пикселш|пикселш}}, файлан барам: $3',
+'svg-long-desc-animated' => 'Анимироват йина SVG-файл, номинальни $1 × $2 {{PLURAL:$2|пиксель|пикселш}}, файлан барам: $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' => 'Ð\9aеÑ\80лаÑ\87Ñ\83 Ñ\85\83мни Ð³Ð°Ð»ÐµÐ»Ð°Ñ\80е',
+'newimages' => 'Ð\9aеÑ\80лаÑ\87Ñ\83 Ñ\84айланÑ\88ан Ð³Ð°Ð»ÐµÑ\80ий',
 'newimages-legend' => 'Литтар',
 'ilsubmit' => 'Лаха',
 
@@ -1395,7 +1836,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,12 +1854,39 @@ PICT # тайп тайпан
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
-'exif-datetime' => 'Хlума хийцина терахь а хан',
+# Exif tags
+'exif-imagewidth' => 'Шоралла',
+'exif-imagelength' => 'Локхалла',
+'exif-orientation' => 'Суьртан хьал',
+'exif-xresolution' => 'Шоралла',
+'exif-yresolution' => 'Локхалла',
+'exif-datetime' => 'Файл хийцина терахь а хан',
+'exif-imagedescription' => 'Суьртан цӏе',
+'exif-software' => 'Лелина программа',
+'exif-colorspace' => 'Беснашан хьал',
+'exif-pixelxdimension' => 'Суьртан локхалла',
 'exif-datetimeoriginal' => 'Дуьххьарлера терахь а хан',
+'exif-datetimedigitized' => 'Оцифровк йина терахь а хан а',
+'exif-gpsaltitude' => 'Локхалла',
+'exif-gpsdestlatitude' => 'Объектан дохалла',
+'exif-gpsdatestamp' => 'Терахь',
+'exif-source' => 'Хьост',
+'exif-languagecode' => 'Мотт',
+
+'exif-orientation-1' => 'Лартӏахь',
+
+'exif-xyresolution-i' => '$1 тӏадамаш дюйман',
 
 'exif-scenetype-1' => 'Сурт даьккхина нис дуьххьал',
 
+'exif-contrast-0' => 'Лартӏахь',
+
+'exif-saturation-0' => 'Лартӏахь',
+
+'exif-sharpness-0' => 'Лартӏахь',
+
+'exif-dc-date' => 'Терахь(ш)',
+
 # External editor support
 'edit-externally' => 'Рéдаккха хlокху хlуман, арахьара диллагlарам лелош',
 'edit-externally-help' => '(мадарра хьажа. оцу [//www.mediawiki.org/wiki/Manual:External_editors куьйгалийца дlахlотторе])',
@@ -1446,11 +1914,14 @@ 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-blank' => 'Агӏон чулацам дӏабяккхина',
+'autosumm-replace' => 'АгӀона чуьраниг хийцина оцу «$1»',
+'autoredircomment' => 'ДӀасахьажийна цуна [[$1]] тӏе',
 'autosumm-new' => 'Керла агlо: «$1»',
 
 # Live preview
@@ -1465,17 +1936,19 @@ 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' => 'Кхин',
+'version-license' => 'Бакъо',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Лаха цхьатера йолу хIумнаш',
+'fileduplicatesearch-filename' => 'Файлан цӀе:',
 'fileduplicatesearch-submit' => 'Лаха',
+'fileduplicatesearch-info' => '$1 × $2 {{PLURAL:$2|пиксель|пикселш|пикселш}}<br />Файлан барам: $3<br />MIME-тайп: $4',
 
 # Special:SpecialPages
 'specialpages' => 'Леррина агlонаш',
@@ -1484,7 +1957,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 +1987,25 @@ PICT # тайп тайпан
 'dberr-usegoogle' => 'Цlачун хьо хьажа лаха гlонца Google.',
 'dberr-outofdate' => 'Хьуна хаалахь, цуьна йолу меттиг хила мега тишйелла черахь.',
 
+# HTML forms
+'htmlform-submit' => 'ДӀадахьийта',
+'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',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|хийцина}} хӏокхуна $3 бакъо',
+
+# Feedback
+'feedback-cancel' => 'Цаоьшу',
+
+# Search suggestions
+'searchsuggest-search' => 'Лаха',
+
 );
index b01dfc1..1fdea44 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',
@@ -298,7 +296,6 @@ $1',
 'disclaimers' => 'Mga pagpasabot',
 'disclaimerpage' => 'Project:Mga pagpasabot',
 'edithelp' => 'Tabang sa pag-usab',
-'edithelppage' => 'Help:Pag-usab',
 'helppage' => 'Help:Mga sulod',
 'mainpage' => 'Unang Panid',
 'mainpage-description' => 'Unang Panid',
@@ -711,7 +708,6 @@ Hinumdomi nga ang paggamit sa mga sumpay sa nabigasyon mo-reset sa column.',
 'prevn' => 'miaging {{PLURAL:$1|$1}}',
 'nextn' => 'sunod {{PLURAL:$1|$1}}',
 'viewprevnext' => 'Tan-awa sa ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:Mga sulod',
 'searchprofile-everything' => 'Tanan ng bagay',
 'search-result-size' => '$1 ({{PLURAL:$2|1 pulong|$2 ka mga pulong}})',
 'search-redirect' => '(redirek $1)',
@@ -737,14 +733,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 +966,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..61328dd 100644 (file)
@@ -213,7 +213,6 @@ $messages = array(
 'disclaimers' => 'Diklarasion Inadahi',
 'disclaimerpage' => 'Project:Diklarasion inadahi henerat',
 'edithelp' => 'Ayudo tumulaika',
-'edithelppage' => 'Help:Tumulaika',
 'helppage' => 'Help:Guinaha',
 'mainpage' => 'Fanhaluman',
 'mainpage-description' => 'Fanhaluman',
@@ -631,7 +630,6 @@ Fanapunta na para u na'nuebu i kolumna anggen un usa i inachetton nabegasion.",
 'prevn' => "{{PLURAL:$1|$1}} ni manmå'pos",
 'nextn' => "{{PLURAL:$1|$1}} ni manmamaila'",
 'viewprevnext' => 'Atan i ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:Guinaha',
 'search-result-size' => '$1 ({{PLURAL:$2|1 na palabra|$2 na palabra siha}})',
 'search-result-score' => 'Prinisisu: $1%',
 'search-redirect' => "(na'dirihi $1)",
@@ -657,13 +655,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 +866,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 7833a2c..974046e 100644 (file)
@@ -154,7 +154,7 @@ $messages = array(
 'tog-newpageshidepatrolled' => 'لە پێرستی پەڕە نوێکاندا پەڕە پاس دراوەکان بشارەوە',
 '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' => 'ڕێگە بدە بۆ دەستکاری کردنی بەشەکان لە ڕێگەی بەستەرەکانی [دەستکاری]',
@@ -187,7 +187,7 @@ $messages = array(
 'tog-watchlisthidepatrolled' => 'لە پێرستی چاودێرییەکاندا دەستکارییە پاس دراوەکان بشارەوە',
 'tog-ccmeonemails' => 'کۆپییەک لەو ئیمەیلانە کە بۆ بەکارھێنەرانی تر دەنێرم بۆ خۆشم بنێرە',
 'tog-diffonly' => 'ناوەرۆکی پەڕە لە ژێرەوەی جیاوازییەکاندا نیشان مەدە',
-'tog-showhiddencats' => 'ھاوپۆلە شاراوەکان نیشان بدە',
+'tog-showhiddencats' => 'پۆلە شاردراوەکان نیشان بدە',
 'tog-noconvertlink' => 'لەکارخستنی ئاڵوگۆڕی سەرناوی بەستەر',
 'tog-norollbackdiff' => 'لە دوای گەڕاندنەوە جیاوازی نیشان مەدە',
 'tog-useeditwarning' => 'ھۆشیارم بکەوە کاتێک لە پەڕەیەکی دەستکاری بە گۆڕانکاریی پاشەکەوت‌نەکراو دەردەچم',
@@ -262,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 پەڕە.}}',
@@ -387,7 +387,6 @@ $1',
 'disclaimers' => 'نابەرپرسییەکان',
 'disclaimerpage' => 'Project:بەرپرسنەبوون',
 'edithelp' => 'ڕێنوێنیی دەستکاریکردن',
-'edithelppage' => 'Help:دەستکاریکردن',
 'helppage' => 'Help:ناوەرۆک',
 'mainpage' => 'دەستپێک',
 'mainpage-description' => 'دەستپێک',
@@ -558,10 +557,20 @@ $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|ڕۆژ}}ە)',
-'yourdomainname' => 'ناوی دۆمه‌ینی خۆت',
+'userlogin-remembermypassword' => 'چوونەژوورەوەکەم ڕابگرە',
+'userlogin-signwithsecure' => 'پەیوەندیی دڵنیا بەکاربھێنە',
+'securelogin-stick-https' => 'پاش چوونەژوورەوە پەیوەندیی لەگەڵ HTTPS بھێڵەوە',
+'yourdomainname' => 'دۆمەینەکەت:',
 'password-change-forbidden' => 'ناتوانیت تێپەڕوشەکانت لەم ویکییەدا بگۆڕیت.',
 'externaldberror' => 'یان هەڵەی ڕێگەپێدانی بنکەدراو هەیە یان ڕێگات پێ نادرێت بۆ نوێ کردنی هەژماری دەرەکیت.',
 'login' => 'بچۆ ژوورەوە',
@@ -571,19 +580,39 @@ $2',
 'userloginnocreate' => 'بچۆ ژوورەوە',
 'logout' => 'بچۆ دەرەوە',
 'userlogout' => 'بچۆ دەرەوە',
-'notloggedin' => 'له‌ ژووره‌وه‌ نیت',
-'nologin' => "ھەژمارت نییە؟  '''$1'''.",
+'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' => 'ئەو ناوەی تۆ داوتە پێشتر بەکارھێنراوە.
 ناوێکی دیکە ھەڵبژێرە.',
 'loginerror' => 'ھەڵەی چوونەژوورەوە',
+'createacct-error' => 'ھەڵە لە دروستکردنی ھەژمار',
 'createaccounterror' => 'ناتوانیت هەژماری بەکارهێنەر دروست بکەیت: $1',
 'nocookiesnew' => 'ھەژماری بەکارھێنەر دروست‌کرا، بەڵام بە سەرکەوتوویی نەچوویتەوە ژوورەوە.
 {{SITENAME}} بۆ چوونەوە ژوورەوەی بەکارھێنەر لە شەکرۆکە کەڵک وەردەگرێت.
@@ -592,6 +621,8 @@ $2',
 'nocookieslogin' => '{{SITENAME}} بۆ چوونەژوورەوە لە کووکی‌یەکان کەڵک وەرئەگرێت.
 ڕێگەت نەداوە بە کووکی‌یەکان.
 ڕێگەیان پێ بدەو و دیسان تێبکۆشە.',
+'nocookiesfornew' => 'ھەژماری بەکارھێنەری دروست نەکرا، چون ناتوانین سەرچاوەکەی پشتڕاست بکەینەوە.
+دڵنیا بە کوکییەکانت چالاک کردووە، پەڕەکە بار بکەوە و دیسان ھەوڵ بدە.',
 'noname' => 'ناوی بەکارهێنەرییەکی گۆنجاوت دیاری نەکردووه.',
 'loginsuccesstitle' => 'سەرکەوتی بۆ چوونە ژوورەوە',
 'loginsuccess' => "'''ئێستا بە ناوی «$1»ەوە لە {{SITENAME}} چوویتەتەژوورەوە.'''",
@@ -664,7 +695,6 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'دووبارە ڕێکخستنەوەی تێپەڕوشە',
-'passwordreset-text' => 'ئەم فۆرمە پڕ بکەوە بۆ گرتنی ئیمەیلێکی بیرخەرەوەی وردەکارییەکانی ھەژمارەکەت.',
 'passwordreset-legend' => 'دووبارە ڕێکخستنەوەی تێپەڕوشە',
 'passwordreset-username' => 'ناوی بەکارھێنەری:',
 'passwordreset-domain' => 'پاوان:',
@@ -905,8 +935,9 @@ $2
 لەوە دەچی سڕدرابێتەوه.‌',
 'edit-conflict' => 'کێشەی دەستکاری.',
 'edit-no-change' => 'دەستکاریەکەت بەرچاو نەخرا، لەبەر ئەوەی هیچ گۆڕانکارییەکت لەسەر دەقەکە نەکردووە.',
-'edit-already-exists' => 'توانای درووست‌کردنی لاپەڕەی نوێ نیە.<br />
-ئەوە لەپێش‌دا هەبوو.',
+'postedit-confirmation' => 'دەستکارییەکەت پاشەکەوت کرا.',
+'edit-already-exists' => 'تواناییی دروستکردنی پەڕەی نوێ نییە.
+ئەمە پەڕەیە پێشتر هەبووە.',
 'defaultmessagetext' => 'دەقی پەیامی هەمیشەیی',
 'invalid-content-data' => 'دراوەی ناوەرۆکی نادروست',
 'editwarning-warning' => 'بەجێ‌هێشتنی ئەم لاپەڕەیە دەبێتە هۆی لە‌دەست چوونی هەموو ئەو گۆڕانکاریانەی کردووتە.',
@@ -1137,7 +1168,6 @@ $1",
 'searchmenu-legend' => 'ھەڵبژاردەکانی گەڕان',
 'searchmenu-exists' => "'''پەڕەیەک بە ناوی «[[:$1]]» لەم ویکییەدا ھەیە.'''",
 'searchmenu-new' => "'''لەم ویکییەدا پەڕەی « [[:$1]] » دروست بکە!'''",
-'searchhelp-url' => 'Help:پێرست',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|گەڕیان لە پەڕەکانی بەم پێشگرەوە]]',
 'searchprofile-articles' => 'پەڕە بە ناوەڕۆکەکان',
 'searchprofile-project' => 'پەڕەکانی یارمەتی و پڕۆژە',
@@ -1789,12 +1819,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' => 'ئەم پەڕە لیستی ئەو پەڕانەیە کە ڕەوانەکراون بۆ پەڕەیەکی ڕەوانەکراوی دیکە.
 هەر ڕیزێک، بەستەرەکانی ڕەوانەکردنەوەی یەکەم و دووەم و ھەروەھا ئامانجی ڕەوانەکراوی دووەمی تێدایە کە حاڵەتی ئاساییدا مەبەستی «ڕاستی»ی ڕەوانەکراوی یەکەمیش دەبێ بۆ ئەوێ بێت.
@@ -1808,7 +1844,7 @@ $1',
 'brokenredirects-edit' => 'دەستکاری',
 'brokenredirects-delete' => 'سڕینەوە',
 
-'withoutinterwiki' => 'پەڕەکانی بێ بەستەرەکانی زمان',
+'withoutinterwiki' => 'پەڕەکان بەبێ بەستەرەکانی زمان',
 'withoutinterwiki-summary' => 'ئەم پەڕانە بەستەریان بۆ وەشانەکانی زمانەکانی تر نیە.',
 'withoutinterwiki-legend' => 'پێشگر',
 'withoutinterwiki-submit' => 'پیشاندان',
@@ -1953,6 +1989,15 @@ $1',
 'listusers-noresult' => 'ھیچ بەکارھێنەرێک نەدۆزرایەوە.',
 'listusers-blocked' => '(بەربەست کراوە)',
 
+# Special:ActiveUsers
+'activeusers' => 'پێرستی بەکارھێنەرە چالاکەکان',
+'activeusers-intro' => 'ئەمە لیستێکی ئەو بەکارھێنەرانەیە کە لە  $1 {{PLURAL:$1|ڕۆژ|ڕۆژ}}ی ڕابردوودا بە جۆرێک چالاکییەکیان ھەبووە.',
+'activeusers-count' => '$1 {{PLURAL:$1|کردەوە}} لە دوایین {{PLURAL:$3|ڕۆژ|$3 ڕۆژ}}دا',
+'activeusers-from' => 'نیشاندانی بەکارھێنەران بە دەستپێکردن لە:',
+'activeusers-hidebots' => 'بۆتەکان بشارەوە',
+'activeusers-hidesysops' => 'بەڕێوبەران بشارەوە',
+'activeusers-noresult' => 'هیچ بەکارهێنەرێک نەدۆزرایەوە',
+
 # Special:ListGroupRights
 'listgrouprights' => 'مافەکانی گرووپی بەکارھێنەر',
 'listgrouprights-summary' => 'ئەمە لیستێکە لە گرووپەکانی بەکارهێنەر لەسەر ئەم ویکی‌یە، دەگەڵ مافەکانی دەست‌پێ‌گەیشتنی هاوپەیوەندیان.
@@ -1981,7 +2026,7 @@ $1',
 'emailpage' => 'ئیمەیل بۆ بەکارھێنەر',
 'emailpagetext' => 'دەتوانی لەم فۆرمەی ژێرەوە بۆ ناردنی ئیمەیلێک بۆ ئەم {{GENDER:$1|بەکارھێنەر}}ە کەڵک وەربگریت.
 ئەو ناونیشانە ئیمەیلە لە [[Special:Preferences|ھەڵبژاردەکانی بەکارھێنەر‌یتدا]] نووسیوتە، لە ناونیشانی «لەلایەن»ی (From) ئیمەیلەکەدا نیشان دەدرێت، کە وایە بەکارھێنەری وەرگر دەتوانێ ڕاستەوخۆ وەڵامت بداتەوە.',
-'defemailsubject' => 'ئیمەیڵی {{SITENAME}} لە بەکارھێنەر «$1»ەوە',
+'defemailsubject' => 'ئیمەیلی {{SITENAME}} لە بەکارھێنەر «$1»ەوە',
 'usermaildisabled' => 'ئیمەیڵی بەکارهێنەر لەکاردانیە',
 'noemailtitle' => 'هیچ ناونیشانێکی ئی‌مەیل نییە',
 'noemailtext' => 'ئەم بەکارهێنەرە ناونێشانێکی بڕوا پێکراوی ئی‌مەیلی دانەناوە.',
@@ -2027,8 +2072,8 @@ $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|پەڕە|پەڕە}}ی تێدایە.',
@@ -2346,8 +2391,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' => 'لە بەربەست‌دەرهێنانی ناوی بەکارهێنەریەک یا ناونیشانێکی ئای‌پی',
@@ -2766,6 +2811,7 @@ $1',
 'pageinfo-contentpage' => 'ھەژمارکراو وەک پەڕەی بەناوەرۆک',
 'pageinfo-contentpage-yes' => 'بەڵێ',
 'pageinfo-protect-cascading-yes' => 'بەڵێ',
+'pageinfo-category-info' => 'زانیاریی پۆل',
 'pageinfo-category-pages' => 'ژمارەی پەڕەکان',
 'pageinfo-category-subcats' => 'ژمارەی ژێرپەڕەکان',
 'pageinfo-category-files' => 'ژمارەی پەڕگەکان',
@@ -2878,7 +2924,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'پانی',
 'exif-imagelength' => 'بەرزی',
 'exif-ycbcrpositioning' => 'شوێنی Y و C',
@@ -2945,7 +2991,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' => 'خاوەنی مافی بڵاوکردنەوە',
@@ -3287,7 +3333,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' => 'ڕەمەزان',
@@ -3329,13 +3375,6 @@ $5
 'version-software-version' => 'وەشان',
 'version-entrypoints-header-url' => 'ناونیشانی ئینتەرنێتی',
 
-# Special:FilePath
-'filepath' => 'ڕێڕەوی پەڕگە',
-'filepath-page' => 'پەڕگە:',
-'filepath-submit' => 'بڕۆ',
-'filepath-summary' => 'ئەم لاپەڕە تایبەتە ڕێڕەوی تەواو بۆ پەڕگەیەک دەگەڕێنێتەوە.
-وێنەکان لە قەبارەی تەواو‌دا نیشان‌ دەدرێن و جۆرە پەڕگەکانی دیکە بە پڕۆگرامی هاوپەیوەندی خۆی ڕاستەوخۆ دەست‌پێ‌دەکات.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'گەڕان بۆ پەڕگە دووپات کراوەکان',
 'fileduplicatesearch-summary' => 'گەڕان بۆ پەڕگە دووبارەکراوەکان لەسەر بنەمای نرخی hash.',
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..8010958 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',
@@ -254,7 +251,6 @@ $1',
 'disclaimers' => 'Mga pagpangindi',
 'disclaimerpage' => 'Project:Pangkabilugan nga pagpangindi',
 'edithelp' => 'Bulig sa pag-ilis',
-'edithelppage' => 'Help:Pag-ilis',
 'helppage' => 'Help:Mga ka-undan',
 'mainpage' => 'Panguna nga pahina',
 'mainpage-description' => 'Panguna nga pahina',
@@ -720,7 +716,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 fce5ba8..c863d15 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' => 'Денъиштирменинъ къыскъа тарифини бош ташласам мени тенбиле',
@@ -346,7 +344,6 @@ $1',
 'disclaimers' => 'Джевапкярлыкъ реди',
 'disclaimerpage' => 'Project:Умумий Малюмат Мукъавелеси',
 'edithelp' => 'Саифелер насыл денъиштирилир?',
-'edithelppage' => 'Help:Саифе насыл денъиштирилир',
 'helppage' => 'Help:Мундеридже',
 'mainpage' => 'Баш Саифе',
 'mainpage-description' => 'Баш Саифе',
@@ -853,7 +850,6 @@ $3 мына бу себепни бильдирди: ''$2''",
 'searchmenu-legend' => 'Къыдырув сазламалары',
 'searchmenu-exists' => "'''Бу викиде \"[[:\$1]]\" адлы бир саифе бар'''",
 'searchmenu-new' => "'''Бу викиде \"[[:\$1]]\" саифесини ярат!'''",
-'searchhelp-url' => 'Help:Мундеридже',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Бу префиксли саифелерни косьтер]]',
 'searchprofile-articles' => 'Малюмат саифелери',
 'searchprofile-project' => 'Ярдым ве лейха саифелери',
@@ -893,9 +889,6 @@ $3 мына бу себепни бильдирди: ''$2''",
 'search-external' => 'Тыш къыдырув',
 'searchdisabled' => '{{SITENAME}} сайтында къыдырув япма вакътынджа токътатылды. Бу арада Google къулланып {{SITENAME}} ичинде къыдырув япып оласынъыз. Къыдырув сайтларында индекслемелерининъ бираз эски къалгъан ола биледжегини козь огюне алынъыз.',
 
-# Quickbar
-'qbsettings' => 'Вызлы иришим сутун сазламалары',
-
 # Preferences page
 'preferences' => 'Сазламалар',
 'mypreferences' => 'Сазламалар',
@@ -1428,8 +1421,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 +1811,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 +1885,7 @@ MediaWiki интерфейсининъ чешит тиллерге терджи
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-make' => 'Камера маркасы',
 'exif-model' => 'Камера модели',
 'exif-artist' => 'Яратыджысы',
@@ -1922,7 +1910,7 @@ MediaWiki интерфейсининъ чешит тиллерге терджи
 'exif-gpstimestamp' => 'GPS сааты (атом сааты)',
 'exif-gpssatellites' => 'Ольчемек ичюн къуллангъаны спутниклер',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Сыкъыштырылмагъан',
 
 'exif-orientation-3' => '180° айландырылгъан',
index 2215b81..557ec86 100644 (file)
@@ -339,7 +339,6 @@ $1',
 'disclaimers' => 'Cevapkârlıq redi',
 'disclaimerpage' => 'Project:Umumiy Malümat Muqavelesi',
 'edithelp' => 'Saifeler nasıl deñiştirilir?',
-'edithelppage' => 'Help:Saife nasıl deñiştirilir',
 'helppage' => 'Help:Münderice',
 'mainpage' => 'Baş Saife',
 'mainpage-description' => 'Baş Saife',
@@ -847,7 +846,6 @@ Vikide bu saifege oşağan saifelerni [[Special:Search|tapıp baqıñız]].',
 'searchmenu-legend' => 'Qıdıruv sazlamaları',
 'searchmenu-exists' => "'''Bu vikide \"[[:\$1]]\" adlı bir saife bar'''",
 'searchmenu-new' => "'''Bu vikide \"[[:\$1]]\" saifesini yarat!'''",
-'searchhelp-url' => 'Help:Münderice',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Bu prefiksli saifelerni köster]]',
 'searchprofile-articles' => 'Malümat saifeleri',
 'searchprofile-project' => 'Yardım ve leyha saifeleri',
@@ -1418,8 +1416,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.',
@@ -1881,7 +1879,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ı',
@@ -1906,7 +1904,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',
index 0cf4a7a..4405518 100644 (file)
@@ -10,6 +10,7 @@
  * @author Chmee2
  * @author Danny B.
  * @author Dontlietome7
+ * @author Geitost
  * @author Helix84
  * @author Jachym
  * @author Jezevec
@@ -17,6 +18,7 @@
  * @author Kaganer
  * @author Kuvaly
  * @author Li-sung
+ * @author Littledogboy
  * @author Martin Kozák
  * @author Matěj Grabovský
  * @author Mercy
@@ -468,6 +470,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}}',
@@ -505,7 +519,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',
@@ -549,6 +563,7 @@ $messages = array(
 'create-this-page' => 'Vytvořit tuto stránku',
 'delete' => 'Smazat',
 'deletethispage' => 'Smazat stránku',
+'undeletethispage' => 'Obnovit tuto stránku',
 'undelete_short' => 'Obnovit $1 {{PLURAL:$1|verzi|verze|verzí}}',
 'viewdeleted_short' => 'Zobrazit {{PLURAL:$1|smazanou editaci|$1 smazané editace|$1 smazaných editací}}',
 'protect' => 'Zamknout',
@@ -602,7 +617,6 @@ $1',
 'disclaimers' => 'Vyloučení odpovědnosti',
 'disclaimerpage' => 'Project:Vyloučení odpovědnosti',
 'edithelp' => 'Pomoc při editování',
-'edithelppage' => 'Help:Jak editovat stránku',
 'helppage' => 'Help:Obsah',
 'mainpage' => 'Hlavní strana',
 'mainpage-description' => 'Hlavní strana',
@@ -748,6 +762,8 @@ $2',
 'namespaceprotected' => "Nemáte povoleno editovat stránky ve jmenném prostoru '''$1'''.",
 'customcssprotected' => 'Nemáte povoleno editovat tuto stránku s CSS, protože obsahuje osobní nastavení jiného uživatele.',
 'customjsprotected' => 'Nemáte povoleno editovat tuto stránku s JavaScriptem, protože obsahuje osobní nastavení jiného uživatele.',
+'mycustomcssprotected' => 'Nemáte oprávnění editovat tuto stránku s CSS.',
+'mycustomjsprotected' => 'Nemáte oprávnění editovat tuto stránku s JavaScriptem.',
 'ns-specialprotected' => 'Stránky ve jmenném prostoru {{ns:special}} nelze editovat.',
 'titleprotected' => "Stránku s tímto názvem nelze založit, protože název zamknul uživatel [[User:$1|$1]] s odůvodněním: ''$2''.",
 'filereadonlyerror' => "Nelze změnit soubor „$1“, protože úložiště souborů „$2“ je momentálně pouze pro čtení.
@@ -772,9 +788,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.',
@@ -787,25 +812,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)',
-'nologin' => "Dosud nemáte účet? '''$1'''.",
+'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.',
@@ -845,7 +890,7 @@ Kvůli prevenci zneužívání lze heslo zaslat jen jednou za $1 {{PLURAL:$1|hod
 'cannotchangeemail' => 'U uživatelských účtů na této wiki nelze měnit e-mailové adresy.',
 'emaildisabled' => 'Tento server nemůže odesílat e-maily.',
 'accountcreated' => 'Účet vytvořen',
-'accountcreatedtext' => 'Uživatelský účet $1 byl vytvořen.',
+'accountcreatedtext' => 'Uživatelský účet [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|diskuse]]) byl vytvořen.',
 'createaccount-title' => 'Vytvoření účtu na {{grammar:6sg|{{SITENAME}}}}',
 'createaccount-text' => 'Někdo vytvořil na {{grammar:6sg|{{SITENAME}}}} ($4) účet s vaší e-mailovou adresou.
 Jméno účtu: „$2“
@@ -882,13 +927,15 @@ 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 získání nového hesla vyplňte tento formulář.',
+'passwordreset-text-one' => 'Pro získání nového hesla vyplňte tento formulář.',
+'passwordreset-text-many' => '{{PLURAL:$1|Pro získání nového hesla zadejte jeden z údajů.}}',
 '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?',
@@ -916,7 +963,7 @@ tedy změnit, můžete tuto zprávu ignorovat a nadále používat původní hes
 Dočasné heslo: $2',
 '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 uživateli: $1',
+'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',
@@ -1120,13 +1167,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 „{{int:prefs-editing}}“ v uživatelském nastavení.',
+Přihlášení uživatelé si mohou toto varování vypnout na záložce „Editace“ v uživatelském nastavení.',
 
 # Content models
 'content-model-wikitext' => 'wikitext',
@@ -1332,7 +1380,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)',
@@ -1367,7 +1415,6 @@ Podrobnosti mohou být uvedeny v [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'searchmenu-legend' => 'Možnosti hledání',
 'searchmenu-exists' => "'''Na této wiki existuje stránka nazvaná „[[:$1]]“.'''",
 'searchmenu-new' => "'''Vytvořte na této wiki stránku „[[:$1]]“!'''",
-'searchhelp-url' => 'Help:Obsah',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Zobrazit stránky, jejichž název začíná „$1“]]',
 'searchprofile-articles' => 'Články',
 'searchprofile-project' => 'Nápověda a projektové stránky',
@@ -1488,7 +1535,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}}:',
@@ -1497,7 +1544,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ů}}.',
@@ -1509,7 +1556,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',
@@ -1551,6 +1599,8 @@ 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.',
+'userrights-removed-self' => 'Úspěšně jste si odebrali vlastní práva. Tudíž už nemáte k této stránce přístup.',
 
 # Groups
 'group' => 'Skupina:',
@@ -1620,7 +1670,11 @@ Tuto operaci nelze vrátit zpět.',
 'right-editinterface' => 'Editace zpráv uživatelského rozhraní',
 'right-editusercssjs' => 'Editace CSS a JS souborů jiných uživatelů',
 'right-editusercss' => 'Editace CSS souborů jiných uživatelů',
-'right-edituserjs' => 'Editace JS souborů jiných uživatelů',
+'right-edituserjs' => 'Editace JavaScriptových souborů jiných uživatelů',
+'right-editmyusercss' => 'Editace vašich uživatelských CSS souborů',
+'right-editmyuserjs' => 'Editace vašich uživatelských JavaScriptových souborů',
+'right-viewmywatchlist' => 'Prohlížení vlastního seznamu sledovaných stránek',
+'right-editmywatchlist' => 'Editace vlastního seznamu sledovaných stránek. Uvědomte si, že některé akce do něj mohou přidat stránky i bez tohoto oprávnění.',
 'right-rollback' => 'Rychlý revert úprav posledního uživatele editujícího danou stránku',
 'right-markbotedits' => 'Označování revertů jako editace bota',
 'right-noratelimit' => 'Imunita vůči rychlostním limitům',
@@ -1682,6 +1736,8 @@ Tuto operaci nelze vrátit zpět.',
 'action-userrights-interwiki' => 'upravovat práva uživatelů na jiných wiki',
 'action-siteadmin' => 'zamykat nebo odemykat databázi',
 'action-sendemail' => 'posílat e-maily',
+'action-editmywatchlist' => 'upravovat vlastní seznam sledovaných stránek',
+'action-viewmywatchlist' => 'prohlížet vlastní seznam sledovaných stránek',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|změna|změny|změn}}',
@@ -1736,7 +1792,7 @@ $3',
 '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]].',
+'uploadnologintext' => 'Pro načtení souboru se musíte $1.',
 'upload_directory_missing' => 'Adresář pro nahrávání souborů ($1) chybí a webový server ho nedokáže vytvořit.',
 'upload_directory_read_only' => 'Do adresáře pro načítané soubory ($1) nemá webserver právo zápisu.',
 'uploaderror' => 'Při načítání došlo k chybě',
@@ -1864,7 +1920,7 @@ $1',
 'upload-file-error-text' => 'Při vytváření dočasného souboru na serveru nastala vnitřní chyba.
 Kontaktuje prosím [[Special:ListUsers/sysop|správce]].',
 'upload-misc-error' => 'Neznámá chyba',
-'upload-misc-error-text' => 'Neznámá chyba se vyskytla během nahrávání souboru.  Zkontrolujte zda je URL platná a přístupné a zkuste to znovu.  Pokud se chyba znovu objeví, kontaktuje administrátora systému.',
+'upload-misc-error-text' => 'Neznámá chyba se vyskytla během nahrávání souboru.  Zkontrolujte zda je URL platná a přístupné a zkuste to znovu.  Pokud se chyba znovu objeví, kontaktuje [[Special:ListUsers/sysop|správce]].',
 'upload-too-many-redirects' => 'URL obsahovalo příliš mnoho přesměrování',
 'upload-unknown-size' => 'Neznámá velikost',
 'upload-http-error' => 'Došlo k chybě HTTP: $1',
@@ -2143,7 +2199,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}}',
@@ -2280,6 +2336,15 @@ Povinná je přinejmenším doména nejvyššího řádu, např. „*.org“.<br
 'listusers-noresult' => 'Nenalezen žádný uživatel.',
 'listusers-blocked' => '({{GENDER:$1|zablokován|zablokována|zablokován}})',
 
+# Special:ActiveUsers
+'activeusers' => 'Seznam aktivních uživatelů',
+'activeusers-intro' => 'Toto je seznam uživatelů, kteří byli nějak aktivní v {{plural:$1|posledním dni|posledních $1 dnech}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|akce|akce|akcí}} během {{PLURAL:$3|posledního dne|posledních $3 dnů}}',
+'activeusers-from' => 'Zobrazit uživatele počínaje od:',
+'activeusers-hidebots' => 'Skrýt roboty',
+'activeusers-hidesysops' => 'Skrýt správce',
+'activeusers-noresult' => 'Nenalezen žádný uživatel.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Práva skupin uživatelů',
 'listgrouprights-summary' => 'Toto je seznam uživatelských skupin definovaných na této wiki a&nbsp;jejich přístupových práv.
@@ -2329,7 +2394,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',
 
@@ -2358,8 +2423,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}}.',
@@ -2467,7 +2532,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í',
@@ -2599,7 +2664,7 @@ $1',
 'mycontris' => 'Příspěvky',
 'contribsub2' => '$1 ($2)',
 'nocontribs' => 'Nenalezeny žádné změny vyhovující kritériím.',
-'uctop' => ' (aktuální)',
+'uctop' => '(aktuální)',
 'month' => 'Do měsíce:',
 'year' => 'Do roku:',
 
@@ -2917,6 +2982,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.',
@@ -3068,7 +3135,6 @@ Uložte jej na svůj disk a nahrajte ho sem.',
 '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 */',
@@ -3237,11 +3303,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:
 
@@ -3267,7 +3347,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',
@@ -3445,7 +3525,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',
@@ -3685,19 +3765,23 @@ Poštovní program hlásí: $1',
 'confirmemail_loggedin' => 'Vaše e-mailová adresa byla potvrzena.',
 'confirmemail_error' => 'Nepodařilo se uložit vaše potvrzení.',
 'confirmemail_subject' => 'Potvrzení e-mailové adresy pro {{grammar:4sg|{{SITENAME}}}}',
-'confirmemail_body' => 'Někdo (patrně vy, z IP adresy $1) si registroval účet se jménem "$2" a touto e-mailovou adresou na {{grammar:6sg|{{SITENAME}}}}.
+'confirmemail_body' => 'Někdo (patrně vy, z IP adresy $1) si na {{grammar:6sg|{{SITENAME}}}}
+zaregistroval účet se jménem „$2“ a touto e-mailovou adresou.
 
-Pokud si přejete aktivovat e-mailové funkce na {{grammar:6sg|{{SITENAME}}}}, tak pro potvrzení, že tato adresa opravdu patří vám, přejděte svým internetovým prohlížečem na následující adresu:
+Pokud si přejete aktivovat e-mailové funkce na {{grammar:6sg|{{SITENAME}}}},
+tak pro potvrzení, že tato adresa opravdu patří vám, přejděte svým internetovým
+prohlížečem na následující adresu:
 
 $3
 
-Pokud jste o toto potvrzení *nežádali*, klikněte na následující odkaz, čímž potvrzení zrušíte:
+Pokud jste si tento účet *neregistrovali*, klikněte na následující odkaz,
+čímž potvrzení zrušíte:
 
 $5
 
 Platnost tohoto potvrzovacího kódu vyprší $4.',
-'confirmemail_body_changed' => 'Někdo (patrně vy, z IP adresy $1)
-změnil e-mailovou adresu k účtu "$2" na {{grammar:6sg|{{SITENAME}}}} na tuto adresu.
+'confirmemail_body_changed' => 'Někdo (patrně vy, z IP adresy $1) změnil e-mailovou adresu
+k účtu „$2“ na {{grammar:6sg|{{SITENAME}}}} na tuto adresu.
 
 Pokud si přejete aktivovat e-mailové funkce na {{grammar:6sg|{{SITENAME}}}},
 tak pro potvrzení, že tato adresa opravdu patří vám, přejděte svým
@@ -3705,7 +3789,7 @@ internetovým prohlížečem na následující adresu:
 
 $3
 
-Pokud jste o toto potvrzení *nežádali*, klikněte na následující odkaz,
+Pokud jste si tento účet *neregistrovali*, klikněte na následující odkaz,
 čímž potvrzení zrušíte:
 
 $5
@@ -3781,7 +3865,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',
@@ -3919,12 +4003,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ů',
@@ -4016,6 +4105,7 @@ Obrázky se zobrazí v plném rozlišení, jiné typy souborů se otevřenou v p
 '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í',
index ae8744a..1826e8e 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',
@@ -263,7 +261,6 @@ $messages = array(
 'disclaimers' => 'Prawné zastrzedżi',
 'disclaimerpage' => 'Project:Prawné zastrzedżi',
 'edithelp' => 'Pòmòc do edicëji',
-'edithelppage' => 'Help:Editowanié starnë',
 'helppage' => 'Help:Spisënk zamkłoscë',
 'mainpage' => 'Przédnô starna',
 'mainpage-description' => 'Przédnô starna',
@@ -583,9 +580,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 +884,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 +911,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 +1221,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 +1237,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..57412c8 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' => 'Тӳрлетӳсен кĕске ăнлантарăвне кăтартман чухне асăрхаттармалла',
@@ -253,7 +251,6 @@ $messages = array(
 'disclaimers' => 'Яваплăха тивĕçтерменни',
 'disclaimerpage' => 'Project:Яваплăха тивĕçтерменни',
 'edithelp' => 'Улшăнусене кĕртме пулăшакан пулăшу',
-'edithelppage' => 'Help:Улшăнусене кĕртме пулăшакан пулăшу',
 'helppage' => 'Help:Пулăшу',
 'mainpage' => 'Тĕп страница',
 'mainpage-description' => 'Тĕп страницă',
@@ -580,16 +577,12 @@ $1 хутшăнакан патне, е ытти [[{{MediaWiki:Grouppage-sysop}}|
 'textmatches' => 'Статьясенчи текст пĕрпеклĕхĕ',
 'prevn' => 'малтанхи {{PLURAL:$1|$1}}',
 'nextn' => 'малалли {{PLURAL:$1|$1}}',
-'searchhelp-url' => 'Help:Пулăшу',
 'search-result-size' => '$1 ({{PLURAL:$2|1 сăмах|$2 сăмах}})',
 'showingresults' => 'Аяларах эсир <b>#$2</b> пуçласа кăтартнă <b>$1</b> йĕркене куратăр.',
 'showingresultsheader' => "{{PLURAL:$5|Результат '''$1'''  '''$3''' хушшинчен|Результатсем'''$1 - $2''' '''$3''' хушшинчен}}  '''$4''' валли",
 'powersearch' => 'Анлă шырав',
 'powersearch-legend' => 'Анлă шырав',
 
-# Quickbar
-'qbsettings' => 'Навигаци хăми',
-
 # Preferences page
 'preferences' => 'Ĕнерлевсем',
 'mypreferences' => 'Ман ĕнерлевсем',
@@ -888,7 +881,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'listgrouprights-group' => 'Ушкăн',
 'listgrouprights-helppage' => 'Help:Ушкăн прависем',
 
-# E-mail user
+# Email user
 'emailuser' => 'Хутшăнакана çыру яр... (Письмо участнику)',
 'usermailererror' => 'Электронлă почта урлă пĕлтерӳ янă чухне йăнăш тухрĕ:',
 'noemailtitle' => 'Электронлă почта адресĕ çук',
@@ -1128,7 +1121,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Metadata
 'metadata' => 'Метаданнăйсем:',
 
-# EXIF tags
+# Exif tags
 'exif-exifversion' => 'Exif версийĕ',
 'exif-flashpixversion' => 'Ĕçлеме пултаракан FlashPix версийĕ',
 'exif-gpsversionid' => 'GPS-информаци блокĕн версийĕ',
@@ -1147,7 +1140,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'watchlistall2' => 'пурте',
 'namespacesall' => 'пурте',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail_sent' => 'Çирĕплетмелли ыйтуллă çырăва ятăмăр.',
 'confirmemail_success' => 'Сирĕн электронлă почтăн адресне çирĕплентĕ.',
 'confirmemail_loggedin' => 'Сирĕн электронлă почтăн адресне çирĕплетрĕмĕр.',
@@ -1193,10 +1186,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Special:Version
 'version' => 'MediaWiki версийĕ',
 
-# Special:FilePath
-'filepath' => 'Файл çулĕ',
-'filepath-submit' => 'Çул',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Пĕр пек файлсен шыравĕ',
 'fileduplicatesearch-legend' => 'Дубликатсен шыравĕ',
index 58a4f9d..14c2083 100644 (file)
@@ -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,7 +156,7 @@ $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',
@@ -226,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}}',
@@ -302,12 +312,13 @@ $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}}',
+'undeletethispage' => 'Adfer y dudalen hon',
+'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',
@@ -360,7 +371,6 @@ $1',
 'disclaimers' => 'Gwadiadau',
 'disclaimerpage' => 'Project:Gwadiad Cyffredinol',
 'edithelp' => 'Help gyda golygu',
-'edithelppage' => 'Help:Golygu',
 'helppage' => 'Help:Cymorth',
 'mainpage' => 'Hafan',
 'mainpage-description' => 'Hafan',
@@ -505,6 +515,8 @@ $2",
 'namespaceprotected' => "Nid oes caniatâd gennych i olygu tudalennau yn y parth '''$1'''.",
 'customcssprotected' => "Nid oes caniatâd ganddoch i olygu'r dudalen CSS hon oherwydd bod gosodiadau personol defnyddiwr arall arno.",
 'customjsprotected' => "Nid oes caniatâd ganddoch i olygu'r dudalen JavaScript hon oherwydd bod gosodiadau personol defnyddiwr arall arno.",
+'mycustomcssprotected' => "Does dim caniatad gennych i olygu'r dudalen CSS hon.",
+'mycustomjsprotected' => "Does dim caniatad gennych i olygu'r dudalen JavaScript hon.",
 'ns-specialprotected' => 'Ni ellir golygu tudalennau arbennig.',
 'titleprotected' => "Diogelwyd y teitl hwn rhag ei greu gan [[User:$1|$1]].
 Rhoddwyd y rheswm hwn - ''$2''.",
@@ -529,11 +541,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',
@@ -544,18 +565,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.',
@@ -600,7 +641,7 @@ Felly ni chaiff defnyddwyr sy'n defnyddio'r cyfeiriad IP hwn greu rhagor o gyfri
 'cannotchangeemail' => 'Ni ellir newid cyfeiriadau e-bost i gyfrifon ar y wici hwn.',
 'emaildisabled' => 'Ni all y wefan hon anfon e-byst.',
 'accountcreated' => 'Crëwyd y cyfrif',
-'accountcreatedtext' => 'Crëwyd cyfrif defnyddiwr ar gyfer $1.',
+'accountcreatedtext' => 'Gosodwyd cyfrif defnyddiwr ar gyfer [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|sgwrs]]).',
 'createaccount-title' => 'Creu cyfrif ar {{SITENAME}}',
 'createaccount-text' => 'Creodd rhywun gyfrif o\'r enw $2 ar {{SITENAME}} ($4) ar gyfer y cyfeiriad e-bost hwn. "$3" yw\'r cyfrinair ar gyfer "$2". Dylech fewngofnodi a newid eich cyfrinair yn syth.
 
@@ -634,13 +675,15 @@ 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 ailosod eich cyfrinair.',
+'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?',
@@ -663,7 +706,7 @@ Dylech fewngofnodi nawr a dewis cyfrinair newydd. Os mai rhywun arall a ofynodd
 Y cyfrinair dros dro: $2",
 'passwordreset-emailsent' => 'Anfonwyd e-bost i ailosod eich cyfrinair atoch.',
 'passwordreset-emailsent-capture' => "Anfonwyd e-bost i ailosod cyfrinair, ac fe'i ddangosir isod.",
-'passwordreset-emailerror-capture' => "Lluniwyd e-bost i ailosod cyfrinair fel ag a welir isod, ond ni lwyddwyd i'w anfon at y defnyddiwr: $1",
+'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',
@@ -869,6 +912,7 @@ 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',
@@ -876,7 +920,7 @@ Mae ar gael yn barod.',
 '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.
-Gallwch ddiddymu\'r rhybudd hwn yn yr adran "{{int:prefs-editing}}" yn eich dewisiadau.',
+Os ydych wedi mewngofnodi gallwch ddiddymu\'r rhybudd hwn yn yr adran "Golygu" yn eich dewisiadau.',
 
 # Content models
 'content-model-wikitext' => 'cystrawen wici',
@@ -1117,7 +1161,6 @@ Mae manylion pellach i'w cael yn [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'searchmenu-legend' => 'Dewisiadau chwilio',
 'searchmenu-exists' => "'''Mae tudalen o'r enw \"[[\$1]]\" ar y wici hwn'''",
 'searchmenu-new' => "'''Creu'r dudalen \"[[:\$1]]\" ar y wici hwn!'''",
-'searchhelp-url' => 'Help:Cymorth',
 'searchmenu-prefix' => "[[Special:PrefixIndex/$1|Chwilio drwy tudalennau gyda'r rhagddodiad hwn]]",
 'searchprofile-articles' => 'Tudalennau pwnc (erthyglau/ffeiliau)',
 'searchprofile-project' => 'Tudalennau Cymorth a Phrosiect',
@@ -1160,6 +1203,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.",
+'search-error' => 'Cafwyd gwall wrth chwilio: $1',
 
 # Preferences page
 'preferences' => 'Dewisiadau',
@@ -1303,6 +1347,8 @@ 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.',
+'userrights-removed-self' => "Rydych wedi llwyddo rhoi'r gorau i'ch galluoedd. Gan hynny, nid ydych yn cael myned i'r dudalen hon bellach.",
 
 # Groups
 'group' => 'Grŵp:',
@@ -1373,6 +1419,10 @@ Mae'r wybodaeth hon ar gael i'r cyhoedd.",
 'right-editusercssjs' => 'Golygu ffeiliau CSS a JS yn perthyn i ddefnyddwyr eraill',
 'right-editusercss' => 'Golygu ffeiliau CSS yn perthyn i ddefnyddwyr eraill',
 'right-edituserjs' => 'Golygu ffeiliau JS yn perthyn i ddefnyddwyr eraill',
+'right-editmyusercss' => 'Golygu eich ffeiliau defnyddiwr CSS eich hunan.',
+'right-editmyuserjs' => 'Golygu eich ffeiliau defnyddiwr JavaScript eich hunan.',
+'right-viewmywatchlist' => 'Gweld eich rhestr wylio',
+'right-editmywatchlist' => 'Golygu eich rhestr wylio. Sylwer bod rhai gweithredoedd yn arwain at ychwanegu tudalennau hyd yn oed heb yr hawl hon.',
 'right-rollback' => 'Gwrthdroi golygiadau defnyddiwr diwethaf rhyw dudalen yn sydyn',
 'right-markbotedits' => 'Marcio golygiadau wedi eu gwrthdroi yn olygiadau bot',
 'right-noratelimit' => 'Bod heb gyfyngiad ar gyflymder eich gweithredoedd',
@@ -1434,6 +1484,8 @@ Mae'r wybodaeth hon ar gael i'r cyhoedd.",
 'action-userrights-interwiki' => 'golygu galluoedd y defnyddwyr ar wicïau eraill',
 'action-siteadmin' => "cloi neu ddatgloi'r databas",
 'action-sendemail' => 'anfon e-bost',
+'action-editmywatchlist' => 'golygu eich rhestr wylio',
+'action-viewmywatchlist' => 'gweld eich rhestr wylio',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|newid|newid|newid|newid|newid|o newidiadau}}',
@@ -1487,7 +1539,7 @@ Mae'r wybodaeth hon ar gael i'r cyhoedd.",
 'reuploaddesc' => "Dileu'r uwchlwytho a dychwelyd i'r ffurflen uwchlwytho",
 'upload-tryagain' => "Uwchlwyther disgrifiad newydd o'r ffeil",
 'uploadnologin' => 'Nid ydych wedi mewngofnodi',
-'uploadnologintext' => "Mae'n rhaid i chi [[Special:UserLogin|fewngofnodi]] er mwyn uwchlwytho ffeiliau.",
+'uploadnologintext' => "Mae'n rhaid $1 er mwyn uwchlwytho ffeiliau.",
 'upload_directory_missing' => "Mae'r cyfeiriadur uwchlwytho ($1) yn eisiau, ac ni allai'r gweinydd gwe ei greu.",
 'upload_directory_read_only' => "Ni all y gweinydd ysgrifennu i'r cyfeiriadur uwchlwytho ($1).",
 'uploaderror' => "Gwall tra'n uwchlwytho ffeil",
@@ -2028,6 +2080,15 @@ Mae angen parth lefel-uchaf o leiaf, er enghraifft "*.org".<br />
 'listusers-noresult' => "Dim defnyddiwr i'w gael.",
 'listusers-blocked' => '(wedi ei flocio)',
 
+# Special:ActiveUsers
+'activeusers' => 'Rhestr defnyddwyr gweithgar',
+'activeusers-intro' => 'Dyma restr y defnyddwyr a fuont yn weithgar o fewn y {{PLURAL:$1|diwrnod|diwrnod|deuddydd|tridiau|$1 diwrnod|$1 diwrnod}} diwethaf.',
+'activeusers-count' => '$1 {{PLURAL:$1|golygiad|golygiad|olygiad|golygiad}} yn ystod y {{PLURAL:$3|diwrnod|diwrnod|deuddydd|tridiau|$3 diwrnod}} diwethaf',
+'activeusers-from' => "Rhestru'r defnyddwyr gan ddechrau gyda:",
+'activeusers-hidebots' => 'Cuddio botiau',
+'activeusers-hidesysops' => 'Cuddio gweinyddwyr',
+'activeusers-noresult' => "Dim defnyddwyr i'w cael.",
+
 # Special:ListGroupRights
 'listgrouprights' => 'Galluoedd grwpiau defnyddwyr',
 'listgrouprights-summary' => "Dyma restr o'r grwpiau defnyddwyr sydd i'w cael ar y wici hon, ynghyd â galluoedd aelodau'r gwahanol grwpiau. Cewch wybodaeth pellach am y gwahanol alluoedd ar y [[{{MediaWiki:Listgrouprights-helppage}}|dudalen gymorth]].",
@@ -2106,8 +2167,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.',
@@ -2684,6 +2745,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',
@@ -2985,11 +3048,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:
 
@@ -3018,7 +3095,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',
@@ -3196,7 +3273,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',
@@ -3597,12 +3674,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',
@@ -3693,6 +3775,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',
index 3094234..e151c99 100644 (file)
@@ -16,6 +16,7 @@
  * @author EPO
  * @author Emilkris33
  * @author Froztbyte
+ * @author Geitost
  * @author Gorbi
  * @author H92
  * @author HenrikKbh
@@ -220,8 +221,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',
@@ -236,6 +235,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',
@@ -299,6 +299,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}}',
@@ -380,6 +392,7 @@ $messages = array(
 'create-this-page' => 'Opret denne side',
 'delete' => 'Slet',
 'deletethispage' => 'Slet side',
+'undeletethispage' => 'Gendan denne side',
 'undelete_short' => 'Fortryd sletning af {{PLURAL:$1|én version|$1 versioner}}',
 'viewdeleted_short' => 'Vis {{PLURAL:$1|en slettet redigering|$1 slettede redigeringer}}',
 'protect' => 'Beskyt',
@@ -433,7 +446,6 @@ $1',
 'disclaimers' => 'Forbehold',
 'disclaimerpage' => 'Project:Generelle forbehold',
 'edithelp' => 'Hjælp til redigering',
-'edithelppage' => 'Help:Hvordan redigerer jeg en side',
 'helppage' => 'Help:Hjælp',
 'mainpage' => 'Forside',
 'mainpage-description' => 'Forside',
@@ -487,15 +499,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-template' => 'Skabelon',
+'nstab-help' => 'Hjælp',
+'nstab-category' => 'Kategori',
 
 # Main script and global functions
 'nosuchaction' => 'Funktionen findes ikke',
@@ -579,6 +591,8 @@ $2',
 'namespaceprotected' => 'Du har ikke rettigheder til at redigere sider i $1-navnerummet.',
 'customcssprotected' => 'Du har ikke tilladelse til at redigere denne CSS-side, da den indeholder en anden brugers personlige indstillinger.',
 'customjsprotected' => 'Du har ikke tilladelse til at redigere denne JavaScript-side, da den indeholder en anden brugers personlige indstillinger.',
+'mycustomcssprotected' => 'Du har ikke rettigheder til at redigere denne CSS-side.',
+'mycustomjsprotected' => 'Du har ikke rettigheder til at redigere denne JavaScript-side.',
 'ns-specialprotected' => 'Sider i navnerummet {{ns:special}} kan ikke redigeres.',
 'titleprotected' => "Dette sidenavn er beskyttet mod oprettelse af [[User:$1|$1]]. Begrundelsen for beskyttelsen er ''$2''.",
 'filereadonlyerror' => 'Ude af stand til at redigere filen "$1", fordi fildatabasen "$2" er skrivebeskyttet.
@@ -603,9 +617,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.',
@@ -618,18 +641,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.',
@@ -680,7 +723,7 @@ Derfor kan besøgende ikke oprette flere kontoer fra denne IP-adresse i øjeblik
 'cannotchangeemail' => 'De email-adresser, der er tilknyttet brugerkontoer, kan ikke ændres på denne wiki.',
 'emaildisabled' => 'Denne hjemmeside kan ikke sende emails.',
 'accountcreated' => 'Brugerkonto oprettet',
-'accountcreatedtext' => 'Brugerkontoen $1 er oprettet.',
+'accountcreatedtext' => 'Brugerkontoen for [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|diskussion]]) er oprettet.',
 'createaccount-title' => 'Opret brugerkonto på {{SITENAME}}',
 'createaccount-text' => 'Nogen har oprettet en konto for din e-post-adresse på {{SITENAME}} ($4) med navnet "$2". Adgangskoden er "$3".
 Du opfordres til at logge ind og ændre adgangskoden med det samme.
@@ -715,13 +758,15 @@ 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 nulstille din adgangskode.',
+'passwordreset-text-one' => 'Udfyld denne formular for at nulstille din adgangskode.',
+'passwordreset-text-many' => '{{PLURAL:$1|Udfyld en af oplysningerne nedenfor for at nulstille din adgangskode.}}',
 '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?',
@@ -744,7 +789,7 @@ Du bør logge på og vælge en ny adgangskode nu. Hvis en anden end dig har gjor
 Midlertidig adgangskode: $2',
 '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 e-mail om nulstilling af adgangskode, som vist nedenfor, blev genereret, men det lykkedes ikke at sende den til brugeren: $1',
+'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',
@@ -781,7 +826,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',
@@ -956,11 +1001,14 @@ Sletnings- og flytteloggerne for siden er vist nedenfor.',
 Den ser du til at være slettet.',
 'edit-conflict' => 'Redigeringskonflikt.',
 'edit-no-change' => 'Din ændring ignoreredes, fordi der ikke var ændring af teksten.',
+'postedit-confirmation' => 'Din redigering er gemt.',
 'edit-already-exists' => 'En ny side kunne ikke oprettes, fordi den allerede findes.',
 'defaultmessagetext' => 'Standardtekst',
 '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',
@@ -1197,7 +1245,6 @@ Detaljer kan findes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'searchmenu-legend' => 'Søgemuligheder',
 'searchmenu-exists' => "'''Der er en side med navnet \"[[:\$1]]\" på denne wiki'''",
 'searchmenu-new' => "'''Opret siden \"[[:\$1]]\" i denne wiki'''",
-'searchhelp-url' => 'Help:Hjælp',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Vis alle sider som begynder med dette præfiks]]',
 'searchprofile-articles' => 'Indholdssider',
 'searchprofile-project' => 'Hjælpe- og projektsider',
@@ -1239,6 +1286,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>',
+'search-error' => 'Der opstod en fejl under søgning: $1',
 
 # Preferences page
 'preferences' => 'Indstillinger',
@@ -1370,8 +1418,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:',
@@ -1381,6 +1429,8 @@ 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.',
+'userrights-removed-self' => 'Du har fjernet dine egne rettigheder. Du har derfor ikke længere adgang til denne side.',
 
 # Groups
 'group' => 'Gruppe:',
@@ -1451,6 +1501,8 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
 'right-editusercssjs' => 'Ændre andre brugeres JS og CSS filer',
 'right-editusercss' => 'Ændre andre brugeres CSS filer',
 'right-edituserjs' => 'Ændre andre brugeres JS filer',
+'right-editmyusercss' => 'Redigere dine egne CSS-filer',
+'right-editmyuserjs' => 'Redigere dine egne JavaScript-filer',
 'right-rollback' => 'Hurtig gendannelse af alle redigeringer foretaget af den seneste bruger',
 'right-markbotedits' => 'Markere gendannelser som ændringer foretaget af en robot',
 'right-noratelimit' => 'Upåvirket af hastighedsgrænser',
@@ -1695,9 +1747,9 @@ $1',
 'upload-proto-error-text' => 'Adressen skal begynde med <code>http://</code> eller <code>ftp://</code>.',
 'upload-file-error' => 'Intern fejl',
 'upload-file-error-text' => 'Ved oprettelse af en midlertidig fil på serveren, er der sket en fejl.
-Informer venligst en [[Special:ListUsers/sysop|systemadministrator]].',
+Informer venligst en [[Special:ListUsers/sysop|administrator]].',
 'upload-misc-error' => 'Ukendt fejl ved upload',
-'upload-misc-error-text' => 'Ved upload er der sket en ukendt fejl. Kontroller adressen for fejl, sidens onlinestatus og forsøg igen. Hvis problemet fortsætter, informeres en system-administrator.',
+'upload-misc-error-text' => 'Ved upload er der sket en ukendt fejl. Kontroller adressen for fejl, sidens onlinestatus og forsøg igen. Hvis problemet fortsætter, informeres en [[Special:ListUsers/sysop|administrator]].',
 'upload-too-many-redirects' => "URL'en indeholdt for mange omdirigeringer",
 'upload-unknown-size' => 'Ukendt størrelse',
 'upload-http-error' => 'Der opstod en HTTP-fejl: $1',
@@ -1947,9 +1999,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.
@@ -2092,7 +2144,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',
 
@@ -2113,6 +2165,15 @@ Der skal som minimum angives et topniveau-domæne som f. eks. "*.org".<br />
 'listusers-noresult' => 'Ingen bruger fundet.',
 'listusers-blocked' => '(blokeret)',
 
+# Special:ActiveUsers
+'activeusers' => 'Liste over aktive brugere',
+'activeusers-intro' => 'Dette er en liste over brugere, som har haft en eller anden form for aktivitet inden for {{PLURAL:$1|den|de}} seneste {{PLURAL:$1|dag|$1 dage}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|handling|handlinger}} i {{PLURAL:$3|det seneste døgn|de seneste $3 dage}}',
+'activeusers-from' => 'Vis brugere som starter med:',
+'activeusers-hidebots' => 'Skjul robotter',
+'activeusers-hidesysops' => 'Skjul administratorer',
+'activeusers-noresult' => 'Ingen brugere fundet.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Brugergrupperettigheder',
 'listgrouprights-summary' => 'Denne side viser de brugergrupper der er defineret på denne wiki og de enkelte gruppers rettigheder.
@@ -2191,13 +2252,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',
 
@@ -2437,7 +2498,7 @@ $1',
 'mycontris' => 'Bidrag',
 'contribsub2' => 'For $1 ($2)',
 'nocontribs' => 'Ingen ændringer er fundet som opfylder disse kriterier.',
-'uctop' => ' (seneste)',
+'uctop' => '(seneste)',
 'month' => 'Måned:',
 'year' => 'År:',
 
@@ -2757,6 +2818,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',
@@ -3064,11 +3127,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:
 
@@ -3095,7 +3172,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',
@@ -3273,7 +3350,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',
@@ -3680,12 +3757,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',
@@ -3732,7 +3814,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.',
@@ -3775,6 +3857,9 @@ 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',
index c5d5507..a7a0939 100644 (file)
@@ -13,6 +13,7 @@
  * @author Church of emacs
  * @author DaSch
  * @author Das Schäfchen
+ * @author DerHexer
  * @author Dschwen
  * @author Duesentrieb
  * @author Filzstift
@@ -43,6 +44,7 @@
  * @author MichaelFrey
  * @author MtaÄ
  * @author Omnipaedista
+ * @author Patrick87
  * @author Pill
  * @author Purodha
  * @author Raimond Spekking (Raymond) <raimond.spekking@gmail.com> since January 2007
@@ -162,6 +164,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 +176,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 +257,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' ),
@@ -517,6 +523,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}}',
@@ -533,8 +551,8 @@ $messages = array(
 'category-file-count' => '{{PLURAL:$2|Diese Kategorie enthält folgende Datei:|{{PLURAL:$1|Folgende Datei ist eine von insgesamt $2 Dateien in dieser Kategorie:|Es werden $1 von insgesamt $2 Dateien in dieser Kategorie angezeigt:}}}}',
 'category-file-count-limited' => 'Folgende {{PLURAL:$1|Datei ist|$1 Dateien sind}} in dieser Kategorie enthalten:',
 'listingcontinuesabbrev' => '(Fortsetzung)',
-'index-category' => 'Indizierte Seiten',
-'noindex-category' => 'Nichtindizierte Seiten',
+'index-category' => 'Indexierte Seiten',
+'noindex-category' => 'Nichtindexierte Seiten',
 'broken-file-category' => 'Seiten mit defekten Dateilinks',
 
 'about' => 'Über',
@@ -586,7 +604,7 @@ $messages = array(
 'go' => 'Ausführen',
 'searcharticle' => 'Seite',
 'history' => 'Versionen',
-'history_short' => 'Versionen/Autoren',
+'history_short' => 'Versionsgeschichte',
 'updatedmarker' => 'Änderung seit meinem letzten Besuch',
 'printableversion' => 'Druckversion',
 'permalink' => 'Permanenter Link',
@@ -598,6 +616,7 @@ $messages = array(
 'create-this-page' => 'Seite erstellen',
 'delete' => 'Löschen',
 'deletethispage' => 'Diese Seite löschen',
+'undeletethispage' => 'Diese Seite wiederherstellen',
 'undelete_short' => '{{PLURAL:$1|1 Version|$1 Versionen}} wiederherstellen',
 'viewdeleted_short' => '{{PLURAL:$1|Eine gelöschte Version|$1 gelöschte Versionen}} ansehen',
 'protect' => 'Schützen',
@@ -651,7 +670,6 @@ $1',
 'disclaimers' => 'Impressum',
 'disclaimerpage' => 'Project:Impressum',
 'edithelp' => 'Bearbeitungshilfe',
-'edithelppage' => 'Help:Bearbeiten',
 'helppage' => 'Help:Inhaltsverzeichnis',
 'mainpage' => 'Hauptseite',
 'mainpage-description' => 'Hauptseite',
@@ -799,6 +817,8 @@ $2',
 'namespaceprotected' => "Du hast nicht die erforderliche Berechtigung, um Seiten im Namensraum '''$1''' bearbeiten zu können.",
 'customcssprotected' => 'Du hast nicht die Berechtigung, diese CSS enthaltende Seite zu bearbeiten, da sie die persönlichen Einstellungen eines anderen Benutzers enthält.',
 'customjsprotected' => 'Du hast nicht die Berechtigung, diese JavaScript enthaltende Seite zu bearbeiten, da es sich hierbei um die persönlichen Einstellungen eines anderen Benutzers handelt.',
+'mycustomcssprotected' => 'Du hast keine Berechtigung, diese CSS-Seite zu bearbeiten.',
+'mycustomjsprotected' => 'Du hast keine Berechtigung, diese JavaScript-Seite zu bearbeiten.',
 'ns-specialprotected' => 'Spezialseiten können nicht bearbeitet werden.',
 'titleprotected' => "Eine Seite mit diesem Namen kann nicht angelegt werden.
 Die Sperre wurde durch [[User:$1|$1]] mit der Begründung ''„$2“'' eingerichtet.",
@@ -829,10 +849,13 @@ Vergiss nicht, deine [[Special:Preferences|{{SITENAME}}-Einstellungen]] zu ände
 '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' => 'Mit dem sicheren Server anmelden',
+'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.',
@@ -847,20 +870,36 @@ Vergiss nicht, deine [[Special:Preferences|{{SITENAME}}-Einstellungen]] zu ände
 'notloggedin' => 'Nicht angemeldet',
 'userlogin-noaccount' => 'Du hast noch kein Benutzerkonto?',
 'userlogin-joinproject' => '{{SITENAME}} beitreten',
-'nologin' => "Du hast kein Benutzerkonto? '''$1'''.",
+'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.',
@@ -910,7 +949,7 @@ Besucher, die diese IP-Adresse verwenden, können momentan keine Benutzerkonten
 'cannotchangeemail' => 'E-Mail-Adressen können in diesem Wiki nicht geändert werden.',
 'emaildisabled' => 'Über diese Website können keine E-Mails versandt werden.',
 'accountcreated' => 'Benutzerkonto erstellt',
-'accountcreatedtext' => 'Das Benutzerkonto $1 wurde eingerichtet.',
+'accountcreatedtext' => 'Das Benutzerkonto für [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|Diskussion]]) wurde eingerichtet.',
 'createaccount-title' => 'Erstellung eines Benutzerkontos für {{SITENAME}}',
 'createaccount-text' => 'Es wurde für dich ein Benutzerkonto „$2“ auf {{SITENAME}} ($4) erstellt. Das automatisch generierte Passwort für „$2“ ist „$3“. Du solltest dich nun anmelden und das Passwort ändern.
 
@@ -944,14 +983,15 @@ 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-emaildisabled' => 'Die E-Mail-Funktionen wurden auf diesem Wiki deaktiviert.',
-'passwordreset-pretext' => '{{PLURAL:$1||Gib eines der folgenden Daten ein.}}',
 'passwordreset-username' => 'Benutzername:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Die E-Mail-Nachricht ansehen?',
@@ -978,7 +1018,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',
@@ -1073,7 +1113,7 @@ Vermutlich wurde er verschoben oder gelöscht, nachdem du die Seite aufgerufen h
 Das Passwort für dieses neue Benutzerkonto kann auf der Spezialseite „[[Special:ChangePassword|Passwort ändern]]“ geändert werden.',
 'newarticle' => '(Neu)',
 'newarticletext' => "Du bist einem Link zu einer Seite gefolgt, die nicht vorhanden ist.
-Um diese Seite anzulegen, trage deinen Text in das untenstehende Bearbeitungsfeld ein (siehe die [[{{MediaWiki:Helppage}}|Hilfeseite]] für weitere Informationen).
+Um diese Seite anzulegen, trage deinen Text in das untenstehende Bearbeitungsfeld ein (weitere Informationen auf der [[{{MediaWiki:Helppage}}|Hilfeseite]]).
 Sofern du fälschlicherweise hier bist, klicke auf die Schaltfläche '''Zurück''' deines Browsers.",
 'anontalkpagetext' => "----''Diese Seite dient dazu, einem nicht angemeldeten Benutzer Nachrichten zu hinterlassen. Es wird seine IP-Adresse zur Identifizierung verwendet. IP-Adressen können von mehreren Benutzern gemeinsam verwendet werden. Wenn du mit den Kommentaren auf dieser Seite nichts anfangen kannst, richten sie sich vermutlich an einen früheren Inhaber deiner IP-Adresse und du kannst sie ignorieren. Du kannst dir auch ein [[Special:UserLogin/signup|Benutzerkonto erstellen]] oder dich [[Special:UserLogin|anmelden]], um künftig Verwechslungen mit anderen anonymen Benutzern zu vermeiden.''",
 'noarticletext' => 'Diese Seite enthält momentan noch keinen Text.
@@ -1099,7 +1139,7 @@ Zur Information folgt ein aktueller Auszug aus dem Benutzersperr-Logbuch:',
 'userjsyoucanpreview' => "'''Tipp:''' Benutze den „{{int:showpreview}}“-Button, um dein neues JavaScript vor dem Speichern zu testen.",
 'usercsspreview' => "'''Beachte, dass du nur eine Vorschau deines Benutzer-CSS betrachtest.'''
 '''Es wurde noch nicht gespeichert!'''",
-'userjspreview' => "'''Beachte, dass du nur eine Vorschau deines Benutzer-JavaScript betrachtest.'''
+'userjspreview' => "'''Beachte, dass du nur eine Vorschau deines Benutzer-JavaScripts betrachtest.'''
 '''Es wurde noch nicht gespeichert!'''",
 'sitecsspreview' => "'''Beachte, dass du nur eine Vorschau dieses CSS betrachtest.'''
 '''Es wurde noch nicht gespeichert!'''",
@@ -1136,7 +1176,7 @@ Bitte füge deine Änderungen in das obere Textfeld ein.
 '''Nur''' der Inhalt des oberen Textfeldes wird gespeichert, wenn du auf „{{int:savearticle}}“ klickst.",
 'yourtext' => 'Dein Text',
 'storedversion' => 'Gespeicherte Version',
-'nonunicodebrowser' => "'''Achtung:''' Dein Browser kann Unicode-Zeichen nicht richtig verarbeiten. Bitte verwende einen anderen Browser um Seiten zu bearbeiten.",
+'nonunicodebrowser' => "'''Achtung: Dein Browser kann Unicode-Zeichen nicht richtig verarbeiten.''' Es wird eine Hilfsroutine eingesetzt, um dir zu erlauben, Seiten sicher zu bearbeiten: Nicht-ASCII-Zeichen werden dabei im Bearbeitungsfenster als hexadezimale Codes angezeigt.",
 'editingold' => "'''Achtung: Du bearbeitest eine alte Version dieser Seite. Sofern du sie speicherst, werden alle neueren Versionen überschrieben.'''",
 'yourdiff' => 'Unterschiede',
 'copyrightwarning' => "'''Bitte kopiere keine Webseiten, die nicht deine eigenen sind, benutze keine urheberrechtlich geschützten Werke ohne Erlaubnis des Urhebers!'''<br />
@@ -1146,7 +1186,7 @@ Du gibst uns hiermit deine Zusage, dass du den Text '''selbst verfasst''' hast,
 Reiche hier keine Texte ein, falls du nicht willst, dass diese ohne Einschränkung geändert werden können.
 
 Du bestätigst hiermit auch, dass du diese Texte selbst geschrieben hast oder diese von einer gemeinfreien Quelle kopiert hast
-(siehe $1 für weitere Einzelheiten). '''ÜBERTRAGE OHNE GENEHMIGUNG KEINE URHEBERRECHTLICH GESCHÜTZTEN INHALTE!'''",
+(weitere Einzelheiten unter $1). '''ÜBERTRAGE OHNE GENEHMIGUNG KEINE URHEBERRECHTLICH GESCHÜTZTEN INHALTE!'''",
 'longpageerror' => "'''Fehler: Der Text, den du zu speichern versuchst, ist {{PLURAL:$1|ein Kilobyte|$1 Kilobyte}} groß. Dies ist größer als das erlaubte Maximum von {{PLURAL:$2|ein Kilobyte|$2 Kilobyte}}.'''
 Er kann nicht gespeichert werden.",
 'readonlywarning' => "'''Achtung: Die Datenbank wurde für Wartungsarbeiten gesperrt, so dass deine Änderungen derzeit nicht gespeichert werden können.
@@ -1186,13 +1226,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 „{{int:prefs-editing}}“-Bereich deiner Einstellungen abschalten.',
+Wenn du angemeldet bist, kannst du das Anzeigen dieser Warnung im Bereich „Bearbeiten“ deiner Einstellungen abschalten.',
 
 # Content models
 'content-model-wikitext' => 'Wikitext',
@@ -1413,8 +1454,8 @@ Einzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 # Search results
 'searchresults' => 'Suchergebnisse',
 'searchresults-title' => 'Suchergebnisse für „$1“',
-'searchresulttext' => 'Für mehr Informationen zur Suche siehe die [[{{MediaWiki:Helppage}}|Hilfeseite]].',
-'searchsubtitle' => 'Deine Suchanfrage: „[[:$1]]“ ([[Special:Prefixindex/$1|alle mit „$1“ beginnenden Seiten]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|alle Seiten, die nach „$1“ verlinken]])',
+'searchresulttext' => 'Mehr Informationen zur Suche sind auf der [[{{MediaWiki:Helppage}}|Hilfeseite]] zu finden.',
+'searchsubtitle' => 'Du hast nach „[[:$1]]“ gesucht ([[Special:Prefixindex/$1|alle mit „$1“ beginnenden Seiten]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|alle Seiten, die nach „$1“ verlinken]])',
 'searchsubtitleinvalid' => 'Deine Suchanfrage: „$1“.',
 'toomanymatches' => 'Die Anzahl der Suchergebnisse ist zu groß, bitte versuche eine andere Abfrage.',
 'titlematches' => 'Übereinstimmungen mit Seitentiteln',
@@ -1430,7 +1471,6 @@ Einzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'searchmenu-legend' => 'Suchoptionen',
 'searchmenu-exists' => "'''Es gibt eine Seite, die den Namen „[[:$1]]“ hat.'''",
 'searchmenu-new' => "'''Erstelle die Seite „[[:$1]]“ in diesem Wiki.'''",
-'searchhelp-url' => 'Help:Hilfe',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Zeige alle Seiten, die mit dem Suchbegriff anfangen]]',
 'searchprofile-articles' => 'Inhaltsseiten',
 'searchprofile-project' => 'Hilfe- und Projektseiten',
@@ -1439,7 +1479,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}})',
@@ -1460,7 +1500,7 @@ Einzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'showingresultsnum' => "Hier {{PLURAL:$3|ist '''1''' Ergebnis|sind '''$3''' Ergebnisse}}, beginnend mit Nummer '''$2.'''",
 'showingresultsheader' => "{{PLURAL:$5|Ergebnis '''$1''' von '''$3'''|Ergebnisse '''$1–$2''' von '''$3'''}} für '''$4'''",
 'nonefound' => "'''Hinweis:''' Es werden standardmäßig nur einige Namensräume durchsucht. Setze ''all:'' vor deinen Suchbegriff, um alle Seiten (inkl. Diskussionsseiten, Vorlagen usw.) zu durchsuchen oder gezielt den Namen des zu durchsuchenden Namensraumes.",
-'search-nonefound' => 'Für deine Suchanfrage wurden keine Ergebnisse gefunden.',
+'search-nonefound' => 'Zu deiner Suchanfrage wurden keine Ergebnisse gefunden.',
 'powersearch' => 'Erweiterte Suche',
 'powersearch-legend' => 'Erweiterte Suche',
 'powersearch-ns' => 'Suche in Namensräumen:',
@@ -1616,6 +1656,8 @@ 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.',
+'userrights-removed-self' => 'Du hast deine eigenen Rechte erfolgreich entfernt. Du kannst nicht länger auf diese Seite zugreifen.',
 
 # Groups
 'group' => 'Gruppe:',
@@ -1686,6 +1728,10 @@ Dies kann nicht mehr rückgängig gemacht werden.',
 'right-editusercssjs' => 'Fremde CSS- und JavaScript-Dateien bearbeiten',
 'right-editusercss' => 'Fremde CSS-Dateien bearbeiten',
 'right-edituserjs' => 'Fremde JavaScript-Dateien bearbeiten',
+'right-editmyusercss' => 'Eigene Benutzer-CSS-Dateien bearbeiten',
+'right-editmyuserjs' => 'Eigene Benutzer-JavaScript-Dateien bearbeiten',
+'right-viewmywatchlist' => 'Eigene Beobachtungsliste ansehen',
+'right-editmywatchlist' => 'Eigene Beobachtungsliste bearbeiten. Einige Aktionen ermöglichen das Hinzufügen von Seiten ohne dieses Recht.',
 'right-rollback' => 'Schnelles Zurücksetzen',
 'right-markbotedits' => 'Schnell zurückgesetzte Bearbeitungen als Bot-Bearbeitung markieren',
 'right-noratelimit' => 'Keine Beschränkung durch Limits',
@@ -1739,7 +1785,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',
@@ -1747,6 +1793,8 @@ Dies kann nicht mehr rückgängig gemacht werden.',
 'action-userrights-interwiki' => 'die Rechte von Benutzern in anderen Wikis zu ändern',
 'action-siteadmin' => 'die Datenbank zu sperren oder freizugeben',
 'action-sendemail' => 'E-Mails zu senden',
+'action-editmywatchlist' => 'deine Beobachtungsliste zu bearbeiten',
+'action-viewmywatchlist' => 'deine Beobachtungsliste anzusehen',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|Änderung|Änderungen}}',
@@ -1782,8 +1830,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
@@ -1802,7 +1850,7 @@ Stand: $4, $5 Uhr.",
 'reuploaddesc' => 'Abbrechen und zurück zur Hochladen-Seite',
 'upload-tryagain' => 'Geänderte Dateibeschreibung abschicken',
 'uploadnologin' => 'Nicht angemeldet',
-'uploadnologintext' => 'Du musst [[Special:UserLogin|angemeldet sein]], um Dateien hochladen zu können.',
+'uploadnologintext' => 'Du musst dich $1, um Dateien hochladen zu können.',
 'upload_directory_missing' => 'Das Upload-Verzeichnis ($1) fehlt und konnte durch den Webserver auch nicht erstellt werden.',
 'upload_directory_read_only' => 'Der Webserver hat keine Schreibrechte für das Upload-Verzeichnis ($1).',
 'uploaderror' => 'Fehler beim Hochladen',
@@ -1932,11 +1980,11 @@ $1',
 'upload-proto-error-text' => 'Die URL muss mit <code>http://</code> oder <code>ftp://</code> beginnen.',
 'upload-file-error' => 'Interner Fehler',
 'upload-file-error-text' => 'Bei der Erstellung einer temporären Datei auf dem Server ist ein interner Fehler aufgetreten.
-Bitte informiere einen [[Special:ListUsers/sysop|System-Administrator]].',
+Bitte informiere einen [[Special:ListUsers/sysop|Administrator]].',
 'upload-misc-error' => 'Unbekannter Fehler beim Hochladen',
 'upload-misc-error-text' => 'Beim Hochladen ist ein unbekannter Fehler aufgetreten.
 Prüfe die URL auf Fehler, den Online-Status der Seite und versuche es erneut.
-Wenn das Problem weiter besteht, informiere einen [[Special:ListUsers/sysop|System-Administrator]].',
+Wenn das Problem weiter besteht, informiere einen [[Special:ListUsers/sysop|Administrator]].',
 'upload-too-many-redirects' => 'Die URL beinhaltete zu viele Weiterleitungen',
 'upload-unknown-size' => 'Unbekannte Größe',
 'upload-http-error' => 'Ein HTTP-Fehler ist aufgetreten: $1',
@@ -2008,7 +2056,7 @@ Sie kann daher keiner ordnungsgemäßen Sicherheitsüberprüfung unterzogen werd
 'img-auth-nopathinfo' => 'Die Angabe PATH_INFO fehlt.
 Der Server ist nicht dafür eingerichtet, diese Information weiterzugeben.
 Sie könnte CGI-gestützt sein und kann daher „img_auth“ (Authentifizierung des Dateiaufrufs) nicht unterstützen.
-Siehe hierzu die Seite https://www.mediawiki.org/wiki/Manual:Image_Authorization (englisch) für weitere Informationen.',
+Siehe auch https://www.mediawiki.org/wiki/Manual:Image_Authorization (englisch).',
 'img-auth-notindir' => 'Der gewünschte Pfad ist nicht im konfigurierten Uploadverzeichnis.',
 'img-auth-badtitle' => 'Aus „$1“ kann kein gültiger Titel erstellt werden.',
 'img-auth-nologinnWL' => 'Du bist nicht angemeldet und „$1“ ist nicht in der weißen Liste.',
@@ -2348,6 +2396,15 @@ Siehe auch die Liste der [[Special:WantedCategories|gewünschten Kategorien]].',
 'listusers-noresult' => 'Keinen Benutzer gefunden.',
 'listusers-blocked' => '(gesperrt)',
 
+# Special:ActiveUsers
+'activeusers' => 'Aktive Benutzer',
+'activeusers-intro' => 'Dies ist eine Liste von Benutzern, die innerhalb {{PLURAL:$1|des letzten Tages|der letzten $1 Tage}} Aktivitäten aufwiesen.',
+'activeusers-count' => '$1 {{PLURAL:$1|Aktion|Aktionen}} in den {{PLURAL:$3|letzten 24 Stunden|vergangenen $3 Tagen}}',
+'activeusers-from' => 'Zeige Benutzer ab:',
+'activeusers-hidebots' => 'Bots ausblenden',
+'activeusers-hidesysops' => 'Administratoren ausblenden',
+'activeusers-noresult' => 'Keine Benutzer gefunden.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Benutzergruppenrechte',
 'listgrouprights-summary' => 'Dies ist eine Liste der in diesem Wiki definierten Benutzergruppen und der damit verbundenen Rechte.
@@ -2425,9 +2482,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}}.',
@@ -2955,7 +3012,7 @@ Alternativ ist der Export auch mit der Syntax [[{{#Special:Export}}/{{MediaWiki:
 'exportall' => 'Alle Seiten exportieren',
 'exportcuronly' => 'Nur die aktuelle Version der Seite exportieren',
 'exportnohistory' => "----
-'''Hinweis:''' Der Export kompletter Versionsgeschichten ist aus Performancegründen bis auf weiteres nicht möglich.",
+'''Hinweis:''' Der Export kompletter Versionsgeschichten ist aus Gründen der Systemleistung bis auf Weiteres nicht möglich.",
 'exportlistauthors' => 'Für jede Seite die jeweils vollständige Liste der Bearbeiter einbeziehen',
 'export-submit' => 'Seiten exportieren',
 'export-addcattext' => 'Seiten aus folgender Kategorie hinzufügen:',
@@ -2987,6 +3044,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,7 +3199,6 @@ Diese auf dem lokalen Rechner speichern und danach hier hochladen.',
 '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 */',
@@ -3150,7 +3208,7 @@ Diese auf dem lokalen Rechner speichern und danach hier hochladen.',
 # Scripts
 'common.js' => '/* Das folgende JavaScript wird für alle Benutzer geladen. */',
 '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 */',
+'monobook.js' => '/* Das folgende JavaScript wird für Benutzer der Monobook-Benutzeroberfläche geladen. */',
 '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. */',
@@ -3311,11 +3369,25 @@ Durch das Herunterladen und Öffnen der Datei kann dein Computer beschädigt wer
 'minutes' => '{{PLURAL:$1|$1 Minute|$1 Minuten}}',
 'hours' => '{{PLURAL:$1|1 Stunde|$1 Stunden}}',
 'days' => '{{PLURAL:$1|$1 Tag|$1 Tage}}',
+'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:
 
@@ -3343,7 +3415,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',
@@ -3521,7 +3593,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',
@@ -3734,7 +3806,7 @@ Weitere werden standardmäßig nicht angezeigt.
 
 # External editor support
 'edit-externally' => 'Diese Datei mit einem externen Programm bearbeiten',
-'edit-externally-help' => '(Siehe die [//www.mediawiki.org/wiki/Manual:External_editors Installationsanweisungen] für weitere Informationen)',
+'edit-externally-help' => '(weitere Informationen in den [//www.mediawiki.org/wiki/Manual:External_editors Installationsanweisungen])',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'alle',
@@ -3955,11 +4027,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',
@@ -4052,6 +4130,7 @@ Eine [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie der ''GNU General Public License'']
 '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',
@@ -4080,13 +4159,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 bd1951a..d8cccef 100644 (file)
@@ -16,6 +16,7 @@
  * @author Kaganer
  * @author Mirzali
  * @author Nemo bis
+ * @author Neribij
  * @author Olvörg
  * @author Reedy
  * @author Sahim
 $namespaceNames = array(
        NS_MEDIA            => 'Medya',
        NS_SPECIAL          => 'Xısusi',
-       NS_TALK             => 'Werênayış',
+       NS_TALK             => 'Mesac',
        NS_USER             => 'Karber',
-       NS_USER_TALK        => 'Karber_werênayış',
-       NS_PROJECT_TALK     => '$1_werênayış',
+       NS_USER_TALK        => 'Karber_mesac',
+       NS_PROJECT_TALK     => '$1_mesac',
        NS_FILE             => 'Dosya',
-       NS_FILE_TALK        => 'Dosya_werênayış',
+       NS_FILE_TALK        => 'Dosya_mesac',
        NS_MEDIAWIKI        => 'MediaWiki',
-       NS_MEDIAWIKI_TALK   => 'MediaWiki_werênayış',
+       NS_MEDIAWIKI_TALK   => 'MediaWiki_mesac',
        NS_TEMPLATE         => 'Şablon',
-       NS_TEMPLATE_TALK    => 'Şablon_werênayış',
+       NS_TEMPLATE_TALK    => 'Şablon_mesac',
        NS_HELP             => 'Peşti',
-       NS_HELP_TALK        => 'Peşti_werênayış',
+       NS_HELP_TALK        => 'Peşti_mesac',
        NS_CATEGORY         => 'Kategoriye',
-       NS_CATEGORY_TALK    => 'Kategoriye_werênayış',
+       NS_CATEGORY_TALK    => 'Kategoriye_mesac',
 );
 
 $namespaceAliases = array(
-       'Karber_mesac'       => NS_USER_TALK,
-       'Desteg'             => NS_HELP,
-       'Desteg_werênayış'   => NS_HELP_TALK,
-       'Kategori'           => NS_CATEGORY,
-       'Kategori_werênayış' => NS_CATEGORY_TALK,
+       'Werênayış'            => NS_TALK,
+       'Karber_werênayış'     => NS_USER_TALK,
+       '$1_werênayış'         => NS_PROJECT_TALK,
+       'Dosya_werênayış'      => NS_FILE_TALK,
+       'MediaWiki_werênayış'  => NS_MEDIAWIKI_TALK,
+       'Şablon_werênayış'     => NS_TEMPLATE_TALK,
+       'Desteg'               => NS_HELP,
+       'Desteg_werênayış'     => NS_HELP_TALK,
+       'Peşti_werênayış'      => NS_HELP_TALK,
+       'Kategori'             => NS_CATEGORY,
+       'Kategori_werênayış'   => NS_CATEGORY_TALK,
+       'Kategoriye_werênayış' => NS_CATEGORY_TALK,
 );
 
 $specialPageAliases = array(
@@ -60,15 +68,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ış' ),
@@ -309,12 +317,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)',
@@ -331,7 +339,7 @@ $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',
@@ -346,17 +354,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' => 'wexta ke ez pelo nêqeydbiyaye ra veciyaya mı hişyar bıker',
+'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 +389,7 @@ $messages = array(
 'fri' => 'Êne',
 'sat' => 'Şem',
 'january' => 'Çele',
-'february' => 'Şıbate',
+'february' => 'Sıbate',
 'march' => 'Adar',
 'april' => 'Nisane',
 'may_long' => 'Gulane',
@@ -393,7 +401,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 +413,7 @@ $messages = array(
 'november-gen' => 'Tışrino Peyên',
 'december-gen' => 'Kanun',
 'jan' => 'Çel',
-'feb' => 'Şbt',
+'feb' => 'Sbt',
 'mar' => 'Adr',
 'apr' => 'Nsn',
 'may' => 'Gln',
@@ -416,6 +424,16 @@ $messages = array(
 'oct' => 'Tşv',
 'nov' => 'Tşp',
 'dec' => 'Kan',
+'january-date' => 'Çele  $1',
+'february-date' => 'Şıbate $1',
+'march-date' => 'Adar $1',
+'april-date' => 'Nisane $1',
+'may-date' => 'Gulane $1',
+'june-date' => 'Hezirane $1',
+'july-date' => 'Temuze $1',
+'august-date' => 'Tebaxe $1',
+'september-date' => 'Keşkelun $1',
+'december-date' => 'Kanun $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategoriye|Kategoriy}}',
@@ -425,7 +443,7 @@ $messages = array(
 '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 piya, {{PLURAL:$1|ena kategoriya bınêne esta|enê $1 kategoriyê bınêni estê.}}, be $2 ra pêro piya.}}',
+'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 +452,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.'''",
@@ -476,7 +494,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',
@@ -501,6 +519,7 @@ $messages = array(
 'create-this-page' => 'Na pele bınuse',
 'delete' => 'Bestere',
 'deletethispage' => 'Ena perer besternê',
+'undeletethispage' => 'Na perer mebesterne',
 'undelete_short' => '{{PLURAL:$1|Yew vurnayışi|$1 Vurnayışan}} mestere',
 'viewdeleted_short' => '{{PLURAL:$1|Yew vurnayışo esterıte|$1 Vurnayışanê esterıtan}} bımocne',
 'protect' => 'Bıpawe',
@@ -554,9 +573,8 @@ $1',
 'disclaimers' => 'Redê mesuliyeti',
 'disclaimerpage' => 'Project:Reddê mesuliyetê bıngey',
 'edithelp' => 'Peştdariya vurnayışi',
-'edithelppage' => 'Help:Vurnayış',
 'helppage' => 'Help:Estêni',
-'mainpage' => 'Pera Seri',
+'mainpage' => 'Pela Seri',
 'mainpage-description' => 'Pela Seri',
 'policy-url' => 'Project:Terzê hereketi',
 'portal' => 'Portalê cemaeti',
@@ -599,7 +617,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ê',
@@ -706,6 +724,8 @@ $2',
 'namespaceprotected' => "No '''$1''' ca de icazetê şıma çino şıma pel rêz keri.",
 'customcssprotected' => 'Mısadeyê şıma çıniyo ke na pela CSSi bıvurnên, çıke na pela xısusiye eyaranê karberan muhtewa kena.',
 'customjsprotected' => 'Mısadeyê şıma çıniyo ke na pela Java Scripti bıvurnên, çıke na pela xısusiye eyaranê karberan muhtewa kena.',
+'mycustomcssprotected' => "Na pera CSS'i re tenya idarekari şene bıvurne",
+'mycustomjsprotected' => "Na pera JavaScript'i re tenya idarekari şene bıvurne",
 'ns-specialprotected' => 'Pelê xısusiy nênê vurnayış.',
 'titleprotected' => 'Eno [[User:$1|$1]] zerreyê ena peli nişeno vuriye.
 Sebeb: "\'\'$2\'\'".',
@@ -731,9 +751,18 @@ Wexta ke verhafızayê cıgerayoxê şıma pak beno no benate de taye peli de he
 'welcomecreation-msg' => 'Hesabê şıma abiyo.
 [[Special:Preferences|{{SITENAME}} vurnayişê tercihanê xo]], xo vir ra mekere.',
 '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ê.',
@@ -746,18 +775,38 @@ Wexta ke verhafızayê cıgerayoxê şıma pak beno no benate de taye peli de he
 'logout' => 'Bıveciye',
 'userlogout' => 'Bıveciye',
 'notloggedin' => 'Şıma cıkewtış nêvıraşto',
+'userlogin-noaccount' => 'Hesabê şıma çıniyo?',
+'userlogin-joinproject' => 'Cıkewe {{SITENAME}}',
 'nologin' => "Hesabê şıma çıniyo? '''$1'''.",
 'nologinlink' => 'Yew hesab ake',
 'createaccount' => 'Hesab vıraze',
 'gotaccount' => "Hesabê şıma esto? '''$1'''.",
 'gotaccountlink' => 'Cı 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-heading' => '{{SITENAME}} meş de merduman şi',
+'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ê.
@@ -794,8 +843,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.',
@@ -808,7 +857,7 @@ Yew formato meqbul de adresê e-posta bınuse ya zi veng bıverde.',
 'cannotchangeemail' => 'E-postay hesabi ena wiki sera nêvurneyêno.',
 'emaildisabled' => 'Na site ra e-posta nêrışêno.',
 'accountcreated' => 'Hesab vıraciya',
-'accountcreatedtext' => 'Qandê $1 hesabê karberi vıraziyayo.',
+'accountcreatedtext' => 'Qandê [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) hesabê karberi vıraziyayo.',
 'createaccount-title' => 'Qey {{SITENAME}} newe yew heab vıraştış',
 'createaccount-text' => 'Kesê, be e-posteyê şıma ra {{SITENAME}} ($4) de, ebe nameyê "$2" u parola "$3" ra yew hesab vıraşto.
 Şıma gani cı kewê u parola xo nıka bıvurnê.',
@@ -840,13 +889,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-text-one' => 'Na form de parola reset kerdış temamiye',
 '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-domain' => 'Domain:',
 'passwordreset-capture' => 'neticey e-postay bımocne?',
@@ -867,9 +916,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ê',
@@ -1035,7 +1084,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.'''
@@ -1073,6 +1122,7 @@ Yew sebeb beyan nibı.',
 Hewna kerde aseno.',
 'edit-conflict' => 'Vurnayişê pêverdiyaye .',
 'edit-no-change' => 'Vurnayişê şıma qebul nêbı, çunke nuşte de yew vurnayiş n3evıraziya.',
+'postedit-confirmation' => 'Vurnayış qeyd be',
 'edit-already-exists' => 'Pelo newe nêvıraziyeno.
 Pel ca ra esto.',
 'defaultmessagetext' => 'Hesıbyaye metne mesaci',
@@ -1195,7 +1245,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ê.'''
@@ -1213,7 +1263,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',
@@ -1321,7 +1371,6 @@ Detayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'searchmenu-legend' => 'bıgeyre tercihan (sae bıke)',
 'searchmenu-exists' => "''Ena 'Wikipediya de ser \"[[:\$1]]\" yew pel esto'''",
 'searchmenu-new' => "''Na Wiki de pelay \"[[:\$1]]\" vıraze!'''",
-'searchhelp-url' => 'Help:Tedeestey',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|pê eno prefix ser pelan de bigêre]]',
 'searchprofile-articles' => 'Pelê tedeestey',
 'searchprofile-project' => 'Pelê yardım u procey',
@@ -1430,7 +1479,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',
@@ -1443,7 +1492,7 @@ Na game tepeya nêerziyena.',
 'prefs-textboxsize' => 'Ebatê pencerey vurnayışi',
 'youremail' => 'E-Mail (mecbur niyo) *:',
 'username' => '{{GENDER:$1|Nameyê karberi}}:',
-'uid' => "ID'e {{GENDER:$1|Karberi}}:",
+'uid' => 'Kamiya {{GENDER:$1|karberi}}:',
 'prefs-memberingroups' => '{{GENDER:$2|Ezayê}} {{PLURAL:$1|grube|gruban}}:',
 'prefs-memberingroups-type' => '$1',
 'prefs-registration' => 'Wextê qeydbiyayışi',
@@ -2073,8 +2122,9 @@ 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' => 'Pere xısusiyete peran',
-'pageswithprop-prop' => 'Xısusi name:',
+'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',
@@ -2090,12 +2140,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}}',
@@ -2113,17 +2163,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.',
@@ -2135,14 +2185,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',
@@ -2226,11 +2276,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.',
 
@@ -2240,6 +2290,15 @@ Qeydeyê destegbiyayey: <code>$1</code> (qet yew qeydeyo hesabiyaye http:// ke n
 'listusers-noresult' => 'karber nêdiyayo/a.',
 'listusers-blocked' => '(blok biy)',
 
+# 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' => '$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',
+'activeusers-noresult' => 'Karberi nêdiyayê.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'heqê grubê karberi',
 'listgrouprights-summary' => 'wikiya cêrın a ke tede grubê karberi nişane biyê, listeya heqê cıresayişê inan o.
@@ -2300,7 +2359,7 @@ qey heqê şexsi de [[{{MediaWiki:Listgrouprights-helppage}}|hema malumato ziyed
 'usermessage-template' => 'MediaWiki:UserMessage',
 
 # Watchlist
-'watchlist' => 'Listay 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.',
@@ -2309,7 +2368,7 @@ qey heqê şexsi de [[{{MediaWiki:Listgrouprights-helppage}}|hema malumato ziyed
 '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',
@@ -2320,8 +2379,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' => 'E-mail xeber dayiş abiyo.',
+'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î.',
@@ -2340,10 +2399,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.',
@@ -2385,8 +2444,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',
@@ -2469,9 +2528,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',
@@ -2503,9 +2562,9 @@ Tı eşkeno seviyeye kılit kerdışi bıvurno, feqat tı nıeşken "cascading p
 '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ê',
@@ -2833,8 +2892,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',
@@ -3093,7 +3152,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|Seyrkar|seyrkari}}',
+'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',
@@ -3114,9 +3173,9 @@ Tı eşkeno yew sebeb bınus.',
 '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',
@@ -3202,19 +3261,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:
 
@@ -3224,8 +3297,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',
@@ -3301,7 +3372,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',
@@ -3494,7 +3565,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ış',
@@ -3762,7 +3833,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,
@@ -4030,12 +4101,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ê',
@@ -4054,14 +4129,14 @@ 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' => 'Melumat u haceti',
 'specialpages-group-redirects' => 'Pela xasîyê ke heteneyayê',
@@ -4128,44 +4203,45 @@ Ena sita dı newke xırabiya teknik esta.',
 'htmlform-reset' => 'Vurnayişî reyna biyar',
 'htmlform-selectorother-other' => 'Bin',
 'htmlform-no' => 'Nê',
-'htmlform-yes' => 'E',
+'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' {{GENDER:$2|besternê}}",
-'logentry-delete-restore' => "$1'i pera $3'i {{GENDER:$2|peyser grot}}",
-'logentry-delete-event' => '$1 asaneyaışê {{PLURAL:$5|weqey roceke|$5 weqey rocekan}} kerdi het de $3: $4  {{GENDER:$2|vurna}}',
-'logentry-delete-revision' => '$1 $3: pela da $4 dı  {{PLURAL:$5|jew revizyon|$5 revizyon}} asayışê cı {{GENDER:$2|vurna}}',
+'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 revizyonê pela da $3 asayışê cı {{GENDER:$2|vurna}}',
+'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 asayışê  {{PLURAL:$5|weqey rocaka|$5 weqey rocekan}}  $3: $4 miyanıki {{GENDER:$2|vurna}}',
-'logentry-suppress-revision' => '$1 $3: pela da $4 dı  {{PLURAL:$5|jew revizyon|$5 revizyon}} asayışê cı xısusiye {{GENDER:$2|vurna}}',
-'logentry-suppress-event-legacy' => '$1 Asayışê {{GENDER:$2|vurnayışê}} ciyo xısusiyeta cı $3 dekerde de',
-'logentry-suppress-revision-legacy' => '$1 revizyonê pela da $3 asayışê cıyo xısuiye {{GENDER:$2|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' => '$1 pela $3 {{GENDER:$2|berde}} $4',
-'logentry-move-move-noredirect' => "$1'i pelay $3 raçarnayış neker dı u {{GENDER:$2|berd}} $4",
+'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' => '$1 hetenayışê qeydê pela da  $3 {{GENDER:$2|ahulnê}} $4 sero hetenayış vıraşt',
-'logentry-patrol-patrol' => '$1 revizyonê pela da $4 $3 {{GENDER:$2|ke}} kontrol',
-'logentry-patrol-patrol-auto' => "$1 pelay $3'i rewizyon dê $4 ya kontrol {{GENDER:$2|ke}}",
+'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ê ezayina grube $4 ra $5 {{GENDER:$2|vuriye}}',
-'logentry-rights-rights-legacy' => '$1 qandê $3 rê ezayina grube {{GENDER:$2|vuriye}}',
+'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)',
 
@@ -4220,7 +4296,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' => '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 0970c5a..db4f6c4 100644 (file)
  * @author Derbeth
  * @author Dunak
  * @author Dundak
+ * @author Geitost
  * @author Kaganer
  * @author Michawiki
  * @author Murjarik
+ * @author Nemo bis
  * @author Nepl1
  * @author Pe7er
  * @author Qualia
@@ -188,8 +190,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 +203,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',
@@ -400,7 +401,6 @@ $1',
 'disclaimers' => 'Impresum',
 'disclaimerpage' => 'Project:impresum',
 'edithelp' => 'Pomoc pśi wobźěłanju',
-'edithelppage' => 'Help:Pomoc pśi wobźěłanju',
 'helppage' => 'Help:Pomoc',
 'mainpage' => 'Głowny bok',
 'mainpage-description' => 'Głowny bok',
@@ -567,9 +567,18 @@ Móžoš {{SITENAME}} anomymnje dalej wužywaś abo móžoš <span class='plainl
 'welcomeuser' => 'Witaj $1',
 'welcomecreation-msg' => 'Twójo konto jo se załožyło. Njezabydni změniś swóje [[Special:Preferences|nastajenja za {{SITENAME}}]].',
 'yourname' => 'mě wužywarja',
+'userlogin-yourname' => 'Wužywarske mě',
+'userlogin-yourname-ph' => 'Zapódaj swójo wužywarske mě',
 'yourpassword' => 'šćitne gronidło:',
+'userlogin-yourpassword' => 'Gronidło',
+'userlogin-yourpassword-ph' => 'Zapódaj swójo gronidło',
+'createacct-yourpassword-ph' => 'Zapódaj gronidło',
 'yourpasswordagain' => 'Šćitne gronidło hyšći raz zapódaś:',
+'createacct-yourpasswordagain' => 'Gronidło wobkšuśiś',
+'createacct-yourpasswordagain-ph' => 'Zapódaj gronidło hyšći raz',
 'remembermypassword' => 'Na toś tom licadle pśizjawjony wóstaś (za maksimalnje $1 {{PLURAL:$1|źeń|dnja|dny|dnjow}})',
+'userlogin-remembermypassword' => 'Pśizjawjony wóstaś',
+'userlogin-signwithsecure' => 'Wěsty zwisk wužywaś',
 'securelogin-stick-https' => 'Pó pśizjawjenju z HTTPS zwězany wóstaś',
 'yourdomainname' => 'Twója domejna',
 'password-change-forbidden' => 'Njamóžoš gronidła w toś tom wikiju změniś.',
@@ -582,12 +591,17 @@ Móžoš {{SITENAME}} anomymnje dalej wužywaś abo móžoš <span class='plainl
 'logout' => 'wótzjawiś se',
 'userlogout' => 'wótzjawiś se',
 'notloggedin' => 'Njepśizjawjony(a)',
-'nologin' => "Njamaš wužywarske konto? '''$1'''.",
+'userlogin-noaccount' => 'Njamaš wužywarske konto?',
+'userlogin-joinproject' => 'Konto za {{GRAMMAR:akuzatiw|{{SITENAME}}}} załožyś',
+'nologin' => 'Njamaš wužywarske konto? $1.',
 'nologinlink' => 'Nowe wužywarske konto załožyś',
 'createaccount' => 'Wužywarske konto załožyś',
 'gotaccount' => "Maš južo wužywarske konto? '''$1'''.",
 'gotaccountlink' => 'Pśizjawiś se',
 'userlogin-resetlink' => 'Sy pśizjawjeńske daty zabył?',
+'userlogin-resetpassword-link' => 'Gronidło anulěrowaś',
+'helplogin-url' => 'Help:Pśizjawiś',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoc za pśizjawjenje]]',
 'createaccountmail' => 'Nachylne pśidatne gronidło wužywaś a jo na slědujucu e-mailowu adresu pósłaś',
 'createaccountreason' => 'Pśicyna:',
 'badretype' => 'Šćitnej gronidle, kótarejž sy zapódał, se njemakajotej.',
@@ -638,7 +652,7 @@ Woglědowarje, kótarež wužywaju toś tu IP-adresu njamógu tuchylu dalšne ko
 'cannotchangeemail' => 'Kontowe e-mailowe adrese njedaju se změniś na toś tom wikiju.',
 'emaildisabled' => 'Toś to sedło njamóžo e-maile pósłaś.',
 'accountcreated' => 'Wužywarske konto jo se wutwóriło.',
-'accountcreatedtext' => 'Wužywarske konto $1 jo se wutwóriło.',
+'accountcreatedtext' => 'Wužywarske konto [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|diskusiju]]) jo se załožyło.',
 'createaccount-title' => 'Wužywarske konto za {{SITENAME}} nawarjone',
 'createaccount-text' => 'Něchten jo konto za twóje e-mailowu adresu na {{GRAMMAR:lokatiw|{{SITENAME}}}} ($4) z mjenim "$2", z pótajmnym słowom "$3", wutwórił. Dejš se pśizjawiś a swóje pótajmne słowo něnt změniś.
 
@@ -674,10 +688,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 +908,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',
@@ -1140,7 +1154,6 @@ Drobnostki móžoš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'searchmenu-legend' => 'Pytańske opcije',
 'searchmenu-exists' => "'''Jo bok z mjenim \"[[\$1]]\" na toś tom wikiju'''",
 'searchmenu-new' => "'''Napóraj bok \"[[:\$1|\$1]]\" na toś tom wikiju!'''",
-'searchhelp-url' => 'Help:Pomoc',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Boki z toś tym prefiksom pśepytaś]]',
 'searchprofile-articles' => 'Wopśimjeśowe boki',
 'searchprofile-project' => 'Pomoc a projektowe boki',
@@ -1507,7 +1520,7 @@ Boki na [[Special:Watchlist|wobglědowańce]] su '''tucne'''.",
 'reuploaddesc' => 'Nagraśe pśetergnuś a slědk k nagrawańskemu formularoju',
 'upload-tryagain' => 'Změnjone datajowe wopisanje wótpósłaś',
 'uploadnologin' => 'Njepśizjawjony',
-'uploadnologintext' => 'Dejš se [[Special:UserLogin|pśizjawiś]], aby mógał dataje nagraś.',
+'uploadnologintext' => 'Dejš se $1, aby mógał dataje nagraś.',
 'upload_directory_missing' => 'Nagrawański zapis ($1) felujo a njejo se pśez webserwer napóraś dał.',
 'upload_directory_read_only' => 'Nagrawański zapisk ($1) njedajo se pśez webserwer pisaś.',
 'uploaderror' => 'Nagrawańska zmólka',
@@ -1635,7 +1648,7 @@ $1',
 'upload-proto-error' => 'Njekorektny protokol',
 'upload-proto-error-text' => 'URL musy zachopiś z <code>http://</code> abo <code>ftp://</code>.',
 'upload-file-error' => 'Interna zmólka',
-'upload-file-error-text' => 'Pśi napóranju temporarneje dataje na serwerje jo nastała interna zmólka. Pšosym staj se ze [[Special:ListUsers/sysop|systemowym administratorom]] do zwiska.',
+'upload-file-error-text' => 'Pśi napóranju temporarneje dataje na serwerje jo nastała interna zmólka. Pšosym staj se ze [[Special:ListUsers/sysop|administratorom]] do zwiska.',
 'upload-misc-error' => 'Njeznata zmólka pśi nagrawanju.',
 'upload-misc-error-text' => 'Pśi nagrawanju jo nastała njeznata zmólka. Kontrolěruj pšosym, lěc URL jo płaśiwy a pśistupny a wopytaj hyšći raz. Jolic problem dalej eksistěrujo, staj se z [[Special:ListUsers/sysop|administratorom]] do zwiska.',
 'upload-too-many-redirects' => 'URL jo pśewjele dalejpósrědnjenja wopśimjeł',
@@ -2047,6 +2060,15 @@ Jo nanejmjenjej głowna domena trěbna, na pśikład "*.org"<br />
 'listusers-noresult' => 'Žeden wužywaŕ njejo se namakał.',
 'listusers-blocked' => '(blokěrowany)',
 
+# Special:ActiveUsers
+'activeusers' => 'Lisćina aktiwnych wužywarjow',
+'activeusers-intro' => 'To jo lisćina wužywarjow, kotrež su byli aktiwne za {{PLURAL:$1|slědny źeń|slědnej $1 dnja|slědne $1 dny|slědnych $1 dnjow}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|akcija|akciji|akcije|akcijow}} w {{PLURAL:$3|slědnem dnju|slědnyma $3 dnjoma|slědnych $3 dnjach}}',
+'activeusers-from' => 'Wužywarjow zwobrazniś, zachopinajucy z:',
+'activeusers-hidebots' => 'Boty schowaś',
+'activeusers-hidesysops' => 'Administratorow schowaś',
+'activeusers-noresult' => 'Žedne wužywarje namakane.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Pšawa wužywarskeje kupki',
 'listgrouprights-summary' => 'To jo lisćina wužywarskich kupkow definěrowanych w toś tom wikiju z jich zwězanymi pśistupnymi pšawami. Móžo [[{{MediaWiki:Listgrouprights-helppage}}|pśidatne informacije]] wó jadnotliwych pšawach daś.',
@@ -2123,8 +2145,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}}.',
@@ -3011,7 +3033,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',
@@ -3189,7 +3211,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',
@@ -3604,13 +3626,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..9d904a8 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',
@@ -256,7 +254,6 @@ $1',
 'disclaimers' => 'Pogoliman',
 'disclaimerpage' => 'Project:Pogoliman kosoruan',
 'edithelp' => 'Sokodung mongidit',
-'edithelppage' => 'Help:Mongidit',
 'helppage' => 'Help:Susuang',
 'mainpage' => 'Natad tagayo',
 'mainpage-description' => 'Natad tagayo',
@@ -554,10 +551,8 @@ Naalanannu noh kaatalib toi nokopokianu koh no do kaatalib daamot.',
 
 # Special:PasswordReset
 'passwordreset' => 'Pudoliai kawagu kaatalib',
-'passwordreset-text' => 'Gonopo poom diti do mangaramit tongosurat-i ponorou do nokomoi id akaun.',
 'passwordreset-legend' => 'Pudoliai kawagu kaatalib',
 'passwordreset-disabled' => 'Pomudolian kawagu do kaatalib kitaantob id wiki diti.',
-'passwordreset-pretext' => '{{PLURAL:$1||Posuango iso data id siriba}}',
 'passwordreset-username' => 'Ngarandait:',
 'passwordreset-domain' => 'Sumanganu:',
 'passwordreset-capture' => 'Intaai surat-i dii nowonsoi?',
@@ -953,7 +948,6 @@ Intaai [[Special:BlockList|lis nantaban]] montok lis kawawagu karaja mogoduh om
 'searchmenu-legend' => 'Pilion ihum-ihumon',
 'searchmenu-exists' => "'''Haro no bolikon pinungaranan do \"[[:\$1]]\" hiti id wiki.'''",
 'searchmenu-new' => "'''Pomonsoi do bolikon \"[[:\$1]]\"hiti id wiki!'''",
-'searchhelp-url' => 'Help:Susuang',
 'searchprofile-articles' => 'Suang bobolikon',
 'searchprofile-project' => 'Tatabang om Tongobolikon purujik',
 'searchprofile-images' => 'Multimodia',
@@ -993,14 +987,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 999b906..5c08f46 100644 (file)
@@ -19,45 +19,74 @@ $rtl = true;
 
 $namespaceNames = array(
        NS_MEDIA            => 'މީޑިއާ',
-       NS_SPECIAL          => 'Þ\80Þ§Þ\87Þ°Þ\9eަ',
+       NS_SPECIAL          => 'Þ\9aÞ§Þ\87Þ°Þ\90ަ',
        NS_MAIN             => '',
        NS_TALK             => 'ޚިޔާލު',
        NS_USER             => 'މެމްބަރު',
        NS_USER_TALK        => 'މެމްބަރުގެ_ވާހަކަ',
-       NS_FILE             => 'ފައިލް',
-       NS_FILE_TALK        => 'ފައިލް_ޚިޔާލު',
+       NS_PROJECT_TALK     => '$1ގެ_ވާހަކަ',
+       NS_FILE             => 'ފައިލު',
+       NS_FILE_TALK        => 'ފައިލުގެ_ޚިޔާލު',
        NS_MEDIAWIKI        => 'މީޑިއާވިކީ',
-       NS_MEDIAWIKI_TALK   => 'Þ\89Þ©Þ\91Þ¨Þ\94Þ§Þ\88Þ¨Þ\86Þ¨_ޚިޔާލު',
+       NS_MEDIAWIKI_TALK   => 'Þ\89Þ¨Þ\91Þ¨Þ\87Þ§Þ\88Þ¨Þ\86Þ©_ޚިޔާލު',
        NS_TEMPLATE         => 'ފަންވަތް',
-       NS_TEMPLATE_TALK    => 'Þ\8aÞ¦Þ\82Þ°Þ\88Þ¦Þ\8cÞ°_ޚިޔާލު',
+       NS_TEMPLATE_TALK    => 'Þ\8aÞ¦Þ\82Þ°Þ\88Þ¦Þ\8cÞªÞ\8eÞ¬_ޚިޔާލު',
        NS_HELP             => 'އެހީ',
-       NS_HELP_TALK        => 'އެހީ_ޚިޔާލު',
+       NS_HELP_TALK        => 'އެހީގެ_ޚިޔާލު',
        NS_CATEGORY         => 'ޤިސްމު',
-       NS_CATEGORY_TALK    => 'ޤިސްމު_ޚިޔާލު',
+       NS_CATEGORY_TALK    => 'ޤިސްމުގެ_ޚިޔާލު',
+);
+
+$namespaceAliases = array(
+       'ހާއްޞަ'          => NS_SPECIAL,
+       'ފައިލް'           => NS_FILE,
+       'ފައިލް_ޚިޔާލު'    => NS_FILE_TALK,
+       'މީޑިޔާވިކި_ޚިޔާލު' => NS_MEDIAWIKI_TALK,
+       'ފަންވަތް_ޚިޔާލު'  => NS_TEMPLATE_TALK,
+       'އެހީ_ޚިޔާލު'      => NS_HELP_TALK,
+       'ޤިސްމު_ޚިޔާލު'   => NS_CATEGORY_TALK,
 );
 
 $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(
@@ -634,6 +663,11 @@ $1',
 [[Special:UnusedCategories|Unused categories]] are not shown here.
 Also see [[Special:WantedCategories|wanted categories]].',
 
+# Special:ActiveUsers
+'activeusers' => 'ހަރަކާތްތެރި މެމްބަރުންގެ ލިސްޓު',
+'activeusers-hidebots' => 'ބޮޓް ފޮރުއްވާ',
+'activeusers-hidesysops' => 'އެޑްމިނިސްޓްރޭޓަރުން ފޮރުއްވާ',
+
 # Special:ListGroupRights
 'listgrouprights-members' => '(މެމްބަރުންގެ ލިސްޓު)',
 
@@ -796,7 +830,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Metadata
 'metadata' => 'މެޓަޑޭޓާ',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ފުޅާމިން',
 'exif-imagelength' => 'އުސްމިން',
 'exif-imagedescription' => 'ތަސްވީރުގެ ސުރުހީ',
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..e8e347d 100644 (file)
@@ -31,6 +31,7 @@
  * @author Lou
  * @author MF-Warburg
  * @author Malafaya
+ * @author Nikosguard
  * @author Omnipaedista
  * @author Protnet
  * @author Reedy
@@ -357,7 +358,7 @@ $messages = array(
 # User preference toggles
 'tog-underline' => 'Υπογράμμιση συνδέσμων:',
 'tog-justify' => 'Στοίχιση παραγράφων',
-'tog-hideminor' => 'Î\91Ï\80Ï\8cκÏ\81Ï\85Ï\88η Î±Î»Î»Î±Î³Ï\8eν Î¼Î¹ÎºÏ\81ήÏ\82 ÎºÎ»Î¯Î¼Î±ÎºÎ±ς',
+'tog-hideminor' => 'Î\91Ï\80Ï\8cκÏ\81Ï\85Ï\88η Î¼Î¹ÎºÏ\81οεÏ\80εξεÏ\81γαÏ\83ιÏ\8eν Ï\83Ï\84ιÏ\82 Ï\80Ï\81Ï\8cÏ\83Ï\86αÏ\84εÏ\82 Î±Î»Î»Î±Î³Î­ς',
 'tog-hidepatrolled' => 'Απόκρυψη ελεγμένων επεξεργασιών στις πρόσφατες αλλαγές',
 'tog-newpageshidepatrolled' => 'Απόκρυψη ελεγμένων σελίδων από τον κατάλογο νέων σελίδων',
 'tog-extendwatchlist' => 'Επέκταση της λίστας παρακολούθησης ώστε να δείχνει όλες τις αλλαγές, όχι μόνο τις πιο πρόσφατες',
@@ -374,7 +375,7 @@ $messages = array(
 'tog-watchmoves' => 'Προσθήκη σελίδων που μετακινώ στη λίστα παρακολούθησής μου',
 'tog-watchdeletion' => 'Προσθήκη σελίδων και αρχείων που διαγράφω στη λίστα παρακολούθησής μου',
 'tog-minordefault' => 'Σήμανση εκ προεπιλογής όλων των αλλαγών ως μικρής κλίμακας',
-'tog-previewontop' => 'Εμφάνιση προεπισκόπησης πριν από το πλαίσιο επεξεργασίας και όχι μετά',
+'tog-previewontop' => 'Εμφάνιση προεπισκόπησης πριν από το πλαίσιο επεξεργασίας',
 'tog-previewonfirst' => 'Εμφάνιση προεπισκόπησης κατά την πρώτη επεξεργασία',
 'tog-nocache' => 'Απενεργοποίηση κρυφής μνήμης',
 'tog-enotifwatchlistpages' => 'Να μου αποστέλλεται μήνυμα ηλεκτρονικού ταχυδρομείου όταν αλλάζει μια σελίδα ή ένα αρχείο που βρίσκεται στη λίστα παρακολούθησής μου',
@@ -384,9 +385,7 @@ $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-showjumplinks' => 'Ενεργοποίηση των συνδέσμων προσβασιμότητας του τύπου «μετάβαση σε»',
 'tog-uselivepreview' => 'Χρήση ζωντανής προεπισκόπησης (απαιτεί JavaScript) (πειραματικό)',
 'tog-forceeditsummary' => 'Να ειδοποιούμαι κατά την εισαγωγή κενής σύνοψης επεξεργασίας',
 'tog-watchlisthideown' => 'Απόκρυψη των επεξεργασιών μου από τη λίστα παρακολούθησης',
@@ -400,10 +399,11 @@ $messages = array(
 'tog-showhiddencats' => 'Εμφάνιση κρυμμένων κατηγοριών',
 'tog-noconvertlink' => 'Απενεργοποίησε την μετατροπή τίτλου συνδέσμου',
 'tog-norollbackdiff' => 'Παράλειψη διαφοράς μετά την εκτέλεση επαναφοράς',
+'tog-useeditwarning' => 'Προειδοποίηση όταν εγκαταλείπω μία σελίδα επεξεργασίας χωρίς να έχω πρώτα αποθηκεύσει τις αλλαγές',
 
 'underline-always' => 'Πάντα',
 'underline-never' => 'Ποτέ',
-'underline-default' => 'ΠÏ\81οεÏ\80ιλεγμένο Ï\80Ï\81Ï\8cγÏ\81αμμα Ï\80εÏ\81ιήγηÏ\83ηÏ\82',
+'underline-default' => 'ΠÏ\81οεÏ\80ιλογή Î±Ï\80Ï\8c Ï\84ο skin Î® Î±Ï\80Ï\8c Ï\84ον Ï\80εÏ\81ιηγηÏ\84ή',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Τύπος γραμματοσειράς της περιοχής επεξεργασίας:',
@@ -463,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|Κατηγορία|Κατηγορίες}}',
@@ -597,7 +609,6 @@ $1',
 'disclaimers' => 'Αποποίηση ευθυνών',
 'disclaimerpage' => 'Project:Γενική αποποίηση',
 'edithelp' => 'Βοήθεια σχετικά με την επεξεργασία',
-'edithelppage' => 'Help:Επεξεργασία',
 'helppage' => 'Help:Περιεχόμενα',
 'mainpage' => 'Αρχική σελίδα',
 'mainpage-description' => 'Αρχική σελίδα',
@@ -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 είναι απενεργοποιημένα στον υπολογιστή σας. Παρακαλούμε ενεργοποιήστε τα και ξαναδοκιμάστε!',
@@ -839,7 +879,7 @@ $2',
 'cannotchangeemail' => "Οι διευθύνσεις ηλεκτρονικού ταχυδρομείου του λογαριασμού δεν μπορούν να αλλάξουν σ' αυτό το wiki.",
 'emaildisabled' => 'Αυτός ο ιστότοπος  δεν μπορεί να στείλει μηνύματα ηλεκτρονικού ταχυδρομείου.',
 'accountcreated' => 'Ο λογαριασμός δημιουργήθηκε',
-'accountcreatedtext' => 'Ο λογαριασμός χρήστη για τον/την $1 έχει δημιουργηθεί.',
+'accountcreatedtext' => 'Ο λογαριασμός χρήστη για τον/την [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|συζήτηση]]) έχει δημιουργηθεί.',
 'createaccount-title' => 'Δημιουργία λογαριασμού για {{SITENAME}}',
 'createaccount-text' => 'Κάποιος δημιούργησε έναν λογαριασμό για τη διεύθυνση email σας στο {{SITENAME}} ($4) με το όνομα "$2", με κωδικό πρόσβασης "$3". Θα πρέπει να συνδεθείτε και να αλλάξετε τον κωδικό πρόσβασής σας τώρα.
 
@@ -873,13 +913,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' => 'Η επαναφορά κωδικού πρόσβασης έχει απενεργοποιηθεί σε αυτό το wiki',
-'passwordreset-pretext' => '{{PLURAL:$1||Εισάγεται ένα από τα στοιχεία δεδομένων που βλέπετε παρακάτω}}',
+'passwordreset-emaildisabled' => "Τα χαρακτηριστικά ηλεκτρονικού ταχυδρομείου έχουν απενεργοποιηθεί σ' αυτό το wiki.",
 'passwordreset-username' => 'Όνομα χρήστη:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Προβολή του μηνύματος ηλεκτρονικού ταχυδρομείου που δημιουργήθηκε;',
@@ -902,7 +944,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' => 'Αλλαγή της διεύθυνσης ηλεκτρονικού ταχυδρομείου',
@@ -1106,11 +1148,15 @@ $2
 Φαίνεται πως έχει διαγραφεί.',
 'edit-conflict' => 'Σύγκρουση επεξεργασιών.',
 'edit-no-change' => 'Η επεξεργασία σας αγνοήθηκε, επειδή δεν έγινε καμία αλλαγή στο κείμενο.',
+'postedit-confirmation' => 'H επεξεργασία σας αποθηκεύτηκε.',
 '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 +1178,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
@@ -1344,7 +1394,6 @@ $1",
 'searchmenu-legend' => 'Επιλογές αναζήτησης',
 'searchmenu-exists' => "'''Υπάρχει μια σελίδα που ονομάζεται \"[[:\$1]]\" σε αυτό το wiki'''",
 'searchmenu-new' => "'''Δημιουργήστε τη σελίδα «[[:$1]]» σε αυτό το wiki!'''",
-'searchhelp-url' => 'Help:Περιεχόμενα',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Πλοηγηθείτε σε σελίδες με αυτό το πρόθεμα]]',
 'searchprofile-articles' => 'Σελίδες περιεχομένων',
 'searchprofile-project' => 'Βοήθεια και σελίδες εγχειρημάτων',
@@ -1385,15 +1434,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' => 'Προτιμήσεις',
@@ -1535,6 +1576,7 @@ $1",
 'userrights-notallowed' => 'Ο λογαριασμός σας δεν έχει άδεια για να προσθέσει ή να αφαιρέσει  δικαιώματα χρηστών.',
 'userrights-changeable-col' => 'Ομάδες που μπορείτε να αλλάξετε',
 'userrights-unchangeable-col' => 'Ομάδες που δεν μπορείτε να αλλάξετε',
+'userrights-conflict' => 'Σύγκρουση δικαιωμάτων χρήστη! Παρακαλώ κάντε πάλι εφαρμογή των αλλαγών σας.',
 
 # Groups
 'group' => 'Ομάδα:',
@@ -1884,10 +1926,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 +1979,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 +2133,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 +2388,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|σελίδα|σελίδες}}.',
@@ -2583,7 +2635,7 @@ $1',
 'mycontris' => 'Συνεισφορές',
 'contribsub2' => 'Για τον/την $1 ($2)',
 'nocontribs' => 'Δεν βρέθηκαν αλλαγές με αυτά τα κριτήρια.',
-'uctop' => '(τελευταία)',
+'uctop' => '(κορυφή)',
 'month' => 'Από τον μήνα (και νωρίτερα):',
 'year' => 'Από τη χρονιά (και νωρίτερα):',
 
@@ -2905,6 +2957,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' => 'Αδύνατη η δημιουργία προσωρινού αρχείου μικρογραφίας',
@@ -3050,27 +3104,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 +3189,6 @@ $1',
 'pageinfo-category-files' => 'Αριθμός αρχείων',
 
 # Skin names
-'skinname-standard' => 'Κλασσικό',
-'skinname-nostalgia' => 'Νοσταλγία',
-'skinname-myskin' => 'ΤοSkinΜου',
-'skinname-simple' => 'Απλό',
 'skinname-modern' => 'Μοντέρνο',
 
 # Patrolling
@@ -3227,11 +3266,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 +3312,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Πλάτος',
 'exif-imagelength' => 'Υψος',
 'exif-bitspersample' => 'Bits ανά στοιχείο',
@@ -3437,7 +3490,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 +3906,15 @@ $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-lookup' => 'Αναζήτηση:',
+'redirect-value' => 'Τιμή:',
+'redirect-user' => 'Αναγνωριστικό χρήση',
+'redirect-revision' => 'Αναθεώρηση σελίδας',
+'redirect-file' => 'Όνομα αρχείου',
+'redirect-not-exists' => 'Η τιμή δε βρέθηκε',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Αναζήτηση για διπλά αρχεία',
@@ -3948,6 +4004,9 @@ $5
 'htmlform-submit' => 'Υποβολή',
 'htmlform-reset' => 'Αναστροφή αλλαγών',
 'htmlform-selectorother-other' => 'Άλλο',
+'htmlform-no' => 'Όχι',
+'htmlform-yes' => 'Ναι',
+'htmlform-chosen-placeholder' => 'Κάντε μια επιλογή',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 με υποστήριξη αναζήτησης πλήρους κειμένου',
@@ -3955,16 +4014,16 @@ $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-revision' => '{{GENDER:$1|Ο|Η}} $1 άλλαξε την ορατότητα {{PLURAL:$5|μιας έκδοσης|$5 εκδόσεων}} στη σελίδα $3: $4',
+'logentry-delete-restore' => 'Î\9f\97 $1 αποκατέστησε τη σελίδα $3',
+'logentry-delete-event' => ' $1 {{GENDER:$1|άλλαξε}} την ορατότητα σε {{PLURAL:$5|ένα γεγονός καταγραφής|$5 γεγονότα καταγραφής}} στο $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|άλλαξε}} άλλαξε την ορατότητα {{PLURAL:$5|μια έκδοση|$5 εκδόσεις}} στη σελίδα $3: $4',
 'logentry-delete-event-legacy' => '{{GENDER:$2|Ο|Η}} $1 άλλαξε την ορατότητα των καταγραφόμενων συμβάντων στη σελίδα $3',
-'logentry-delete-revision-legacy' => '{{GENDER:$1|Ο|Η}} $1 άλλαξε την  ορατότητα των αναθεωρήσεων στη σελίδα $3',
-'logentry-suppress-delete' => '{{GENDER:$1|Ο|Η}} $1 διέγραψε τη σελίδα $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|άλλαξε}} την  ορατότητα των αναθεωρήσεων στη σελίδα $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|διέγραψε}} τη σελίδα $3',
 'logentry-suppress-event' => '{{Gender:$2|Ο|Η}} $1 άλλαξε μυστικά την ορατότητα {{PLURAL:$5|ενός καταγραφόμενου συμβάντος|$5 καταγραφόμενων συμβάντων}} στη σελίδα $3: $4',
 'logentry-suppress-revision' => '{{Gender:$2|Ο|Η}} $1 άλλαξε μυστικά την ορατότητα {{PLURAL:$5|μίας αναθεώρησης|$5 αναθεωρήσεων}} στη σελίδα $3: $4',
 'logentry-suppress-event-legacy' => '{{Gender:$2|Ο|Η}} $1 άλλαξε μυστικά την ορατότητα των καταγραφόμενων συμβάντων στη σελίδα $3',
-'logentry-suppress-revision-legacy' => '$1 κρυφά άλλαξαν την  ορατότητα των αναθεωρήσεων στη σελίδα $3',
+'logentry-suppress-revision-legacy' => '{{Gender:$2|Ο|Η}} $1 άλλαξε μυστικά την ορατότητα των αναθεωρήσεων στη σελίδα $3',
 'revdelete-content-hid' => 'το περιεχόμενο αποκρύφθηκε',
 'revdelete-summary-hid' => 'Η σύνοψη επεξεργασίας αποκρύφθηκε',
 'revdelete-uname-hid' => 'Το όνομα χρήστη αποκρύφθηκε',
@@ -3973,20 +4032,20 @@ $5
 'revdelete-uname-unhid' => 'το όνομα χρήστη έπαψε να είναι κρυφό',
 'revdelete-restricted' => 'εφάρμοσε περιορισμούς στους sysops',
 'revdelete-unrestricted' => 'αφαίρεσε περιορισμούς στους sysops',
-'logentry-move-move' => '{{GENDER:$1|Ο|Η}} $1 μετακίνησε τη σελίδα $3 στη $4',
+'logentry-move-move' => '{{GENDER:$2|Ο|Η}} $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-byemail' => 'Ο λογαριασμός χρήστη $3 δημιουργήθηκε από τον $1  και ο κωδικός πρόσβασης εστάλη μέσω ηλεκτρονικού ταχυδρομείου',
-'logentry-newusers-autocreate' => 'Ο λογαριασμός $1 δημιουργήθηκε αυτόματα',
+'logentry-newusers-newusers' => 'Ο λογαριασμός χρήστη $1 {{GENDER:$2|δημιουργήθηκε}}',
+'logentry-newusers-create' => 'Ο λογαριασμός χρήστη $1 {{GENDER:$2|δημιουργήθηκε}}',
+'logentry-newusers-create2' => 'Ο λογαριασμός χρήστη $3 δημιουργήθηκε από {{GENDER:$2|τον|την}} $1',
+'logentry-newusers-byemail' => 'Ο λογαριασμός χρήστη $3 δημιουργήθηκε από {{GENDER:$2|τον|την}} $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 b08436c..b29c204 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' ),
@@ -268,6 +274,7 @@ $magicWords = array(
        'img_center'              => array( 1,    'center', 'centre' ),
        'img_framed'              => array( 1,    'framed', 'enframed', 'frame' ),
        'img_frameless'           => array( 1,    'frameless' ),
+       'img_lang'                => array( 1,    'lang=$1' ),
        'img_page'                => array( 1,    'page=$1', 'page $1' ),
        'img_upright'             => array( 1,    'upright', 'upright=$1', 'upright $1' ),
        'img_border'              => array( 1,    'border' ),
@@ -372,6 +379,7 @@ $magicWords = array(
  * hook.
  */
 $specialPageAliases = array(
+       'Activeusers'               => array( 'ActiveUsers' ),
        'Allmessages'               => array( 'AllMessages' ),
        'Allpages'                  => array( 'AllPages' ),
        'Ancientpages'              => array( 'AncientPages' ),
@@ -441,6 +449,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' ),
@@ -621,8 +630,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
@@ -680,7 +689,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',
+'tog-useeditwarning'          => 'Warn me when I leave an edit page with unsaved changes',
 
 'underline-always'  => 'Always',
 'underline-never'   => 'Never',
@@ -694,56 +703,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}}',
@@ -831,6 +852,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',
@@ -886,7 +908,7 @@ $1',
 'disclaimers'          => 'Disclaimers',
 'disclaimerpage'       => 'Project:General disclaimer',
 'edithelp'             => 'Editing help',
-'edithelppage'         => 'Help:Editing',
+'edithelppage'         => '//www.mediawiki.org/wiki/Special:MyLanguage/Help:Editing_pages', # do not translate or duplicate this message to other languages
 'helppage'             => 'Help:Contents',
 'mainpage'             => 'Main Page',
 'mainpage-description' => 'Main page',
@@ -1048,6 +1070,8 @@ $2',
 'namespaceprotected'            => "You do not have permission to edit pages in the '''$1''' namespace.",
 'customcssprotected'            => "You do not have permission to edit this CSS page because it contains another user's personal settings.",
 'customjsprotected'             => "You do not have permission to edit this JavaScript page because it contains another user's personal settings.",
+'mycustomcssprotected'          => 'You do not have permission to edit this CSS page.',
+'mycustomjsprotected'           => 'You do not have permission to edit this JavaScript page.',
 'ns-specialprotected'           => 'Special pages cannot be edited.',
 'titleprotected'                => 'This title has been protected from creation by [[User:$1|$1]].
 The reason given is "\'\'$2\'\'".',
@@ -1075,13 +1099,17 @@ Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
 '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'    => 'Remember me',
-'userlogin-signwithsecure'        => 'Sign in with secure server',
+'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.',
@@ -1103,14 +1131,37 @@ Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
 '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',
+'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.
@@ -1178,7 +1229,7 @@ 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.',
+'accountcreatedtext'              => 'The user account for [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) 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.
@@ -1224,14 +1275,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-emaildisabled'      => 'Email features have been disabled on this wiki.',
-'passwordreset-pretext'            => '{{PLURAL:$1||Enter one of the pieces of data below}}',
 'passwordreset-username'           => 'Username:',
 'passwordreset-domain'             => 'Domain:',
 'passwordreset-capture'            => 'View the resulting email?',
@@ -1263,7 +1315,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',
@@ -1494,6 +1546,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
@@ -1539,6 +1592,7 @@ Please check the comparison below to verify that this is what you want to do, an
 'undo-failure' => 'The edit could not be undone due to conflicting intermediate edits.',
 'undo-norev'   => 'The edit could not be undone because it does not exist or was deleted.',
 'undo-summary' => 'Undo revision $1 by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]])',
+'undo-summary-username-hidden' => 'Undo revision $1 by a hidden user',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Cannot create account',
@@ -1754,9 +1808,7 @@ Details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
 'searchmenu-exists'                => "'''There is a page named \"[[:\$1]]\" on this wiki.'''",
 'searchmenu-new'                   => "'''Create the page \"[[:\$1]]\" on this wiki!'''",
 'searchmenu-new-nocreate'          => '', # do not translate or duplicate this message to other languages
-'searchhelp-url'                   => 'Help:Contents',
 'searchmenu-prefix'                => '[[Special:PrefixIndex/$1|Browse pages with this prefix]]',
-'searchmenu-help'                  => '[[{{MediaWiki:Searchhelp-url}}|{{int:help}}]]?', # do not translate or duplicate this message to other languages
 'searchprofile-articles'           => 'Content pages',
 'searchprofile-project'            => 'Help and Project pages',
 'searchprofile-images'             => 'Multimedia',
@@ -1813,10 +1865,10 @@ 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
-'search-error' => 'An error has occurred while searching: $1',
 
 # Preferences page
 'preferences'                   => 'Preferences',
@@ -1852,7 +1904,6 @@ Note that their indexes of {{SITENAME}} content may be out of date.',
 'resetprefs'                    => 'Clear unsaved changes',
 'restoreprefs'                  => 'Restore all default settings',
 'prefs-editing'                 => 'Editing',
-'prefs-edit-boxsize'            => 'Size of the edit window.',
 'rows'                          => 'Rows:',
 'columns'                       => 'Columns:',
 'searchresultshead'             => 'Search',
@@ -1896,7 +1947,6 @@ Here's a randomly-generated value you can use: $1",
 'prefs-reset-intro'             => 'You can use this page to reset your preferences to the site defaults.
 This cannot be undone.',
 'prefs-emailconfirm-label'      => 'Email confirmation:',
-'prefs-textboxsize'             => 'Size of editing window',
 'youremail'                     => 'Email:',
 'username'                      => '{{GENDER:$1|Username}}:',
 'uid'                           => '{{GENDER:$1|User}} ID:',
@@ -1932,7 +1982,9 @@ Your email address is not revealed when other users contact you.',
 'prefs-signature'               => 'Signature',
 'prefs-dateformat'              => 'Date format',
 'prefs-timeoffset'              => 'Time offset',
-'prefs-advancedediting'         => 'Advanced options',
+'prefs-advancedediting'         => 'General',
+'prefs-editor'                  => 'Editor',
+'prefs-preview'                 => 'Preview',
 'prefs-advancedrc'              => 'Advanced options',
 'prefs-advancedrendering'       => 'Advanced options',
 'prefs-advancedsearchoptions'   => 'Advanced options',
@@ -1970,6 +2022,8 @@ 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.',
+'userrights-removed-self'        => 'You successfully removed your own rights. As such, you are no longer able to access this page.',
 
 # Groups
 'group'               => 'Group:',
@@ -2040,6 +2094,10 @@ Your email address is not revealed when other users contact you.',
 'right-editusercssjs'         => "Edit other users' CSS and JavaScript files",
 'right-editusercss'           => "Edit other users' CSS files",
 'right-edituserjs'            => "Edit other users' JavaScript files",
+'right-editmyusercss'         => 'Edit your own user CSS files',
+'right-editmyuserjs'          => 'Edit your own user JavaScript files',
+'right-viewmywatchlist'       => 'View your own watchlist',
+'right-editmywatchlist'       => 'Edit your own watchlist. Note some actions will still add pages even without this right.',
 'right-rollback'              => 'Quickly rollback the edits of the last user who edited a particular page',
 'right-markbotedits'          => 'Mark rolled-back edits as bot edits',
 'right-noratelimit'           => 'Not be affected by rate limits',
@@ -2101,6 +2159,8 @@ Your email address is not revealed when other users contact you.',
 'action-userrights-interwiki' => 'edit user rights of users on other wikis',
 'action-siteadmin'            => 'lock or unlock the database',
 'action-sendemail'            => 'send emails',
+'action-viewmywatchlist'      => 'view your watchlist',
+'action-editmywatchlist'      => 'edit your watchlist',
 
 # Recent changes
 'nchanges'                          => '$1 {{PLURAL:$1|change|changes}}',
@@ -2109,6 +2169,7 @@ Your email address is not revealed when other users contact you.',
 'recentchanges-legend'              => 'Recent changes options',
 'recentchanges-summary'             => 'Track the most recent changes to the wiki on this page.',
 'recentchangestext'                 => '-', # do not translate or duplicate this message to other languages
+'recentchanges-noresult'            => 'No changes during the given period matching these criteria.',
 'recentchanges-feed-description'    => 'Track the most recent changes to the wiki in this feed.',
 'recentchanges-label-newpage'       => 'This edit created a new page',
 'recentchanges-label-minor'         => 'This is a minor edit',
@@ -2148,7 +2209,6 @@ Your email address is not revealed when other users contact you.',
 'recentchangeslinked-feed'     => 'Related changes',
 'recentchangeslinked-toolbox'  => 'Related changes',
 'recentchangeslinked-title'    => 'Changes related to "$1"',
-'recentchangeslinked-noresult' => 'No changes on linked pages during the given period.',
 'recentchangeslinked-summary'  => "This is a list of changes made recently to pages linked from a specified page (or to members of a specified category).
 Pages on [[Special:Watchlist|your watchlist]] are '''bold'''.",
 'recentchangeslinked-page'     => 'Page name:',
@@ -2160,7 +2220,7 @@ Pages on [[Special:Watchlist|your watchlist]] are '''bold'''.",
 'reuploaddesc'                => 'Cancel upload and return to the upload form',
 'upload-tryagain'             => 'Submit modified file description',
 'uploadnologin'               => 'Not logged in',
-'uploadnologintext'           => 'You must be [[Special:UserLogin|logged in]] to upload files.',
+'uploadnologintext'           => 'You must $1 to upload files.',
 'upload_directory_missing'    => 'The upload directory ($1) is missing and could not be created by the webserver.',
 'upload_directory_read_only'  => 'The upload directory ($1) is not writable by the webserver.',
 'uploaderror'                 => 'Upload error',
@@ -2395,13 +2455,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-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',
@@ -2782,6 +2842,16 @@ Supported {{PLURAL:$2|protocol|protocols}}: <code>$1</code> (defaults to http://
 'listusers-noresult' => 'No user found.',
 'listusers-blocked'  => '(blocked)',
 
+# Special:ActiveUsers
+'activeusers'            => 'Active users list',
+'activeusers-summary'    => '', # do not translate or duplicate this message to other languages
+'activeusers-intro'      => 'This is a list of users who had some kind of activity within the last $1 {{PLURAL:$1|day|days}}.',
+'activeusers-count'      => '$1 {{PLURAL:$1|action|actions}} in the last {{PLURAL:$3|day|$3 days}}',
+'activeusers-from'       => 'Display users starting at:',
+'activeusers-hidebots'   => 'Hide bots',
+'activeusers-hidesysops' => 'Hide administrators',
+'activeusers-noresult'   => 'No users found.',
+
 # Special:ListGroupRights
 'listgrouprights'                      => 'User group rights',
 'listgrouprights-summary'              => 'The following is a list of user groups defined on this wiki, with their associated access rights.
@@ -2862,10 +2932,9 @@ Future changes to this page and its associated talk page will be listed there.',
 'unwatchthispage'      => 'Stop watching',
 'notanarticle'         => 'Not a content page',
 '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}}.',
@@ -3125,7 +3194,7 @@ $1',
 'mycontris'             => 'Contributions',
 'contribsub2'           => 'For $1 ($2)',
 'nocontribs'            => 'No changes were found matching these criteria.',
-'uctop'                 => '(top)',
+'uctop'                 => '(current)',
 'month'                 => 'From month (and earlier):',
 'year'                  => 'From year (and earlier):',
 
@@ -3469,6 +3538,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',
@@ -3700,7 +3771,6 @@ You can view its source',
 '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
@@ -3880,11 +3950,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:
 
@@ -3894,8 +3979,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
@@ -3971,7 +4054,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',
@@ -4168,7 +4251,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',
@@ -4516,7 +4599,7 @@ Please confirm that you really want to recreate this page.",
 'semicolon-separator' => ';&#32;', # only translate this message to other languages if you have to change it
 'comma-separator'     => ',&#32;', # only translate this message to other languages if you have to change it
 'colon-separator'     => ':&#32;', # only translate this message to other languages if you have to change it
-'autocomment-prefix'  => '-&#32;', # only translate this message to other languages if you have to change it
+'autocomment-prefix'  => '', # only translate this message to other languages if you have to change it
 'pipe-separator'      => '&#32;|&#32;', # only translate this message to other languages if you have to change it
 'word-separator'      => '&#32;', # only translate this message to other languages if you have to change it
 'ellipsis'            => '...', # only translate this message to other languages if you have to change it
@@ -4742,12 +4825,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',
@@ -4843,6 +4932,7 @@ This site is experiencing technical difficulties.',
 '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',
index 071c7fc..8131e30 100644 (file)
@@ -16,6 +16,7 @@
  * @author Blahma
  * @author Castelobranco
  * @author Eliovir
+ * @author Geitost
  * @author Iketsi
  * @author Jens Liebenau
  * @author Kaganer
@@ -28,6 +29,7 @@
  * @author Michawiki
  * @author Mihxil
  * @author MinuteElectron
+ * @author Nemo bis
  * @author Objectivesea
  * @author Omnipaedista
  * @author Pedroca cerebral
@@ -79,11 +81,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 +100,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 +108,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 +138,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 +151,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 +186,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 +225,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 +261,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 +354,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 +368,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 +479,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',
@@ -502,6 +512,7 @@ $messages = array(
 'create-this-page' => 'Krei ĉi tiun paĝon',
 'delete' => 'Forigi',
 'deletethispage' => 'Forigi ĉi tiun paĝon',
+'undeletethispage' => 'Restarigi tiun ĉi paĝon',
 'undelete_short' => 'Malforigi {{PLURAL:$1|redakton|$1 redaktojn}}',
 'viewdeleted_short' => 'Vidi {{PLURAL:$1|unu forigitan redakton|$1 forigitajn redaktojn}}',
 'protect' => 'Protekti',
@@ -555,7 +566,6 @@ $1',
 'disclaimers' => 'Malgarantio',
 'disclaimerpage' => 'Project:Malgarantia paĝo',
 'edithelp' => 'Helpo pri redaktado',
-'edithelppage' => 'Help:Kiel redakti paĝon',
 'helppage' => 'Help:Enhavo',
 'mainpage' => 'Ĉefpaĝo',
 'mainpage-description' => 'Ĉefpaĝo',
@@ -706,6 +716,8 @@ $2',
 'namespaceprotected' => "Vi ne rajtas redakti paĝojn en la '''$1''' nomspaco.",
 'customcssprotected' => 'Vi ne rajtas redakti ĉi tiun CSS-paĝon, ĉar ĝi enhavas personajn alĝustigojn de alia uzanto.',
 'customjsprotected' => 'Vi ne rajtas redakti ĉi tiun JavaScript-paĝon, ĉar ĝi enhavas personajn alĝustigojn de alia uzanto.',
+'mycustomcssprotected' => 'Vi ne havas la rajton redakti tiun ĉi CSS-paĝon.',
+'mycustomjsprotected' => 'Vi ne havas la rajton redakti tiun ĉi JavaScript-paĝon.',
 'ns-specialprotected' => 'Paĝoj en la {{ns:special}} nomspaco ne povas esti redaktataj.',
 'titleprotected' => "Ĉi titolo estas protektita de kreado de [[User:$1|$1]].
 La kialo donata estis ''$2''.",
@@ -731,9 +743,16 @@ 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',
+'createacct-yourpasswordagain' => 'Konfirmu pasvorton',
 'remembermypassword' => 'Memori mian ensalutadon ĉe ĉi tiu komputilo (daŭrante maksimume $1 {{PLURAL:$1|tagon|tagojn}})',
+'userlogin-remembermypassword' => 'Memoru mian ensaluton',
+'userlogin-signwithsecure' => 'Uzu sekurigitan konekton',
 '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,14 +765,31 @@ Ne forgesu ŝanĝi viajn [[Special:Preferences|{{SITENAME}}-preferojn]]',
 'logout' => 'Elsaluti',
 'userlogout' => 'Elsaluti',
 'notloggedin' => 'Ne ensalutinta',
-'nologin' => "Ĉu vi ne havas konton? '''$1'''.",
+'userlogin-noaccount' => 'Ĉu vi ne havas konton?',
+'userlogin-joinproject' => 'Aliĝu al {{SITENAME}}',
+'nologin' => 'Ĉu vi ne havas konton? $1.',
 'nologinlink' => 'Krei konton',
 'createaccount' => 'Krei novan konton',
 'gotaccount' => "Ĉu vi jam havas konton? '''$1'''.",
 'gotaccountlink' => 'Ensaluti',
 'userlogin-resetlink' => 'Ĉu vi forgesis ensalutajn detalojn?',
+'helplogin-url' => 'Help:Ensalutado',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Helpo pri ensalutado]]',
+'createacct-join' => 'Suben enigu informojn pri vi',
+'createacct-emailrequired' => 'Retpoŝta adreso',
+'createacct-emailoptional' => 'Retpoŝta adreso (nedeviga)',
+'createacct-email-ph' => 'Enigu vian retpoŝtan adreson',
 'createaccountmail' => 'Uzi provizoran hazardsignan pasvorton kaj sendi ĝin al la retpoŝto suben',
+'createacct-realname' => 'Vera nomo (nedeviga)',
 'createaccountreason' => 'Kialo:',
+'createacct-reason' => 'Kialo',
+'createacct-reason-ph' => 'Kial vi kreas plian konton',
+'createacct-captcha' => 'Sekureca kontrolo',
+'createacct-imgcaptcha-ph' => 'Entajpu la supran tekston',
+'createacct-submit' => 'Krei konton',
+'createacct-benefit-heading' => '{{SITENAME}} estas kreata de homoj kiel vi.',
+'createacct-benefit-body1' => '{{PLURAL:$1|redakto|redaktoj}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|paĝo|paĝoj}}',
 'badretype' => 'La pasvortojn kiujn vi tajpis ne egalas.',
 'userexists' => 'Salutnomo enigita jam estas uzata.
 Bonvolu elekti alian nomon.',
@@ -794,7 +830,8 @@ Bonvolu saluti denove ricevinte ĝin.',
 'blocked-mailpassword' => 'Via IP adreso estas forbarita de redaktado, kaj tial
 ne rajtas uzi la pasvorto-rekovran funkcion por malebligi misuzon.',
 'eauthentsent' => 'Konfirma retmesaĝo estas sendita al la nomita retadreso. Antaŭ ol iu ajn alia mesaĝo estos sendita al la konto, vi devos sekvi la instrukciojn en la mesaĝo por konfirmi ke la konto ja estas la via.',
-'throttled-mailpassword' => 'Pasvorta rememorigilo estis jam sendita, ene de la {{PLURAL:$1|lasta $1 horo|lastaj $1 horoj}}. Por preventi misuzo, nur unu pasvorto-rememorigilo estos sendita po {{PLURAL:$1|$1 horo|$1 horoj}}.',
+'throttled-mailpassword' => 'Retpoŝto kun reŝargita pasvorto estis jam sendita ene de la {{PLURAL:$1|lasta horo|lastaj $1 horoj}}.
+Por preventi misuzon, nur unu reŝargita pasvorto estos sendita dum {{PLURAL:$1|horo|$1 horoj}}.',
 'mailerror' => 'Okazis eraro sendante retpoŝtaĵon: $1',
 'acct_creation_throttle_hit' => 'Vizitintoj al ĉi tiu vikio uzintaj vian IP-adreson kreis {{PLURAL:$1|1 konton|$1 kontojn}} dum la lasta tago, kiu estas la maksimume permesita en ĉi tiu tempoperiodo.
 Tial, vizitantoj kun ĉi tiu IP-adreso ne povas krei pluajn kontojn ĉi-momente.',
@@ -823,6 +860,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 +882,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 +913,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 +959,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.',
@@ -959,7 +997,7 @@ Notu, ke vi ne povas uzi la servon "Retpoŝtu ĉi tiu uzanton" krom se vi havas
 
 Via nuna IP-adreso estas $3, kaj la forbaro-identigo estas $5.
 Bonvolu inkluzivi tiujn detalojn en iuj ajn demandoj kiun vi farus.',
-'blockednoreason' => 'nenia kialo donata',
+'blockednoreason' => 'neniu kialo estis donita',
 'whitelistedittext' => 'Vi devas $1 por redakti paĝojn.',
 'confirmedittext' => 'Vi devas konfirmi vian retpoŝtan adreson antaŭ ol redakti paĝojn. Bonvolu agordi kaj validigi vian retadreson per viaj [[Special:Preferences|preferoj]].',
 'nosuchsectiontitle' => 'Ne povas trovi sekcion',
@@ -968,7 +1006,7 @@ Bonvolu inkluzivi tiujn detalojn en iuj ajn demandoj kiun vi farus.',
 'loginreqtitle' => 'Nepre ensaluti',
 'loginreqlink' => 'ensaluti',
 'loginreqpagetext' => 'Vi devas $1 por rigardi aliajn paĝojn.',
-'accmailtitle' => 'Pasvorto sendita.',
+'accmailtitle' => 'La pasvorto estas sendita.',
 'accmailtext' => "Hazarde generita pasvorto por [[User talk:$1|$1]] estis sendita al $2.
 
 La pasvorto por ĉi tiu nova konto povas esti ŝanĝita en la paĝo ''[[Special:ChangePassword|ŝanĝi pasvorton]]'' dum ensalutado.",
@@ -1090,12 +1128,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',
@@ -1336,7 +1377,6 @@ Detaloj troveblos en la [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}
 'searchmenu-legend' => 'Serĉaj opcioj',
 'searchmenu-exists' => "'''Estas paĝo nomita \"[[:\$1]]\" en ĉi tiu vikio'''",
 'searchmenu-new' => "'''Krei la paĝon \"[[:\$1]]\" en ĉi tiu vikio!'''",
-'searchhelp-url' => 'Help:Enhavo',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Traserĉi paĝojn kun ĉi tiu prefikso]]',
 'searchprofile-articles' => 'Enhavaj paĝoj',
 'searchprofile-project' => 'Paĝoj pri Helpo kaj Projektoj',
@@ -1358,7 +1398,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 +1419,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',
@@ -1832,11 +1864,11 @@ $1',
 'upload-proto-error' => 'Malvalida protokolo',
 'upload-proto-error-text' => 'Fora alŝuto devas URL-on komence de <code>http://</code> aŭ <code>ftp://</code>.',
 'upload-file-error' => 'Interna eraro',
-'upload-file-error-text' => 'Interna eraro okazis provante krei labordosieron ĉe la servilo. Bonvolu kontakti [[Special:ListUsers/sysop|sistem-administranton]].',
+'upload-file-error-text' => 'Interna eraro okazis provante krei labordosieron ĉe la servilo. Bonvolu kontakti [[Special:ListUsers/sysop|administranton]].',
 'upload-misc-error' => 'Nekonata eraro pri alŝutado.',
 'upload-misc-error-text' => 'Nekonata eraro okazis dum la alŝuto.
 Bonvolu kontroli ke la URL-o estas valida kaj atingebla tiam reprovu.
-Se la problemo kontinuas, kontaku [[Special:ListUsers/sysop|sisteman administranton]].',
+Se la problemo kontinuas, kontaku [[Special:ListUsers/sysop|administranton]].',
 'upload-too-many-redirects' => 'La URL-o enhavis tro multajn alidirektilojn',
 'upload-unknown-size' => 'Nekonata grandeco',
 'upload-http-error' => 'HTTP-eraro okazis: $1',
@@ -1929,7 +1961,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>
@@ -2084,6 +2115,8 @@ Bonvolu kontroli aliajn ligilojn al la ŝablonoj antaŭ ol forigi ilin.',
 Ili devus anstataŭe alligi la ĝustan temon.<br />
 Paĝo estas traktata kiel apartigilo se ĝi uzas ŝablonon kiu estas ligita de [[MediaWiki:Disambiguationspage]]",
 
+'pageswithprop' => 'Paĝoj kun paĝa atributo',
+'pageswithprop-legend' => 'Paĝoj kun paĝa atributo',
 'pageswithprop-prop' => 'Nomo de la atributo:',
 'pageswithprop-submit' => 'Ek',
 
@@ -2185,7 +2218,7 @@ Bonvolu noti ke aliaj retejoj povas ligi dosieron kun rekta URL-o, kaj tial esta
 kaj/aŭ informumos pri la libro ligita.
 La {{SITENAME}} ne estas komerce ligita al tiuj vendejoj, kaj la listo ne estu
 komprenata kiel rekomendo aŭ reklamo.',
-'booksources-invalid-isbn' => 'La donata ISBN verŝajne esats nevalida; kontroli por eraroj kopiitaj el la originala fonto.',
+'booksources-invalid-isbn' => 'La donata ISBN verŝajne estas nevalida; kontrolu pri erara kopiado el la originala fonto.',
 
 # Special:Log
 'specialloguserlabel' => 'Faranto:',
@@ -2336,8 +2369,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 +2498,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 +2514,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',
@@ -2601,7 +2635,7 @@ $1',
 'sp-contributions-blocked-notice-anon' => 'Ĉi tiu IP-adreso estas nune forbarita.
 Jen la lasta ero de la forbara protokolo:',
 'sp-contributions-search' => 'Serĉado de kontribuoj',
-'sp-contributions-username' => 'IP-adreso aŭ salutnomo:',
+'sp-contributions-username' => 'IP-adreso aŭ uzantonomo:',
 'sp-contributions-toponly' => 'Montru nur ŝanĝojn kiuj estas la plej lastaj revizioj',
 'sp-contributions-submit' => 'Serĉi',
 
@@ -3059,17 +3093,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 +3106,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 +3157,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 +3186,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 +3265,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 +3304,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 +3482,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',
@@ -3788,8 +3813,8 @@ Bonvolu konfirmi ke vi ja volas rekrei la paĝon.',
 'table_pager_empty' => 'Neniaj rezultoj',
 
 # Auto-summaries
-'autosumm-blank' => 'Forviŝis la paĝon',
-'autosumm-replace' => "Anstataŭigante paĝojn kun '$1'",
+'autosumm-blank' => 'Forviŝis la tutan enhavon el la paĝo',
+'autosumm-replace' => "Anstataŭigis paĝon per '$1'",
 'autoredircomment' => 'Alidirektigis al [[$1]]',
 'autosumm-new' => "Nova paĝo kun '$1'",
 
@@ -3926,13 +3951,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 +4040,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 +4052,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 +4068,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 50cae1b..7b6efad 100644 (file)
  * @author Fibonacci
  * @author Fitoschido
  * @author Fluence
+ * @author Fortega
+ * @author Geitost
  * @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 Miguel2706
  * @author Muro de Aguas
  * @author Omnipaedista
  * @author Orgullomoore
@@ -71,6 +77,7 @@
  * @author Piolinfax
  * @author Platonides
  * @author PoLuX124
+ * @author QuimGil
  * @author Ralgis
  * @author Remember the dot
  * @author Remux
@@ -137,10 +144,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' ),
@@ -148,7 +155,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' ),
@@ -394,8 +401,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',
@@ -410,6 +415,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',
@@ -465,7 +471,7 @@ $messages = array(
 'feb' => 'feb',
 'mar' => 'mar',
 'apr' => 'abr',
-'may' => 'may',
+'may' => 'mayo',
 'jun' => 'jun',
 'jul' => 'jul',
 'aug' => 'ago',
@@ -473,6 +479,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}}',
@@ -554,6 +572,7 @@ $messages = array(
 'create-this-page' => 'Crear esta página',
 'delete' => 'Borrar',
 'deletethispage' => 'Borrar esta página',
+'undeletethispage' => 'Restaurar esta página',
 'undelete_short' => 'Restaurar {{PLURAL:$1|una edición|$1 ediciones}}',
 'viewdeleted_short' => 'Ver {{PLURAL:$1|una edición borrada|$1 ediciones borradas}}',
 'protect' => 'Proteger',
@@ -607,7 +626,6 @@ $1',
 'disclaimers' => 'Aviso legal',
 'disclaimerpage' => 'Project:Limitación general de responsabilidad',
 'edithelp' => 'Ayuda de edición',
-'edithelppage' => 'Help:Cómo se edita una página',
 'helppage' => 'Help:Contenidos',
 'mainpage' => 'Página principal',
 'mainpage-description' => 'Página principal',
@@ -661,7 +679,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',
@@ -754,6 +772,8 @@ $2',
 'namespaceprotected' => "No tienes permiso para editar las páginas del espacio de nombres '''$1'''.",
 'customcssprotected' => 'No tienes permiso para editar esta página CSS, porque contiene configuraciones personales de otro usuario.',
 'customjsprotected' => 'No tienes permiso para editar esta página JavaScript, porque contiene configuraciones personales de otro usuario.',
+'mycustomcssprotected' => 'No tienes permiso para editar esta página CSS.',
+'mycustomjsprotected' => 'No tienes permiso para editar esta página JavaScript.',
 'ns-specialprotected' => 'Las páginas especiales no se pueden editar',
 'titleprotected' => 'Esta página ha sido protegida contra creación por [[User:$1|$1]].
 El motivo dado fue: "\'\'$2\'\'".',
@@ -778,9 +798,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.',
@@ -793,18 +822,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.
@@ -858,7 +907,7 @@ Por favor, escribe una dirección en el formato adecuado o deja el campo en blan
 'cannotchangeemail' => 'Las direcciones de la correo electrónico de las cuentas de usuario no puedes cambiarse en esta wiki.',
 'emaildisabled' => 'Este sitio no puede enviar mensajes de correo electrónico.',
 'accountcreated' => 'Cuenta creada',
-'accountcreatedtext' => 'La cuenta de usuario para $1 ha sido creada.',
+'accountcreatedtext' => 'La cuenta de usuario de [[{{ns:User}}: $1 | $1 ]] ([[{{ns:User talk}}: $1 |talk]]) ha sido creada.',
 'createaccount-title' => 'Creación de cuenta para {{SITENAME}}',
 'createaccount-text' => 'Alguien creó en {{SITENAME}} ($4) una cuenta asociada a este correo electrónico con el nombre «$2».
 La contraseña asignada automáticamente es «$3». Por favor entra ahora y cambia tu contraseña.
@@ -894,28 +943,29 @@ 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 restablecer la contraseña.',
+'passwordreset-text-one' => 'Completa este formulario para restablecer tu contraseña.',
+'passwordreset-text-many' => '{{PLURAL:$1|Introducir uno de los datos para restablecer la contraseña.}}',
 '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:
@@ -930,7 +980,7 @@ ignorar este mensaje y continuar usando tu contraseña anterior.',
 Contraseña temporal: $2',
 '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 al usuario falló: $1',
+'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',
@@ -1139,12 +1189,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',
@@ -1387,7 +1440,6 @@ Los detalles pueden encontrarse en el [{{fullurl:{{#Special:Log}}/delete|page={{
 'searchmenu-legend' => 'Opciones de búsqueda',
 'searchmenu-exists' => "'''Hay una página llamada \"[[:\$1]]\" en esta wiki.'''",
 'searchmenu-new' => "'''¡Crea la página «[[:$1]]» en este wiki!'''",
-'searchhelp-url' => 'Help:Ayuda',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Otras páginas con este prefijo]]',
 'searchprofile-articles' => 'Páginas de contenido',
 'searchprofile-project' => 'Páginas de ayuda y de proyecto',
@@ -1430,15 +1482,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',
@@ -1447,7 +1491,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',
@@ -1580,6 +1624,8 @@ 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.',
+'userrights-removed-self' => 'Usted eliminado con éxito sus propios derechos. Por lo tanto, usted ya no es capaz de acceder a esta página.',
 
 # Groups
 'group' => 'Grupo:',
@@ -1650,6 +1696,8 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
 'right-editusercssjs' => 'Editar las páginas de CSS y JS de otros usuarios',
 'right-editusercss' => 'Editar las páginas de CSS de otros usuarios',
 'right-edituserjs' => 'Editar las páginas de JS de otros usuarios',
+'right-editmyusercss' => 'Editar tus archivos de usuario CSS',
+'right-editmyuserjs' => 'Editar tus propios archivos JavaScript de usuario',
 'right-rollback' => 'Revertir rápidamente las ediciones del último usuario que modificó una página en particular',
 'right-markbotedits' => 'Marcar ediciones deshechas como ediciones de un bot',
 'right-noratelimit' => 'No afectado por límites de frecuencia',
@@ -1895,9 +1943,9 @@ $1',
 'upload-proto-error' => 'Protocolo incorrecto',
 'upload-proto-error-text' => 'Para subir archivos desde otra página la URL debe comenzar por <code>http://</code> o <code>ftp://</code>.',
 'upload-file-error' => 'Error interno al subir el archivo',
-'upload-file-error-text' => 'Ha ocurrido un error interno mientras se intentaba crear un fichero temporal en el servidor. Por favor, contacta con un [[Special:ListUsers/sysop|administrador del sistema]].',
+'upload-file-error-text' => 'Ha ocurrido un error interno mientras se intentaba crear un fichero temporal en el servidor. Por favor, contacta con un [[Special:ListUsers/sysop|administrador]].',
 'upload-misc-error' => 'Error desconocido en la subida',
-'upload-misc-error-text' => 'Ha ocurrido un error durante la subida. Por favor verifica que la URL es válida y accesible e inténtalo de nuevo. Si el problema persiste, contacta con un [[Special:ListUsers/sysop|administrador del sistema]].',
+'upload-misc-error-text' => 'Ha ocurrido un error durante la subida. Por favor verifica que la URL es válida y accesible e inténtalo de nuevo. Si el problema persiste, contacta con un [[Special:ListUsers/sysop|administrador]].',
 'upload-too-many-redirects' => 'La URL contenía demasiadas redirecciones',
 'upload-unknown-size' => 'Tamaño desconocido',
 'upload-http-error' => 'Ha ocurrido un error HTTP: $1',
@@ -2315,6 +2363,15 @@ Es necesario, por lo menos, un dominio de alto nivel, por ejemplo "*.org".<br />
 'listusers-noresult' => 'No se encontró al usuario.',
 'listusers-blocked' => '({{GENDER:$1|bloqueado|bloqueada}})',
 
+# Special:ActiveUsers
+'activeusers' => 'Lista de usuarios activos',
+'activeusers-intro' => 'Esta es una lista de usuarios que han tenido alguna actividad en los últimos $1 {{PLURAL:$1|día|días}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|acción|acciones}} en los últimos {{PLURAL:$3|día|$3 días}}',
+'activeusers-from' => 'Mostrando a los usuarios empezando por:',
+'activeusers-hidebots' => 'Ocultar robots',
+'activeusers-hidesysops' => 'Ocultar administradores',
+'activeusers-noresult' => 'No se encontraron usuarios.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Permisos del grupo de usuarios',
 'listgrouprights-summary' => 'La siguiente es una lista de los grupos de usuario definidos en esta wiki y de sus privilegios de acceso asociados.
@@ -2391,8 +2448,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}}.',
@@ -2619,7 +2676,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
@@ -2636,7 +2693,7 @@ $1',
 'mycontris' => 'Contribuciones',
 'contribsub2' => '$1 ($2)',
 'nocontribs' => 'No se encontraron cambios que cumplieran estos criterios.',
-'uctop' => '(última edición)',
+'uctop' => '(Edición actual)',
 'month' => 'Desde el mes (y anteriores):',
 'year' => 'Desde el año (y anteriores):',
 
@@ -2736,7 +2793,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',
@@ -2796,6 +2853,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',
@@ -2957,6 +3015,8 @@ Por favor visita [//www.mediawiki.org/wiki/Localisation Localización MediaWiki]
 'thumbnail-more' => 'Aumentar',
 'filemissing' => 'Falta archivo',
 'thumbnail_error' => 'Error al crear miniatura: $1',
+'thumbnail_error_remote' => 'Mensaje de error de  $1 :
+$2',
 'djvu_page_error' => 'Página DjVu fuera de rango',
 'djvu_no_xml' => 'Imposible obtener XML para el archivo DjVu',
 'thumbnail-temp-create' => 'No se ha podido crear el archivo temporal de la miniatura',
@@ -3108,13 +3168,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) */',
+'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" */',
 '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 */',
@@ -3290,11 +3349,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:
 
@@ -3323,7 +3396,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',
@@ -3501,7 +3574,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',
@@ -3885,7 +3958,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',
@@ -3899,11 +3972,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',
@@ -3913,12 +3986,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',
@@ -4010,6 +4088,9 @@ 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',
@@ -4019,14 +4100,14 @@ Este sitio está experimentando dificultades técnicas.',
 'logentry-delete-delete' => '$1 {{GENDER:$2|borró}} la página «$3»',
 'logentry-delete-restore' => '$1 restauró la página «$3»',
 'logentry-delete-event' => '$1 {{GENDER:$2|modificó}} la visibilidad de {{PLURAL:$5|un evento|$5 eventos}} del registro en $3: $4',
-'logentry-delete-revision' => '$1 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-delete-revision' => '$1 {{GENDER:$2|modificó}} la visibilidad de {{PLURAL:$5|una revisión |$5 revisiones}} en la página  $3: $4',
+'logentry-delete-event-legacy' => '$1 ha {{GENDER:$2|cambiado}} la visibilidad de registro de eventos en $3',
+'logentry-delete-revision-legacy' => '$1 ha {{GENDER:$2|cambiado}} la visibilidad de las revisiones en la página $3',
 'logentry-suppress-delete' => '$1 {{GENDER:$2|borró}}, con restricciones para administradores aplicadas, la página $3',
-'logentry-suppress-event' => '$1 modificó secretamente la visibilidad de {{PLURAL:$5|un evento del registro|$5 eventos del registro}} en $3: $4',
+'logentry-suppress-event' => '$1 {{GENDER:$2|modificó}} secretamente la visibilidad de {{PLURAL:$5|una edición|$5 ediciones}} en la página $3: $4',
 'logentry-suppress-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-event-legacy' => '$1 {{GENDER:$2|modificó}} secretamente la visibilidad de los eventos del registro en $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|modificó}} secretamente la visibilidad de varias ediciones en la página $3',
 'revdelete-content-hid' => 'contenido ocultado',
 'revdelete-summary-hid' => 'resumen de edición oculto',
 'revdelete-uname-hid' => 'nombre de usuario ocultado',
@@ -4038,17 +4119,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-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-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 {{GENDER:$2|marcó}} como patrullada la edición $4 de la página $3',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|marcó}} automáticamente la edición $4 de la página $3 como patrullada',
+'logentry-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
index 5873721..97001cb 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Avjoska
  * @author Cylly1512
+ * @author Geitost
  * @author Hendrik
  * @author Hendrix
  * @author Jaan513
@@ -18,6 +19,7 @@
  * @author Ker
  * @author Kyng
  * @author Morel
+ * @author Nemo bis
  * @author Oop
  * @author Pikne
  * @author Silvar
@@ -320,8 +322,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 +335,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',
@@ -398,6 +399,18 @@ $messages = array(
 'oct' => 'okt',
 'nov' => 'nov',
 'dec' => 'dets',
+'january-date' => '$1. jaanuar',
+'february-date' => '$1. veebruar',
+'march-date' => '$1. märts',
+'april-date' => '$1. aprill',
+'may-date' => '$1. mai',
+'june-date' => '$1. juuni',
+'july-date' => '$1. juuli',
+'august-date' => '$1. august',
+'september-date' => '$1. september',
+'october-date' => '$1. oktoober',
+'november-date' => '$1. november',
+'december-date' => '$1. detsember',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategooria|Kategooriad}}',
@@ -478,6 +491,7 @@ $messages = array(
 'create-this-page' => 'Loo see lehekülg',
 'delete' => 'Kustuta',
 'deletethispage' => 'Kustuta see lehekülg',
+'undeletethispage' => 'Taasta see lehekülg',
 'undelete_short' => 'Taasta {{PLURAL:$1|üks muudatus|$1 muudatust}}',
 'viewdeleted_short' => 'Vaata {{PLURAL:$1|üht|$1}} kustutatud redaktsiooni',
 'protect' => 'Kaitse',
@@ -529,7 +543,6 @@ $1',
 'disclaimers' => 'Hoiatused',
 'disclaimerpage' => 'Project:Hoiatused',
 'edithelp' => 'Redigeerimisjuhend',
-'edithelppage' => 'Help:Kuidas_lehte_redigeerida',
 'helppage' => 'Help:Sisukord',
 'mainpage' => 'Esileht',
 'mainpage-description' => 'Esileht',
@@ -679,6 +692,8 @@ $2',
 'namespaceprotected' => "Sul pole õigust redigeerida lehekülgi nimeruumis '''$1'''.",
 'customcssprotected' => 'Sul pole õigust seda CSS-lehekülge redigeerida, sest see sisaldab teise kasutaja isiklikke sätteid.',
 'customjsprotected' => 'Sul pole õigust seda JavaScripti lehekülge redigeerida, sest see sisaldab teise kasutaja isiklikke sätteid.',
+'mycustomcssprotected' => 'Sul pole õigust redigeerida seda CSS-lehekülge.',
+'mycustomjsprotected' => 'Sul pole õigust redigeerida seda JavaScript-lehekülge.',
 'ns-specialprotected' => 'Erilehekülgi ei saa redigeerida.',
 'titleprotected' => "Kasutaja [[User:$1|$1]] on selle pealkirjaga lehe loomise keelanud esitades järgmise põhjenduse: ''$2''.",
 'filereadonlyerror' => 'Faili "$1" ei saa muuta, sest hoidla "$2" on kirjutuskaitstud.
@@ -703,9 +718,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' => 'Kasuta turvalist ühendust',
 '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 +742,38 @@ 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',
-'nologin' => "Sul pole kontot? '''$1'''.",
+'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?',
+'userlogin-resetpassword-link' => 'Lähtesta oma parool',
+'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' => '{{PLURAL:$1|muudatus|muudatust}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|lehekülg|lehekülge}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|hiljutine kaastööline|hiljutist kaastöölist}}',
 'badretype' => 'Sisestatud paroolid ei lange kokku.',
 '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.',
@@ -775,7 +819,7 @@ Ole hea ja sisesta õige e-posti aadress või jäta väli tühjaks.',
 'cannotchangeemail' => 'Selles vikis ei saa konto e-posti aadressi muuta.',
 'emaildisabled' => 'Selle võrgukoha kaudu ei saa e-kirju saata.',
 'accountcreated' => 'Konto loodud',
-'accountcreatedtext' => 'Kasutajakonto kasutajatunnusele $1 loodud.',
+'accountcreatedtext' => 'Kasutaja [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) konto on loodud.',
 'createaccount-title' => '{{GRAMMAR:illative|{{SITENAME}}}} konto loomine',
 'createaccount-text' => 'Keegi on loonud {{GRAMMAR:illative|{{SITENAME}}}} ($4) sinu e-posti aadressile vastava kasutajatunnuse "$2". Parooliks seati "$3". Logi sisse ja muuda oma parool.
 
@@ -789,7 +833,8 @@ 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-addy' => 'Püüdsid saata e-kirja ilma e-posti aadressita.',
+'user-mail-no-body' => 'Püüti saata tühja või ebamõistlikult lühikese sisuosaga e-kirja.',
 
 # Change password dialog
 'resetpass' => 'Parooli muutmine',
@@ -810,13 +855,15 @@ Sisselogimine...',
 '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 oma parool lähtestada.',
+'passwordreset-text-one' => 'Täida see vorm, et oma parool lähtestada.',
+'passwordreset-text-many' => '{{PLURAL:$1|Sisesta üks andmeüksus, et oma parool lähtestada.}}',
 '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?',
@@ -839,7 +886,7 @@ Peaksid nüüd sisse logima ja uue parooli valima. Kui selle palve esitas keegi
 Ajutine parool: $2',
 '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 kasutajale saatmine ebaõnnestus: $1',
+'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',
@@ -1050,11 +1097,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 "Toimetamine" keelata.',
 
 # Content models
 'content-model-wikitext' => 'vikiteksti',
@@ -1256,7 +1306,7 @@ Pane tähele, et navigeerimislinkide kasutamine lähtestab redaktsioonide valiku
 'difference-title' => 'Erinevus lehekülje "$1" redaktsioonide vahel',
 'difference-title-multipage' => 'Erinevus lehekülgede "$1" ja "$2" vahel',
 'difference-multipage' => '(Lehekülgede erinevus)',
-'lineno' => 'Rida $1:',
+'lineno' => '$1. rida:',
 'compareselectedversions' => 'Võrdle valitud redaktsioone',
 'showhideselectedversions' => 'Näita/peida valitud versioonid',
 'editundo' => 'eemalda',
@@ -1287,7 +1337,6 @@ Harilikult tähendab see seda, et sind siia juhatanud link on vananenud ja siin
 'searchmenu-legend' => 'Otsingu sätted',
 'searchmenu-exists' => "'''Lehekülg pealkirjaga \"[[:\$1]]\" on olemas.'''",
 'searchmenu-new' => "'''Loo lehekülg pealkirjaga \"[[:\$1]]\".'''",
-'searchhelp-url' => 'Help:Sisukord',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Sirvi selle eesliitega lehekülgi]]',
 'searchprofile-articles' => 'Sisuleheküljed',
 'searchprofile-project' => 'Abi- ja projektilehed',
@@ -1332,15 +1381,7 @@ päringu ees prefiksit ''all:''. Konkreetsest nimeruumist otsimiseks kasuta pref
 'searchdisabled' => "Otsimine on preagu keelatud.
 Vahepeal saad otsimiseks Google'it kasutada.
 Pane tähele, et Google'is talletatud {{GRAMMAR:genitive|{{SITENAME}}}} sisu võib olla iganenud.",
-
-# Quickbar
-'qbsettings' => 'Kiirriba',
-'qbsettings-none' => 'Puudub',
-'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',
+'search-error' => 'Otsimise ajal ilmnes tõrge: $1',
 
 # Preferences page
 'preferences' => 'Eelistused',
@@ -1464,7 +1505,7 @@ 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 kasutajanimi:',
 'editusergroup' => 'Muuda kasutajarühma',
@@ -1480,10 +1521,12 @@ 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.',
+'userrights-removed-self' => 'Võtsid edukalt endalt õigused. Seetõttu sellele leheküljele sa enam ligi ei pääse.',
 
 # Groups
 'group' => 'Rühm:',
@@ -1554,6 +1597,8 @@ See ei tohi olla pikem kui {{PLURAL:$1|üks märk|$1 märki}}.',
 'right-editusercssjs' => 'Redigeerida teiste kasutajate CSS- ja JS-faile',
 'right-editusercss' => 'Redigeerida teiste kasutajate CSS-faile',
 'right-edituserjs' => 'Redigeerida teiste kasutajate JS-faile',
+'right-editmyusercss' => 'Redigeerida oma CSS-kasutajafaile',
+'right-editmyuserjs' => 'Redigeerida oma JavaScript-kasutajafaile',
 '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',
@@ -1576,7 +1621,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"
@@ -1629,17 +1674,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',
@@ -2196,6 +2241,15 @@ Toetatud {{PLURAL:$2|protokoll|protokollid}}: <code>$1</code> (määramata proto
 'listusers-noresult' => 'Kasutajat ei leitud.',
 'listusers-blocked' => '(blokeeritud)',
 
+# Special:ActiveUsers
+'activeusers' => 'Aktiivsete kasutajate nimekiri',
+'activeusers-intro' => 'See on loetelu kasutajatest, kes on viimase $1 {{PLURAL:$1|päev|päeva}} jooksul midagi teinud.',
+'activeusers-count' => '$1 {{PLURAL:$1|toiming|toimingut}} viimase {{PLURAL:$3|päeva|$3 päeva}} jooksul',
+'activeusers-from' => 'Näita kasutajaid alates:',
+'activeusers-hidebots' => 'Peida robotid',
+'activeusers-hidesysops' => 'Peida administraatorid',
+'activeusers-noresult' => 'Kasutajaid ei leidunud.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Kasutajarühma õigused',
 'listgrouprights-summary' => 'Siin on loetletud selle viki kasutajarühmad ja rühmaga seotud õigused.
@@ -2272,8 +2326,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 lubatud.',
+'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}}.',
@@ -2399,6 +2453,7 @@ 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:',
@@ -2522,7 +2577,7 @@ $1',
 'mycontris' => 'Kaastöö',
 'contribsub2' => 'Kasutaja $1 ($2) jaoks',
 'nocontribs' => 'Antud kriteeriumitele vastavaid muudatusi ei leitud.',
-'uctop' => ' (uusim)',
+'uctop' => '(praegune)',
 'month' => 'Alates kuust (ja varasemad):',
 'year' => 'Alates aastast (ja varasemad):',
 
@@ -2534,7 +2589,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:',
@@ -2846,6 +2901,8 @@ Kui soovid MediaWiki tarkvara tõlkimises osaleda, siis vaata lehti [//www.media
 'thumbnail-more' => 'Suurenda',
 'filemissing' => 'Fail puudub',
 'thumbnail_error' => 'Viga pisipildi loomisel: $1',
+'thumbnail_error_remote' => 'Tõrketeade asukohast $1:
+$2',
 'djvu_page_error' => 'DjVu-failis ei ole sellist lehekülge',
 'djvu_no_xml' => 'DjVu failist XML-i lugemine ebaõnnestus.',
 'thumbnail-temp-create' => 'Ajutist pisipildifaili ei õnnestu luua.',
@@ -3155,11 +3212,25 @@ 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',
+'monday-at' => 'Esmaspäeval kell $1',
+'tuesday-at' => 'Teisipäeval kell $1',
+'wednesday-at' => 'Kolmapäeval kell $1',
+'thursday-at' => 'Neljapäeval kell $1',
+'friday-at' => 'Reedel kell $1',
+'saturday-at' => 'Laupäeval kell $1',
+'sunday-at' => 'Pühapäeval kell $1',
+'yesterday-at' => 'Eile kell $1',
+
 # 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.
@@ -3193,7 +3264,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',
@@ -3353,7 +3424,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',
@@ -3743,12 +3814,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',
@@ -3839,6 +3915,9 @@ 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',
@@ -3874,6 +3953,8 @@ Pilt kuvatakse algupärases suuruses, muu fail avatakse koheselt seostuva progra
 '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
@@ -3939,15 +4020,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 efcdad2..0544abc 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
@@ -232,6 +233,18 @@ $messages = array(
 'oct' => 'Urr',
 'nov' => 'Aza',
 'dec' => 'Abe',
+'january-date' => 'Urtarrilaren $1',
+'february-date' => 'Otsailaren $1',
+'march-date' => 'Martxoaren $1',
+'april-date' => 'Apirilaren $1',
+'may-date' => 'Maiatzaren $1',
+'june-date' => 'Ekainaren $1',
+'july-date' => 'Uztailaren $1',
+'august-date' => 'Abuztuaren $1',
+'september-date' => 'Irailaren $1',
+'october-date' => 'Urriaren $1',
+'november-date' => 'Azaroaren $1',
+'december-date' => 'Abenduaren $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategoria|Kategoriak}}',
@@ -243,7 +256,7 @@ $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}}, eta guztira $2 orri dira kategoria honetan.}}',
+'category-article-count' => '{{PLURAL:$2|Kategoria honek orrialde hau bakarrik du.|Honako {{PLURAL:$1|orrialdea kategoria honetan dago|$1 orrialdeak kategoria honetan daude}}, guztira dauden $2 orrialdetatik.}}',
 '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}}, eta guztira $2 fitxategi dira kategoria honetan.}}',
 'category-file-count-limited' => 'Ondorengo {{PLURAL:$1|fitxategia kategoria honetan dago.|$1 fitxategiak kategoria honetan daude.}}',
@@ -313,6 +326,7 @@ $messages = array(
 'create-this-page' => 'Orrialde hau sortu',
 'delete' => 'Ezabatu',
 'deletethispage' => 'Ezabatu orri hau',
+'undeletethispage' => 'Orrialde hau bergaitu',
 'undelete_short' => 'Berreskuratu {{PLURAL:$1|aldaketa bat|$1 aldaketa}}',
 'viewdeleted_short' => 'Ikusi ezabatutako {{PLURAL:$1|bidalketa bat|$1 bidalketa}}',
 'protect' => 'Babestu',
@@ -366,7 +380,6 @@ $1',
 'disclaimers' => 'Mugaketak',
 'disclaimerpage' => 'Project:Erantzukizunen mugaketa orokorra',
 'edithelp' => 'Aldaketak egiteko laguntza',
-'edithelppage' => 'Help:Aldaketak egiteko laguntza',
 'helppage' => 'Help:Laguntza',
 'mainpage' => 'Azala',
 'mainpage-description' => 'Azala',
@@ -514,6 +527,8 @@ $2",
 'namespaceprotected' => "Ez daukazu '''$1''' izen-tarteko orrialdeak aldatzeko baimenik.",
 'customcssprotected' => 'Ez duzu baimenik CSS orrialde hau aldatzeko beste erabiltzaile baten hobespen pertsonalak dituelako.',
 'customjsprotected' => 'Ez duzu baimenik JavaScript orrialde hau aldatzeko beste erabiltzaile baten hobespen pertsonalak dituelako.',
+'mycustomcssprotected' => 'Ez duzu baimenik CSS orrialde hau aldatzeko.',
+'mycustomjsprotected' => 'Ez duzu baimentik JavaScript orrialdea aldatzeko.',
 'ns-specialprotected' => 'Ezin dira {{ns:special}} izen-tarteko orrialdeak editatu.',
 'titleprotected' => "[[User:$1|$1]]ek izenburu hau sortzea ekidin zuen.
 Emandako arrazoia ''$2'' izan zen.",
@@ -523,6 +538,7 @@ Blokeoa ezarri zuen administratzaileak honako arrazoia eman zuen: "$3".',
 'invalidtitle-knownnamespace' => 'Izenburua gaizki dago "$2" izen eremuan eta "$3" testuan',
 'invalidtitle-unknownnamespace' => 'Izenburua gaizki dago "$1" izen eremuan ezezagunean eta "$2" testuan',
 'exception-nologin' => 'Saioa hasi gabe',
+'exception-nologin-text' => 'Ekintza edo orrialde honek wiki honetan sartzea eskatzen du.',
 
 # Virus scanner
 'virus-badscanner' => "Ezarpen txarrak: antibirus ezezaguna: ''$1''",
@@ -535,12 +551,24 @@ Blokeoa ezarri zuen administratzaileak honako arrazoia eman zuen: "$3".',
 Erabiltzaile anonimo bezala jarrai dezakezu {{SITENAME}} erabiltzen, edo <span class='plainlinks'>[$1 saioa has dezakezu berriz]</span> erabiltzaile berdinarekin edo ezberdin batekin.
 Kontuan izan orrialde batzuk saioa hasita bazenu bezala ikus ditzakezula nabigatzailearen katxea garbitu arte.",
 'welcomeuser' => 'Ongi etorri, $1!',
+'welcomecreation-msg' => 'Zure kontua sortua izan da.
+Ez ezazu ahaztu zure [[Special:Preferences|{{SITENAME}} hobespenak]] aldatzea.',
 'yourname' => 'Erabiltzaile izena',
+'userlogin-yourname' => 'Erabiltzale izena',
+'userlogin-yourname-ph' => 'Sartu zure erabiltzaile izena',
 'yourpassword' => 'Pasahitza:',
+'userlogin-yourpassword' => 'Pasahitza',
+'userlogin-yourpassword-ph' => 'Sartu zuren pasahitza',
+'createacct-yourpassword-ph' => 'Sartu pasahitza',
 'yourpasswordagain' => 'Pasahitza berriz',
+'createacct-yourpasswordagain' => 'Pasahitza berridatzi',
+'createacct-yourpasswordagain-ph' => 'Sartu pasahitza berriro ere',
 'remembermypassword' => 'Nire saioa ordenagailu honetan gogoratu ({{PLURAL:$1|egun baterako|$1 egunetarako }} gehienez)',
+'userlogin-remembermypassword' => 'Manten nazazu barruan',
+'userlogin-signwithsecure' => 'Erabili konexio ziurra',
 'securelogin-stick-https' => 'Mantendu konektatua HTTPSra sartu ondoren',
 'yourdomainname' => 'Zure domeinua',
+'password-change-forbidden' => 'Ezin duzu pasahitzarik aldatu wiki honetan.',
 'externaldberror' => 'Kanpoko datu-base autentifikazio errorea gertatu da edo ez duzu zure kanpo kontua eguneratzeko baimenik.',
 'login' => 'Saioa hasi',
 'nav-login-createaccount' => 'Saioa hasi / kontua sortu',
@@ -550,18 +578,38 @@ Kontuan izan orrialde batzuk saioa hasita bazenu bezala ikus ditzakezula nabigat
 'logout' => 'Saioa itxi',
 'userlogout' => 'Saioa itxi',
 'notloggedin' => 'Saioa hasi gabe',
+'userlogin-noaccount' => 'Ez al duzu konturik?',
+'userlogin-joinproject' => 'Batu {{SITENAME}}(r)ekin',
 'nologin' => "Ez duzu erabiltzaile konturik? '''$1'''.",
 'nologinlink' => 'Kontua sortu',
 'createaccount' => 'Kontua sortu',
 'gotaccount' => "Baduzu erabiltzaile kontua? '''$1'''.",
 'gotaccountlink' => 'Saioa hasi',
 'userlogin-resetlink' => 'Saioa hasteko datuak ahaztu dituzu?',
+'userlogin-resetpassword-link' => 'Zure pasahitza berrezarri',
+'helplogin-url' => 'Help:Sarrera',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Barrura sartzeko laguntza]]',
+'createacct-join' => 'Sartu zure informazioa azpian.',
+'createacct-emailrequired' => 'E-posta helbidea',
+'createacct-emailoptional' => 'E-posta helbidea (hautazkoa)',
+'createacct-email-ph' => 'Sartu zure e-posta helbidea',
 'createaccountmail' => 'Erabili behin-behineko pasahitz ausazko bat eta bidali behean agertzeko den e-posta helbidera',
+'createacct-realname' => 'Benetako izena (hautazkoa)',
 'createaccountreason' => 'Arrazoia:',
+'createacct-reason' => 'Arrazoia',
+'createacct-reason-ph' => 'Zergatik ari zaren beste erabiltzaile kontu bat',
+'createacct-captcha' => 'Segurtasun froga',
+'createacct-imgcaptcha-ph' => 'Sartu gainean ikusten duzun testua',
+'createacct-submit' => 'Kontua sortu',
+'createacct-benefit-heading' => '{{SITENAME}} zu bezalako pertsonek egiten dute.',
+'createacct-benefit-body1' => '{{PLURAL:$1|edizio bat|$1 edizio}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|Orrialde 1|$1 orrialde}}',
+'createacct-benefit-body3' => 'azkeneko {{PLURAL:$1|egilea|egileak}}',
 'badretype' => 'Idatzitako pasahitzak ez dira berdinak.',
 'userexists' => 'Aukeratutako erabiltzaile izena hartuta dago.
 Mesedez beste bat aukeratu.',
 'loginerror' => 'Errorea saioa hastean',
+'createacct-error' => 'Kontua sortzerakoan arazoa',
 'createaccounterror' => 'Ezin izan da kontua sortu: $1',
 'nocookiesnew' => 'Erabiltzaile kontua sortu da, baina ez da saioa hasi. {{SITENAME}}(e)k cookieak erabiltzen ditu saioekin eta ezgaituta dauzkazu. Gaitu itzazu mesedez, eta ondoren saiatu saioa hasten zure erabiltzaile izen eta pasahitz berriak erabiliz.',
 'nocookieslogin' => '{{SITENAME}}(e)k cookieak erabiltzen ditu saioekin eta ezgaituta dauzkazu. Gaitu itzazu mesedez, eta saiatu berriz.',
@@ -599,7 +647,7 @@ Mesedez, saioa hasi jasotakoan.',
 'eauthentsent' => 'Egiaztapen mezu bat bidali da zehaztutako e-posta helbidera.
 Helbide horretara beste edozein mezu bidali aurretik, bertan azaltzen diren argibideak jarraitu behar dituzu, e-posta hori zurea dela egiaztatzeko.',
 'throttled-mailpassword' => 'Pasahitz gogorarazle bat bidali da jada azken {{PLURAL:$1|orduan|$1 orduetan}}.
-Bandalismoa saihesteko pasahitz eskaera bat baino ezin da egin {{PLURAL:$1|orduan|$1 orduan}} behin.',
+Bandalismoa sahiesteko pasahitz eskaera bat baino ezin da egin {{PLURAL:$1|orduan|$1 orduan}} behin.',
 'mailerror' => 'Errorea mezua bidaltzerakoan: $1',
 'acct_creation_throttle_hit' => 'Sentitzen dugu, {{PLURAL:$1|erabiltzaile kontu bat sortu duzu|$1 erabiltzaile kontu sortu dituzu}} dagoeneko.
 Ondorioz, ezin duzu kontu gehiago sortu.',
@@ -610,9 +658,10 @@ Ondorioz, ezin duzu kontu gehiago sortu.',
 'invalidemailaddress' => 'Ezin da e-posta helbide hori ontzat eman baliogabeko formatua duela dirudielako.
 
 Mesedez, formatu egokia duen helbide bat zehaztu, edo hutsik utzi.',
+'cannotchangeemail' => 'Kontuen e-posta helbideak ezin dira aldatu wiki honetan.',
 'emaildisabled' => 'Gune honek ezin du e-postarik bidali.',
 'accountcreated' => 'Kontua sortuta',
-'accountcreatedtext' => '$1 erabiltzaile kontua sortu egin da.',
+'accountcreatedtext' => '[[{{ns:User}}:$1|$1]] lankidearentzat ([[{{ns:User talk}}:$1|eztabaida]]) kontua sortu da.',
 'createaccount-title' => '{{SITENAME}}-rako kontua sortu',
 'createaccount-text' => 'Norbaitek zure e-postarekin kontu bat sortu du {{SITENAME}}(e)n ($4) "$2" izenarekin eta "$3" pasahitzarekin.
 Orain bertan sar zaitezke eta zure pasahitza aldatu.
@@ -621,11 +670,14 @@ Kontu honen sorrera akats bat dela uste baduzu mezu honi ez diozu zertan jaramon
 'usernamehasherror' => 'Erabiltzaile-izenak ezin du kuxin-karaktererik eduki',
 'login-throttled' => 'Saioa hasteko saiakera gehiegi egin berri dituzu.
 Berriro saiatu aurretik itxaron ezazu, mesedez.',
+'login-abort-generic' => 'Zure sarrera ez da arrakastatsua izan - Abortatua',
 'loginlanguagelabel' => 'Hizkuntza: $1',
 'suspicious-userlogout' => 'Saioa amaitzeko egin duzun eskaria ukatu da. Izan ere, ematen du eskari hori gaizki dabilen nabigatzaile edo cache proxy batek bidali duela.',
 
 # Email sending
 'php-mail-error-unknown' => 'PHPren mail() funtzioan arazo ezezagun bat egon da.',
+'user-mail-no-addy' => 'E-posta bidaltzen saiatu zara e-posta helbiderik gabe.',
+'user-mail-no-body' => 'E-posta bidaltzen saiatu zara testu gorputzik gabe edo laburregiarekin.',
 
 # Change password dialog
 'resetpass' => 'Pasahitza aldatu',
@@ -644,22 +696,34 @@ Berriro saiatu aurretik itxaron ezazu, mesedez.',
 'resetpass-wrong-oldpass' => 'Behin-behineko edo oraintxuko pasahitza ez da baliagarria.
 Agian dagoeneko ondo aldatu duzu zure pasahitza edo behin-behineko pasahitza bat eskatu duzu.',
 'resetpass-temp-password' => 'Behin-behineko pasahitza:',
+'resetpass-abort-generic' => 'Estentsio batek pasahitza aldatzea ekidin du.',
 
 # Special:PasswordReset
 'passwordreset' => 'Pasahitzaren berrezarpena',
+'passwordreset-text-one' => 'Bete formulario hau zure pasahitza berrezartzeko.',
+'passwordreset-text-many' => '{{PLURAL:$1|Sartu datuetako bat zure pasahitza berrezartzeko.}}',
 'passwordreset-legend' => 'Pasahitza berrezarri',
+'passwordreset-disabled' => 'Pasahitza berrezartzea ez da posible wiki honetan.',
+'passwordreset-emaildisabled' => 'E-posta aukerak ez daude eskuragarri wiki honetan.',
 'passwordreset-username' => 'Lankide izena:',
 'passwordreset-domain' => 'Domeinua:',
+'passwordreset-capture' => 'Bidaliko den e-posta ikusi nahi?',
+'passwordreset-capture-help' => 'Kutxa hau hautatzen baduzu behin-behineko pasahitza duen e-posta erakutsiko zatzaizu, eta erabiltzaileari bidaliko zaio.',
 'passwordreset-email' => 'E-mail helbidea:',
+'passwordreset-emailtitle' => '{{SITENAME}}-rako kontuaren xehetasunak',
 'passwordreset-emailelement' => 'Erabiltzaile izena: $1
 Behin-behineko pasahitza: $2',
-'passwordreset-emailsent' => 'Gogorarazteko e-posta bidali da.',
+'passwordreset-emailsent' => 'Pasahitza berrezartzeko e-posta bidali da.',
 
 # Special:ChangeEmail
 'changeemail' => 'Aldatu e-mail helbidea',
+'changeemail-header' => 'Aldatu kontuko e-posta helbidea',
+'changeemail-text' => 'Bete ezazu formulario hau e-posta helbidea aldatzeko. Zure pasahitza sartu beharko duzu aldaketa hau baieztatzeko.',
+'changeemail-no-info' => 'Orrialde honetara zuzenean sartzeko izena eman behar duzu.',
 'changeemail-oldemail' => 'Egungo e-mail helbidea:',
 'changeemail-newemail' => 'E-posta helbide berria:',
 'changeemail-none' => '(bat ere ez)',
+'changeemail-password' => 'Zure {{SITENAME}}ko pasahitza:',
 'changeemail-submit' => 'E-posta aldatu',
 'changeemail-cancel' => 'Utzi',
 
@@ -849,10 +913,15 @@ Ez du azalpenik eman.',
 'edit-gone-missing' => 'Ezin da orria eguneratu. Ezabatu omen dute.',
 'edit-conflict' => 'Aldaketa gatazka.',
 'edit-no-change' => 'Zure edizioa baztertu da testua aldatu ez duzulako.',
+'postedit-confirmation' => 'Zure aldaketa gorde da.',
 'edit-already-exists' => 'Ezin izan da orri berria sortu.
 Jada existitzen da.',
+'defaultmessagetext' => 'Testu lehenetsia',
+'content-failed-to-parse' => 'Ezin izan da $2(r)en edukia parseatu $1 modeloarentzat: $3',
+'invalid-content-data' => 'Eduki datu baliogabea',
+'content-not-allowed-here' => '"$1" edukia ez dago baimendua [[$2]] orrialdean',
 '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.',
+Saioa hasi baduzu, mezu hau kendu dezakezu zure hobespenen orrialdeko "Aldatzen" atalean.',
 
 # Content models
 'content-model-wikitext' => 'wikitestua',
@@ -874,6 +943,12 @@ Eztabaidak aipatu gabe utzi dira.',
 'parser-template-loop-warning' => 'Txantiloiaren itzul-biraketa aurkitu da: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Txantiloaren rekurtsio sakoneraren muga gainditu da ($1)',
 'language-converter-depth-warning' => 'Hizkuntza-bihurgailuaren sakonerak ($1) muga gainditu du',
+'node-count-exceeded-category' => 'Nodo-zenbaketa gainditu den orrialdeak',
+'node-count-exceeded-warning' => 'Orrialdeak nodo-zenbaketa gainditu du',
+'expansion-depth-exceeded-category' => 'Orrialdearen espantsio sakonera gainditu da',
+'expansion-depth-exceeded-warning' => 'Espantsio sakonera gainditu duten orrialdeak',
+'parser-unstrip-loop-warning' => 'Loop unstrip bat aurkitu da',
+'parser-unstrip-recursion-limit' => 'Unstrip errekurtsio limitea gainditu da ($1)',
 
 # "Undo" feature
 'undo-success' => 'Aldaketa desegin daiteke.
@@ -972,7 +1047,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',
@@ -1053,10 +1128,11 @@ Kontura zaitez nabigazio loturek, zutabea ezabatu dezakela.',
 # Diffs
 'history-title' => '"$1" orrialdearen historia berrikuspena',
 'difference-title' => '"$1"-en berrikuspenen arteko aldaketa',
+'difference-title-multipage' => '"$1" eta "$2" orrialdeen arteko ezberditasunak',
 '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}}.)',
 
@@ -1080,7 +1156,6 @@ Kontura zaitez nabigazio loturek, zutabea ezabatu dezakela.',
 'searchmenu-legend' => 'Bilaketa aukerak',
 'searchmenu-exists' => "'''\"[[:\$1]]\" izena duen orrialde bat badago wiki honetan'''",
 'searchmenu-new' => "'''\"[[:\$1]]\" orrialde sortu wiki honetan!'''",
-'searchhelp-url' => 'Help:Laguntza',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Aurrizki hau duten orrialdeetatik nabigatu]]',
 'searchprofile-articles' => 'Eduki-orriak',
 'searchprofile-project' => 'Laguntza eta Proiektu-orriak',
@@ -1327,6 +1402,8 @@ $1 {{PLURAL:$1|karakteretik|karakteretik}} behera izan behar ditu.',
 'right-editusercssjs' => 'Beste lankideen CSS eta JS fitxategiak aldatu',
 'right-editusercss' => 'Beste lankideen CSS fitxategiak aldatu',
 'right-edituserjs' => 'Beste lankideen JS fitxategiak aldatu',
+'right-editmyusercss' => 'Aldatu zure CSS fitxategi propioak',
+'right-editmyuserjs' => 'Aldatu zure JavaScript fitxategi propioak',
 'right-rollback' => 'Orrialde zehatz bat aldatu zuen azken lankidearen aldaketak modu azkar batean leheneratu',
 'right-markbotedits' => 'Atzera bueltan eginiko aldaketak bot baten aldaketak balira markatu',
 'right-noratelimit' => 'Ez dio eragiten erlazio mugak',
@@ -1342,6 +1419,7 @@ $1 {{PLURAL:$1|karakteretik|karakteretik}} behera izan behar ditu.',
 'right-siteadmin' => 'Databasea blokeatu eta desblokeatu',
 'right-override-export-depth' => '5eko sakonerararteko loturiko orrialdeak barne esportatu',
 'right-sendemail' => 'Beste erabiltzaileei e-posta bidali',
+'right-passwordreset' => 'Ikusi pasahitza berrezartze e-postak',
 
 # Special:Log/newusers
 'newuserlogpage' => 'Erabiltzaile erregistroa',
@@ -1421,6 +1499,7 @@ $1 {{PLURAL:$1|karakteretik|karakteretik}} behera izan behar ditu.',
 'newsectionsummary' => '/* $1 */ atal berria',
 'rc-enhanced-expand' => 'Erakutsi xehetasunak (JavaScript beharrezkoa da)',
 'rc-enhanced-hide' => 'Xehetasunak ezkutatu',
+'rc-old-title' => 'hasiera batean "$1" gisa sortua',
 
 # Recent changes linked
 'recentchangeslinked' => 'Lotutako orrietako aldaketak',
@@ -1466,6 +1545,7 @@ Orrialde baten irudi bat txertatzeko, erabili kode hauetako bat:
 'ignorewarnings' => 'Edozein ohar ezikusi.',
 'minlength1' => 'Fitxategi izenek letra bat izan behar dute gutxienez.',
 'illegalfilename' => '"$1" fitxategiaren izenak orrialdeen izenburuetan erabili ezin diren karaktereak ditu. Mesedez, fitxategiari izena aldatu eta saiatu berriz igotzen.',
+'filename-toolong' => 'Fitxategi izenak ezin dira izan 240 byte baino luzeagoak.',
 'badfilename' => 'Irudiaren izena aldatu da: "$1".',
 'filetype-badmime' => 'Ezin dira "$1" MIME motako fitxategiak igo.',
 'filetype-bad-ie-mime' => 'Ezin da fitxategia igo, Internet Explorerek "$1" bezala detektatuko lukeelako, zein fitxategi mota ez onartua eta arriskutsua den.',
@@ -1549,6 +1629,25 @@ $1',
 'upload-unknown-size' => 'Tamaina ezezaguna',
 'upload-http-error' => 'HTTP errorea gertatu da: $1',
 
+# File backend
+'backend-fail-stream' => 'Ezin izan da "$1" fitxategiaren stream egin.',
+'backend-fail-backup' => 'Ezin izan da "$1" fitxategiaren backup egin.',
+'backend-fail-notexists' => '$1 fitxategia ez da existitzen.',
+'backend-fail-hashes' => 'Ezin izan da fitxategien hashak eskuratu konparatzeko.',
+'backend-fail-notsame' => 'Berdina ez den beste fitxategi bat dago "$1"n',
+'backend-fail-invalidpath' => '"$1" ez da gordetzeko helbide baliagarria.',
+'backend-fail-delete' => 'Ezin izan da ezabatu "$1" fitxategia.',
+'backend-fail-alreadyexists' => '"$1" fitxategia jadanik badago.',
+'backend-fail-store' => 'Ezin izan da gorde "$1" fitxategia "$2" helbidean.',
+'backend-fail-copy' => 'Ezin izan da kopiatu "$1" fitxategia "$2" helbidean.',
+'backend-fail-move' => 'Ezin izan da mugitu "$1" fitxategia "$2" helbidean.',
+'backend-fail-opentemp' => 'Ezin izan da behin behineko fitxategia ireki.',
+'backend-fail-writetemp' => 'Ezin da behin behineko fitxategia idatzi.',
+'backend-fail-closetemp' => 'Ezin izan da behin behineko fitxategia itxi.',
+'backend-fail-read' => 'Ezin izan da "$1" fitxategia irakurri.',
+'backend-fail-create' => 'Ezin izan da "$1" fitxategia idatzi.',
+'backend-fail-maxsize' => 'Ezin izan da idatzi "$1" fitxategia {{PLURAL:$2|byte bat|$2 byte}} baino handiagoa delako.',
+
 # ZipDirectoryReader
 'zip-wrong-format' => 'Zehaztutako fitxategia ez zen ZIP motakoa.',
 
@@ -1569,9 +1668,12 @@ Ikusi https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 Fitxategien sarbidea baino ez da onartzen.',
 'img-auth-streaming' => '"$1" sekuentziatzen.',
 'img-auth-noread' => 'Erabiltzaileak ez du "$1" irakurtzeko sarbiderik.',
+'img-auth-bad-query-string' => 'URLan query esaldi baliogabea dago.',
 
 # HTTP errors
 'http-invalid-url' => 'URL baliogabea: $1',
+'http-invalid-scheme' => '"$1" eskema duten URLak ez dira baliagarriak.',
+'http-request-error' => 'HTTP eskariak akatsa izan du errore ezezagun bat dela eta.',
 'http-read-error' => 'HTTP irakurketa-akatsa.',
 'http-timed-out' => 'HTTP eskaera iraungi da.',
 'http-curl-error' => 'Errorea URLa bilatzerakoan: $1',
@@ -1637,6 +1739,7 @@ Bere [$2 fitxategiaren deskribapen orrialdea] behean dago.',
 'uploadnewversion-linktext' => 'Fitxategi honen bertsio berri bat igo',
 'shared-repo-from' => '$1-tik',
 'shared-repo' => 'elkarbanatutako biltegia',
+'upload-disallowed-here' => 'Ezin duzu fitxategi hau gain-idatzi.',
 
 # File reversion
 'filerevert' => '$1 leheneratu',
@@ -1718,6 +1821,11 @@ Bere [$2 fitxategiaren deskribapen orrialdea] behean dago.',
 Kasu bakoitzean dagokion artikulu zuzenarekin izan beharko lukete lotura.<br />
 Orrialde bat argipen motakoa dela antzeman ohi da [[MediaWiki:Disambiguationspage]] orrialdean agertzen den txantiloietako bat duenean.",
 
+'pageswithprop' => 'Orrialde propietatea duten orrialdeak',
+'pageswithprop-legend' => 'Orrialde propietatea duten orrialdeak',
+'pageswithprop-prop' => 'Ezaugarriaren izena:',
+'pageswithprop-submit' => 'Joan',
+
 'doubleredirects' => 'Birzuzenketa bikoitzak',
 'doubleredirectstext' => 'Lerro bakoitzean lehen eta bigarren birzuzenketetarako loturak ikus daitezke, eta baita edukia daukan edo eduki beharko lukeen orrialderako lotura ere. Lehen birzuzenketak azken honetara <del>zuzendu</del> beharko luke.',
 'double-redirect-fixed-move' => '[[$1]] mugitu da eta orain [[$2]](e)ra birzuzenketa bat da',
@@ -1739,10 +1847,13 @@ Orrialde bat argipen motakoa dela antzeman ohi da [[MediaWiki:Disambiguationspag
 # Miscellaneous special pages
 'nbytes' => '{{PLURAL:$1|byte 1|$1 byte}}',
 'ncategories' => '{{PLURAL:$1|kategoria 1|$1 kategoria}}',
+'ninterwikis' => '{{PLURAL:$1|Interwiki $1|$1 interwiki}}',
 'nlinks' => '{{PLURAL:$1|lotura 1|$1 lotura}}',
 'nmembers' => '{{PLURAL:$1|partaide 1|$1 partaide}}',
 'nrevisions' => '{{PLURAL:$1|berrikuspen 1|$1 berrikuspen}}',
 'nviews' => '{{PLURAL:$1|ikusketa 1|$1 ikusketa}}',
+'nimagelinks' => '{{PLURAL:$1|Orrialde batean erabilia|$1 orrialdetan erabilia}}',
+'ntransclusions' => '{{PLURAL:$1|orrialde batean erabilia|$1 orrialdetan erabilia}}',
 'specialpage-empty' => 'Ez dago emaitzarik bilaketa honetarako.',
 'lonelypages' => 'Orrialde umezurtzak',
 'lonelypagestext' => 'Jarraian zerrendatutako orrialdeek ez daukate {{SITENAME}}(e)n beste orrialdeetatik loturarik.',
@@ -1763,8 +1874,10 @@ Orrialde bat argipen motakoa dela antzeman ohi da [[MediaWiki:Disambiguationspag
 'mostlinkedtemplates' => 'Txantiloi erabilienak',
 'mostcategories' => 'Sailkapenean kategoria gehien dituzten orrialdeak',
 'mostimages' => 'Gehien lotutako irudiak',
+'mostinterwikis' => 'Interwiki gehien dituzten orrialdeak',
 'mostrevisions' => 'Berrikuspen gehien dituzten orrialdeak',
 'prefixindex' => 'Orri guztiak aurrizkiekin',
+'prefixindex-namespace' => '$1 izentartean honako aurrizkia duten orrialde guztiak:',
 'shortpages' => 'Orrialde laburrak',
 'longpages' => 'Orrialde luzeak',
 'deadendpages' => 'Orrialde itsuak',
@@ -1780,7 +1893,7 @@ Orrialde bat argipen motakoa dela antzeman ohi da [[MediaWiki:Disambiguationspag
 'listusers' => 'Erabiltzaileen zerrenda',
 'listusers-editsonly' => 'Aldaketak egin dituzten erabiltzaileak soilik erakutsi',
 'listusers-creationsort' => 'Sorrera dataren arabera sailkatu',
-'usereditcount' => '{{PLURAL:$1|aldaketa $1|$1 aldaketa}}',
+'usereditcount' => '{{PLURAL:$1|edizio bat|$1 edizio}}',
 'usercreated' => '{{GENDER:$3|Sortze data}}: $1, $2',
 'newpages' => 'Orrialde berriak',
 'newpages-username' => 'Erabiltzaile izena:',
@@ -1797,6 +1910,7 @@ Mesedez, kontuan izan beste webgune batzutatik URL zuzena erabiliz lotura izan d
 'pager-newer-n' => '{{PLURAL:$1|berriago den 1|berriagoak diren $1}}',
 'pager-older-n' => '{{PLURAL:$1|zaharragoa den 1|zaharragoak diren $1}}',
 'suppress' => 'Gain-ikuspena',
+'querypage-disabled' => 'Orrialde berezi hau desgaituta dago funtzionamendu arrazoiengatik.',
 
 # Book sources
 'booksources' => 'Iturri liburuak',
@@ -1814,6 +1928,7 @@ Mesedez, kontuan izan beste webgune batzutatik URL zuzena erabiliz lotura izan d
 Erregistro mota, erabiltzailearen izena edota orrialdearen izena iragaziz bistaratu daiteke. Letra larriak eta xeheak bereizten dira.',
 'logempty' => 'Ez dago emaitzarik erregistroan.',
 'log-title-wildcard' => 'Testu honekin hasten diren izenburuak bilatu',
+'showhideselectedlogentries' => 'Erakutsi/izkutatu aukeratutako log sarrerak',
 
 # Special:AllPages
 'allpages' => 'Orri guztiak',
@@ -1857,7 +1972,7 @@ Ikus, gainera [[Special:WantedCategories|kategoriarik eskatuenak]].',
 'linksearch-ok' => 'Bilatu',
 'linksearch-text' => '"*.wikipedia.org" bezalako izartxoak erabil daitezke.
 Gutxienez goi mailako domeinua behar du, adibidez "*.org".<br />
-Baimendutako protokoloak: <code>$1</code> (protokoloa zehazten ez bada http:// hartzen da lehenetsitzat).',
+Baimendutako {{PLURAL:$2|protokoloa|protokoloak}}: <code>$1</code> (protokoloa zehazten ez bada http:// hartzen da lehenetsitzat).',
 'linksearch-line' => '$1, $2(e)tik lotuta',
 'linksearch-error' => 'Komodinak izenaren hasieran bakarrik agertu beharko lirateke.',
 
@@ -1867,6 +1982,14 @@ Baimendutako protokoloak: <code>$1</code> (protokoloa zehazten ez bada http:// h
 'listusers-noresult' => 'Ez da erabiltzailerik aurkitu.',
 'listusers-blocked' => '(blokeatua)',
 
+# Special:ActiveUsers
+'activeusers' => 'Lankide aktiboen zerrenda',
+'activeusers-count' => '{{PLURAL:$1|Ekintza berri bat|$1 ekintza berri}} azken {{PLURAL:$3|egunean|$3 egunetan}}',
+'activeusers-from' => 'Bilatu honela hasten diren lankideak:',
+'activeusers-hidebots' => 'Ezkutatu bot-ak',
+'activeusers-hidesysops' => 'Ezkutatu administratzaileak',
+'activeusers-noresult' => 'Ez da lankiderik aurkitu.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Erabiltzaile talde eskumenak',
 'listgrouprights-summary' => 'Ondorengo zerrendak wikian dauden lankide taldeak agertzen dira, beraien eskubideekin.
@@ -1888,9 +2011,10 @@ Badago [[{{MediaWiki:Listgrouprights-helppage}}|informazio osagarria]] banakako
 'mailnologin' => 'Bidalketa helbiderik ez',
 'mailnologintext' => 'Beste erabiltzaileei e-posta mezuak bidaltzeko [[Special:UserLogin|saioa hasi]] eta baliozko e-posta helbidea behar duzu izan zure [[Special:Preferences|hobespenetan]].',
 'emailuser' => 'Erabiltzaile honi e-posta bidali',
+'emailuser-title-target' => '{{GENDER:$1|Erabiltzale}} honi e-posta bidali',
 'emailuser-title-notarget' => 'Erabiltzaileari e-maila bidali',
 'emailpage' => 'Erabiltzaileari e-posta bidali',
-'emailpagetext' => 'Erabiltzaile honek baliozko e-posta helbide bat ezarri badu bere hobespenetan, beheko formularioa erabiliz mezu bat bidal dakioke.
+'emailpagetext' => '{{GENDER:$1|Erabiltzaile}} honek baliozko e-posta helbide bat ezarri badu bere hobespenetan, beheko formularioa erabiliz mezu bat bidal dakioke.
 [[Special:Preferences|Hobespenetan]] daukazun e-posta helbidea azalduko da mezuaren bidaltzaile bezala eta beraz erantzun ahal izango dizu.',
 'usermailererror' => 'Mail objektuak errore hau itzuli du:',
 'defemailsubject' => '{{SITENAME}} e-posta "$1" lankideak',
@@ -1900,6 +2024,7 @@ Badago [[{{MediaWiki:Listgrouprights-helppage}}|informazio osagarria]] banakako
 'noemailtext' => 'Erabiltzaile honek ez du baliozko e-posta helbiderik zehaztu.',
 'nowikiemailtitle' => 'Ezin da e-postarik bidali',
 'nowikiemailtext' => 'Erabiltzaile honek beste erabiltzaileengandik e-postak ez jasotzea hautatu du.',
+'emailtarget' => 'Sartu jasolearen erabiltzaile izena',
 'emailusername' => 'Lankide izena:',
 'emailusernamesubmit' => 'Bidali',
 'email-legend' => 'Bidali e-posta bat {{SITENAME}}(e)ko beste lankide bati',
@@ -1915,6 +2040,7 @@ Badago [[{{MediaWiki:Listgrouprights-helppage}}|informazio osagarria]] banakako
 'emailuserfooter' => 'E-posta hau $1(e)k bidali dio $2(r)i {{SITENAME}}ko "E-posta bidali" funtzioa erabiliz.',
 
 # User Messenger
+'usermessage-summary' => 'Sistema mezua uzten.',
 'usermessage-editor' => 'Sistemako mezularia',
 
 # Watchlist
@@ -1925,9 +2051,11 @@ Badago [[{{MediaWiki:Listgrouprights-helppage}}|informazio osagarria]] banakako
 'watchlistanontext' => 'Mesedez $1 zure jarraipen zerrendako orrialdeak ikusi eta aldatu ahal izateko.',
 'watchnologin' => 'Saioa hasi gabe',
 'watchnologintext' => '[[Special:UserLogin|Saioa hasi]] behar duzu zure jarraipen zerrenda aldatzeko.',
-'addedwatchtext' => "\"<nowiki>\$1</nowiki>\" orrialdea zure [[Special:Watchlist|jarraipen edo zelatatuen zerrendara]] erantsi da. Orrialde honen hurrengo aldaketak zerrenda horretan ageriko dira aurrerantzean, eta gainera [[Special:RecentChanges|aldaketa berrien zerrendan]] beltzez ageriko da, erraztasunez antzeman ahal izateko.
+'addwatch' => 'Jarraipen zerrendara gehitu',
+'addedwatchtext' => '"[[:$1]]" orrialdea zure [[Special:Watchlist|jarraipen edo zelatatuen zerrendara]] erantsi da. 
 
-Jarraipen zerrendatik artikulua kentzeko, artikuluan ''ez jarraitu''ri eman.",
+Orrialde honen hurrengo aldaketak zerrenda horretan ageriko dira aurrerantzean.',
+'removewatch' => 'Kendu zure jarraipen zerrendatik',
 'removedwatchtext' => '"[[:$1]]" orrialdea zure [[Special:Watchlist|jarraipen zerrendatik]] kendu da.',
 'watch' => 'Jarraitu',
 'watchthispage' => 'Orrialde hau jarraitu',
@@ -1937,8 +2065,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}}.',
@@ -2026,6 +2154,7 @@ kontu izan.',
 'rollback_short' => 'Desegin',
 'rollbacklink' => 'desegin',
 'rollbacklinkcount' => 'desegin {{PLURAL:$1|edizio bat|$1 edizio}}',
+'rollbacklinkcount-morethan' => 'desegin {{PLURAL:$1|edizio bat|$1 edizio}} baino gehiago',
 'rollbackfailed' => 'Desegiteak huts egin dud',
 'cantrollback' => 'Ezin da aldaketa desegin; erabiltzaile bakarrak hartu du parte.',
 'alreadyrolled' => 'Ezin da [[User:$2|$2]](e)k ([[User talk:$2|Eztabaida]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) [[$1]](e)n egindako azken aldaketa desegin;
@@ -2050,7 +2179,12 @@ Ikusi [[Special:ProtectedPages|babestutako orrialdeen zerrenda]] orrialde babes
 'unprotectedarticle' => '"[[$1]]"-(r)i babesa kendu zaio',
 'movedarticleprotection' => 'babes hobespenak "[[$2]]"tik "[[$1]]"(e)ra mugitu dira',
 'protect-title' => '"$1" babesten',
+'protect-title-notallowed' => '"$1"en babes maila ikusi',
 'prot_1movedto2' => '$1 izenburua $2(r)engatik aldatu da',
+'protect-badnamespace-title' => 'Izen-tarte ez babesgarria',
+'protect-badnamespace-text' => 'Izen-tarte honetako orrialdeak ezin dira babestu.',
+'protect-norestrictiontypes-text' => 'Orrialde hau ezin da babestu ez daudelako mugapen mota eskuragarririk.',
+'protect-norestrictiontypes-title' => 'Izen-tarte ez babesgarria',
 'protect-legend' => 'Babesa baieztatu',
 'protectcomment' => 'Arrazoia:',
 'protectexpiry' => 'Iraungipena:',
@@ -2067,11 +2201,12 @@ Hemen daude '''$1''' orrialderako oraingo ezarpenak:",
 'protect-cascadeon' => 'Orrialde hau babestuta dago orain, ondorengo orrialde {{PLURAL:$1|honek kaskada bidezko babesa aktibatua duelako|hauek kaskada bidezko babesa aktibatua dutelako}}.
 Orrialde honen babes maila alda dezakezu, baina ez du eraginik izango kaskada bidezko babesean.',
 'protect-default' => 'Lankide guztiak baimendu',
-'protect-fallback' => '"$1" baimena eskatu',
-'protect-level-autoconfirmed' => 'Lankide berri eta erregistratu gabekoak blokeatu',
-'protect-level-sysop' => 'Administratzaileak bakarrik',
+'protect-fallback' => '"$1" baimena duten erabiltzaileak bakarrik baimendu',
+'protect-level-autoconfirmed' => 'Baimendu lankide autokonfirmatuei bakarrik',
+'protect-level-sysop' => 'Administratzaileak bakarrik baimendu',
 'protect-summary-cascade' => 'jauzian',
 'protect-expiring' => 'babesaldiaren bukaera: $1 (UTC)',
+'protect-expiring-local' => 'iraungitze data: $1',
 'protect-expiry-indefinite' => 'mugagabea',
 'protect-cascade' => 'Babes masiboa - orrialde honen barneko orrialde guztiak blokeatu.',
 'protect-cantedit' => 'Ezin duzu orrialde honetako babes-maila aldatu, ez duzulako berau aldatzeko eskumenik.',
@@ -2135,7 +2270,7 @@ In such cases, you must uncheck or unhide the newest deleted revision.',
 'undeletedrevisions' => '{{PLURAL:$1|Berrikuspen 1 leheneratu da|$1 berrikuspen leheneratu dira}}',
 'undeletedrevisions-files' => '{{PLURAL:$1|berrikuspen|berrikuspen}} eta {{PLURAL:$2|fitxategi|fitxategi}} leheneratu dira',
 'undeletedfiles' => '{{PLURAL:$1|fitxategi|fitxategi}} leheneratu dira',
-'cannotundelete' => 'Errorea birsortzerakoan; baliteke beste norbaitek lehenago birsortu izana.',
+'cannotundelete' => 'Ezabatutako birgaitzean akatsa: $1',
 'undeletedpage' => "'''$1 leheneratu egin da'''
 
 [[Special:Log/delete|Ezabaketa erregistrora]] jo azken ezabaketa eta leheneraketak ikusteko.",
@@ -2150,6 +2285,7 @@ In such cases, you must uncheck or unhide the newest deleted revision.',
 'undelete-cleanup-error' => 'Erabiltzen ez den "$1" fitxategia ezabatzen arazoa egon da.',
 'undelete-missing-filearchive' => 'Fitxategiaren $1 IDa ezin da leheneratu, ez baitago datu-basean.
 Aurretik ez luke ezabatua izan behar.',
+'undelete-error' => 'Akatsa orrialde ezabatua birgaitzen',
 'undelete-error-short' => 'Errorea fitxategia berreskuratzerakoan: $1',
 'undelete-error-long' => 'Errorea gertatu da hurrengo orrialdea berreskuratzerakoan:
 
@@ -2169,7 +2305,7 @@ $1',
 'mycontris' => 'Ekarpenak',
 'contribsub2' => '$1 ($2)',
 'nocontribs' => 'Ez da ezaugarri horiekin bat datorren aldaketarik aurkitu.',
-'uctop' => ' (Azken aldaketa)',
+'uctop' => '(azken aldaketa)',
 'month' => 'Hilabetea (eta lehenagokoak):',
 'year' => 'Urtea (eta lehenagokoak):',
 
@@ -2253,13 +2389,19 @@ Ikus [[Special:BlockList|blokeoen zerrenda]] blokeoak aztertzeko.',
 'unblockiptext' => 'Erabili beheko formularioa lehenago blokeatutako IP helbide edo erabiltzaile baten idazketa baimenak leheneratzeko.',
 'ipusubmit' => 'Blokeoa ezabatu',
 'unblocked' => '[[User:$1|$1]] desblokeatu egin da',
+'unblocked-range' => '$1 desblokeatuta izan da.',
 'unblocked-id' => '$1 blokeaketa ezabatu da',
 'blocklist' => 'Blokeatutako erabiltzaileak',
 'ipblocklist' => 'Blokeatutako erabiltzaileak',
 'ipblocklist-legend' => 'Blokeatutako erabiltzaile bat bilatu',
+'blocklist-userblocks' => 'Izkutatu kontuaren blokeak',
+'blocklist-tempblocks' => 'Izkutatu behin-behineko blokeoak',
+'blocklist-addressblocks' => 'Izkutatu IP bakarretako blokeoak',
 'blocklist-timestamp' => 'Eguna eta ordua',
 'blocklist-target' => 'Helburua',
+'blocklist-expiry' => 'Epemuga:',
 'blocklist-by' => 'Blokeoa ezarri duen administratzailea',
+'blocklist-params' => 'Blokeo parametroak',
 'blocklist-reason' => 'Arrazoia',
 'ipblocklist-submit' => 'Bilatu',
 'ipblocklist-localblock' => 'Tokiko blokeoa',
@@ -2335,6 +2477,7 @@ Hala ere, $2-(r)en parte denez, blokeoa kendu daiteke.',
 'unlockdbsuccesstext' => 'Datu-basea desblokeatu egin da.',
 'lockfilenotwritable' => 'Ezin da datu-baseko blokeo fitxategian idatzi. Datu-basea blokeatu edo desblokeatzeko, zerbitzariak idazteko aukera izan beharra dauka.',
 'databasenotlocked' => 'Datu-basea ez dago blokeatuta.',
+'lockedbyandtime' => '({{GENDER:$1|$1}}k egina $2ko $3(e)tan)',
 
 # Move page
 'move-page' => '$1 mugitu',
@@ -2455,6 +2598,7 @@ Mesedez bisitatu [//www.mediawiki.org/wiki/Localisation MediaWiki] eta [//transl
 'thumbnail_error' => 'Errorea irudi txikia sortzerakoan: $1',
 'djvu_page_error' => 'DjVu orrialdea eremuz kanpo',
 'djvu_no_xml' => 'Ezinezkoa izan da DjVu fitxategiaren XML lortzea',
+'thumbnail-dest-create' => 'Ezin izan da iruditxoa gorde helburuan',
 'thumbnail_invalid_params' => 'Irudi txikiaren ezarpenak ez dira baliagarriak',
 'thumbnail_dest_directory' => 'Ezinezkoa izan da helburu direktorioa sortu',
 'thumbnail_image-type' => 'Irudi mota ez babestua',
@@ -2470,12 +2614,14 @@ Mesedez bisitatu [//www.mediawiki.org/wiki/Localisation MediaWiki] eta [//transl
 'import-interwiki-templates' => 'Txantiloi guztiak sartu',
 'import-interwiki-submit' => 'Inportatu',
 'import-interwiki-namespace' => 'Helburuko izen-tartea:',
+'import-interwiki-rootpage' => 'Helburuko oinarri orrialdea (aukerazkoa):',
 'import-upload-filename' => 'Fitxategiaren izena:',
 'import-comment' => 'Iruzkina:',
 'importtext' => 'Mesedez, jatorrizko wikitik orrialdea esportatzeko [[Special:Export|esportazio tresna]] erabil ezazu, zure diskoan gorde eta jarraian hona igo.',
 'importstart' => 'Orrialdeak inportatzen...',
 'import-revision-count' => '{{PLURAL:$1|berrikuspen 1|$1 berrikuspen}}',
 'importnopages' => 'Ez dago orrialderik inportatzeko.',
+'imported-log-entries' => '{{PLURAL:$1|Log sarrera bat|$1 log sarrera}} inportatu dira.',
 'importfailed' => 'Inportazioak huts egin du: $1',
 'importunknownsource' => 'Inportazio iturri mota ezezaguna',
 'importcantopen' => 'Ezin izan da inportazio fitxategia ireki',
@@ -2506,6 +2652,10 @@ Fitxategiaren atal bat baino ez zen igo.',
 'import-logentry-interwiki' => '$1 wiki artean mugitu da',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|berrikuspen|berrikuspen}} $2-(e)tik',
 
+# JavaScriptTest
+'javascripttest' => 'JavaScript frogatzen',
+'javascripttest-title' => '$1 frogak egiten',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Nire lankide orria',
 'tooltip-pt-anonuserpage' => 'Zure IParen lankide orrialdea',
@@ -2566,6 +2716,8 @@ Fitxategiaren atal bat baino ez zen igo.',
 'tooltip-diff' => 'Testuari egindako aldaketak erakutsi.',
 'tooltip-compareselectedversions' => 'Orrialde honen bi hautatutako bertsioen arteko ezberdintasunak ikusi.',
 'tooltip-watch' => 'Orrialde hau zure segimendu zerrendan gehitu',
+'tooltip-watchlistedit-normal-submit' => 'Izenburuak kendu',
+'tooltip-watchlistedit-raw-submit' => 'Jarraipen zerrenda gaurkotu',
 'tooltip-recreate' => 'Orrialdea birsortu ezabatu egin den arren',
 'tooltip-upload' => 'Igoera hasi',
 'tooltip-rollback' => '"Desegin" ekintzak orriaren azken egilearen ekarpena ezabatzen du klik batean',
@@ -2606,6 +2758,8 @@ Baliteke zerrenda beltzean dagoen kanpo lotura batek sortzea arazo hori.',
 'spam_blanking' => 'Berrikuspen guztiek $1(e)rako lotura zeukaten, husten',
 
 # Info page
+'pageinfo-title' => '"$1"(r)entzako informazioa',
+'pageinfo-not-current' => 'Barkatu, errebisio zaharretako informazioa eskaintzea ezinezkoa da.',
 'pageinfo-header-basic' => 'Oinarrizko informazioa',
 'pageinfo-header-edits' => 'Aldaketen historia',
 'pageinfo-header-restrictions' => 'Orriaren babesa',
@@ -2620,6 +2774,7 @@ Baliteke zerrenda beltzean dagoen kanpo lotura batek sortzea arazo hori.',
 'pageinfo-robot-noindex' => 'Indexaezina',
 'pageinfo-views' => 'Bistaratze-kopurua',
 'pageinfo-watchers' => 'Orriaren jarraitzaileen kopurua',
+'pageinfo-few-watchers' => '{{PLURAL:$1|Ikusle bat|$1 ikusle}} baino gutxiago',
 'pageinfo-redirects-name' => 'Orri honetara dakarten birzuzenketak',
 'pageinfo-subpages-name' => 'Orri honen azpiorriak',
 'pageinfo-firstuser' => 'Orriaren sortzailea',
@@ -2633,12 +2788,17 @@ Baliteke zerrenda beltzean dagoen kanpo lotura batek sortzea arazo hori.',
 'pageinfo-hidden-categories' => 'Ezkutuko {{PLURAL:$1|kategoria|kategoriak}} ($1)',
 'pageinfo-templates' => 'Txertatutako {{PLURAL:$1|txantiloia|txantiloiak}} ($1)',
 'pageinfo-toolboxlink' => 'Orri honen datuak',
+'pageinfo-redirectsto' => 'Hona birzuzentzen du',
 'pageinfo-redirectsto-info' => 'Informazioa',
 'pageinfo-contentpage' => 'Eduki-orritzat zenbatua',
 'pageinfo-contentpage-yes' => 'Bai',
 'pageinfo-protect-cascading' => 'Serieko babesa, orri honetatik',
 'pageinfo-protect-cascading-yes' => 'Bai',
 'pageinfo-protect-cascading-from' => 'Serieko babesak aktibatuta. Sorburua:',
+'pageinfo-category-info' => 'Kategoria informazioa',
+'pageinfo-category-pages' => 'Orrialde kopurua',
+'pageinfo-category-subcats' => 'Azpikategorien zenbakia',
+'pageinfo-category-files' => 'Fitxategi kopurua',
 
 # Skin names
 'skinname-cologneblue' => 'Cologne Blue',
@@ -2654,6 +2814,8 @@ Baliteke zerrenda beltzean dagoen kanpo lotura batek sortzea arazo hori.',
 'markedaspatrollederror' => 'Ezin da patruilatutzat markatu',
 'markedaspatrollederrortext' => 'Patruilatutzat markatzeko berrikuspen bat hautatu behar duzu.',
 'markedaspatrollederror-noautopatrol' => 'Ez daukazu zeure aldaketak patruilatutzat markatzeko baimenik.',
+'markedaspatrollednotify' => '$1 orrialdeari egindako aldaketa patruilatu moduan markatua izan da.',
+'markedaspatrollederrornotify' => 'Patruilatu gisa markatzean akatsa egon da.',
 
 # Patrol log
 'patrol-log-page' => 'Patrullatze loga',
@@ -2683,8 +2845,10 @@ Zure sisteman exekutatzea arriskutsua izan liteke.",
 'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|orri|orri}}',
 'file-info' => 'fitxategiaren tamaina: $1, MIME mota: $2',
 'file-info-size' => '$1 × $2 pixel, fitxategiaren tamaina: $3, MIME mota: $4',
+'file-info-size-pages' => '$1 × $2 pixel, fitxategi tamaina: $3, MIME mota: $4, {{PLURAL:$5|orrialde $5|$5 orrialde}}',
 'file-nohires' => 'Ez dago bereizmen handiagorik.',
 'svg-long-desc' => 'SVG fitxategia, nominaldi $1 × $2 pixel, fitxategiaren tamaina: $3',
+'svg-long-error' => 'SVG fitxategi ez baliagarria: $1',
 'show-big-image' => 'Bereizmen handikoa',
 'show-big-image-preview' => 'Aurreikuspen honen neurria: $1.',
 'show-big-image-other' => 'Bestelako {{PLURAL:$2|bereizmena|bereizmenak}}: $1.',
@@ -2692,6 +2856,7 @@ Zure sisteman exekutatzea arriskutsua izan liteke.",
 'file-info-gif-looped' => 'kiribildua',
 'file-info-gif-frames' => '{{PLURAL:$1|Irudi $1|$1 irudi}}',
 'file-info-png-looped' => 'begiztatua',
+'file-info-png-repeat' => '{{PLURAL:$1|Behin|$1 aldiz}} ikusia',
 'file-info-png-frames' => '{{PLURAL:$1|Frame bat|$1 frame}}',
 
 # Special:NewFiles
@@ -2715,7 +2880,24 @@ Zure sisteman exekutatzea arriskutsua izan liteke.",
 'minutes' => '{{PLURAL:$1|minutu $1|$1 minutu}}',
 'hours' => '{{PLURAL:$1|ordu $1|$1 ordu}}',
 'days' => '{{PLURAL:$1|egun $1|$1 egun}}',
+'weeks' => '{{PLURAL: $1|aste $1|$1 aste}}',
+'months' => '{{PLURAL: $1|hilabete $1|$1 hilabete}}',
+'years' => '{{PLURAL: $1|urte $1|$1 urte}}',
 'ago' => 'Duela $1',
+'just-now' => 'orain',
+
+# Human-readable timestamps
+'hours-ago' => 'Orain dela {{PLURAL:$1|ordu bat|$1 ordu}}',
+'minutes-ago' => 'Orain dela {{PLURAL:$1|minutu bat|$1 minutu}}',
+'seconds-ago' => 'Orain dela {{PLURAL:$1|segundu bat|$1 segundu}}',
+'monday-at' => 'Astelehena $1(e)tan',
+'tuesday-at' => 'Asteartea $1(e)tan',
+'wednesday-at' => 'Asteazkena $1(e)tan',
+'thursday-at' => 'Osteguna $1(e)tan',
+'friday-at' => 'Ostirala $1(e)tan',
+'saturday-at' => 'Larunbata $1(e)tan',
+'sunday-at' => 'Igandea $1(e)tan',
+'yesterday-at' => 'Atzo $1(e)tan',
 
 # Bad image list
 'bad_image_list' => 'Formatua hurrengoa da:
@@ -2742,7 +2924,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',
@@ -2876,18 +3058,49 @@ Zerrenda elementuak (hasieran * duten lerroak) baino ez dira kontuan hartzen. Le
 'exif-headline' => 'Goiburua',
 'exif-credit' => 'Kreditua/Emalea',
 'exif-source' => 'Jatorria',
+'exif-editstatus' => 'Irudiaren egoera editoriala',
 'exif-urgency' => 'Larrialdia',
+'exif-locationdest' => 'Agertzen den lekua',
+'exif-locationdestcode' => 'Agertzen den lekuaren kodea',
+'exif-objectcycle' => 'Media hau baliagarria den egunaren ordua',
+'exif-contact' => 'Kontratuaren informazioa',
 'exif-writer' => 'Idazlea',
 'exif-languagecode' => 'Hizkuntza',
 'exif-iimversion' => 'IIM bertsioa',
 'exif-iimcategory' => 'Kategoria',
+'exif-iimsupplementalcategory' => 'Kategoria gehigarriak',
+'exif-datetimeexpires' => 'Ez erabili data hau pasata:',
+'exif-datetimereleased' => 'Ekoizpen data:',
+'exif-identifier' => 'Identifikatzailea',
+'exif-lens' => 'Erabilitako lentea',
 'exif-serialnumber' => 'Kameraren serie-zenbakia',
 'exif-cameraownername' => 'Kameraren jabea',
 'exif-label' => 'Etiketa',
+'exif-rating' => 'Balorazioa (5 arte)',
+'exif-rightscertificate' => 'Eskubideen kudeaketa ziurtagiria',
+'exif-copyrighted' => 'Copyright egoera',
 'exif-copyrightowner' => 'Copyright-aren jabea',
 'exif-usageterms' => 'Erabilera baldintzak',
-
-# EXIF attributes
+'exif-webstatement' => 'Copyright azapena sarean',
+'exif-originaldocumentid' => 'Jatorrizko dokumentuaren ID bakarra',
+'exif-licenseurl' => 'Copyright lizentziaren URLa',
+'exif-morepermissionsurl' => 'Lizentziaren informazio alternatiboa',
+'exif-attributionurl' => 'Lan hau berrerabiltzean, mesedez lotura hau erabili',
+'exif-preferredattributionname' => 'Lan hau berrerabiltzean, mesedez aipatu',
+'exif-pngfilecomment' => 'PNG fitxategiaren iruzkina',
+'exif-disclaimer' => 'Mugaketak',
+'exif-contentwarning' => 'Edukiarekin adi',
+'exif-giffilecomment' => 'GIF fitxategiaren iruzkina',
+'exif-intellectualgenre' => 'Elementu mota',
+'exif-subjectnewscode' => 'Gaiaren kodea',
+'exif-scenecode' => 'IPTC eskena kodea',
+'exif-event' => 'Agertzen den ebentoa',
+'exif-organisationinimage' => 'Agertzen den antolakundea',
+'exif-personinimage' => 'Agertzen den pertsona',
+'exif-originalimageheight' => 'Irudiaren altuera moztu aurretik',
+'exif-originalimagewidth' => 'Irudiaren zabalera moztu aurretik',
+
+# Exif attributes
 'exif-compression-1' => 'Konprimatu gabe',
 'exif-compression-6' => 'JPEG',
 
@@ -3062,13 +3275,31 @@ Zerrenda elementuak (hasieran * duten lerroak) baino ez dira kontuan hartzen. Le
 
 'exif-gpsdop-excellent' => 'Bikaina ($1)',
 'exif-gpsdop-good' => 'Ona  ($1)',
+'exif-gpsdop-moderate' => 'Moderatua ($1)',
+'exif-gpsdop-fair' => 'Justua ($1)',
+'exif-gpsdop-poor' => 'Pobrea ($1)',
+
+'exif-objectcycle-a' => 'Goizetan bakarrik',
+'exif-objectcycle-p' => 'Arratsaldetan bakarrik',
+'exif-objectcycle-b' => 'Goiz zein arratsalde',
 
 # Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
 'exif-gpsdirection-t' => 'Benetako norabidea',
 'exif-gpsdirection-m' => 'Norabide magnetikoa',
 
+'exif-ycbcrpositioning-1' => 'Zentratua',
+
+'exif-dc-contributor' => 'Egileak',
+'exif-dc-date' => 'Data(k)',
 'exif-dc-publisher' => 'Argitaratzailea',
+'exif-dc-relation' => 'Harremana duen media',
 'exif-dc-rights' => 'Eskubideak',
+'exif-dc-source' => 'Jatorrizko media',
+'exif-dc-type' => 'Media mota',
+
+'exif-rating-rejected' => 'Ukatua',
+
+'exif-isospeedratings-overflow' => '65535 baino handiago',
 
 'exif-iimcategory-ace' => 'Arteak, kultura eta aisia',
 'exif-iimcategory-clj' => 'Krimena eta zuzenbidea',
@@ -3077,7 +3308,9 @@ Zerrenda elementuak (hasieran * duten lerroak) baino ez dira kontuan hartzen. Le
 'exif-iimcategory-edu' => 'Hezkuntza',
 'exif-iimcategory-evn' => 'Ingurumena',
 'exif-iimcategory-hth' => 'Osasuna',
+'exif-iimcategory-hum' => 'Gizakientzako interesa',
 'exif-iimcategory-lab' => 'Lana',
+'exif-iimcategory-lif' => 'Bizimoduak eta denborapasak',
 'exif-iimcategory-pol' => 'Politika',
 'exif-iimcategory-rel' => 'Erlijioa eta sinesmenak',
 'exif-iimcategory-sci' => 'Zientzia eta teknologia',
@@ -3226,6 +3459,8 @@ Halaber [[Special:EditWatchlist|aldatzaile estandarra]] erabil dezakezu.',
 'version-specialpages' => 'Aparteko orrialdeak',
 'version-parserhooks' => 'Parser estentsioak',
 'version-variables' => 'Aldagaiak',
+'version-antispam' => 'Spam ekiditea',
+'version-skins' => 'Itxurak',
 'version-other' => 'Bestelakoak',
 'version-mediahandlers' => 'Media gordailuak',
 'version-hooks' => 'Estentsioak',
@@ -3241,14 +3476,20 @@ Halaber [[Special:EditWatchlist|aldatzaile estandarra]] erabil dezakezu.',
 'version-software' => 'Instalatutako softwarea',
 'version-software-product' => 'Produktua',
 'version-software-version' => 'Bertsioa',
+'version-entrypoints' => 'Sarrera puntuko URLa',
+'version-entrypoints-header-entrypoint' => 'Sarrera puntua',
 '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:Redirect
+'redirect' => 'Birzuzendu fitxategi, lankide edo berrikuspen IDaren arabera',
+'redirect-legend' => 'Orrialde edo fitxategi batera birzuzendu',
+'redirect-submit' => 'Joan',
+'redirect-lookup' => 'Ikuskatu:',
+'redirect-value' => 'Balioa:',
+'redirect-user' => 'Erabiltzailearen identifikazioa (ID):',
+'redirect-revision' => 'Orrialdearen berrikuspena',
+'redirect-file' => 'Fitxategiaren izena',
+'redirect-not-exists' => 'Ez da baliorik aurkitu',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Artxibo bikoiztuen bilaketa',
@@ -3334,17 +3575,31 @@ Irudiak bereizmen handienean daude, bestelako fitxategi motak beraiei esleitutak
 'htmlform-submit' => 'Bidali',
 'htmlform-reset' => 'Aldaketak desegin',
 'htmlform-selectorother-other' => 'Beste bat',
+'htmlform-no' => 'Ez',
+'htmlform-yes' => 'Bai',
+'htmlform-chosen-placeholder' => 'Aukeratu',
+
+# SQLite database support
+'sqlite-has-fts' => '$1 testu osoan bilatzeko laguntzarekin',
 
 # New logging system
-'logentry-delete-delete' => '$1 wikilariak «$3» orria ezabatu du',
+'logentry-delete-delete' => '$1 wikilariak $3 orria {{GENDER:$2|ezabatu}} du',
+'logentry-delete-restore' => '$1(e)k $3 orrialdea {{GENDER:$2|berrezarri}} du',
 'logentry-delete-event' => '$1 wikilariak ikusgaitasuna aldatu {{PLURAL:$5|dio erregistroko sarrera bati|die erregistroko $5 sarrerari}}, $3 orrian: $4',
 'logentry-suppress-event' => '$1 wikilariak ezkutuan ikusgaitasuna aldatu {{PLURAL:$5|dio erregistroko sarrera bati|die erregistroko $5 sarrerari}}, $3 orrian: $4',
+'revdelete-content-hid' => 'edukia izkutatua',
+'revdelete-summary-hid' => 'aldaketa laburpena izkutatua',
+'revdelete-uname-hid' => 'lankide izena ezkutatua',
+'revdelete-content-unhid' => 'eduki ezkutua erakutsi',
+'revdelete-summary-unhid' => 'aldaketa laburpen izkutua erakutsi',
+'revdelete-uname-unhid' => 'lankide ezkutua erakutsi',
 'revdelete-restricted' => 'administratzaileentzako mugak ezarri dira',
 'revdelete-unrestricted' => 'administratzaileentzako mugak kendu dira',
-'logentry-move-move' => '$1 wikilariak «$3» orria «$4» izenera aldatu du',
-'logentry-move-move-noredirect' => '$1 wikilariak «$3» orria «$4» izenera aldatu du, birzuzenketarik utzi gabe',
-'logentry-move-move_redir' => '$1 wikilariak «$3» orria «$4» izenera aldatu du, birzuzenketaren gainetik',
-'logentry-move-move_redir-noredirect' => '$1 wikilariak «$3» orria «$4» izenera aldatu du, birzuzenketa bat gainidatzita, birzuzenketarik utzi gabe',
+'logentry-move-move' => '$1 {{GENDER:$2|wikilariak}} $3 orria $4 izenera aldatu du',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|wikilariak}} $3 orria $4 izenera aldatu du, birzuzenketarik utzi gabe',
+'logentry-move-move_redir' => '$1 {{GENDER:wikilariak}} «$3» orria «$4» izenera aldatu du, birzuzenketaren gainetik',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:wikilariak}} «$3» orria «$4» izenera aldatu du, birzuzenketa bat gainidatzita, birzuzenketarik utzi gabe',
+'logentry-patrol-patrol' => '$1(e)k $3 orrialdearen $4 berrikuzpena patruilatutzat {{GENDER:$2|markatu}} du',
 'logentry-newusers-newusers' => '$1 erabiltzaile kontua sortu da',
 'logentry-newusers-create' => '$1 erabiltzaile kontua sortu da',
 'logentry-newusers-create2' => '$1 wikilariak $3 erabiltzaile kontua sortu du',
@@ -3355,9 +3610,29 @@ Irudiak bereizmen handienean daude, bestelako fitxategi motak beraiei esleitutak
 'feedback-message' => 'Mezua:',
 'feedback-cancel' => 'Utzi',
 'feedback-submit' => 'Feedbacka bidali',
+'feedback-error2' => 'Akatsa: Aldaketa ez da egin',
+'feedback-close' => 'Egina',
+'feedback-bugnew' => 'Txekeatu dut. Bug berria bidaliko',
 
 # Search suggestions
 'searchsuggest-search' => 'Bilatu',
 'searchsuggest-containing' => 'edukian...',
 
+# API errors
+'api-error-badaccess-groups' => 'Ez duzu baimendik fitxategi hauek wiki honetara igotzeko.',
+'api-error-badtoken' => 'Barne akatsa: token okerra.',
+'api-error-unclassified' => 'Ezezaguna den errorea gertatu da.',
+'api-error-unknown-code' => 'Akats ezezaguna: "$1".',
+
+# Durations
+'duration-seconds' => '{{PLURAL:$1|Segundu $1|$1 segundu}}',
+'duration-minutes' => '{{PLURAL:$1|Minutu $1|$1 minutu}}',
+'duration-hours' => '{{PLURAL:$1|Ordu $1|$1 ordu}}',
+'duration-days' => '{{PLURAL:$1|Egun $1|$1 egun}}',
+'duration-weeks' => '{{PLURAL:$1|Aste $1|$1 aste}}',
+'duration-years' => '{{PLURAL:$1|Urte $1|$1 urte}}',
+'duration-decades' => '{{PLURAL:$1|Hamarkada $1|$1 hamarkada}}',
+'duration-centuries' => '{{PLURAL:$1|Mende $1|$1 mende}}',
+'duration-millennia' => '{{PLURAL:$1|Milurteko $1|$1 milurteko}}',
+
 );
index 61a1b3a..2a614fa 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',
@@ -238,7 +236,6 @@ $messages = array(
 'disclaimers' => 'Avissu legal',
 'disclaimerpage' => 'Project:Arrayu heneral de responsabiliá',
 'edithelp' => "Ayua d'eición",
-'edithelppage' => 'Help:Eitandu',
 'helppage' => 'Help:Continius',
 'mainpage' => 'Página prencipal',
 'mainpage-description' => 'Páhina prencipal',
@@ -768,7 +765,6 @@ Asigurati e qu'esti chambu mantenga la continuiá el estorial la páhina.",
 'viewprevnext' => 'Vel ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-legend' => 'Ocionis de landeu',
 'searchmenu-new' => "'''Crial el artículu \"[[:\$1]]\"'''",
-'searchhelp-url' => 'Help:Continius',
 'searchprofile-images' => 'Murtimeya',
 'searchprofile-everything' => 'Tó',
 'searchprofile-advanced' => 'Avançau',
@@ -797,14 +793,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 +1386,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 +1997,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 +2081,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 +2352,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 a3ecc82..e88b97e 100644 (file)
@@ -40,6 +40,7 @@
  * @author ZxxZxxZ
  * @author לערי ריינהארט
  * @author جواد
+ * @author درفش کاویانی
  * @author محک
  */
 
@@ -75,34 +76,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( 'فهرست_مدیران' ),
@@ -113,60 +115,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( 'پیوند_به_این_صفحه' ),
@@ -537,6 +539,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|رده|رده‌ها}}',
@@ -671,7 +685,6 @@ $1',
 'disclaimers' => 'تکذیب‌نامه‌ها',
 'disclaimerpage' => 'Project:تکذیب‌نامهٔ عمومی',
 'edithelp' => 'راهنمای ویرایش‌کردن',
-'edithelppage' => 'Help:ویرایش',
 'helppage' => 'Help:محتوا',
 'mainpage' => 'صفحهٔ اصلی',
 'mainpage-description' => 'صفحهٔ اصلی',
@@ -682,7 +695,7 @@ $1',
 'privacypage' => 'Project:سیاست محرمانگی',
 
 'badaccess' => 'خطای دسترسی',
-'badaccess-group0' => 'شما اجازهٔ اجرای عملی را که درخواست کرده‌اید ندارید.',
+'badaccess-group0' => 'شما اجازهٔ اجرای عملی که درخواست کرده‌اید را ندارید.',
 'badaccess-groups' => 'عملی که درخواست کرده‌اید منحصر به کاربران {{PLURAL:$2|این گروه|این گروه‌ها}} است: $1.',
 
 'versionrequired' => 'نسخهٔ $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' => 'رایانامهٔ نهایی نشان داده شود؟',
@@ -1223,6 +1261,7 @@ $2
 به نظرمی‌رسد که صفحه حذف شده باشد.',
 'edit-conflict' => 'تعارض ویرایشی.',
 'edit-no-change' => 'ویرایش شما نادیده گرفته شد، زیرا تغییری در متن داده نشده بود.',
+'postedit-confirmation' => 'ویرایش شما ذخیره شد.',
 'edit-already-exists' => 'امکان ساختن صفحهٔ جدید وجود ندارد.
 این صفحه از قبل وجود داشته‌است.',
 'defaultmessagetext' => 'متن پیش‌فرض پیغام',
@@ -1471,7 +1510,6 @@ $1",
 'searchmenu-legend' => 'گزینه‌های جستجو',
 'searchmenu-exists' => "'''صفحه‌ای با عنوان \"[[:\$1]]\" در این ویکی وجود دارد.'''",
 'searchmenu-new' => "'''صفحهٔ «[[:$1]]» را در این ویکی بسازید!'''",
-'searchhelp-url' => 'Help:محتوا',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|مرور صفحه‌های با این پیشوند]]',
 'searchprofile-articles' => 'صفحه‌های محتوایی',
 'searchprofile-project' => 'صفحه‌های راهنما و پروژه',
@@ -1637,7 +1675,7 @@ $1",
 'prefs-diffs' => 'تفاوت‌ها',
 
 # User preference: email validation using jQuery
-'email-address-validity-valid' => 'نشانی رایانامه معتبر به نظر می رسد',
+'email-address-validity-valid' => 'نشانی رایانامه معتبر به نظر میرسد',
 'email-address-validity-invalid' => 'نشانی رایانامهٔ معتبر وارد کنید',
 
 # User rights
@@ -2399,6 +2437,15 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'listusers-noresult' => 'هیچ کاربری یافت نشد.',
 'listusers-blocked' => '(بسته شده)',
 
+# Special:ActiveUsers
+'activeusers' => 'فهرست کاربران فعال',
+'activeusers-intro' => 'در زیر فهرستی از کاربرانی را می‌بینید که در $1 {{PLURAL:$1|روز|روز}} گذشته فعالیتی داشته‌اند.',
+'activeusers-count' => '$1 {{PLURAL:$1|فعالیت|فعالیت}} در {{PLURAL:$3|روز|$3 روز}} اخیر',
+'activeusers-from' => 'نمایش کاربران با آغاز از:',
+'activeusers-hidebots' => 'نهفتن ربات‌ها',
+'activeusers-hidesysops' => 'نهفتن مدیران',
+'activeusers-noresult' => 'کاربری پیدا نشد.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'اختیارات گروه‌های کاربری',
 'listgrouprights-summary' => 'فهرست زیر شامل گروه‌های کاربری تعریف شده در این ویکی و اختیارات داده شده به آن‌ها است.
@@ -3175,7 +3222,7 @@ $1',
 'tooltip-n-mainpage' => 'مشاهدهٔ صفحهٔ اصلی',
 'tooltip-n-mainpage-description' => 'مشاهدهٔ صفحهٔ اصلی',
 'tooltip-n-portal' => 'پیرامون پروژه، آنچه می‌توانید انجام دهید و اینکه چه چیز را کجا پیدا کنید',
-'tooltip-n-currentevents' => 'یافتن اطلاعات پیش‌زمینه پیرامون رویدادهای کنونی',
+'tooltip-n-currentevents' => 'یافتن اطلاعات پس‌زمینه پیرامون رویدادهای کنونی',
 'tooltip-n-recentchanges' => 'فهرستی از تغییرات اخیر ویکی',
 'tooltip-n-randompage' => 'آوردن یک صفحهٔ تصادفی',
 'tooltip-n-help' => 'مکانی برای دریافتن',
@@ -3376,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' => 'اطلاعات را باید اینگونه وارد کنید:
 
@@ -3403,7 +3463,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'عرض',
 'exif-imagelength' => 'طول',
 'exif-bitspersample' => 'نقطه در هر جزء',
@@ -3582,7 +3642,7 @@ $1',
 'exif-originalimageheight' => 'بلندی تصویر قبل از برش دادن',
 'exif-originalimagewidth' => 'پهنای تصویر قبل از برش دادن',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'غیرفشرده',
 'exif-compression-2' => 'رمزگذاری سی‌سی‌آی‌تی‌تی گروه ۳ یک بعدی به روش هافمن تغییریافته روی طول',
 'exif-compression-3' => 'رمزگذاری نمابر سی‌سی‌آی‌تی‌تی گروه ۳',
@@ -4061,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 3c5799b..98ba0a7 100644 (file)
@@ -12,6 +12,7 @@
  * @author Cimon Avaro
  * @author Crt
  * @author ElmA
+ * @author Geitost
  * @author Harriv
  * @author Hyperborean
  * @author Jaakonam
@@ -313,7 +314,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',
@@ -420,6 +421,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}}',
@@ -501,6 +514,7 @@ $messages = array(
 'create-this-page' => 'Luo tämä sivu',
 'delete' => 'Poista',
 'deletethispage' => 'Poista tämä sivu',
+'undeletethispage' => 'Palauta tämä sivu',
 'undelete_short' => 'Palauta {{PLURAL:$1|yksi muokkaus|$1 muokkausta}}',
 'viewdeleted_short' => 'Näytä {{PLURAL:$1|poistettu muokkaus|$1 poistettua muokkausta}}',
 'protect' => 'Suojaa',
@@ -554,7 +568,6 @@ $1',
 'disclaimers' => 'Vastuuvapaus',
 'disclaimerpage' => 'Project:Vastuuvapaus',
 'edithelp' => 'Muokkausohjeet',
-'edithelppage' => 'Help:Kuinka sivuja muokataan',
 'helppage' => 'Help:Sisällys',
 'mainpage' => 'Etusivu',
 'mainpage-description' => 'Etusivu',
@@ -695,6 +708,8 @@ $2',
 'namespaceprotected' => "Et voi muokata sivuja nimiavaruudessa '''$1'''.",
 'customcssprotected' => 'Sinulla ei ole oikeutta muuttaa tätä CSS-sivua, koska se sisältää toisen käyttäjän henkilökohtaisia asetuksia.',
 'customjsprotected' => 'Sinulla ei ole oikeutta muuttaa tätä JavaScript-sivua, koska se sisältää toisen käyttäjän henkilökohtaisia asetuksia.',
+'mycustomcssprotected' => 'Sinulla ei ole oikeutta muokata tätä CSS-sivua.',
+'mycustomjsprotected' => 'Sinulla ei ole oikeutta muokata tätä JavaScript-sivua.',
 'ns-specialprotected' => 'Toimintosivuja ei voi muokata.',
 'titleprotected' => "Käyttäjä [[User:$1|$1]] on suojannut tämän sivunimen, ja sivua ei voi luoda.
 Syynä on: ''$2''.",
@@ -720,10 +735,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' => 'Muista minut',
+'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 +759,37 @@ Huomaa, että jotkut sivut saattavat näkyä edelleen kuin olisit kirjautunut si
 'logout' => 'Kirjaudu ulos',
 'userlogout' => 'Kirjaudu ulos',
 'notloggedin' => 'Et ole kirjautunut',
-'nologin' => "Jos sinulla ei ole vielä käyttäjätunnusta, '''$1'''.",
+'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.',
@@ -785,7 +828,7 @@ Tästä johtuen tästä IP-osoitteesta ei voi tällä hetkellä luoda uusia tunn
 'cannotchangeemail' => 'Tunnusten sähköpostiosoitteita ei voi muuttaa tässä wikissä.',
 'emaildisabled' => 'Tältä sivustolta ei voi lähettää sähköpostia.',
 'accountcreated' => 'Käyttäjätunnus luotiin',
-'accountcreatedtext' => 'Käyttäjän $1 käyttäjätunnus luotiin.',
+'accountcreatedtext' => 'Käyttäjätunnus [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|keskustelu]]) luotiin.',
 'createaccount-title' => 'Tunnuksen luominen {{GRAMMAR:illative|{{SITENAME}}}}',
 'createaccount-text' => 'Joku on luonut tunnuksen $2 {{GRAMMAR:illative|{{SITENAME}}}} ($4).
 Tunnuksen $2 salasana on $3. Kirjaudu sisään ja vaihda salasanasi.
@@ -820,28 +863,30 @@ 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' => 'Täytä tämä lomake vaihtaaksesi salasanasi.',
+'passwordreset-text-one' => 'Täytä tämä lomake vaihtaaksesi salasanasi.',
+'passwordreset-text-many' => '{{PLURAL:$1|Täytä yksi datakentistä alustaaksesi salasanasi.}}',
 'passwordreset-legend' => 'Salasanan vaihto',
 'passwordreset-disabled' => 'Salasanojen alustus ei ole mahdollista tässä wikissä.',
 'passwordreset-emaildisabled' => 'Sähköpostitoiminnot on poistettu käytöstä tässä wikissä.',
-'passwordreset-pretext' => '{{PLURAL:$1||Kirjoita jokin jäljempänä pyydetty tieto}}',
 '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:
@@ -854,9 +899,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',
@@ -1050,6 +1095,7 @@ 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',
@@ -1057,7 +1103,7 @@ Se on jo olemassa.',
 '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 ”{{int:prefs-editing}}”.',
+Jos olet kirjautuneena sisään, voit poistaa tämän varoituksen käytöstä asetuksissa osiossa »Muokkaus».',
 
 # Content models
 'content-model-wikitext' => 'wikiteksti',
@@ -1294,7 +1340,6 @@ $1 {{int:pipe-separator}} $2',
 'searchmenu-legend' => 'Hakuasetukset',
 'searchmenu-exists' => "'''Tässä wikissä on sivu nimellä [[:$1]].'''",
 'searchmenu-new' => "'''Luo sivu ''[[:$1]]'' tähän wikiin.'''",
-'searchhelp-url' => 'Help:Sisällys',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Selaa sivuja tällä etuliitteellä]]',
 'searchprofile-articles' => 'Sisältösivut',
 'searchprofile-project' => 'Ohje- ja projektisivut',
@@ -1336,6 +1381,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>',
+'search-error' => 'Virhe ilmaantui haettaessa: $1',
 
 # Preferences page
 'preferences' => 'Asetukset',
@@ -1476,6 +1522,8 @@ 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.',
+'userrights-removed-self' => 'Poistit onnistuneesti omat oikeutesi. Tämän myötä sinulla ei ole enää oikeutta käyttää tätä sivua.',
 
 # Groups
 'group' => 'Ryhmä',
@@ -1546,6 +1594,10 @@ Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
 'right-editusercssjs' => 'Muokata toisten käyttäjien CSS- ja JavaScript-tiedostoja',
 'right-editusercss' => 'Muokata toisten käyttäjien CSS-tiedostoja',
 'right-edituserjs' => 'Muokata toisten käyttäjien JavaScript-tiedostoja',
+'right-editmyusercss' => 'Muokata omia CSS-tiedostojaan',
+'right-editmyuserjs' => 'Muokata omia JavaScript-tiedostojaan',
+'right-viewmywatchlist' => 'Katsoa tarkkailulistaasi',
+'right-editmywatchlist' => 'Muokata tarkkailulistaasi. Huomaa, että jotkin toiminnot lisäävät yhä sivuja listallesi riippumatta tästä oikeudesta.',
 'right-rollback' => 'Palauttaa nopeasti käyttäjän viimeisimmät muokkaukset sivuun',
 'right-markbotedits' => 'Kumota muokkauksia bottimerkinnällä',
 'right-noratelimit' => 'Ohittaa nopeusrajoitukset',
@@ -1607,6 +1659,8 @@ Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
 'action-userrights-interwiki' => 'muokata muiden wikien käyttäjien käyttöoikeuksia',
 'action-siteadmin' => 'lukita tai avata tietokantaa',
 'action-sendemail' => 'lähettää sähköpostia',
+'action-editmywatchlist' => 'muokata tarkkailulistaasi',
+'action-viewmywatchlist' => 'katsoa tarkkailulistaasi',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|muutos|muutosta}}',
@@ -1660,7 +1714,7 @@ Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
 'reuploaddesc' => 'Peruuta tallennus ja palaa tallennuslomakkeelle.',
 'upload-tryagain' => 'Lähetä muutettu tiedostokuvaus',
 'uploadnologin' => 'Et ole kirjautunut sisään',
-'uploadnologintext' => 'Sinun pitää olla [[Special:UserLogin|kirjautuneena sisään]], jotta voisit tallentaa tiedostoja.',
+'uploadnologintext' => 'Sinun pitää $1 tallentaaksesi tiedostoja.',
 'upload_directory_missing' => 'Tallennushakemisto $1 puuttuu, eikä palvelin pysty luomaan sitä.',
 'upload_directory_read_only' => 'Palvelimella ei ole kirjoitusoikeuksia tallennushakemistoon $1.',
 'uploaderror' => 'Tallennusvirhe',
@@ -1785,7 +1839,7 @@ $1',
 'upload-file-error' => 'Sisäinen virhe',
 'upload-file-error-text' => 'Väliaikaistiedoston luominen epäonnistui. Ota yhteyttä sivuston [[Special:ListUsers/sysop|ylläpitäjään]].',
 'upload-misc-error' => 'Virhe',
-'upload-misc-error-text' => 'Tiedoston etälähetys ei onnistunut. Varmista, että antamasi osoite on oikein ja toimiva. Jos virhe ei katoa, ota yhteyttä sivuston ylläpitäjään.',
+'upload-misc-error-text' => 'Tiedoston etälähetys ei onnistunut. Varmista, että antamasi osoite on oikein ja toimiva. Jos virhe ei katoa, ota yhteyttä sivuston [[Special:ListUsers/sysop|ylläpitäjään]].',
 'upload-too-many-redirects' => 'URL sisälsi liian monta ohjausta',
 'upload-unknown-size' => 'Tuntematon koko',
 'upload-http-error' => 'HTTP-virhe: $1',
@@ -2197,6 +2251,15 @@ Vaaditaan vähintään ylätason verkkotunnus, esimerkiksi "*.org".<br />
 'listusers-noresult' => 'Käyttäjiä ei löytynyt.',
 'listusers-blocked' => '(estetty)',
 
+# Special:ActiveUsers
+'activeusers' => 'Aktiivisten käyttäjien lista',
+'activeusers-intro' => 'Tämä on luettelo käyttäjistä, jotka ovat tehneet jotain viimeisen $1 {{PLURAL:$1|päivän}} sisällä.',
+'activeusers-count' => '$1 {{PLURAL:$1|toiminto|toimintoa}} viimeisen {{PLURAL:$3|päivän|$3 päivän}} aikana',
+'activeusers-from' => 'Näytä käyttäjät alkaen',
+'activeusers-hidebots' => 'Piilota botit',
+'activeusers-hidesysops' => 'Piilota ylläpitäjät',
+'activeusers-noresult' => 'Käyttäjiä ei löytynyt.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Käyttäjäryhmien oikeudet',
 'listgrouprights-summary' => 'Tämä lista sisältää tämän wikin käyttäjäryhmät sekä ryhmiin liitetyt käyttöoikeudet.
@@ -2273,8 +2336,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}}.',
@@ -2510,13 +2573,13 @@ $1',
 'mycontris' => 'Omat muokkaukset',
 'contribsub2' => 'Käyttäjän $1 ($2) muokkaukset',
 'nocontribs' => 'Näihin ehtoihin sopivia muokkauksia ei löytynyt.',
-'uctop' => ' (uusin)',
+'uctop' => '(uusin)',
 'month' => 'Kuukausi',
 'year' => 'Vuosi',
 
 'sp-contributions-newbies' => 'Näytä uusien tulokkaiden muutokset',
-'sp-contributions-newbies-sub' => 'Uusien tulokkaiden muokkaukset',
-'sp-contributions-newbies-title' => 'Uusien tulokkaiden muokkaukset',
+'sp-contributions-newbies-sub' => 'Uusien käyttäjien muokkaukset',
+'sp-contributions-newbies-title' => 'Uusien käyttäjien muokkaukset',
 'sp-contributions-blocklog' => 'estot',
 'sp-contributions-deleted' => 'poistetut muokkaukset',
 'sp-contributions-uploads' => 'tallennukset',
@@ -2822,6 +2885,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',
@@ -3030,6 +3095,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}})',
@@ -3050,7 +3116,9 @@ 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ä',
@@ -3136,11 +3204,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:
 
@@ -3168,7 +3250,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',
@@ -3346,7 +3428,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',
@@ -3758,12 +3840,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',
@@ -3855,6 +3942,7 @@ Kuvat näytetään täysikokoisina. Muut tiedostot avataan niille määritetyss
 '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',
@@ -3969,4 +4057,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 4d334d2..5694a8c 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Diupwijk
  * @author EileenSanda
+ * @author Geitost
  * @author Krun
  * @author Quackor
  * @author S.Örvarr.S
@@ -112,58 +113,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',
@@ -219,14 +219,26 @@ $messages = array(
 'oct' => 'okt',
 'nov' => 'nov',
 'dec' => 'des',
+'january-date' => 'Januar $1',
+'february-date' => 'Februar $1',
+'march-date' => 'Mars $1',
+'april-date' => 'Apríl $1',
+'may-date' => 'Maj $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|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 +256,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 +279,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 +297,23 @@ $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}}',
+'undeletethispage' => 'Endurskapað hesa síðuna',
+'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 +323,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 +352,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 +360,18 @@ $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',
 '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 +384,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 +419,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',
@@ -504,6 +516,8 @@ $2',
 'namespaceprotected' => 'Tú hevur ikki loyvi til at rætta síður í $1 navnateiginum.',
 'customcssprotected' => 'Tú hevur ikki loyvi til at rætta hesa CSS síðuna, tí hon inniheldur persónligar innstillingar hjá øðrum brúkara.',
 'customjsprotected' => 'Tú hevur ikki loyvir til at rætta hesa JavaScript síðuna, tí hon inniheldur persónligar innstillingar hjá øðrum brúkara.',
+'mycustomcssprotected' => 'Tú hevur ikki loyvi til at rætta hesa CSS síðuna.',
+'mycustomjsprotected' => 'Tú hevur ikki loyvi til at rætta hesa JavaScript síðuna.',
 'ns-specialprotected' => 'Serstakar síður kunnu ikki rættast.',
 'titleprotected' => '[[User:$1|$1]] hevur vart hetta heitið frá skapan.
 Givin orsøk er "\'\'$2\'\'".',
@@ -528,9 +542,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' => 'Lat meg vera innritaðan',
+'userlogin-signwithsecure' => 'Nýt trygt samband',
 '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 +566,38 @@ Gloym ikki at broyta tínar [[Special:Preferences|{{SITENAME}}-innstillingar]].'
 'logout' => 'Útrita',
 'userlogout' => 'Rita út',
 'notloggedin' => 'Ikki ritað inn',
-'nologin' => "Hevur tú ikki eina kontu? '''$1'''.",
+'userlogin-noaccount' => 'Hevur tú ikki nakra kontu?',
+'userlogin-joinproject' => 'Meldað teg til {{SITENAME}}',
+'nologin' => 'Hevur tú ikki eina kontu? $1.',
 'nologinlink' => 'Stovna eina kontu',
 'createaccount' => 'Stovna nýggja kontu',
 'gotaccount' => "Hevur tú longu eina kontu? '''$1'''.",
 'gotaccountlink' => 'Rita inn',
 'userlogin-resetlink' => 'Hevur tú gloymt tínar logg inn upplýsingar',
+'userlogin-resetpassword-link' => 'Nullstilla títt loyniorð',
+'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-reason-ph' => 'Hví upprættar tú eina nýggja kontu',
+'createacct-captcha' => 'Trygdarkekk',
+'createacct-imgcaptcha-ph' => 'Skriva tekstin ið tú sært omanfyri',
+'createacct-submit' => 'Upprætta tína kontu',
+'createacct-benefit-heading' => '{{SITENAME}} er gjørd av fólki sum tær.',
+'createacct-benefit-body1' => '{{PLURAL:$1|rætting|rættingar}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|síða|síður}}',
+'createacct-benefit-body3' => 'seinasti/u {{PLURAL:$1|høvundur|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.
@@ -610,7 +653,7 @@ Vinarliga skriva t-post bústað í røttum formati ella lat handa teigin vera t
 'cannotchangeemail' => 'T-post adressur, sum eru knýttar at brúkarakontum, kunnu ikki broytast á hesi wiki.',
 'emaildisabled' => 'Henda heimasíðan kann ikki senda teldupostar.',
 'accountcreated' => 'Konto upprættað',
-'accountcreatedtext' => 'Brúkarakontan hjá $1 er nú upprættað.',
+'accountcreatedtext' => 'Henda brúkarakontan fyri [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|kjak]]) er nú upprættað.',
 'createaccount-title' => 'Upprætta brúkarakonto á {{SITENAME}}',
 'createaccount-text' => 'Onkur hevur stovnað eina konto fyri tína teldupost adressu á {{SITENAME}} ($4) nevnd "$2", við loyniorðinum "$3".
 Tú eigur at innrita og broyta loyniorðið nú.
@@ -646,42 +689,40 @@ Nú verður tú ritaður inn...',
 'resetpass-wrong-oldpass' => 'Ógyldug fyribils ella verandi loyniorð.
 Møguliga hevur tú longu broytt títt loyniorð ella biðið um eitt nýtt fyribils loyniorð.',
 'resetpass-temp-password' => 'Fyribils loyniorð',
+'resetpass-abort-generic' => 'Broyting av loyniorði bleiv avbrotin av einari víðkan.',
 
 # Special:PasswordReset
 'passwordreset' => 'Nullstilla loyniorðið',
-'passwordreset-text' => 'Útfyll hetta skjalið fyri at nullstilla títt loyniorð.',
+'passwordreset-text-one' => 'Útfyll henda teigin fyri at nullstilla títt loyniorð.',
+'passwordreset-text-many' => '{{PLURAL:$1|Skriva eitt av pettunum av dáta fyri at nullstilla títt loyniorð.}}',
 'passwordreset-legend' => 'Nulstilla loyniorðið',
 'passwordreset-disabled' => 'Tað ber ikki til at nullstilla loyniorðið á hesi wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Skriva ein av upplýsingunum niðanfyri}}',
+'passwordreset-emaildisabled' => 'Teldupost funksjónir eru óvirknar á hesi wiki.',
 'passwordreset-username' => 'Brúkaranavn:',
 'passwordreset-domain' => 'Umdømi (domain):',
 'passwordreset-capture' => 'Sí tann endaliga t-postin?',
 'passwordreset-capture-help' => 'Um tú setir kross við henda teigin, so verður t-posturin (við fyribils loyniorðinum) vístur fyri tær og verður harumframt sendur til brúkaran.',
 'passwordreset-email' => 'T-post adressur:',
 'passwordreset-emailtitle' => 'konto upplýsingar á {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Onkur (óiva tú, frá IP adressu $1) hevur biðið um 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 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 áminningar teldupostur var gjørdur, sum víst niðanfyri, men tað miseydnaðist at senda til brúkaran: $1',
+'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',
@@ -898,18 +939,26 @@ Ongin frágreiðing finst.',
 Tað sær út til at hon er blivin strikað.',
 'edit-conflict' => 'Rættingar trupulleiki (konflikt).',
 'edit-no-change' => 'Tín rætting var sæð burtur frá, tí ongin broyting varð gjørd í tekstinum.',
+'postedit-confirmation' => 'Tín rætting varð goymd.',
 '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',
 
 # Parser/template warnings
+'expensive-parserfunction-warning' => "'''Ávaring:''' Henda síðan inniheldur ov nógvar útrokningstungar parsara-funksjónskall.
+
+Hon eigur at hava minni enn $2 {{PLURAL:$2|kall}}, tað {{PLURAL:$1|er nú $1|eru nú $1 kall}}.",
 'expensive-parserfunction-category' => 'Síður við ov nógvum dýrum parsara funktiónskallum',
 'post-expand-template-inclusion-warning' => "'''Ávaring:''' Tað eru ov nógvar skabilónir á hesi síðu. 
 Nakrar skabilónir vera ikki vístar.",
@@ -918,6 +967,7 @@ Nakrar skabilónir vera ikki vístar.",
 Hetta parametur er tí ikki tikið við.",
 'post-expand-template-argument-category' => 'Síður har skabilón parametur (template arguments) ikki eru tikin við',
 'parser-template-loop-warning' => 'Skapilónssloyfa funnin: [[$1]]',
+'language-converter-depth-warning' => 'Markið fyri dýpd á málkonverteraranum er farið út um mark ($1)',
 'node-count-exceeded-category' => 'Síður har talið av notum (node) er ov høgt',
 'node-count-exceeded-warning' => 'Síðan hevur og høgt tal av notum (node-count)',
 'expansion-depth-exceeded-category' => 'Síður ið fara yvir loyvdu víðkanar-dýpdina',
@@ -1029,6 +1079,9 @@ $1",
 Hon kann ikki fjalast.',
 'revdelete-show-no-access' => 'Feilur tá hesin lutur dagfestur $1 klokkan $2 skuldi vísast:Hesin lutur er blivin markeraður sum "avmarkaður".
 Tú hevur ikki atgongd til hann.',
+'revdelete-modify-no-access' => 'Feilur tá hesin lutur dagfestur $1 klokkan $2 skuldi broytast:Hesin lutur er blivin markeraður sum "avmarkaður".
+Tú hevur ikki atgongd til hann.',
+'revdelete-modify-missing' => 'Feilur hendi undir broytan av luti ID $1: Hann er ikki at finna í dátabasuni!',
 'revdelete-no-change' => "'''Ávaring:''' Pettið ið er dagfest $1, kl. $2 hevði longu tær umbidnu innstillingar fyri sjónligheit.",
 'revdelete-concurrent-change' => 'Ein feilur hendi, meðan tú dagførdi tekstin frá $1, kl. $2: Teksturin sær út til at vera blivin broyttur av onkrum øðrum, meðan tú royndi at rætta hann.',
 'revdelete-otherreason' => 'Onnur orsøk',
@@ -1036,12 +1089,23 @@ Tú hevur ikki atgongd til hann.',
 'revdelete-edit-reasonlist' => 'Rætta strikingar orsøkir',
 'revdelete-offender' => 'Høvundurin av hesi endurskoðan:',
 
+# Suppression log
+'suppressionlog' => 'Samanpressingarloggur',
+'suppressionlogtext' => 'Niðanfyri sæst eitt yvirlit yvir slettingar og sperringar, sum fevnir um innihald, sum er fjalt fyri administratorum.
+Hygg at [[Special:BlockList|sperringslistanum]] fyri at síggja listan yvir verandi bann og sperringar.',
+
 # History merging
 'mergehistory' => 'Samantvinna søgurnar hjá síðunum',
 'mergehistory-header' => 'Henda síðan letur teg samanflætta versjónirnar frá søguni av einari síðu til eina nýggjari síðu.
 Tryggja tær, at henda broyting fer at varðveita framhaldssøguna hjá síðuni.',
 'mergehistory-box' => 'Samantvinna versjónirnar av tveimum síðum:',
 'mergehistory-from' => 'Keldusíða:',
+'mergehistory-into' => 'Komusíða:',
+'mergehistory-list' => 'Rættingarsøgur, sum kunnu samanflættast',
+'mergehistory-go' => 'Vís rættingar ið kunnu samantvinnast',
+'mergehistory-submit' => 'Samanflætta versjónirnar',
+'mergehistory-empty' => 'Ongar versjónir kunnu samanflættast.',
+'mergehistory-success' => '$3 {{PLURAL:$3|versjón|versjónir}} av [[:$1]] er samanflættað við [[:$2]].',
 'mergehistory-no-source' => 'Keldu síðan $1 er ikki til.',
 'mergehistory-no-destination' => 'Destinatiónssíðan $1 er ikki til.',
 'mergehistory-invalid-source' => 'Keldusíðan má hava eitt gyldugt heiti.',
@@ -1089,7 +1153,6 @@ Tryggja tær, at henda broyting fer at varðveita framhaldssøguna hjá síðuni
 'searchmenu-legend' => 'Leiti møguleikar',
 'searchmenu-exists' => "'''Tað er longu ein síða sum eitur \"[[:\$1]]\" á hesi wiki.'''",
 'searchmenu-new' => "'''Stovna síðuna \"[[:\$1]]\" á hesi wiki!'''",
-'searchhelp-url' => 'Help:Innihald',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Leita í síðum við hesum prefiksinum (byrjan av orðinum)]]',
 'searchprofile-articles' => 'Innihaldssíður',
 'searchprofile-project' => 'Hjálpar og verkætlanar síður',
@@ -1133,24 +1196,21 @@ Tú kanst royna at brúka ''all:'' sum fyrsta stavilsi fyri at søkja í øllum
 'searchdisabled' => '{{SITENAME}} leitan er sett úr gildi.
 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',
+'search-error' => 'Ein feilur hendi undir leitanini: $1',
 
 # Preferences page
 'preferences' => 'Innstillingar',
 'mypreferences' => 'Innstillingar',
 'prefs-edits' => 'Tal av rættingum:',
 'prefsnologin' => 'Tú hevur ikki ritað inn',
+'prefsnologintext' => 'Tú mást vera <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} innritað/ur]</span> fyri at broyta brúkarainnstillingar.',
 '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 +1235,20 @@ 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.',
+'prefs-help-watchlist-token' => 'Um tú fyllir út henda teigin við einum tryggum lykli, so verður ein RSS feed upprættaður til tín eftirlitslista.
+Ein og hvør ið kennir lykilin í hesum teiginum, hevur møguleika fyri at lesa tín eftirlitslista, so vel ein trygt virði.
+Her er eitt tilvildarliga valdt virði, sum tú kanst brúka: $1',
 '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',
@@ -1216,8 +1282,11 @@ Tú kanst ikki angra, tá tað fyrst er gjørt.',
 'prefs-registration' => 'Skrásett tíðspunkt:',
 'yourrealname' => 'Títt navn*:',
 'yourlanguage' => 'Mál til brúkaraflatu:',
+'yourvariant' => 'Málvariantur fyri innihald:',
 '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 +1337,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 +1378,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',
@@ -1314,23 +1386,37 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
 'right-autoconfirmed' => 'Rætta hálvt-vardar síður (semi-protected)',
 'right-delete' => 'Strika síður',
 'right-bigdelete' => 'Strika síður við nógvum versjónum',
+'right-deletedtext' => 'Sí strikaðan tekst og broytingar ímillum strikaðar endurskoðanir',
 'right-browsearchive' => 'Leita í strikaðum síðum',
 'right-undelete' => 'Endurstovnað eina síðu',
+'right-suppressrevision' => 'Endurskoða og endurstovna versjónir sum eru fjaldar fyri administratorum',
+'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',
 'right-unblockself' => 'Taka burtur sperring av sær sjálvum',
 'right-protect' => 'Broyt verjustøður og rætta vardar síður',
 'right-editprotected' => 'Rætta vardar síður (uttan niðurarvaða verju)',
+'right-editinterface' => 'Rætta brúkaramarkamótið',
 'right-editusercssjs' => 'Rætta CSS og JavaScript fílur hjá øðrum brúkarum',
 'right-editusercss' => 'Rætta CSS fílur hjá øðrum brúkarum',
 'right-edituserjs' => 'Rætta JavaScript fílur hjá øðrum brúkarum',
+'right-editmyusercss' => 'Rætta tínar egnu brúkara CSS fílur',
+'right-editmyuserjs' => 'Rætta tínar egnu brúkara JavaScript fílur',
+'right-viewmywatchlist' => 'Síggj tín egna eftirlitslista',
+'right-rollback' => 'Rulla skjótt aftur (tak burtur) rættingarnar hjá tí seinasta brúkaranum á einari ávísari síðu',
+'right-markbotedits' => 'Markera afturrullaðar rættingar sum rættingar frá einum botti',
+'right-noratelimit' => 'Ikki ávirkað av hámarksferð',
 'right-import' => 'Innflyt síður frá øðrum wikium',
+'right-importupload' => 'Innflyt síður frá frá einari fílu sum er løgd út',
 'right-patrol' => 'Marka broytingar hjá øðrum sum eftirkannaðar',
+'right-autopatrol' => 'Hava eins egnu rættingar sjálvvirkamdi vístar sum eftirkannaðar',
 'right-unwatchedpages' => 'Sí lista við síðum sum ikki eru eftiransaðar',
 'right-mergehistory' => 'Samanflætta søguna hjá hesum síðum',
 'right-userrights' => 'Rætta øll brúkaraloyvir',
 'right-userrights-interwiki' => 'Broyt brúkara rættindi hjá brúkarum á øðrum wikium',
+'right-siteadmin' => 'Stong og læs upp dátugrunnin',
+'right-override-export-depth' => 'Útflyt síður, eisini slóðaðar síður upp til eina dýpd á 5',
 'right-sendemail' => 'Send t-post til aðrir brúkarar',
 'right-passwordreset' => 'Sí teldupostar til nullstilling av loyniorði',
 
@@ -1354,19 +1440,29 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
 'action-move-rootuserpages' => 'flyt høvuðs brúkarasíður',
 'action-movefile' => 'flyt hesa fílu',
 'action-upload' => 'send hesa fílu upp',
+'action-reupload' => 'yvirskriva hesa verandi fíluna',
 'action-upload_by_url' => 'legg henda fílin upp frá einari URL-adressu',
 'action-delete' => 'Strika hesa síðu',
+'action-deleterevision' => 'sletta hesa versjónina',
 'action-deletedhistory' => 'hygg at strikingar søguni hjá hesi síðu',
 'action-browsearchive' => 'leita eftir strikaðum síðum',
 'action-undelete' => 'endurstovnað hesa síðu',
+'action-suppressrevision' => 'endurskoða og endurstovna hesa fjaldu versjónina',
+'action-suppressionlog' => 'sí henda privata loggin',
 'action-block' => 'noktað hesum brúkara at rætta',
 'action-protect' => 'broyt verjustøðuna hjá hesi síðu',
+'action-rollback' => 'rulla skjótt aftur rættingarnar hjá tí seinasta brúkaranum, sum rættaði eina ávísa síðu',
+'action-import' => 'innflyt hesa síðu frá aðrari wiki',
+'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',
 'action-userrights-interwiki' => 'broyt brúkararættindi hjá brúkarum á øðrum wikium',
 'action-siteadmin' => 'stong ella læs upp dátugrunnin',
 'action-sendemail' => 'send teldupostar',
+'action-editmywatchlist' => 'rætta tín eftirlitslista',
+'action-viewmywatchlist' => 'síggja tín eftirlitslista',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|broyting|broytingar}}',
@@ -1390,13 +1486,15 @@ 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' => 'Avmarkað til síður frá bólkunum (skil sundur við "|")',
 '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',
@@ -1419,8 +1517,7 @@ Síður á [[Special:Watchlist|tínum eftiransingarlista]] eru skrivaðar við '
 'reuploaddesc' => 'Angra uppløðu og far aftur til upload formin',
 'upload-tryagain' => 'Goym broytta fílu frágreiðing',
 'uploadnologin' => 'Ikki ritað inn',
-'uploadnologintext' => 'Tú mást hava [[Special:UserLogin|ritað inn]]
-fyri at leggja fílur upp.',
+'uploadnologintext' => 'Tú mást $1 fyri at leggja fílur út.',
 'upload-recreate-warning' => "'''Ávaring: Ein fíla við hasum navninum er blivin strikað ella flutt.'''
 
 Strikingar og flytingar loggurin (søgan) fyri ta síðuna verður vístur her niðanfyri fyri at gera tað lættari hjá tær:",
@@ -1453,11 +1550,15 @@ Vinarliga gev fíluni nýtt navn og royn at senda hana upp (uploada) enn einafer
 'filename-toolong' => 'Fílunøvn mugu ikki vera longri enn 240 bytes.',
 'badfilename' => 'Myndin er umnevnd til "$1".',
 'filetype-badmime' => 'Fílur av slagnum MIME "$1" eru ikki loyvd at verða send up (uploada).',
+'filetype-banned-type' => '\'\'\'".$1"\'\'\' {{PLURAL:$4|er ikki eitt loyvt fíluslag|eru ikki loyvd fílusløg}}.
+Loyvt/loyvd {{PLURAL:$3|fíluslag er|fílusløg eru}} $2.',
 'filetype-missing' => 'Fílan hevur ongan enda (sum t.d. ".jpg").',
 'empty-file' => 'Fílan sum tú sendi upp var tóm.',
 'file-too-large' => 'Fílan sum tú sendi inn var ov stór.',
 'filename-tooshort' => 'Fílunavnið er ov stutt.',
 'filetype-banned' => 'Hetta slagi av fílum er bannað.',
+'verification-error' => 'Henda fílan varð ikki góðkend av fílugóðkenningini.',
+'hookaborted' => 'Broytingin ið tú royndi at gera var tikin burtur av einari leingjan (extension).',
 'illegal-filename' => 'Hetta fílunavnið er ikki loyvt.',
 'overwrite' => 'Tað er ikki loyvi til at yvirskriva eina verandi fílu.',
 'unknown-error' => 'Ein ókend villa kom fyri.',
@@ -1466,6 +1567,9 @@ Vinarliga gev fíluni nýtt navn og royn at senda hana upp (uploada) enn einafer
 'large-file' => 'Tað verður viðmælt, at fílur ikki eru størri enn $1;
 henda fílin er $2.',
 'largefileserver' => 'Henda fílan er størri enn servarin er innstillaður til at loyva.',
+'emptyfile' => 'Fílan ið tú legði út sær út til at vera tóm.
+Hetta kann skyldast ein sláfeil í fílunavninum.
+Vinarliga eftirkanna um tú veruliga ynskir at leggja hesa fíluna út.',
 'windows-nonascii-filename' => "Henda wiki'in stuðlar ikki fílunøvn við serstøkum bókstavum/teknum.",
 'fileexists' => 'Ein fíla við hesum navninum er longu til, vinarliga kanna eftir <strong>[[:$1]]</strong> um tú ivast í, um tú ynskir at broyta tað.
 [[$1|thumb]]',
@@ -1473,11 +1577,33 @@ 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.',
+'fileexists-thumbnail-yes' => "Fílan sær út til at vera ein minka stødd ''(thumbnail)''.
+[[$1|thumb]]
+Vinarliga kanna fíluna <strong>[[:$1]]</strong>.
+Um tann kannað fílan er tann sama myndin av einari uppruna stødd, so er tað ikki neyðugt at leggja út ein eyka thumbnail.",
+'file-thumbnail-no' => "Fílunavnið byrjar við <strong>$1</strong>.
+Tað sær út til at vera ein mynd av einari minkaðari stødd ''(thumbnail)''.
+Um tú hevur hesa myndina í fullari upploysn, legg so hesa út, um ikki broyt so vinarliga fílunavnið.",
+'fileexists-forbidden' => 'Ein fíla við hesum navninum finst longu og kann ikki verða yvirskivað.
+Um tú álíkavæl ynskir at leggja út tína fílu, vinarliga far so aftur og vel eitt annað navn.
+[[File:$1|thumb|center|$1]]',
+'fileexists-shared-forbidden' => 'Ein fíla við tí sama navninum finst longu í felags fílusavninum.
+Um tú enn ynskir at leggja út tína fílu, vinarliga far so aftur og vel eitt annað navn.
+[[File:$1|thumb|center|$1]]',
 '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',
+'overwroteimage' => 'legði út eina nýggja versjón av "[[$1]]"',
+'uploadfromurl-queued' => 'Tín útlegging er komin í bíðirøð.',
+'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 +1613,35 @@ 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-invalidpath' => '"$1" er ikki ein loyvd goymsluslóð.',
+'backend-fail-delete' => 'Tað bar ikki til at sletta fílu "$1".',
+'backend-fail-describe' => 'Tað bar ikki til at broyta metadáta fyri fílu "$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 +1650,10 @@ 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}}.',
+'backend-fail-readonly' => 'Goymslu backend "$1" er í løtuni í "bara-lesa" støðu. Orsøkin til hetta er: "\'\'$2\'\'"',
+'backend-fail-connect' => 'Tað bar ikki til at fáa samband við goymslu-backend "$1".',
+'backend-fail-internal' => 'Ein ókendur feilur hendi í goymsluskipanini (backend) "$1".',
 
 # Lock manager
 'lockmanager-notlocked' => 'Kundi ikki lata upp "$1"; hon er ikki stongd.',
@@ -1511,8 +1663,12 @@ 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-badtitle' => 'Tað bar ikki til at gera eitt heiti útfrá "$1".',
 'img-auth-nologinnWL' => 'Tú ert ikki ritað/ur inn, og "$1" er ikki á hvítalista.',
 'img-auth-nofile' => 'Fílan "$1" er ikki til',
 'img-auth-isdir' => 'Tú roynir at fáa atgongd til mappuna "$1".
@@ -1528,7 +1684,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 +1716,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,20 +1739,57 @@ 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.',
+'sharedupload-desc-edit' => 'Henda fílan er frá $1 og kann vera brúkt av øðrum verkætlanum.
+Kanska ynskir tú at rætta frágreiðingina hjá fíluni á [$2 fílu frágreiðingarsíðuni] her.',
+'sharedupload-desc-create' => 'Henda fílan er frá $1 og kann vera brúkt av øðrum verkætlanum.
+Kanska ynskir tú at rætta frágreiðingina til fíluna á [$2 fílu frágreiðingarsíðuni] her.',
+'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' => 'Endurstovna $1',
+'filerevert-legend' => 'Endurstovna fílu',
+'filerevert-intro' => "Tú ert í ferð við at endurstovna fílu '''[[Media:$1|$1]]''' til [$4 verssjónina sum hon sá út kl. $3, hin $2].",
+'filerevert-comment' => 'Orsøk:',
+'filerevert-defaultcomment' => 'Endurstovanð til versjón frá kl. $2, hin $1',
+'filerevert-submit' => 'Endurstovna',
+'filerevert-success' => "'''[[Media:$1|$1]]''' er blivið endurstovna til [$4 versjónina frá $2, kl. $3].",
 
 # 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-otherreason' => 'Onnur/aðrar orsøkir:',
+'filedelete-reason-otherlist' => 'Onnur orsøk',
+'filedelete-reason-dropdown' => '*Vanligar orsøkir til sletting
+** Brot á upphavsrættin
+** Fílan kemur fyri tvær ferðir',
+'filedelete-edit-reasonlist' => 'Rætta orsøkina til striking',
+'filedelete-maintenance-title' => 'Ógjørligt at sletta fílu',
 
 # MIME search
 'mimesearch' => 'MIME-leit',
+'mimetype' => 'MIME slag:',
+'download' => 'tak niður',
+
+# Unwatched pages
+'unwatchedpages' => 'Ikki eftiransaðar síður',
 
 # List redirects
 'listredirects' => 'Sýn ávísingar',
@@ -1631,12 +1823,16 @@ Frágreiðingin á [$2 fílu frágreiðingar síðu] er víst her niðanfyri.',
 'disambiguations' => 'Síður sum vísa til síður við fleirfaldum týdningi',
 'disambiguationspage' => 'Template:fleiri týdningar',
 
+'pageswithprop-submit' => 'Far',
+
 'doubleredirects' => 'Tvífaldað ávísing',
 'doubleredirectstext' => 'Henda síða gevur yvirlit yvir síður, sum vísa víðari til aðrar víðaristillaðar síður.
 Hvør linja inniheldur leinkjur til ta fyrstu og næstu víðaristillingina, eins væl og málið fyri tað næstu víðaristillingina, sum vanliga er tann "veruliga" endamáls síðan, sum tann fyrsta víðaristillingin átti at peika móti.
 <del>Útkrossaðir</del> postar eru loystir.',
 'double-redirect-fixed-move' => '[[$1]] er blivin flutt.
 Víðaristilling verður nú gjørd til [[$2]].',
+'double-redirect-fixed-maintenance' => 'Rætta dupulta umstýring frá [[$1]] til [[$2]].',
+'double-redirect-fixer' => 'Umstýringsrættari',
 
 'brokenredirects' => 'Brotnar ávísingar',
 'brokenredirectstext' => 'Hesar víðaristillingar slóða til síður, ið ikki eru til:',
@@ -1650,12 +1846,17 @@ 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}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwikiir}}',
 'nlinks' => '$1 {{PLURAL:$1|slóð|slóðir}}',
 'nmembers' => '$1 {{PLURAL:$1|limur|limir}}',
 'nviews' => '$1 {{PLURAL:$1|skoðan|skoðanir}}',
+'nimagelinks' => 'Brúkt á $1 {{PLURAL:$1|síðu|síðum}}',
+'ntransclusions' => 'brúkt á $1 {{PLURAL:$1|síðu|síðum}}',
+'specialpage-empty' => 'Tað eru ongi úrslit fyri hesa rapportina.',
 'lonelypages' => 'Foreldraleysar síður',
+'lonelypagestext' => 'Hesar síður slóða ikki frá ella eru ikki tiknar við á aðrar síður á {{SITENAME}}.',
 'uncategorizedpages' => 'Óbólkaðar síður',
 'uncategorizedcategories' => 'Óbólkaðir bólkar',
 'uncategorizedimages' => 'Fílir sum ikki eru bólkaðar',
@@ -1669,13 +1870,22 @@ Víðaristilling verður nú gjørd til [[$2]].',
 'wantedtemplates' => 'Ynsktar fyrimyndir',
 'mostlinked' => 'Síður við flest ávísingum',
 'mostlinkedcategories' => 'Bólkar við flestum ávísandi slóðum',
+'mostlinkedtemplates' => 'Mest slóðaðar-til fyrimyndir',
 'mostcategories' => 'Greinir við flest bólkum',
+'mostimages' => 'Mest leinkjaðar-til fílur',
+'mostinterwikis' => 'Síður við flestum interwiki-slóðum',
 'mostrevisions' => 'Greinir við flestum útgávum',
 'prefixindex' => 'Allar síður við forskoyti (prefiks)',
 'shortpages' => 'Stuttar síður',
 'longpages' => 'Langar síður',
 'deadendpages' => 'Gøtubotnssíður',
+'deadendpagestext' => 'Hesar síðurnar slóða ikki til aðrar síður í {{SITENAME}}.',
 'protectedpages' => 'Friðaðar síður',
+'protectedpagestext' => 'Hesar síður eru vardar móti flyting ella rætting',
+'protectedpagesempty' => 'Ongar síður eru í løtuni vardar á henda hátt.',
+'protectedtitles' => 'Vard heiti',
+'protectedtitlestext' => 'Hesi heiti er vard móti upprættan',
+'protectedtitlesempty' => 'Ongi heiti eru í løtuni vard á henda hátt.',
 'listusers' => 'Brúkaralisti',
 'listusers-editsonly' => 'Vís bara brúkarar sum hava gjørt rættingar',
 'listusers-creationsort' => 'Bólkað eftir stovningardegnum',
@@ -1689,8 +1899,10 @@ Víðaristilling verður nú gjørd til [[$2]].',
 'unusedimagestext' => 'Fylgjandi fílur eru til, men eru ikki lagdar inn á nakra síðu.
 Vinarliga legg merki til, at vevsíður kunnu slóða til eina fílu við beinleiðis URL, og tí kann hon enn síggjast her, hóast at hon er í regluligari nýtslu.',
 'notargettitle' => 'Onki mál',
+'nopagetext' => 'Síðan ið tú leitar eftir er ikki til.',
 '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',
@@ -1737,6 +1949,15 @@ Sí eisini [[Special:WantedCategories|ynsktir bólkar]].',
 'listusers-submit' => 'Sýna',
 'listusers-noresult' => 'Ongin brúkari var funnin.',
 
+# Special:ActiveUsers
+'activeusers' => 'Listi yvir aktivar brúkarar',
+'activeusers-intro' => 'Hetta er ein listi yvir brúkarar, ið høvdu okkurt slag av aktiviteti tann seinasta/teir seinastu $1 {{PLURAL:$1|dagin|dagarnar}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|handling|handlingar}} tann seinasta/teir seinastu {{PLURAL:$3|dagin|$3 dagarnar}}',
+'activeusers-from' => 'Vís brúkarar, ið byrja við:',
+'activeusers-hidebots' => 'Fjal bottar',
+'activeusers-hidesysops' => 'Fjal umboðsstjórar (administratorar)',
+'activeusers-noresult' => 'Ongir brúkarar funnir.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Brúkara bólka rættindi',
 'listgrouprights-summary' => 'Henda síða vísir ein lista av brúkarabólkum, sum eru útgreinaðir á hesi wiki og rættindini hjá teimum einstøku bólkunum.
@@ -1747,6 +1968,7 @@ Møguliga er [[{{MediaWiki:Listgrouprights-helppage}}|meira kunning]] um einstø
 'listgrouprights-rights' => 'Rættindi',
 'listgrouprights-helppage' => 'Help:Bólka rættindi',
 'listgrouprights-members' => '(limalisti)',
+'listgrouprights-addgroup' => 'Legg afturat {{PLURAL:$2|bólk|bólkar}}: $1',
 'listgrouprights-removegroup' => 'Tak burtur {{PLURAL:$2|bólk|bólkar}}: $1',
 'listgrouprights-addgroup-all' => 'Legg til allir bólkar',
 'listgrouprights-removegroup-all' => 'Tak burtur allir bólkar',
@@ -1761,8 +1983,10 @@ Møguliga er [[{{MediaWiki:Listgrouprights-helppage}}|meira kunning]] um einstø
 og hava virkandi teldupostadressu í [[Special:Preferences|innstillingum]] tínum
 fyri at senda teldupost til aðrar brúkarar.',
 'emailuser' => 'Send t-post til brúkara',
+'emailuser-title-target' => 'Send teldupost til henda {{GENDER:$1|brúkaran}}',
+'emailuser-title-notarget' => 'Send t-post til brúkara',
 'emailpage' => 'Send t-post til brúkara',
-'emailpagetext' => 'Tú kanst brúka skjalið niðanfyri til at senda ein teldupost til henda 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',
@@ -1770,7 +1994,12 @@ Teldupost adressan sum tú skrivaði í [[Special:Preferences|tíni brúkara yns
 'noemailtitle' => 'Ongin t-post adressa',
 'noemailtext' => 'Hesin brúkarin hevur ikki upplýst eina gylduga t-post-adressu.',
 'nowikiemailtitle' => 'Ongin t-postur er loyvdur',
+'nowikiemailtext' => 'Hesin brúkarin hevur valt ikki at móttaka teldupost frá øðrum brúkarum.',
+'emailnotarget' => 'Ikki-eksisterandi ella ógyldugt brúkaranavn fyri móttakaran.',
+'emailtarget' => 'Skriva brúkaranavnið hjá móttakaranum',
 'emailusername' => 'Brúkaranavn:',
+'emailusernamesubmit' => 'Send',
+'email-legend' => 'Send eitt teldubræv til ein annan {{SITENAME}} brúkara',
 'emailfrom' => 'Frá:',
 'emailto' => 'Til:',
 'emailsubject' => 'Evni:',
@@ -1780,6 +2009,7 @@ Teldupost adressan sum tú skrivaði í [[Special:Preferences|tíni brúkara yns
 'emailccsubject' => 'Avrit av tínum boðum til $1: $2',
 'emailsent' => 'T-postur sendur',
 'emailsenttext' => 'Títt t-post boð er sent.',
+'emailuserfooter' => 'Hesin teldupostur var sendur av $1 til $2 við "Send teldupost" funksjónini á {{SITENAME}}.',
 
 # Watchlist
 'watchlist' => 'Eftirlitslisti',
@@ -1787,15 +2017,15 @@ 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.",
+'addwatch' => 'Legg til eftirlitslista',
+'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.',
+'removewatch' => 'Tak burtur frá eftirlistslistanum',
 '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',
+'unwatchthispage' => 'Halt uppat við at hava eftirlit',
 'notanarticle' => 'Ongin innihaldssíða',
 'watchnochange' => 'Ongin grein í tínum eftirliti er rætta innanfyri hetta tíðarskeiði.',
 'watchlist-details' => '{{PLURAL:$1|$1 síða|$1 síður}} á tínum vaktarlista, kjaksíður ikki íroknaðar.',
@@ -1809,7 +2039,17 @@ Vilt tú flyta síðuna undan tínum eftirliti, kanst tú trýsta á \"Strika ef
 'watching' => 'Eftirlitir...',
 'unwatching' => 'Strikar eftirlit...',
 
+'enotif_reset' => 'Markera allar síður sum vitjaðar',
 'enotif_impersonal_salutation' => '{{SITENAME}}brúkari',
+'enotif_subject_deleted' => '{{SITENAME}} síðan $1 er blivin {{GENDER:$2|slettað}} av $2',
+'enotif_subject_created' => '{{SITENAME}} síðan $1 er blivin {{GENDER:$2|upprættað}} av $2',
+'enotif_subject_moved' => '{{SITENAME}} síðan $1 er blivin {{GENDER:$2|flutt}} av $2',
+'enotif_subject_restored' => '{{SITENAME}} síðan $1 er blivin {{GENDER:$2|endurupprættað}} av $2',
+'enotif_subject_changed' => '{{SITENAME}} síðan $1 er blivin {{GENDER:$2|broytt}} av $2',
+'enotif_body_intro_deleted' => '{{SITENAME}} síðan $1 er blivin {{GENDER:$2|slettað}} $PAGEEDITDATE av $2, sí $3.',
+'enotif_lastvisited' => 'Sí $1 fyri allar broytingar síðan tína seinastu vitjan.',
+'enotif_lastdiff' => 'Sí $1 fyri at síggja hesa broyting.',
+'enotif_anon_editor' => 'dulnevndur brúkari $1',
 'created' => 'stovnað',
 
 # Delete
@@ -1850,7 +2090,16 @@ Striking av slíkum síðum er avmarkað fyri at forða fyri at onkur av óvart
 'rollback' => 'Rulla broytingar aftur',
 'rollback_short' => 'Rulla aftur',
 'rollbacklink' => 'afturrulling',
+'rollbacklinkcount' => 'rulla aftur $1 {{PLURAL:$1|rætting|rættingar}}',
+'rollbacklinkcount-morethan' => 'rulla aftur meira enn $1 {{PLURAL:$1|rætting|rættingar}}',
 'rollbackfailed' => 'Afturrulling miseydnað',
+'cantrollback' => 'Tað ber ikki til at afturstilla rættingina;
+tann seinasti ið skrivaði her er eisini tann einasti høvundurin á hesi síðu.',
+'alreadyrolled' => 'Tað ber ikki til at rulla aftur seinastu rætting av [[:$1]] hjá [[User:$2|$2]] ([[User talk:$2|talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
+onkur annar hevur longu rættað ella rullað síðuna aftur.
+
+Seinasta broytingin á síðuni var av [[User:$3|$3]] ([[User talk:$3|kjak]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
+'editcomment' => "Rættingarfrágreiðingin var: \"''\$1''\".",
 'revertpage' => 'Tók burtur rættingar hjá [[Special:Contributions/$2|$2]] ([[User talk:$2|kjak]]) til seinastu versjón hjá [[User:$1|$1]]',
 'revertpage-nouser' => 'Tók burtur rættingar hjá (brúkaranavn tikið vekk) til seinastu versjón hjá [[User:$1|$1]]',
 'rollback-success' => 'Tók burtur rættingar hjá $1;
@@ -1866,9 +2115,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:',
@@ -1904,7 +2153,7 @@ broytti tað aftur til seinastu versjón hjá $2.',
 'contributions-title' => 'Brúkaraíkøst fyri $1',
 'mycontris' => 'Íkøst',
 'contribsub2' => 'Eftir $1 ($2)',
-'uctop' => '(ovast)',
+'uctop' => '(verandi)',
 'month' => 'Frá mánaði (og áðrenn):',
 'year' => 'Frá ár (og áðrenn):',
 
@@ -1987,10 +2236,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.
@@ -2030,7 +2279,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ð',
@@ -2060,10 +2309,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.',
@@ -2072,19 +2321,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',
@@ -2092,7 +2341,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',
@@ -2104,7 +2353,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!',
@@ -2126,15 +2375,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
@@ -2197,7 +2444,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',
@@ -2276,9 +2523,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 f407782..db7fec1 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
@@ -430,7 +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',
+'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}}',
@@ -575,6 +589,7 @@ $messages = array(
 'create-this-page' => 'Créer cette page',
 'delete' => 'Supprimer',
 'deletethispage' => 'Supprimer cette page',
+'undeletethispage' => 'Annuler la suppression de cette page',
 'undelete_short' => 'Restaurer $1 modification{{PLURAL:$1||s}}',
 'viewdeleted_short' => 'Voir {{PLURAL:$1|une modification supprimée|$1 modifications supprimées}}',
 'protect' => 'Protéger',
@@ -628,7 +643,6 @@ $1",
 'disclaimers' => 'Avertissements',
 'disclaimerpage' => 'Project:Avertissements généraux',
 'edithelp' => 'Aide',
-'edithelppage' => 'Help:Comment modifier une page',
 'helppage' => 'Help:Accueil',
 'mainpage' => 'Accueil',
 'mainpage-description' => 'Accueil',
@@ -775,12 +789,14 @@ $2",
 'namespaceprotected' => "Vous n'avez pas la permission de modifier les pages de l'espace de noms « '''$1''' ».",
 'customcssprotected' => "Vous n'avez pas la permission de modifier cette page de CSS, car elle contient les paramètres personnels d'un autre utilisateur.",
 'customjsprotected' => "Vous n'avez pas la permission de modifier cette page de JavaScript, car elle contient les paramètres personnels d'un autre utilisateur.",
+'mycustomcssprotected' => 'Vous n’avez pas le droit de modifier cette page CSS.',
+'mycustomjsprotected' => 'Vous n’avez pas le droit de modifier cette page JavaScript.',
 'ns-specialprotected' => "Les pages dans l'espace de noms « {{ns:special}} » ne peuvent pas être modifiées.",
 'titleprotected' => "Ce titre a été protégé à la création par [[User:$1|$1]].
 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é',
@@ -805,10 +821,13 @@ N'oubliez pas de modifier [[Special:Preferences|vos préférences pour {{SITENAM
 '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}})',
-'userlogin-remembermypassword' => 'Se souvenir de moi',
-'userlogin-signwithsecure' => "S'inscrire avec un serveur sécurisé",
+'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.',
@@ -829,12 +848,30 @@ N'oubliez pas de modifier [[Special:Preferences|vos préférences pour {{SITENAM
 '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.',
@@ -884,7 +921,7 @@ Entrez une adresse bien formatée ou laissez ce champ vide.',
 'cannotchangeemail' => 'Les adresses de courriel des comptes ne peuvent pas être modifiées sur ce wiki.',
 'emaildisabled' => 'Ce site ne peut pas envoyer de courriels.',
 'accountcreated' => 'Compte créé',
-'accountcreatedtext' => 'Le compte utilisateur pour $1 a été créé.',
+'accountcreatedtext' => 'Le compte utilisateur pour [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|discussion]]) a été créé.',
 'createaccount-title' => "Création d'un compte pour {{SITENAME}}",
 'createaccount-text' => "Quelqu'un a créé un compte pour votre adresse de courriel sur {{SITENAME}} ($4) intitulé « $2 », avec le mot de passe « $3 ».
 Vous devriez ouvrir une session et modifier dès à présent votre mot de passe.
@@ -919,14 +956,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-emaildisabled' => 'Les fonctionnalités e-mail ont été désactivées sur ce wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Entrez un élément de données ci-dessous}}',
 'passwordreset-username' => "Nom d'utilisateur :",
 'passwordreset-domain' => 'Domaine :',
 'passwordreset-capture' => 'Voir le courriel résultant?',
@@ -947,7 +985,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",
@@ -957,7 +995,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',
 
@@ -1062,7 +1100,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'' ;
@@ -1121,7 +1159,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 />
@@ -1155,6 +1193,7 @@ 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',
@@ -1162,7 +1201,7 @@ Elle existe déjà.",
 '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é avec votre compte, vous pouvez retirer cet avertissement dans la section « {{int:prefs-editing}} » de vos préférences.',
+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',
@@ -1235,9 +1274,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'''.
@@ -1384,7 +1423,7 @@ Vous pouvez trouver des détails dans le [{{fullurl:{{#Special:Log}}/delete|page
 'searchresulttext' => "Pour plus d'informations sur la recherche dans {{SITENAME}}, voir [[{{MediaWiki:Helppage}}|{{int:help}}]].",
 'searchsubtitle' => "Vous avez recherché « '''[[:$1]]''' » ([[Special:Prefixindex/$1|toutes les pages commençant par « $1 »]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|toutes les pages qui ont un lien vers « $1 »]])",
 'searchsubtitleinvalid' => "Vous avez recherché « '''$1''' »",
-'toomanymatches' => 'Un trop grand nombre d’occurrences a été renvoyé, veuillez soumettre une requête différente.',
+'toomanymatches' => "Un trop grand nombre d'occurrences a été renvoyé, veuillez soumettre une requête différente.",
 'titlematches' => 'Correspondances dans les titres des pages',
 'notitlematches' => 'Aucun titre de page ne correspond à la recherche.',
 'textmatches' => 'Correspondances dans le texte des pages',
@@ -1398,7 +1437,6 @@ Vous pouvez trouver des détails dans le [{{fullurl:{{#Special:Log}}/delete|page
 'searchmenu-legend' => 'Options de recherche',
 'searchmenu-exists' => "'''Il existe une page nommée « [[:$1]] » sur ce wiki'''",
 'searchmenu-new' => "'''Créer la page « [[:$1|$1]] » sur ce wiki !'''",
-'searchhelp-url' => 'Help:Accueil',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Rechercher les pages commençant par ce préfixe]]',
 'searchprofile-articles' => 'Pages de contenu',
 'searchprofile-project' => "Pages d'aide et de projet",
@@ -1440,7 +1478,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.',
-'search-error' => 'Une erreur s’est produite en recherchant : $1',
+'search-error' => "Une erreur s'est produite en recherchant : $1",
 
 # Preferences page
 'preferences' => 'Préférences',
@@ -1519,7 +1557,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 :",
@@ -1572,10 +1610,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.",
@@ -1583,6 +1621,8 @@ 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.',
+'userrights-removed-self' => 'Vous avez bien supprimé vos propres droits. Du coup, vous ne pouvez plus accéder à cette page.',
 
 # Groups
 'group' => 'Groupe :',
@@ -1653,6 +1693,10 @@ Elle ne doit pas dépasser $1 caractère{{PLURAL:$1||s}}.',
 'right-editusercssjs' => "Modifier les fichiers CSS et JavaScript d'autres utilisateurs",
 'right-editusercss' => "Modifier les fichiers CSS d'autres utilisateurs",
 'right-edituserjs' => "Modifier les fichiers JavaScript d'autres utilisateurs",
+'right-editmyusercss' => 'Modifier vos propres fichiers CSS utilisateur',
+'right-editmyuserjs' => 'Modifier vos propres fichiers JavaScript utilisateur',
+'right-viewmywatchlist' => 'Afficher votre propre liste de suivi',
+'right-editmywatchlist' => 'Modifier votre propre liste de suivi. Remarquez que certaines actions ajouteront encore des pages sans ce droit.',
 'right-rollback' => "Révoquer rapidement les modifications du dernier contributeur d'une page particulière",
 'right-markbotedits' => 'Marquer des modifications révoquées comme ayant été faites par un robot.',
 'right-noratelimit' => 'Ne pas être affecté par les limites de taux',
@@ -1714,6 +1758,8 @@ Elle ne doit pas dépasser $1 caractère{{PLURAL:$1||s}}.',
 'action-userrights-interwiki' => "modifier les droits des utilisateurs sur d'autres wikis",
 'action-siteadmin' => 'verrouiller ou déverrouiller la base de données',
 'action-sendemail' => 'envoyer des courriels',
+'action-editmywatchlist' => 'modifier votre liste de suivi',
+'action-viewmywatchlist' => 'afficher votre liste de suivi',
 
 # Recent changes
 'nchanges' => '$1 modification{{PLURAL:$1||s}}',
@@ -1767,7 +1813,7 @@ Elle ne doit pas dépasser $1 caractère{{PLURAL:$1||s}}.',
 'reuploaddesc' => "Annuler et retourner au formulaire d'import",
 'upload-tryagain' => 'Envoyer la description du fichier modifiée',
 'uploadnologin' => 'Non connecté(e)',
-'uploadnologintext' => 'Vous devez être [[Special:UserLogin|connecté(e)]] pour importer des fichiers sur le serveur.',
+'uploadnologintext' => 'Vous devez $1 pour importer des fichiers.',
 'upload_directory_missing' => "Le répertoire d'import de fichier ($1) est introuvable et n'a pas pu être créé par le serveur web.",
 'upload_directory_read_only' => "Le répertoire d'import de fichier ($1) n'est pas accessible en écriture depuis le serveur web.",
 'uploaderror' => "Erreur lors de l'import",
@@ -1992,7 +2038,7 @@ 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é.',
@@ -2204,8 +2250,8 @@ Les entrées <del>barrées</del> ont été résolues.',
 'wantedpages' => 'Pages les plus demandées',
 'wantedpages-badtitle' => 'Titre invalide dans les résultats : $1',
 'wantedfiles' => 'Fichiers les plus demandés',
-'wantedfiletext-cat' => "Les fichiers suivants sont utilisés, mais n'existent pas. Les fichiers d'autres dépôts peuvent être listés malgré qu'ils existent. Tous ces faux positifs seront <del>barrés</del>. En outre, les pages qui intègrent des fichiers qui n'existent pas sont répertoriées dans [[:$1]].",
-'wantedfiletext-nocat' => "Les fichiers suivants sont utilisés, mais n'existent pas. Les fichiers d'autres dépôts peuvent être listés malgré qu'ils existent. Tous ces faux positifs seront <del>barrés</del>.",
+'wantedfiletext-cat' => "Les fichiers suivants sont utilisés, mais n'existent pas localement. S'ils se trouvent sur un dépôt partagé, ils peuvent être listés ici, bien qu'ils soient, de fait, déjà disponibles. Tous ces faux positifs seront <del>barrés</del>. En outre, les pages qui intègrent des fichiers qui n'existent pas sont répertoriées dans [[:$1]].",
+'wantedfiletext-nocat' => "Les fichiers suivants sont utilisés, mais n'existent pas localement. S'ils se trouvent sur un dépôt partagé, ils peuvent être listés ici, bien qu'ils soient, de fait, déjà disponibles. Tous ces faux positifs seront <del>barrés</del>.",
 'wantedtemplates' => 'Modèles demandés',
 'mostlinked' => 'Pages les plus liées',
 'mostlinkedcategories' => 'Catégories les plus utilisées',
@@ -2323,6 +2369,15 @@ Ils nécessitent au moins un domaine de niveau supérieur, par exemple « *.org
 'listusers-noresult' => 'Aucun utilisateur trouvé. Vérifiez aussi les variantes de casse.',
 'listusers-blocked' => '(bloqué{{GENDER:$1||e|(e)}})',
 
+# Special:ActiveUsers
+'activeusers' => 'Liste des utilisateurs actifs',
+'activeusers-intro' => 'Ceci est une liste des utilisateurs qui ont exercé une quelconque activité au cours {{PLURAL:$1|de la dernière journée|des $1 derniers jours}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|action|actions}} lors {{PLURAL:$3|du dernier jour|des $3 derniers jours}}',
+'activeusers-from' => 'Afficher les utilisateurs depuis :',
+'activeusers-hidebots' => 'Masquer les robots',
+'activeusers-hidesysops' => 'Masquer les administrateurs',
+'activeusers-noresult' => 'Aucun utilisateur trouvé.',
+
 # Special:ListGroupRights
 'listgrouprights' => "Droits des groupes d'utilisateurs",
 'listgrouprights-summary' => "Cette page contient une liste des groupes définis sur ce wiki ainsi que les droits d'accès qui leur sont associés.
@@ -2400,8 +2455,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}}.',
@@ -2655,7 +2710,7 @@ $1',
 'mycontris' => 'Contributions',
 'contribsub2' => 'Pour $1 ($2)',
 'nocontribs' => "Aucune modification correspondant à ces critères n'a été trouvée.",
-'uctop' => '(dernière)',
+'uctop' => '(actuel)',
 'month' => 'À partir du mois (et précédents) :',
 'year' => "À partir de l'année (et précédentes) :",
 
@@ -2728,7 +2783,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',
@@ -2975,6 +3030,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',
@@ -2996,7 +3053,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]].
@@ -3030,12 +3087,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',
@@ -3049,7 +3106,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.',
@@ -3120,10 +3177,10 @@ Vous pouvez toutefois en visualiser la source.',
 'tooltip-watchlistedit-normal-submit' => 'Enlever les titres',
 'tooltip-watchlistedit-raw-submit' => 'Mise à jour de la liste de suivi',
 'tooltip-recreate' => 'Recréer la page même si celle-ci a été effacée',
-'tooltip-upload' => 'Démarrer l’import',
+'tooltip-upload' => "Démarrer l'import",
 'tooltip-rollback' => '« Révoquer » annule en un clic la ou les modification(s) de cette page par son dernier contributeur.',
-'tooltip-undo' => '« Défaire » révoque cette modification et ouvre la fenêtre de modification en mode prévisualisation.
-Permet de rétablir la version précédente et d’ajouter un motif dans la boîte de résumé.',
+'tooltip-undo' => "« Défaire » révoque cette modification et ouvre la fenêtre de modification en mode prévisualisation.
+Permet de rétablir la version précédente et d'ajouter un motif dans la boîte de résumé.",
 'tooltip-preferences-save' => 'Sauvegarder les préférences',
 'tooltip-summary' => 'Entrez un bref résumé',
 
@@ -3134,7 +3191,6 @@ Permet de rétablir la version précédente et d’ajouter un motif dans la boî
 '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. */',
@@ -3169,7 +3225,7 @@ Permet de rétablir la version précédente et d’ajouter un motif dans la boî
 
 # Spam protection
 'spamprotectiontitle' => 'Filtre de protection anti-pollution',
-'spamprotectiontext' => "La page que vous avez voulu sauvegarder a été bloquée par le filtre anti-pollution. Ceci est probablement dû à l'introduction d'un lien vers un site externe apparaissant sur la liste noire. Cette dernière utilise les expressions rationnelles suivantes :",
+'spamprotectiontext' => "La page que vous avez voulu sauvegarder a été bloquée par le filtre anti-pollution. Ceci est probablement dû à l'introduction d'un lien vers un site externe apparaissant sur la liste noire.",
 'spamprotectionmatch' => "La chaîne de caractères « '''$1''' » a déclenché le détecteur de spam.",
 'spambot_username' => 'Nettoyage de spams par MediaWiki',
 'spam_reverting' => 'Rétablissement de la dernière version ne contenant pas de lien vers $1',
@@ -3269,7 +3325,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',
@@ -3281,10 +3337,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',
@@ -3304,11 +3360,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 :
 
@@ -3336,7 +3406,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',
@@ -3514,7 +3584,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',
@@ -4010,12 +4080,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',
@@ -4049,7 +4124,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>
@@ -4108,6 +4183,7 @@ Les images sont montrées dans leur pleine résolution, les autres fichiers sont
 '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',
@@ -4117,7 +4193,7 @@ 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-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',
@@ -4127,10 +4203,10 @@ Les images sont montrées dans leur pleine résolution, les autres fichiers sont
 '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 {{GENDER:$2|a déplacé}} la page $3 vers $4',
@@ -4157,7 +4233,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]".',
@@ -4201,7 +4277,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 »',
@@ -4223,6 +4299,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 0b0f09a..3584d6c 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',
@@ -551,7 +550,6 @@ $1',
 'disclaimers' => 'Semonces',
 'disclaimerpage' => 'Project:Semonces g·ènèrales',
 'edithelp' => 'Éde',
-'edithelppage' => 'Help:Coment changiér na pâge',
 'helppage' => 'Help:Somèro',
 'mainpage' => 'Reçua',
 'mainpage-description' => 'Reçua',
@@ -852,10 +850,8 @@ Pôt-étre vos éd ja changiê voutron contresegno avouéc reusséta ou ben dema
 
 # Special:PasswordReset
 'passwordreset' => 'Remês’a zérô du contresegno',
-'passwordreset-text' => 'Rempléd ceti formulèro por rebetar a zérô voutron contresegno.',
 'passwordreset-legend' => 'Rebetar a zérô lo contresegno',
 'passwordreset-disabled' => 'La remês’a zérô des contresegnos est étâye dèsactivâye sur ceti vouiqui.',
-'passwordreset-pretext' => '{{PLURAL:$1||Buchiéd yona de les piéces de balyês ce-desot}}',
 'passwordreset-username' => 'Nom d’utilisator :',
 'passwordreset-domain' => 'Domêno :',
 'passwordreset-capture' => 'Est-o que vos voléd vêre lo mèssâjo que rèsulte ?',
@@ -1114,6 +1110,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',
@@ -1358,7 +1356,6 @@ Vos pouede trovar més de dètalys sur lo [{{fullurl:{{#Special:Log}}/delete|pag
 'searchmenu-legend' => 'Chouèx de rechèrche',
 'searchmenu-exists' => "'''Y at na pâge apelâye « [[:$1]] » sur ceti vouiqui.'''",
 'searchmenu-new' => "'''Fâre la pâge « [[:$1|$1]] » sur ceti vouiqui !'''",
-'searchhelp-url' => 'Help:Somèro',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Fâre dèfelar les pâges que començont per ceti prèfixo]]',
 'searchprofile-articles' => 'Pâges de contegnu',
 'searchprofile-project' => 'Pâges d’éde et pâges projèt',
@@ -1403,15 +1400,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 +1968,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>
@@ -2311,6 +2298,15 @@ Ils ant fôta de por lo muens un domêno de nivél de dessus, per ègzemplo « *
 'listusers-noresult' => 'Nion utilisator trovâ.',
 'listusers-blocked' => '(blocâ{{GENDER:$1||ye|(ye)}})',
 
+# Special:ActiveUsers
+'activeusers' => 'Lista des utilisators actifs',
+'activeusers-intro' => 'O est na lista des utilisators qu’ant ègzèrciê un’activitât la quinta que seye pendent {{PLURAL:$1|lo jorn passâ|los $1 jorns passâs}}.',
+'activeusers-count' => '$1 accion{{PLURAL:$1||s}} pendent {{PLURAL:$3|lo jorn passâ|los $3 jorns passâs}}',
+'activeusers-from' => 'Fâre vêre los utilisators dês :',
+'activeusers-hidebots' => 'Cachiér los robots',
+'activeusers-hidesysops' => 'Cachiér los administrators',
+'activeusers-noresult' => 'Nion utilisator trovâ.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Drêts de les tropes d’utilisators',
 'listgrouprights-summary' => 'Vê-que na lista de les tropes d’utilisators dèfenies sur ceti vouiqui et pués los sins drêts d’accès.
@@ -2389,8 +2385,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}}.',
@@ -3124,17 +3120,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. */',
@@ -3143,13 +3133,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. */',
@@ -3220,13 +3205,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',
 
@@ -3334,7 +3314,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',
@@ -3512,7 +3492,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',
@@ -4005,13 +3985,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 81b35f8..ef1b082 100644 (file)
@@ -7,6 +7,8 @@
  * @ingroup Language
  * @file
  *
+ * @author Geitost
+ * @author Inkowik
  * @author Maartenvdbent
  * @author Merlissimo
  * @author Murma174
@@ -19,60 +21,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-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-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' => "Ütjwidjet uunwisin faan a ''Leetst feranrangen'' an bi a sidjen, diar dü ''Uun't uug behual'' wel (brükt JavaScript)",
+'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 feranrangen üüb min brüker-diskusjuunssidj en e-mail schüü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-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',
+'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' => 'Åltens',
-'underline-never' => 'uler',
+'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',
@@ -125,124 +127,137 @@ $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-delete' => 'Strike',
-'vector-action-move' => 'Ferschüwe',
-'vector-action-protect' => 'Sääkere',
-'vector-action-undelete' => 'Wi mååge',
-'vector-action-unprotect' => 'Frijeewe unti späre',
-'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-action-addsection' => 'Nei kirew began',
+'vector-action-delete' => 'Strik',
+'vector-action-move' => 'Fersküüw',
+'vector-action-protect' => 'Seekre',
+'vector-action-undelete' => 'Weder iinstel',
+'vector-action-unprotect' => 'Sidjenseekerhaid',
+'vector-simplesearch-preference' => 'Ianfacher schüklist iinstel (bluas bi Vector)',
+'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',
-'namespaces' => 'Noomerüme',
-'variants' => 'Fariante',
+'vector-view-viewsource' => 'Kweltekst uunluke',
+'actions' => 'Aktjuunen',
+'namespaces' => 'Nöömrümer',
+'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',
-'protect' => 'Sääkere',
-'protect_change' => 'änre',
-'protectthispage' => 'Sid önj ferbading hüülje',
-'unprotect' => 'Frijeewe unti späre',
+'edit' => 'Bewerke',
+'create' => 'Maage',
+'editthispage' => 'Sidj bewerke',
+'create-this-page' => 'Nei sidj maage',
+'delete' => 'Strik',
+'deletethispage' => 'Detdiar sidj strik',
+'undeletethispage' => 'Detdiar stregen sidj turaghaale',
+'undelete_short' => '{{PLURAL:$1|1 werjuun|$1 werjuunen}} weder iinstel',
+'viewdeleted_short' => '{{PLURAL:$1|Ian stregen werjuun|$1 stregen werjuunen}} uunluke',
+'protect' => 'Seekre',
+'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",
@@ -250,168 +265,171 @@ $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",
+'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',
-'toc' => 'Inhåltsfertiiknis',
+'editold' => 'Bewerke',
+'viewsourceold' => 'kweltekst uunwise',
+'editlink' => 'bewerke',
+'viewsourcelink' => 'kweltekst uunwise',
+'editsectionhint' => 'Kirew bewerke: $1',
+'toc' => 'Auersicht',
 'showtoc' => 'Wise',
-'hidetoc' => 'Ferbärje',
+'hidetoc' => 'Fersteeg',
 '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}}',
+'collapsible-expand' => 'Wise',
+'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',
-'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)',
-'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',
-'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.',
-'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',
-'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.',
+'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 tekst för „$1“ $2 as ei fünjen wurden uun't dootenbeenk.
+
+Ferlicht as det sidj stregen of fersköwen wurden.
+
+Wan't det ei as, do heest dü ferlicht en feeler uun't software fünjen. Wees so gud an skriiw det tu en [[Special:ListUsers/sysop|administraator]] an fertel ham, am hün URL det gongt.",
+'missingarticle-rev' => '(Werjuunsnumer: $1)',
+'missingarticle-diff' => '(Ferskeel tesken $1 an $2)',
+'readonly_lag' => 'Det dootenbeenk as speret wurden, amdat jo ferdiald dootenbeenken (slaves) jo mä di hoodserver (master) ufglik kön.',
+'internalerror' => 'Süsteemfeeler',
+'internalerror_info' => 'Süsteemfeeler: $1',
+'fileappenderrorread' => '"$1" küd ei leesen wurd, auer diar jüst üüb skrewen woort.',
+'fileappenderror' => '"$1" küd ei bi "$2" bihinget wurd.',
+'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' => 'Det fertiaknis "$1" küd ei iinracht wurd.',
+'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' => 'Mä di wäärs stemet wat ei: "$1"="$2".',
+'formerror' => 'Feeler: Di iindrach küd ei ferwerket wurd.',
+'badarticleerror' => 'Son aktjuun koon üüb detdiar sidj ei föörnimen wurd.',
+'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',
-'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.',
-'querypage-no-updates' => "'''Jü aktualisiiringsfunksjoon for jüdeer sid as nütutids deaktiwiird. Da doote wårde tujarst ai fernaierd.'''",
-'wrong_wfQuery_params' => 'Ferkiirde parameetere for wfQuery()<br />
-Funksjoon: $1<br />
-Ouffrååch: $2',
-'viewsource' => 'Kwältäkst önjkiike',
+'delete-hook-aborted' => 'Det striken as faan en software-feranrang faan MediaWiki ferhanert wurden. Di grünj as ei bekäänd.',
+'badtitle' => 'Ferkiard tiitel',
+'badtitletext' => 'Didiar sidjennööm gongt ei. Hi as ferlicht leesag of as en ferkiard ferwisang faan en ööder projekt.',
+'perfcached' => 'Jodiar dooten kem faan a cache an san ferlicht ei muar aktuel. Ei muar üs {{PLURAL:$1|ian resultoot as|$1 resultooten san}} uun a cache.',
+'perfcachedts' => 'Jodiar dooten kem faan a cache, leetst tooch nei: $1. Ei muar üs {{PLURAL:$4|ian resultoot as|$4 resultooten san}} uun a cache.',
+'querypage-no-updates' => 'Dü könst detdiar sidj uun uugenblak ei aktualisiare. A dooten wurd iarst ans ei iinsteld.',
+'wrong_wfQuery_params' => 'Ferkiard dooten för wfQuery()<br />
+Funktjuun: $1<br />
+Uffraag: $2',
+'viewsource' => 'Kweltekst uunluke',
 'viewsource-title' => 'Code faan sidj $1 uunluke',
-'actionthrottled' => 'Aksjoonstål limitiird',
-'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.',
+'actionthrottled' => 'Taal faan aktjuunen limitiaret',
+'actionthrottledtext' => 'Dü heest detdiar aktjuun tufölsis uun en kurten tidjrüm ütjfeerd.
+Wees so gud an ferschük det glik noch ans weder.',
 'protectedpagetext' => 'Detdiar sidj as seekert wurden, am dat diar näämen wat feranert.',
-'viewsourcetext' => 'Dü koost jü kwäle foon jüdeer sid bekiike än kopiire.',
+'viewsourcetext' => 'Dü könst di kweltekst faan det sidj uunluke an ham uk kopiare:',
 'viewyourtext' => "Dü könst di code faan '''din feranrang''' faan detdiar sidj uunluke an kopiare:",
 'protectedinterface' => 'Üüb detdiar sidj stäänt tekst för det software faan detheer wiki an as seekert wurden, am dat näämen diar wat feranert.
 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.',
-'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.',
+'mycustomcssprotected' => 'Dü mutst detdiar CSS-sidj ei bewerke.',
+'mycustomjsprotected' => 'Dü mutst detdiar JavaScript-sidj ei bewerke.',
+'ns-specialprotected' => 'Spezial-sidjen kön ei bewerket wurd.',
+'titleprotected' => 'En sidj mä didiar nööm koon ei uunlaanj wurd.
+Di brüker [[User:$1|$1]] hää det sidj speret, an di grünj as: "\'\'$2\'\'".',
 'filereadonlyerror' => 'Det datei „$1“ koon ei feranert wurd, auer uun det fertiaknis „$2“ bluas leesen wurd koon.
 Di grünj faan di administraator as: „$3“.',
 'invalidtitle-knownnamespace' => 'Ferkiard auerskraft uun di nöömrüm „$2“ an tekst „$3“',
@@ -420,140 +438,175 @@ 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:',
-'yourpasswordagain' => 'Schriw pååsuurd nuch iinjsen:',
-'remembermypassword' => 'Aw diheere komputer foon duur önjmälde (maksimool for $1 {{PLURAL:$1|däi|deege}})',
-'securelogin-stick-https' => 'Eefter önjmälding ma HTTPS ferbünen bliwe',
+'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' => 'Skriiw det paaswurd noch ans weder hen:',
+'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' => "Efter't uunmeldin auer HTTPS ferbünjen bliiw",
 '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',
-'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',
-'nologin' => "Dü hääst niinj brükerkonto? '''$1'''.",
-'nologinlink' => 'Nai brükerkonto inruchte',
-'createaccount' => 'Brükerkonto inruchte',
+'login' => 'Uunmelde',
+'nav-login-createaccount' => 'Melde di uun of skriiw di iin',
+'loginprompt' => "För't uunmeldin tu {{SITENAME}} skel bi dan browser cookies aktiwiaret wees.",
+'userlogin' => 'Melde di uun of skriiw di iin',
+'userloginnocreate' => 'Uunmelde',
+'logout' => 'Ufmelde',
+'userlogout' => 'Ufmelde',
+'notloggedin' => 'Ei uunmeldet',
+'userlogin-noaccount' => 'Dü heest noch nian brükerkonto ?',
+'userlogin-joinproject' => 'Bi {{SITENAME}} mämaage',
+'nologin' => 'Dü heest nian brükerkonto? $1.',
+'nologinlink' => 'Nei brükerkonto iinracht',
+'createaccount' => 'Brükerkonto iinracht',
 'gotaccount' => "Dü hääst ål en brükerkonto? '''$1'''.",
-'gotaccountlink' => 'Ö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',
-'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.',
+'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' => 'Det brükerkonto as iinracht wurden, oober dü beest ei uunmeldet.
+{{SITENAME}} brükt cookies för detdiar aktjuun.
+Wees so gud an aktiwiare jo uun dan browser, an do melde di mä dan nei brükernööm an det nei paaswurd uun.',
+'nocookieslogin' => "{{SITENAME}} brükt cookies för't uunmeldin faan brükern.
+Dü heest cookies deaktiwiaret.
+Wees so gud an aktiwiare jo uun dan browser, an do ferschük det noch ans.",
 'nocookiesfornew' => 'Det brükerkonto as ei iinracht wurden, auer wi ei witj, huar a dooten faan kem.
 Üü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.'''",
-'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".
-Präiw din ruchtschriwing.',
-'nouserspecified' => 'Dü schäät en brükernoome spesifisiire.',
-'login-userblocked' => 'Dideer brüker as spärd. Niinj ferloof tu önjmälding.',
-'wrongpassword' => 'Ferkiird pååsuurd önjjeewen.
-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.',
+'noname' => 'Dü skel en rochten brükernööm uundu.',
+'loginsuccesstitle' => 'Uunmeldin hää loket.',
+'loginsuccess' => "'''Dü beest nü üs „$1“ bi {{SITENAME}} uunmeldet.'''",
+'nosuchuser' => 'Di brükernööm „$1“ jaft at ei. Aachte üüb det skriiwwiis (an uk üüb grat- an letjskriiwang), an do [[Special:UserLogin/signup|melde di nei uun]].',
+'nosuchusershort' => 'Diar as nään brüker mä di nööm "$1".
+Heest dü ham uk rocht skrewen?',
+'nouserspecified' => 'Dü skel en brükernööm uundu.',
+'login-userblocked' => 'Didiar brüker as speret wurden. Hi mut ham ei uunmelde.',
+'wrongpassword' => 'Det paaswurd as ferkiard.
+Wees so gud an ferschük det noch ans.',
+'wrongpasswordempty' => 'Dü heest nian paaswurd iinden.
+Ferschük det man noch ans.',
+'passwordtooshort' => 'Paaswurden skel tumanst {{PLURAL:$1|1 tiaken|$1 tiakens}} lung wees.',
+'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}}',
+'mailmypassword' => 'Schüür mi en nei paaswurd.',
+'passwordremindertitle' => 'Nei tidjwiis paaswurd för {{SITENAME}}',
 'passwordremindertext' => 'En brüker (woorskiinelk dü, faan IP adres $1) hää am en nei paaswurd för {{SITENAME}} ($4) fraaget.
 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".
-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.
-
-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',
-'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.',
-'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).',
+'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 nei tidjwiis paaswurd as tu det e-mail-adres faan di brüker "$1" schüürd wurden.
+Melde di diarmä uun, wan dü det füngen heest. Det ual paaswurd blaft iarst ans bestunen.',
+'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' => 'Diar as en e-mail tu det uunjiwen adres schüürd wurden.
+
+Iar en e-mail faan ööder brükern auer det e-mail-funktjuun uunnimen wurd koon, skal seeker steld wurd, dat det e-mail-adres uk würelk tu di brüker hiart. Wees so gud an befulge jo uunwisangen uun det e-mail, wat dü jüst füngen heest.',
+'throttled-mailpassword' => 'Diar as uun a leetst {{PLURAL:$1|stünj|$1 stünj}} al ans am en nei paaswurd uunfraaget wurden. Am dat diar nään masbrük mä drewen woort, koon bluas {{PLURAL:$1|iansis per stünj|iansis per $1 stünj}} am en nei paaswurd uunfraaget wurd.',
+'mailerror' => 'Fäägel bai dåt siinjen foon e e-mail: $1',
+'acct_creation_throttle_hit' => 'Beschükern faan detheer wiki mä din IP-adres haa di leetst dai {{PLURAL:$1|1 brükerkonto|$1 brükerkontos}} iinracht. Muar san ei tuläät.
+
+Beschükern mä detdiar IP-adres kön daalang nian brükerkontos muar iinracht.',
+'emailauthenticated' => 'Din e-mail-adres as di $2 am a klook $3 gudkäänd wurden.',
+'emailnotauthenticated' => 'Din e-mail-adres as noch ei gudkäänd. Jodiar e-mail-funktjuunen kön iarst brükt wurd, wan det adres gudkäänd wurden as.',
+'noemailprefs' => 'Du en e-mail-adres uun din iinstelangen iin, amdat dü jodiar funktjuunen brük könst.',
+'emailconfirmlink' => 'E-mail-adres gudkään',
 'invalidemailaddress' => 'Jü E-mail adräs wörd ai aksäptiird, ouerdåt jü en üngülti formoot (ewentuäl üngültie tiikne) tu heewen scheent.
 Wees sü gödj än jeef en koräkt adräs önj unti mäág dåt fäalj lääsi.',
 'cannotchangeemail' => 'E-mail-adresen kön uun detheer wiki ei feranert wurd.',
 'emaildisabled' => 'Fann detdiar sidj kön nian E-Mails fersjüürd wurd',
-'accountcreated' => 'Benjüterkonto mååged',
-'accountcreatedtext' => 'Dåt benjüteraccount for $1 as mååged wörden.',
-'createaccount-title' => 'Måågen foon en benjüterkonto for {{SITENAME}}',
-'createaccount-text' => 'Deer wörd for de en benjüterkonto "$2" aw {{SITENAME}} ($4) mååged. Dåt automaatisch generiird pååsuurd for "$2" as "$3".
-Dü schöist de nü önjmälde än dåt pååsuurd änre.
-
-Fåls dåt benjüterkonto üt fersiinj önjläid wörd, koost dü jüdeer tising ignoriire.',
-'usernamehasherror' => 'Benjüternoome mötje niinj rütetiikne önjthüulje',
-'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',
-'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.',
+'accountcreated' => 'Brükerkonto as iinracht wurden',
+'accountcreatedtext' => 'Det brükerkonto för [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) as iinracht wurden.',
+'createaccount-title' => 'En brükerkonto üüb {{SITENAME}} iinracht',
+'createaccount-text' => 'Diar as mä din e-mail adres för di en brükerkonto "$2" üüb {{SITENAME}} ($4) maaget wurden. För "$2" as automaatisk det paaswurd "$3" iinracht wurden.
+Dü skulst di nü uunmelde an det paaswurd anre.
+
+Wan det brükerkonto ütj fersen uunlaanj wurden as, säärst dü niks widjer onernem.',
+'usernamehasherror' => 'Uun brükernöömer mut nian rütjen föörkem.',
+'login-throttled' => 'Dü heest tufölsis fersoocht, di uuntumeldin.
+Wees so gud an teew en uugenblak, iar dü det noch ans ferschükst.',
+'login-abort-generic' => 'Det uunmeldin hää ei loket - Ufbreegen',
+'loginlanguagelabel' => 'Spriak: $1',
+'suspicious-userlogout' => 'Din ufmeldang as ei föörnimen wurden, auer det uunfraag ferlicht faan en uunstakenen browser of faan en cache-proxy kaam.',
 
 # Email sending
 'php-mail-error-unknown' => 'Ünbekäänd feeler mä det funktsjuun mail() faan PHP.',
-'user-mail-no-addy' => 'Köö niinj e-mail schake suner e-mail-adres.',
+'user-mail-no-addy' => 'Küd nian e-mail schüür saner e-mail-adres.',
 'user-mail-no-body' => 'Dü wulst en e-mail saner tekst wechsjüür.',
 
 # Change password dialog
-'resetpass' => 'Pååsuurd änre',
-'resetpass_announce' => 'Önjmälding ma di ouer E-mail tusånde kode. Am e önjmälding ouftusliten, möist dü en nai pååsuurd kiise.',
-'resetpass_header' => 'Account pååsuurd änre',
-'oldpassword' => 'Üülj pååsuurd:',
-'newpassword' => 'Nai pååsuurd:',
-'retypenew' => 'Tip nai pååsuurd nuch iinjsen:',
-'resetpass_submit' => 'Seet pååsuurd än mäld önj',
-'resetpass_success' => 'Din pååsuurd as ma resultoot änred!
-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-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' => 'Paaswurd feranre',
+'resetpass_announce' => 'Dü heest di mä di code uunmeldet, di dü per e-mail tuschüürd füngen heest.
+Am det uunmeldin uftuslütjen, skel dü en nei paaswurd iindu.',
+'resetpass_header' => 'Paaswurd feranre',
+'oldpassword' => 'Ual paaswurd:',
+'newpassword' => 'Nei paaswurd:',
+'retypenew' => 'Skriiw det paaswurd noch ans weder hen:',
+'resetpass_submit' => 'Paaswurd saat an uunmelde',
+'resetpass_success' => 'Din paaswurd as feranert wurden!
+Dü woorst nü uunmeldet ...',
+'resetpass_forbidden' => 'Det paaswurd koon ei feranert wurd.',
+'resetpass-no-info' => 'Dü skel di uunmelde, am üüb det sidj tutugripen.',
+'resetpass-submit-loggedin' => 'Paaswurd feranre',
+'resetpass-submit-cancel' => 'Ufbreeg',
+'resetpass-wrong-oldpass' => 'Detdiar paaswurd docht niks.
+Ferlicht heest dü jüst din paaswurd feranert
+of am en nei paaswurd uunfraaget.',
+'resetpass-temp-password' => 'Tidjwiis paaswurd:',
+'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-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' => 'Paaswurd turagsaat',
+'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' => 'Paaswurd turagsaat',
+'passwordreset-disabled' => 'Dü könst din paaswurd uun detdiar wiki ei turagsaat.',
+'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?',
@@ -575,7 +628,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',
@@ -590,43 +643,43 @@ Tidwis paasuurd: $2',
 'changeemail-cancel' => 'Ufbreeg',
 
 # Edit page toolbar
-'bold_sample' => 'FÃ¥ten täkst',
-'bold_tip' => 'FÃ¥ten täkst',
-'italic_sample' => 'Kursiiwen täkst',
-'italic_tip' => 'Kursiiwen täkst',
-'link_sample' => 'Link-täkst',
-'link_tip' => 'Intärnen link',
-'extlink_sample' => 'http://www.example.com link-täkst',
-'extlink_tip' => 'Äkstärnen link (http:// beåchte)',
-'headline_sample' => 'Schuchte 2 ouerschraft',
-'headline_tip' => 'Schuchte 2 ouerschraft',
-'nowiki_sample' => 'Ünformatiirden täkst heer önjfäige',
-'nowiki_tip' => 'Ünformatiirden täkst',
-'image_tip' => 'Dååtäilink',
-'media_tip' => 'Meediendååtäi-link',
-'sig_tip' => 'Din signatuur ma tidståmp',
-'hr_tip' => 'Horizontool liinje (spårsoom ferwiinje)',
+'bold_sample' => 'Fäät buksteewen',
+'bold_tip' => 'Fäät buksteewen',
+'italic_sample' => 'Kursiif buksteewen',
+'italic_tip' => 'Kursiif buksteewen',
+'link_sample' => 'Link-tekst',
+'link_tip' => 'Intern ferwisang',
+'extlink_sample' => 'http://www.example.com link-tekst',
+'extlink_tip' => 'Ekstern ferwisang (seenk am http:// prefix)',
+'headline_sample' => 'Auerskraft (grate 2)',
+'headline_tip' => 'Auerskraft (grate 2)',
+'nowiki_sample' => 'Ünformatiaret tekst diar tusaat.',
+'nowiki_tip' => 'Ünformatiaret tekst',
+'image_tip' => 'Iinbünjen datei',
+'media_tip' => 'Meediendatei-link',
+'sig_tip' => 'Din onerskraft mä tidjstempel',
+'hr_tip' => 'Horisontaal streg (ei auerdriiw diarmä)',
 
 # Edit pages
-'summary' => 'Tuhuupefooting:',
-'subject' => 'Bedrååwet:',
-'minoredit' => 'Bloot kleenihäide wörden feränred',
-'watchthis' => 'Kiike eefter jüdeer sid',
+'summary' => 'Tuupfaadet:',
+'subject' => 'Auerskraft:',
+'minoredit' => 'Det as man en letj feranrang',
+'watchthis' => "Detdiar sidj uun't uug behual",
 'savearticle' => 'Sidj seekre',
 'preview' => 'Iarst ans luke',
 'showpreview' => 'Iarst ans luke',
 'showlivepreview' => 'Glik uunluke',
 'showdiff' => 'Feranrangen wise',
-'anoneditwarning' => "Dü beårbest jüdeer sid ünönjmälded. Wan dü spikerst, wård din aktuäle IP-adräs önj e fesjoonshistoori aptiikned än as deerma for åltens '''ålgemiin''' sichtboor.",
-'anonpreviewwarning' => "''Dü bast ai önjmälded. Bai t spiikern wårt din IP-adräs önj e fersjoonshistoori awtiikned.''",
-'missingsummary' => "'''Haanewising:\"' Dü heest niinj tuhuupefooting önjjääwen.
-Wan dü wider aw \"Sid spiikre\" klikst, wårt din änring suner tuhuupefooting ouernümen.",
-'missingcommenttext' => 'Jeew en tuhuupefooting önj.',
-'missingcommentheader' => "'''PÅÅS AW:''' dü heest niinj keer/ouerschraft önjjääwen.
-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',
+'anoneditwarning' => "'''Paase üüb:''' Dü bewerkest detdiar sidj anonüüm. Wan dü det seekerst, woort din aktuel IP-adres uun a ferluup aptiakent, an as diarmä '''för arken''' iintusen.",
+'anonpreviewwarning' => '"Dü beest ei uunmeldet. Bi\'t seekrin woort din IP-adres uun a ferluup faan werjuunen aptiakent."',
+'missingsummary' => "'''Paase üüb:''' Dü heest det ei tuupfaadet.
+Wan dü det sidj seekerst, woort det saner en kurtfaadet beskriiwang auernimen.",
+'missingcommenttext' => 'Faade det oner tuup.',
+'missingcommentheader' => "'''Paase üüb:''' Dü heest nian auerskraft uunden.
+Wan dü det sidj seekerst, woort det saner auerskraft auernimen.",
+'summary-preview' => 'Föörskau faan det tuupfaadang:',
+'subject-preview' => 'Föörskau faan det auerskraft:',
+'blockedtitle' => 'Brüker as speret',
 'blockedtext' => "'''Dan brükernööm of IP adres as speret wurden.'''
 
 Det as maaget wurden faan $1.
@@ -657,61 +710,62 @@ 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.',
-'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.',
-'accmailtitle' => 'Pååsuurd sånd.',
-'accmailtext' => "En tufäli generiird pååsuurd for [[User talk:$1|$1]] wörd tu $2 fersånd.
-
-Dåt pååsuurd for jüdeer nai benjüterkonto koon aw e spetsjoolsid ''[[Special:ChangePassword|Pååsuurd änre]]'' änred wårde.",
-'newarticle' => '(Nai)',
-'newarticletext' => "Dü bast en link tu en sid fülied, jü nuch ai bestoont.
-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.",
+'blockednoreason' => 'nään grünj uunden',
+'whitelistedittext' => 'Dü skel di $1, am sidjen tu bewerkin.',
+'confirmedittext' => 'Dü skel iarst din e-mail-adres gudkään, iar dü began könst tu werkin. Maage det üüb det sidj mä din persöönelk [[Special:Preferences|iinstelangen]].',
+'nosuchsectiontitle' => 'Kirew ei fünjen',
+'nosuchsectiontext' => "Dü wulst en kirew feranre, diar't goorei jaft.
+Ferlicht as det stregen of fersköwen wurden, jüst üs dü det sidj bewerke wulst.",
+'loginreqtitle' => 'Dü skel di uunmelde.',
+'loginreqlink' => 'Uunmelde',
+'loginreqpagetext' => 'Dü skel di $1, am ööder sidjen uuntulukin.',
+'accmailtitle' => 'Paaswurd as ferschüürd wurden.',
+'accmailtext' => "En tufelag iinracht paaswurd för [[User talk:$1|$1]] as tu $2 ferschüürd wurden.
+
+Det paaswurd för det nei brükerkonto koon üüb det spezial-sidj ''[[Special:ChangePassword|Paaswurd anre]]'' feranert wurd.",
+'newarticle' => '(Nei)',
+'newarticletext' => "Dü beest en ferwisang tu en sidj fulagt, diar't noch ei jaft.
+Am det sidj iinturachten, skriiw dan tekst uun det fial för't bewerkin iin.
+Üüb det [[{{MediaWiki:Helppage}}|halepsidj]] fanjst dü halep.
+Wan dü ütj fersen heer beest, trak ianfach üüb di '''turag'''-knoop faan dan browser.",
 'anontalkpagetext' => "----''Üüb detheer sidj könst dü en ünbekäänden brüker en nooracht du. Det lääpt auer sin IP adres. IP adresen kön faan flook brükern brükt wurd. Wan dü mä detheer nooracht niks began könst, do as det ferlicht för hoker ööders mend weesen. Dü säärst niks widjer onernem. Wan dü en aanj [[Special: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.
 Dü könst det uun\'t [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} logbuk faan stregen sidjen] efterlees.',
 'userpage-userdoesnotexist' => "Det brükerkonto ''$1'' as ei diar.
 Wel dü detdiar sidj würelk maage/bewerke?",
-'userpage-userdoesnotexist-view' => 'Benjüterkonto "$1" bestoont ai.',
-'blocked-notice-logextract' => 'Dideer benjüter as tutids spärd.
-For informasjoon füliet di leeste üttooch üt dåt benjüterspär-logbök:',
+'userpage-userdoesnotexist-view' => 'Son brükerkonto "$1" jaft at ei.',
+'blocked-notice-logextract' => "Didiar brüker as speret. Det stäänt uun't sper-logbuk:",
 'clearyourcache' => "'''Beaachte:''' Maage di cache faan dan browser leesag, wan dü a feranrangen sä wel.
 * '''Firefox / Safari:''' Hual ''Shift'' bi't aktualisiarin, of trak ''Strg an F5'' of ''Strg an R'' (''⌘an R'' üüb en Mac)
 * '''Google Chrome:''' Trak ''Strg an Shift an R'' (''⌘an Shift an R'' üüb en Mac)
 * '''Internet Explorer:''' Hual ''Strg'' bi't aktualisiarin, of trak ''Strg an F5''
 * '''Opera:''' ''Extras - Internetspuren löschen - Individuelle Auswahl - Den kompletten Cache löschen''",
-'usercssyoucanpreview' => "'''Tip:''' Brük di „{{int:showpreview}}“-knoop, am din nai CSS for dåt spiikern tu tästen.",
-'userjsyoucanpreview' => "'''Tip:''' Brük di „{{int:showpreview}}“-knoop, am din nai JavaScript for dåt spiikern tu tästen.",
-'usercsspreview' => "'''Påås aw dåt dü bloot din brüker CSS forbekiikest.'''
-'''Dåt as nuch ai spiikerd!'''",
-'userjspreview' => "'''Påås aw dåt dü bloot din brüker JavaScript präiwest/forbekiikest.'''
-'''Dåt as nuch ai spiikerd!'''",
+'usercssyoucanpreview' => "'''Tip:''' Brük di „{{int:showpreview}}“-knoop, am din nei CSS föör det seekrin tu testin.",
+'userjsyoucanpreview' => "'''Tip:''' Brük di „{{int:showpreview}}“-knoop, am din nei JavaScript föör det seekrin tu testin.",
+'usercsspreview' => "'''Seenk diaram, dat det bluas en föörskau faan din CSS as.'''
+'''Det as noch ei seekert wurden!'''",
+'userjspreview' => "'''Seenk diaram, dat det bluas en föörskau faan din JavaScript as.'''
+'''Det as noch ei seekert wurden!'''",
 'sitecsspreview' => "'''Påås aw dåt dü jüdeer CSS bloot forbekiikest.'''
 '''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''.",
-'updated' => '(Änred)',
-'note' => "'''Påås aw:'''",
+'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' => '(Feranert)',
+'note' => "'''Paase üüb:'''",
 'previewnote' => "'''Heer könst dü sä, hü det sidj wurd skal.'''
 Det sidj as oober noch ei seekert!",
 'continue-editing' => "Gung tu't fial för't bewerkin",
-'previewconflict' => 'Dideer forbekiik jeeft di inhålt foon dåt boowerst takstfälj wider. Sü wårt jü sid ütsiinj, wan dü nü spiikerst.',
+'previewconflict' => 'Detdiar föörskau wiset di boowenst dial faan dan tekst. So schocht hi ütj, wan dü ham nü seekerst.',
 'session_fail_preview' => "'''Din werk küd ei ufseekert wurd, diar as wat skiaf gingen.'''
 Fersjük det man noch ans an trak do üüb ''Sid spiikre''.
 Wan't do imer noch ei loket, [[Special:UserLogout|melde di uf]] an weder uun.",
@@ -726,33 +780,34 @@ 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)',
-'editconflict' => 'Beårbingskonflikt: $1',
+'editingsection' => 'Bewerke $1 (kirew)',
+'editingcomment' => 'Bewerke $1 (nei kirew)',
+'editconflict' => "Konflikt bi't bewerkin (BK): $1",
 'explainconflict' => "Hoker ööders hää detheer sidj feranert, üs dü jüst diarmä uun a gang wiarst.
 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.)
 
 '''Auerdreeg nään frääm teksten an bilen saner ferloof!'''",
 'longpageerror' => "'''Error: Dan tekst as {{PLURAL:$1|ian kilobyte|$1 kilobytes}} lung, hi mut oober ei linger wees üs {{PLURAL:$2|ian kilobyte|$2 kilobytes}}.'''Hi koon ei ufspiikerd wurd.",
-'readonlywarning' => "'''PÅÅS AW: Jü dootenbånk wörd for unerhult spärd, sü dåt din änringe tutids ai spiikerd wårde koone.
-Wees sü gödj än sääkre di täkst lokool aw din kompjuuter än fersäk tun lääsern tidpunkt, da änringe tu ouerdreegen.'''.
+'readonlywarning' => "'''Paase üüb: Dü könst uun uugenblak ei üüb det dootenbeenk tugrip. Din dooten kön ei seekert wurd.''' Wees so gud an seekre dan tekst iarst ans üüb dan reegner, an ferschük leederhen, ham tu auerdreegen.
 
-Grün for jü späre: $1",
+Grünj för det sperin: $1",
 'protectedpagewarning' => "'''Paase üüb: Detdiar sidj as speret wurden. Bluas administratooren kön det bewerke.'''
 Uun't logbuk stäänt muar diartu:",
 'semiprotectedpagewarning' => "'''Paase üüb: Detdiar sidj as dialwiis tu't bewerkin speret wurden. Bluas gudkäänd brükern kön det bewerke.'''
@@ -760,33 +815,32 @@ Uun't logbuk stäänt muar diartu:",
 'cascadeprotectedwarning' => "'''Paase üüb:''' Detdiar sidj koon bluas faan administratooren bewerket wurd. Hat as uun {{PLURAL:$1|detdiar ööder sidj|jodiar ööder sidjen}} iinbünjen, diar troch en kaskaaden-optsjuun seekert {{PLURAL:$1|as|san}}:",
 '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:',
-'templatesusedsection' => '{{PLURAL:$1|Jü füliend forlååg wårt|Da füliende forlååge wårde}} foon dideer oufsnaas ferwånd:',
+'templatesused' => '{{PLURAL:$1|Detdiar föörlaag woort|Jodiar föörlaagen wurd}} üüb detdiar sidj brükt:',
+'templatesusedpreview' => '{{PLURAL:$1|Detdiar föörlaag woort|Jodiar föörlaagen wurd}} uun detdiar sidjenföörskau brükt:',
+'templatesusedsection' => '{{PLURAL:$1|Detdiar föörlaag woort|Jodiar föörlaagen wurd}} uun didiar kirew brükt:',
 '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.',
-'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}}:',
+'hiddencategories' => 'Detdiar sidj hiart tu {{PLURAL:$1|1 ferbürgen kategorii|$1 ferbürgen kategoriin}}:',
+'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' => 'Det bewerkin faan enkelt kirwer as ei mögelk.',
+'sectioneditnotsupported-text' => 'Det bewerkin faan enkelt kirwer gongt üüb detdiar sidj ei.',
+'permissionserrors' => 'Brükerrochten ling ei',
+'permissionserrorstext' => 'Dü heest diar ei a brükerrochten för. {{PLURAL:$1|Grünj|Grünjer}}:',
+'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',
-'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.',
-'edit-already-exists' => 'Köö niinj nai sid mååge.
-Dåt bestöö ål.',
+'moveddeleted-notice' => "Detdiar sidj as stregen wurden.
+Uun't strik- an fersküüw-logbuk oner stäänt muar diartu.",
+'log-fulllog' => 'Logbuk-iindracher uunluke',
+'edit-hook-aborted' => "Det bewerkin as faan't software ufbreegen wurden. Di grünj as ei bekäänd.",
+'edit-gone-missing' => 'Detdiar sidj küd ei aktualisiaret wurd. Ferlicht as det stregen wurden.',
+'edit-conflict' => "Konflikt bi't bewerkin (BK).",
+'edit-no-change' => 'Din feranrang woort ei seekert, auer dü di tekst ei feranert heest.',
+'postedit-confirmation' => 'Din feranrang as seekert wurden.',
+'edit-already-exists' => 'Det nei sidj küd ei iinracht wurd. Son sidj as al diar.',
 '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',
@@ -801,17 +855,17 @@ Dåt bestöö ål.',
 'content-model-css' => 'CSS',
 
 # Parser/template warnings
-'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',
-'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-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',
-'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)',
+'expensive-parserfunction-warning' => "'''Paase üüb:''' Detdiar sidj brükt tuföl widjloftag server-funktjuunen.
+
+Diar mut ei muar üs {{PLURAL:$2|1|$2}} brükt wurd. Nü {{PLURAL:$1|woort diar 1|wurd diar $1}} brükt.",
+'expensive-parserfunction-category' => 'Sidjen mä tuföl parser-funktjuunen.',
+'post-expand-template-inclusion-warning' => "'''Paase üüb:''' Enkelt föörlaagen san tu grat, jo kön ei uun det sidj iinbünjen wurd.",
+'post-expand-template-inclusion-category' => 'Sidjen mä muar üs det maksimaal taal faan iinbünjen föörlaagen.',
+'post-expand-template-argument-warning' => "'''Paase üüb:''' Üüb detdiar sidj stäänt tumanst ään iindrach för en föörlaag, diar tu grat as. Sok iindracher wurd ei ferwerket.",
+'post-expand-template-argument-category' => 'Sidjen mä föörlaagen, huar ei arke iindrach brükt wurd koon.',
+'parser-template-loop-warning' => 'Diar as en föörlaagensleuf: [[$1]]',
+'parser-template-recursion-depth-warning' => 'Tuföl föörlaagen uun föörlaagen ($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)',
@@ -823,303 +877,298 @@ Deer {{PLURAL:$2|mötj ai mör ås 1 apteel|mönje ai mör ås $1 apteele}} wees
 # "Undo" feature
 'undo-success' => 'Detdiar feranrang koon turag nimen wurd. 
 Luke oner, of dü det uk würelk du wel, an do seekre din feranrangen.',
-'undo-failure' => 'Jü änring köö ai tunintemååged wårde, deer di bedrååwede oufsnaas intwasche feränred wörd.',
-'undo-norev' => 'Jü beårbing köö ai tunintemååged wårde, deer jü ai bestoont unti sleeked wörd.',
-'undo-summary' => 'Änring $1 foon [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskusjoon]]) tunintemååged.',
+'undo-failure' => 'Det feranrang küd ei stregen wurd, auer di kirew uuntesken feranert wurden as.',
+'undo-norev' => 'Det feranrang küd ei turagsaat wurd, auer diar niks as of auer det sidj stregen wurden as.',
+'undo-summary' => 'Feranrang $1 faan [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskusjuun]]) turagsaat.',
 
 # Account creation failure
-'cantcreateaccounttitle' => 'Benjüterkonto köö ai mååged wårde',
-'cantcreateaccount-text' => "Dår måågen foon en brükerkonto foon jü IP-adräs '''($1)''' üt wörd döör [[User:$3|$3]] späred.
+'cantcreateaccounttitle' => 'Det brükerkonto koon ei iinracht wurd',
+'cantcreateaccount-text' => "Det iinrachten faan en brükerkonto faan det IP-adres '''($1)''' as faan [[User:$3|$3]] speret wurden.
 
-Grün foon jü späre: ''$2''",
+Grünj för det sper: ''$2''",
 
 # History pages
-'viewpagelogs' => 'Logböke for jüdeer sid wise',
-'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',
-'cur' => 'aktuäl',
-'next' => 'ist',
-'last' => 'leest',
+'viewpagelogs' => 'Logbuken faan detdiar sidj uunwise',
+'nohistory' => 'Detdiar sidj hää nään ferluup faan werjuunen.',
+'currentrev' => 'Leetst werjuun',
+'currentrev-asof' => 'Leetst werjuun faan di $2, am a 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' => 'Aktuel',
+'next' => 'Naist',
+'last' => 'Leetst',
 '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',
-'histfirst' => 'Ålste',
-'histlast' => 'Naiste',
-'historysize' => '({{PLURAL:$1|1 Byte|$1 Bytes}})',
-'historyempty' => '(lääsi)',
+'page_last' => 'Aanj',
+'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' => 'Äälst',
+'histlast' => 'Neist',
+'historysize' => '({{PLURAL:$1|1 byte|$1 bytes}})',
+'historyempty' => '(leesag)',
 
 # Revision feed
-'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-title' => 'Ferluup faan werjuunen',
+'history-feed-description' => 'Ferluup faan werjuunen faan detdiar sidj uun {{SITENAME}}',
+'history-feed-item-nocomment' => '$1 di $3 am a klook $4',
+'history-feed-empty' => 'Son sidj jaft at ei. Ferlicht as det stregen of fersköwen wurden. [[Special:Search|Schük]] üüb {{SITENAME}} efter nei sidjen, diar diartu paase.',
 
 # 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-delundel' => 'wis/fersteeg',
+'rev-deleted-comment' => '(Tuupfaadet beskriiwang wechnimen)',
+'rev-deleted-user' => '(Brükernööm stregen)',
+'rev-deleted-event' => '(Logbuk-iindrach stregen)',
+'rev-deleted-user-contribs' => '[Brükernööm of IP-adres wechnimen - Feranrangen uun bidracher ferbürgen]',
+'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' => 'wise/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.',
-'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-show-file-submit' => 'Jåå',
-'revdelete-selected' => "'''{{PLURAL:$2|Ütjsoocht wersjuun|Ütjsoocht wersjuunen}} faan [[:$1]]:'''",
+'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' => 'Nian log-typ uunden',
+'revdelete-nologtype-text' => 'Dü heest nään log-typ för detdiar aktjuun uunden.',
+'revdelete-nologid-title' => 'Ferkiard log-iindrach',
+'revdelete-nologid-text' => 'Dü heest nään log-typ uunden of di log-typ as ferkiard.',
+'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' => 'Ja',
+'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-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',
-'revdelete-hide-restricted' => 'Doote uk for administratoore än oudere unerdrüke',
-'revdelete-radio-same' => '(ai änre)',
-'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-log' => 'Begrüning:',
-'revdelete-submit' => 'Aw {{PLURAL:$1|kiisd färsjoon|kiisde färsjoone}} önjwiinje',
-'revdelete-success' => "'''Jü färsjoonsönjsicht wörd aktualisiird.'''",
+'revdelete-legend' => 'Iinstelangen, hüföl tu sen wees skal',
+'revdelete-hide-text' => 'Tekst faan det werjuun fersteeg',
+'revdelete-hide-image' => 'Fersteeg, wat uun det datei stäänt',
+'revdelete-hide-name' => 'Logbuk-aktjuun fersteeg',
+'revdelete-hide-comment' => 'Tuupfaadet beskriiwang fersteeg',
+'revdelete-hide-user' => 'Brükernööm/IP-adres faan di brüker fersteeg',
+'revdelete-hide-restricted' => 'Dooten uk för administratooren an öödern fersteeg',
+'revdelete-radio-same' => '(ei feranre)',
+'revdelete-radio-set' => 'Ja',
+'revdelete-radio-unset' => 'Naan',
+'revdelete-suppress' => "Grünj för't striken uk för administratooren an öödern fersteeg",
+'revdelete-unsuppress' => 'Weder iinsteld werjuunen luasmaage',
+'revdelete-log' => 'Grünj:',
+'revdelete-submit' => 'Widjer för {{PLURAL:$1|ütjsoocht werjuun|ütjsoocht werjuunen}}',
+'revdelete-success' => "'''Det werjuunsuunsicht as aktualisiaret wurden.'''",
 'revdelete-failure' => "'''Jü färsjoonsönjsicht köö ai aktualisiird wårde:'''
 $1",
-'logdelete-success' => "'''Logbökönjsicht ma erfolch aktualisiird.'''",
-'logdelete-failure' => "'''Logböksachtboorhäid köö ai änred wårde:'''
+'logdelete-success' => "'''Logbukuunsicht as aktualisiaret wurden.'''",
+'logdelete-failure' => "'''Det logbukuunsicht küd ei feranert wurd:'''
 $1",
-'revdel-restore' => 'sichtboorhäid änre',
-'revdel-restore-deleted' => 'sleekede färsjoone',
-'revdel-restore-visible' => 'sachtboore färsjoone',
-'pagehist' => 'Färsjoonshistoori',
-'deletedhist' => 'Straagene färsjoone',
-'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.
-Dü heest deeraw nåån tugraawe.',
+'revdel-restore' => 'Feranre, wat tu sen wees skal',
+'revdel-restore-deleted' => 'stregen werjuunen',
+'revdel-restore-visible' => 'sichtboor werjuunen',
+'pagehist' => 'Ferluup faan werjuunen',
+'deletedhist' => 'Stregen werjuunen',
+'revdelete-hide-current' => 'Di iindrach faan $1, klook $2 koon ei ferbürgen wurd. Det as det aktuel werjuun.',
+'revdelete-show-no-access' => 'Bi\'t bewerkin di $1, am a klook $2 as wat skiaf gingen: Didiar iindrach as üs "hualew klaar" markiaret.
+Dü könst diar ei üüb tugrip.',
 'revdelete-modify-no-access' => 'Bi\'t bewerkin di $1, am a klook $2 as wat skiaf gingen: Diheer iindrach as üs "hualew klaar" markiaret. Dü könst diar ei üüb tugrip.',
 'revdelete-modify-missing' => "Bi't bewerkin faan ID $1 as wat skiaf gingen: At waant uun a dootenbeenk!",
 'revdelete-no-change' => "'''Waarskau:''' Di iindrach faan di $1, am a klook $2 hää al jodiar iinstelangen.",
-'revdelete-concurrent-change' => "Bi't bewerkin faan di iindrach di $1, am a klook $2 as wat skiaf gingen: At sjocht so ütj, üs wan hoker ööders det bewerket hää, iar dü det bewerke wulst. Luke iin uun a logbuken.",
+'revdelete-concurrent-change' => "Bi't bewerkin faan di iindrach di $1, am a klook $2 as wat skiaf gingen: At schocht so ütj, üs wan hoker ööders det bewerket hää, iar dü det bewerke wulst. Luke iin uun a logbuken.",
 'revdelete-only-restricted' => "Bi't fersteegen faan di iindrach di $1, am a klook $2 as wat skiaf gingen: Dü könst di iindrach ei föör administratooren fersteeg, saner ööder iinstelangen tu feranrin.",
 'revdelete-reason-dropdown' => "*Grünjer för't striken san miast
 ** Copyright woort ei iinhäälen
 ** Persöönelk informatsjuunen, diar näämen wat uungung
 ** Brükernööm as ei tuläät
 ** Fülk informatsjuunen",
-'revdelete-otherreason' => 'Ouderen/tubaikaamenden grün:',
-'revdelete-reasonotherlist' => 'Ouderen grün',
-'revdelete-edit-reasonlist' => 'Strikgrüne beårbe',
-'revdelete-offender' => 'Autoor foon jüdeer färsjoon:',
+'revdelete-otherreason' => 'Ööder/noch en grünj:',
+'revdelete-reasonotherlist' => 'Ööder grünj',
+'revdelete-edit-reasonlist' => "Grünjer för't striken bewerke",
+'revdelete-offender' => 'Skriiwer faan detdiar werjuun:',
 
 # Suppression log
-'suppressionlog' => 'Oversight-logbök',
+'suppressionlog' => 'Oversight-logbuk',
 'suppressionlogtext' => 'Detheer as det logbuk faan oversighter aktsjuunen.
 Luke bi [[Special:BlockList|List faan speret IP-adresen an brükernöömer]] för aktuel sperangen.',
 
 # History merging
-'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-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-no-source' => 'Jurtkamstsid "$1" as ai deer.',
-'mergehistory-no-destination' => 'Müüljsid „$1“ bestoont ai.',
+'mergehistory' => 'Ferluup faan werjuunen tuupfeer',
+'mergehistory-header' => 'Mä detdiar spezial-sidj könst dü di werjuunsferluup faan ian sidj mä di ferluup faan en ööder sidj tuupfeer.
+Aachte diarüüb, dat di ferluup faan det sidj uk rocht as.',
+'mergehistory-box' => 'Ferluup faan tau sidjen tuupfeer:',
+'mergehistory-from' => 'Iarst sidj:',
+'mergehistory-into' => 'Ööder sidj:',
+'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' => 'Det iarst sidj "$1" as ai diar.',
+'mergehistory-no-destination' => 'Det ööder sidj „$1“ as ei diar.',
 'mergehistory-invalid-source' => 'Jurtkamstsid mötj en gülti sidnoome heewe.',
 'mergehistory-invalid-destination' => 'Müüljsid mötj en gülti sidnoome weese.',
 'mergehistory-autocomment' => '„[[:$1]]“ feriind eefter „[[:$2]]“',
-'mergehistory-comment' => '„[[:$1]]“ feriind eefter „[[:$2]]“: $3',
-'mergehistory-same-destination' => 'Jurtkamst- än müüljsid mönje ai idäntisch weese',
-'mergehistory-reason' => 'Grün:',
+'mergehistory-comment' => '„[[:$1]]“ tuupfeerd tu „[[:$2]]“: $3',
+'mergehistory-same-destination' => 'Det iarst an det ööder sidj mut ei detsalew wees',
+'mergehistory-reason' => 'Grünj:',
 
 # Merge log
 'mergelog' => 'Feriin-logbök',
-'pagemerge-logentry' => 'feriind [[$1]] eefter [[$2]] (färsjoonen bit $3)',
-'revertmerge' => 'Feriining tuninte mååge',
-'mergelogpagetext' => 'Dåtheer as dåt logbök foon da feriinde färsjoonshistoorie.',
+'pagemerge-logentry' => '[[$1]] efter [[$2]] tuupfeerd (werjuunen bit $3)',
+'revertmerge' => 'Det tuupfeeren turagsaat',
+'mergelogpagetext' => 'Diar as det logbuk faan a tuupfeerd sidjen.',
 
 # 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)',
-'lineno' => 'Ra $1:',
-'compareselectedversions' => 'Wäälde färsjoone ferglike',
-'showhideselectedversions' => 'Wäälde färsjoone wise/fersteege',
-'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)',
+'difference-multipage' => '(Ferskeel tesken sidjen)',
+'lineno' => 'Rä $1:',
+'compareselectedversions' => 'Werjuunen ferglik',
+'showhideselectedversions' => 'Werjuunen wise of fersteeg',
+'editundo' => 'turagsaat',
+'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]])',
-'searchsubtitleinvalid' => 'Din säkönjfrååg: "$1".',
+'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 uunfraag: "$1".',
 'toomanymatches' => 'Diar kaam tuföl resultooten üüb din uunfraag. Fersjük det ööders.',
-'titlematches' => 'Oueriinjstiminge ma sidetiitle',
-'notitlematches' => 'Niinj oueriinjstiming ma sidetiitle',
-'textmatches' => 'Oueriinjstiminge ma inhålte',
-'notextmatches' => 'Niinj oueriinjstiming ma inhålte',
-'prevn' => '{{PLURAL:$1|leesten|leeste $1}}',
-'nextn' => '{{PLURAL:$1|näisten|näiste $1}}',
-'prevn-title' => 'Leeste $1 {{PLURAL:$1|resultoot|resultoote}}',
-'nextn-title' => 'Näiste $1 {{PLURAL:$1|resultoot|resultoote}}',
-'shown-title' => 'Wis $1 {{PLURAL:$1|resultoot|resultoote}} pro sid',
-'viewprevnext' => 'Wis ($1 {{int:pipe-separator}} $2) ($3)',
+'titlematches' => 'Auerianstemangen mä sidjennöömer',
+'notitlematches' => 'Nian auerianstemangen mä sidjennöömer',
+'textmatches' => 'Auerianstemangen mä teksten',
+'notextmatches' => 'Nian auerianstemangen mä teksten',
+'prevn' => '{{PLURAL:$1|leetst|leetst $1}}',
+'nextn' => '{{PLURAL:$1|naist|naist $1}}',
+'prevn-title' => 'Leetst $1 {{PLURAL:$1|resultaat|resultaaten}}',
+'nextn-title' => 'Naist $1 {{PLURAL:$1|resultaat|resultaaten}}',
+'shown-title' => 'Wise $1 {{PLURAL:$1|resultaat|resultaaten}} per sidj',
+'viewprevnext' => 'Wise ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-legend' => 'Säkmöölikhäide',
 'searchmenu-exists' => "'''Deer as en sid nååmd \"[[:\$1]]\" önj jüdeer Wiki'''",
-'searchmenu-new' => "'''Mååg jü sid „[[:$1|$1]]“ önj jüdeer Wiki.'''",
-'searchhelp-url' => 'Help:Inhåltsfertiiknis',
+'searchmenu-new' => "'''Maage det sidj „[[:$1]]“ uun detheer wiki.'''",
 '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',
-'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-score' => 'Relevans: $1 %',
-'search-redirect' => '(widerliidjing foon „$1“)',
-'search-section' => '(oufsnaas $1)',
-'search-suggest' => 'Miinjdst dü „$1“?',
-'search-interwiki-caption' => 'Süsterprujäkte',
-'search-interwiki-default' => '$1 resultoote:',
-'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',
-'searchrelated' => 'früne',
-'searchall' => 'åle',
-'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.",
-'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-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.',
+'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 wurd|$2 wurden}})',
+'search-result-category-size' => '{{PLURAL:$1|1 sidj|$1 sidjen}} ({{PLURAL:$2|1 onerkategorii|$2 onerkategoriin}}, {{PLURAL:$3|1 datei|$3 datein}})',
+'search-result-score' => 'Relewans: $1 %',
+'search-redirect' => '(widjerfeerd faan „$1“)',
+'search-section' => '(kirew $1)',
+'search-suggest' => 'Mendst dü „$1“?',
+'search-interwiki-caption' => 'Saster-projekten',
+'search-interwiki-default' => '$1 resultaaten:',
+'search-interwiki-more' => '(muar)',
+'search-relatedarticle' => 'Ferbünjen',
+'mwsuggest-disable' => "Föörslacher för't schüken deaktiwiare",
+'searcheverything-enable' => 'Uun arke nöömrüm schük',
+'searchrelated' => 'ferbünjen',
+'searchall' => 'aaltumaal',
+'showingresults' => "Heer {{PLURAL:$1|as '''1''' resultaat|san '''$1''' resultaaten}}, jo began mä numer '''$2.'''",
+'showingresultsnum' => "Heer {{PLURAL:$3|as '''1''' resultaat|san '''$3''' resultaaten}}, jo began mä numer '''$2.'''",
+'showingresultsheader' => "{{PLURAL:$5|resultaat '''$1''' faan '''$3'''|resultaaten '''$1-$2''' faan '''$3'''}}, för '''$4.'''",
+'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' => 'För din uunfraag san nian resultaaten fünjen wurden.',
+'powersearch' => 'Ütjwidjet schüken',
+'powersearch-legend' => 'Ütjwidjet schüken',
+'powersearch-ns' => 'Schük uun nöömrümer:',
+'powersearch-redir' => 'Widjerfeerangen uunwise',
+'powersearch-field' => 'Schük efter:',
+'powersearch-togglelabel' => 'Schük uun:',
+'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',
+'preferences' => 'Iinstelangen',
 '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',
+'changepassword' => 'Paaswurd feranre',
 'prefs-skin' => 'Skak',
-'skin-preview' => 'Forlök',
-'datedefault' => 'Foor-önjstaling',
+'skin-preview' => 'Föörskau',
+'datedefault' => 'Föör-iinstelang',
 'prefs-beta' => 'Beta mögelkhaiden',
 'prefs-datetime' => 'Dai an klooktidj',
 '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}}',
 'prefs-watchlist-edits' => 'Ei muar feranrangen üs:',
 'prefs-watchlist-edits-max' => 'Ai mör as 1000',
 'prefs-watchlist-token' => "Token för uun't uug behualen:",
-'prefs-misc' => 'Dit än dat',
-'prefs-resetpass' => 'Pååsuurd änre',
+'prefs-misc' => 'Dit an dat',
+'prefs-resetpass' => 'Paaswurd feranre',
 'prefs-changeemail' => 'Feranre det E-Mail-adres',
 'prefs-setemail' => 'E-Mail-adres fäästlei:',
 'prefs-email' => 'E-Mail iinstelangen',
 'prefs-rendering' => 'Skak',
-'saveprefs' => 'Önjstalinge sääkere',
+'saveprefs' => 'Iinstelangen seekre',
 'resetprefs' => 'Wech diarmä',
 'restoreprefs' => 'Normool iinstelangen weder haale',
 'prefs-editing' => 'Bewerke',
 '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:',
-'localtime' => 'lokaal tid',
+'localtime' => 'Lokaal tidj:',
 'timezoneuseserverdefault' => 'Wiki standard tidj brük ($1)',
 'timezoneuseoffset' => 'Öödern (ferskeel uundu)',
 'timezoneoffset' => 'Ferskeel¹:',
@@ -1135,12 +1184,12 @@ Dü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'timezoneregion-europe' => 'Euroopa',
 'timezoneregion-indian' => 'Indik',
 'timezoneregion-pacific' => 'Pasiifik',
-'allowemail' => 'E-Mail foon oudere brükere tulätje',
-'prefs-searchoptions' => 'Sjük',
-'prefs-namespaces' => 'Noomerüme',
-'defaultns' => 'Ouers säk önj jüheer noomerüme:',
-'default' => 'Forinstaling',
-'prefs-files' => 'Dååtäie',
+'allowemail' => 'E-mail faan ööder brükern tuläät',
+'prefs-searchoptions' => 'Schük',
+'prefs-namespaces' => 'Nöömrümer',
+'defaultns' => 'Ööders schük uun jodiar nöömrümer:',
+'default' => 'Fööriinstelang',
+'prefs-files' => 'Datein',
 'prefs-custom-css' => 'Salew maaget CSS',
 'prefs-custom-js' => 'Salew maaget JavaScript',
 'prefs-common-css-js' => 'CSS / JavaScript för arke skak:',
@@ -1154,10 +1203,10 @@ 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:',
+'yournick' => 'Nei signatuur:',
 'prefs-help-signature' => 'Wees so gud an onerskriiw üüb diskusjuunssidjen mä „<nowiki>~~~~</nowiki>“. Diar komt do dan brükernööm an det klooktidj bi ütj.',
 'badsig' => "Diar stemet wat ei mä't signatuur. Preewe at HTML.",
 'badsiglength' => 'Din signatuur mut ei muar üs $1 {{PLURAL:$1|tiaken|tiakens}} haa.',
@@ -1167,7 +1216,7 @@ Do san jo ual iinstelangen wech.',
 'gender-female' => 'Wüf',
 'prefs-help-gender' => "Stäänt tu wool: Det woort brükt för't paasin uunspreegen faan maaner an wüfen. Arken koon det lees.",
 'email' => 'E-mail',
-'prefs-help-realname' => 'Stäänt tu wool. Wan dü dan rochten nööm uundääst, koon hi mä din bewerkangen ferbünjen wurd.',
+'prefs-help-realname' => 'Stäänt tu wool. Wan dü dan rochten nööm uundääst, koon hi mä din feranrangen ferbünjen wurd.',
 'prefs-help-email' => 'Dü säärst din e-mail-adres ei uundu, oober do könst dü uk nian mädialangen fu, wan dü ans din paaswurd ferjiden heest.',
 'prefs-help-email-others' => 'Mä ööder brükern könst dü uk auer hör an din brükersidj kontakt apnem. Diarför woort din e-mail-adres ei brükt.',
 'prefs-help-email-required' => 'Du en rocht E-Mail-adres uun.',
@@ -1176,11 +1225,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",
@@ -1211,6 +1260,8 @@ 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.',
+'userrights-removed-self' => 'Dü heest din aanj brükerrochtem stregen. Dü könst nü ei muar üüb det sidj tugrip.',
 
 # Groups
 'group' => 'Skööl:',
@@ -1246,13 +1297,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-reupload-own' => 'En datei auerskriiw, diar dü salew huuchsjüürd heest',
+'right-upload' => 'Datein huuchschüür',
+'right-reupload' => 'Datein auerskriiw',
+'right-reupload-own' => 'En datei auerskriiw, diar dü salew huuchschüü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',
@@ -1260,256 +1311,918 @@ 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-sendemail' => 'E-mails tu oudere brükere schake',
+'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-editmyusercss' => 'Aanj CSS-datein bewerke',
+'right-editmyuserjs' => 'Aanj JavaScript-datein bewerke',
+'right-viewmywatchlist' => "Sidjen uunluke, diar ik uun't uug behual wal",
+'right-editmywatchlist' => "Sidjen bewerke, diar dü uun't uug behual wel. Enkelt aktjuunen kön diar wat saner din dun feranre.",
+'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 ööder brükern schüür',
+'right-passwordreset' => 'Paaswurd faan en brüker turagsaat an det e-mail diartu uunluke',
 
 # Special:Log/newusers
-'newuserlogpage' => 'Nai-önjmäldings-logbök',
+'newuserlogpage' => 'Neiuunmeldangs-logbuk',
+'newuserlogpagetext' => 'Detheer as en logbuk faan nei iinracht brükerkonten.',
 
 # User rights log
-'rightslog' => 'Ruchte-logbök',
+'rightslog' => 'Brükerrochten-logbuk',
+'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-sendemail' => 'e-mails sjüür',
+'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 tu schüüren',
+'action-editmywatchlist' => "sidjen, diar dü uun't uug behual wel, tu bewerkin",
+'action-viewmywatchlist' => "sidjen uuntulukin, diar dü uun't uug behual wel",
 
 # Recent changes
-'nchanges' => '$1 {{PLURAL:$1|änring|änringe}}',
-'recentchanges' => 'Leeste änringe',
-'recentchanges-legend' => 'Wis-opsjoone',
+'nchanges' => '$1 {{PLURAL:$1|feranrang|feranrangen}}',
+'recentchanges' => 'Leetst feranrangen',
+'recentchanges-legend' => "Iinstelangen för't uunwisin",
 '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}}.',
+'recentchanges-feed-description' => 'Mä didiar feed könst dü a leetst feranrangen faan {{SITENAME}} ferfulge.',
 'recentchanges-label-newpage' => 'Nei sidj uunlaanj',
 'recentchanges-label-minor' => 'Letj feranrang',
 'recentchanges-label-bot' => 'Feranrang faan en bot',
 'recentchanges-label-unpatrolled' => 'Detdiar feranrang as noch ei efterluket wurden',
-'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.",
+'rcnote' => "Diar {{PLURAL:$1|stäänt det leetst feranrang|stun a leetst '''$1''' feranrangen}} faan a leetst {{PLURAL:$2|dai|'''$2''' daar}}. Stant: $4, am a 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',
-'rcshowhidebots' => 'Bots $1',
-'rcshowhideliu' => 'Önjmäldede brükere $1',
-'rcshowhideanons' => 'Anonymen brüker $1',
-'rcshowhidepatr' => '$1 efterluket feranrangen',
-'rcshowhidemine' => 'Äine tujeefte $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',
+'rclistfrom' => 'Bluas feranrangen sant $1 wise.',
+'rcshowhideminor' => '$1 letj feranrangen',
+'rcshowhidebots' => '$1 bots',
+'rcshowhideliu' => '$1 uunmeldet brükern',
+'rcshowhideanons' => '$1 anonüüm brükern',
+'rcshowhidepatr' => 'Efterluket feranrangen $1',
+'rcshowhidemine' => '$1 min bidracher',
+'rclinks' => 'Wise a leetst $1 feranrangen faan a leetst $2 daar.<br />$3',
+'diff' => 'ferskeel',
+'hist' => 'werjuunen',
+'hide' => 'Fersteeg',
+'show' => 'Wise',
 'minoreditletter' => 'L',
 'newpageletter' => 'N',
 'boteditletter' => 'B',
-'rc-enhanced-expand' => 'Detaile wise (JavaScript as nüsi)',
-'rc-enhanced-hide' => 'Detaile fersteege',
+'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 kirew /* $1 */',
+'rc-enhanced-expand' => 'Enkelthaiden wise (brükt JavaScript)',
+'rc-enhanced-hide' => 'Enkelthaiden fersteeg',
 'rc-old-title' => 'tuiarst maaget üs „$1“',
 
 # Recent changes linked
 'recentchangeslinked' => 'Feranrangen bi ferlinket sidjen',
 'recentchangeslinked-feed' => 'Feranrangen bi ferlinket sidjen',
 'recentchangeslinked-toolbox' => 'Feranrangen bi ferlinket sidjen',
-'recentchangeslinked-title' => 'Feranrangen bi sidjen, diar faan "$1" ferlinket san',
+'recentchangeslinked-title' => 'Feranrangen bi sidjen, huar faan "$1" üüb ferwiset woort',
 '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-page' => 'Sid:',
-'recentchangeslinked-to' => 'Wis änringe aw side, da heerjurt ferlinke',
+'recentchangeslinked-summary' => "Detdiar spezial-sidj wiset a leetst feranrangen faan ferwiset sidjen (of faan sidjen uun en was kategorii). Sidjen, diar dü [[Special:Watchlist|uun't uug behual]] wel, san '''fäät''' skrewen.",
+'recentchangeslinked-page' => 'Sidjennööm:',
+'recentchangeslinked-to' => 'Wise feranrangen üüb sidjen, diar heerhen ferwise.',
 
 # 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.',
-'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',
+'reuploaddesc' => "Ufbreeg an turag tu't sidj för't huuchsjüüren",
+'upload-tryagain' => 'Feranert dateibeskriiwang ufsjüür',
+'uploadnologin' => 'Ei uunmeldet',
+'uploadnologintext' => 'Dü skel di $1, amdat dü datein huuchschüür könst.',
+'upload_directory_missing' => 'Det archiif-fertiaknis ($1) as ei diar, an küd faan di webserver uk ei iinracht wurd.',
+'upload_directory_read_only' => 'Uun det archiif-fertiaknis ($1) küd faan di webserver ei skrewen wurd.',
+'uploaderror' => "Bi't huuchschüüren as wat skiaf gingen",
+'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',
+'uploadlogpage' => 'Datei-logbuk',
+'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',
-'uploadedimage' => 'heet "[[$1]]" huuchsånd',
+'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 feranrang, wat dü maage wulst, as faan en ütjwidjet software-funktjuun 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 schüür det huuch.",
+'fileexists-forbidden' => 'En datei mä didiar nööm jaft at al an koon ei auerskrewen wurd.
+Gung noch ans turag an schüü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' => 'hää "[[$1]]" huuchschüürd',
+'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 informatjuun 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-deleteone' => 'jüdeer färsjoon strike',
-'filehist-revert' => 'tubääg seete',
-'filehist-current' => 'aktuäl',
-'filehist-datetime' => 'Färsjoon foon e',
-'filehist-thumb' => 'Forlökbil',
-'filehist-thumbtext' => 'Forlökbil for Färsjoon foon $2, am e klook $3',
-'filehist-nothumb' => 'Niinj forlökbil deer',
-'filehist-user' => 'brüker',
-'filehist-dimensions' => 'Mätje',
-'filehist-comment' => 'Komentoor',
+'filehist' => 'Dateiwerjuunen',
+'filehist-help' => 'Klike üüb en tidjponkt, am detdiar werjuun uuntulukin.',
+'filehist-deleteall' => 'aal a werjuunen strik',
+'filehist-deleteone' => 'detdiar werjuun strik',
+'filehist-revert' => 'turagsaat',
+'filehist-current' => 'aktuel',
+'filehist-datetime' => 'Werjuun faan',
+'filehist-thumb' => 'Föörskaubil',
+'filehist-thumbtext' => 'Föörskau för det werjuun faan $2, klook $3',
+'filehist-nothumb' => 'Diar as nian föörskaubil',
+'filehist-user' => 'Brüker',
+'filehist-dimensions' => 'Miaten',
+'filehist-filesize' => 'Dateigrate',
+'filehist-comment' => 'Komentaar',
+'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',
-'sharedupload' => 'Jüdeer dååtäi ståmt üt $1 än mötj foon ouder prujäkte brükt wårde.',
+'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' => 'Detdiar datei komt faan $1 an mut uk för ööder projekten brükt wurd.',
+'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' => 'Tufelag sidj',
+'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 feranrangen',
+'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' => 'Feranrangen, sant {{SITENAME}} maaget wurden as',
+'statistics-edits-average' => "Feranrangen 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 feranrang',
+'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)',
+'nmembers' => '{{PLURAL:$1|1 iindrach|$1 iindracher}}',
+'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:',
-'move' => 'Ferschüwe',
-'movethispage' => 'Sid ferschüwe',
-'pager-newer-n' => '{{PLURAL:$1|näisten|näiste $1}}',
-'pager-older-n' => '{{PLURAL:$1|åleren|ålere $1}}',
+'ancientpages' => 'Al loong ei muar bewerket sidjen',
+'move' => 'Fersküüw',
+'movethispage' => 'Detdiar sidj fersküüw',
+'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|1 neier|$1 neier}}',
+'pager-older-n' => '{{PLURAL:$1|1 ääler|$1 ääler}}',
 '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 wurd 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',
+'prevpage' => 'Leetst sidj ($1)',
+'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',
+'allpagessubmit' => 'Widjer',
+'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-ns' => 'Noomerüm:',
-'linksearch-ok' => 'Säk',
+'linksearch' => "Schük efter ferwisangen uun't näät",
+'linksearch-pat' => 'Schükmünster:',
+'linksearch-ns' => 'Nöömrüm:',
+'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' => 'Schüü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.",
-'removedwatchtext' => 'Jü sid „[[:$1]]“ wörd foon din [[Special:Watchlist|eefterkiiklist]] wächhååld.',
-'watch' => 'Kiike eefter',
-'watchthispage' => 'Side eefterkiike',
-'unwatch' => 'ai mör eefter kiike',
-'watchlist-details' => 'Dü kiikst eefter {{PLURAL:$1|1 sid|$1 side}}.',
-'wlshowlast' => 'Wis da änringe foon da leeste $1 stüne, $2 deege unti $3.',
-'watchlist-options' => 'Wis-opsjoone',
+Feranrangen faan detdiar sidj wurd üüb detdiar list fäästhäälen.",
+'removewatch' => "Ei muar uun't uug behual",
+'removedwatchtext' => "Det sidj „[[:$1]]“ as faan a sidjen, diar dü [[Special:Watchlist|uun't uug behual]] wel, wechnimen wurden.",
+'watch' => "Uun't uug behual",
+'watchthispage' => "Detdiar sidj uun't uug behual",
+'unwatch' => "Ei muar uun't uug behual",
+'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' => 'Wise a feranrangen faan leetst $1 stünjen, $2 daar of $3.',
+'watchlist-options' => "Iinstelangen för't uunwisin",
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching' => 'Eefter kiike...',
-'unwatching' => 'Ai eefter kiike...',
+'watching' => "Uun't uug behual ...",
+'unwatching' => "Ei uun't uug behual ...",
+'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',
+'deletepage' => 'Sidj strik',
+'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.',
-'actioncomplete' => 'Aksjoon beånd',
+'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' => 'Klaar',
 'actionfailed' => 'Diar ging wat skiaf',
-'deletedtext' => '„$1“ wörd tunintemååged. In e $2 fanst dü en list foon da tuleest tunintemåågede side.',
-'dellogpage' => 'Tunintemååg-Logbök',
+'deletedtext' => "„$1“ as stregen wurden. Uun't $2 fanjst dü a sidjen, diar tuleetst stregen wurden san.",
+'dellogpage' => 'Strik-logbuk',
 'dellogpagetext' => 'Diar stun a leetst stregen sidjen an datein.',
 'deletionlog' => "logbuk faan't striken",
-'reverted' => 'Tu en ual wersjuun turagsaat',
-'deletecomment' => 'Grün:',
-'deleteotherreason' => 'Ouderen/tubaikaamenden grün:',
-'deletereasonotherlist' => 'Ouderen grün',
+'reverted' => 'Üüb en ual werjuun turagsaat',
+'deletecomment' => 'Grünj:',
+'deleteotherreason' => 'Ööder/noch en grünj:',
+'deletereasonotherlist' => 'Ööder grünj',
 'deletereason-dropdown' => "*Algemian grünjer för't striken
 ** Di skriiwer wul det so
 ** 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
-'rollbacklink' => 'tubäägseete',
+'rollback' => 'Feranrangen turagsaat',
+'rollback_short' => 'Turagsaat',
+'rollbacklink' => 'turagsaat',
+'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',
-'protectedarticle' => 'schütsed „[[$1]]“',
-'modifiedarticleprotection' => 'änred e schüts for "[[$1]]"',
+'protectlogpage' => 'Sidjenseekerangs-logbuk',
+'protectlogtext' => 'Detheer as det logbuk mä seekert sidjen.
+Üüb [[Special:ProtectedPages|detdiar list]] stun a seekert sidjen.',
+'protectedarticle' => 'hää „[[$1]]“ seekert.',
+'modifiedarticleprotection' => 'hää det seekerhaid faan "[[$1]]" feranert',
+'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',
-'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-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-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ünj:',
+'protectexpiry' => 'Sperdüür:',
+'protect_expiry_invalid' => 'Didiar tidjrüm gongt ei.',
+'protect_expiry_old' => 'Det spertidj leit uun a jütidj.',
+'protect-unchain-permissions' => 'Separaat speren aktiwiare',
+'protect-text' => 'Heer könst dü det seekerhaid faan "$1" uunluke an feranre.',
+'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-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.',
-'restriction-type' => 'Schütsstatus',
-'restriction-level' => 'Schütshöögde',
+'protect-summary-cascade' => 'kaskadiirin',
+'protect-expiring' => 'bit $2, am a klook $3 (UTC)',
+'protect-expiring-local' => 'bit $1',
+'protect-expiry-indefinite' => 'saner aanj',
+'protect-cascade' => 'Kaskaadensper - aal a föörlaagen faan detdiar sidj wurd uk speret',
+'protect-cantedit' => 'Dü könst det sper faan detdiar sidj ei feranre, auer dü det sidj ei bewerke mutst.',
+'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' => 'Seekerhaidsiinstelangen:',
+'restriction-level' => 'Seekerhaidspeegel:',
 'minimum-size' => 'Minimaal grate:',
 'maximum-size' => 'Maksimaal grate:',
 'pagesize' => '(bytes)',
@@ -1528,269 +2241,708 @@ 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',
+'undeletelink' => 'wise / weder iinstel',
 'undeleteviewlink' => 'Uunluke',
-'undeletereset' => 'Turag saat',
+'undeletereset' => 'Turagsaat',
 '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)',
+'namespace' => 'Nöömrüm:',
+'invert' => 'Ütjwool amkiir',
+'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"',
+'contributions-title' => 'Brükerbidracher för "$1"',
 'mycontris' => 'Bidracher',
-'contribsub2' => 'For $1 ($2)',
-'uctop' => '(aktuäl)',
-'month' => 'än moune:',
-'year' => 'bit iir:',
-
-'sp-contributions-newbies' => 'Wis bloot tujeefte foon naie brükere',
-'sp-contributions-blocklog' => 'Spär-logbök',
-'sp-contributions-uploads' => 'Huuchsjüürd bilen',
-'sp-contributions-logs' => 'logbuken',
-'sp-contributions-talk' => 'diskusjuun',
-'sp-contributions-search' => 'Säkj eefter brükertujeefte',
-'sp-contributions-username' => 'IP-adräs unti brükernoome',
-'sp-contributions-toponly' => 'Bluas aktuel wersjuunen wise',
-'sp-contributions-submit' => 'Säike',
+'contribsub2' => 'För $1 ($2)',
+'nocontribs' => 'Diar wiar nian paasin brükerbidracher',
+'uctop' => '(aktuel)',
+'month' => 'faan muun (of iarer):',
+'year' => 'faan juar (of iarer):',
+
+'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' => 'Sper-logbuk',
+'sp-contributions-deleted' => 'Stregen bidracher',
+'sp-contributions-uploads' => 'Huuchschüürd bilen',
+'sp-contributions-logs' => 'Logbuken',
+'sp-contributions-talk' => 'Diskusjuun',
+'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-adres of brükernööm:',
+'sp-contributions-toponly' => 'Bluas aktuel werjuunen wise',
+'sp-contributions-submit' => 'Schük',
 
 # What links here
-'whatlinkshere' => 'Links aw jüdeer sid',
-'whatlinkshere-title' => 'Side, da aw "$1" ferlinke',
-'whatlinkshere-page' => 'sid:',
-'linkshere' => "Da füliende side ferlinke aw '''„[[:$1]]“''':",
+'whatlinkshere' => 'Ferwisangen üüb detdiar sidj',
+'whatlinkshere-title' => 'Sidjen, diar üüb "$1" ferwise',
+'whatlinkshere-page' => 'Sidj:',
+'linkshere' => "Jodiar sidjen ferwise üüb '''„[[:$1]]“''':",
 'nolinkshere' => 'Nian sidj ferwiset üüb [[:$1]]',
-'isredirect' => 'widerliidjingssid',
-'istemplate' => 'forlåågeninbining',
-'isimage' => 'Dåtäilink',
-'whatlinkshere-prev' => '{{PLURAL:$1|leesten|leeste $1}}',
-'whatlinkshere-next' => '{{PLURAL:$1|näisten|näiste $1}}',
-'whatlinkshere-links' => '← links',
-'whatlinkshere-hideredirs' => 'Widerliidjinge $1',
-'whatlinkshere-hidetrans' => 'Forlåågenönjbininge $1',
-'whatlinkshere-hidelinks' => 'Links $1',
-'whatlinkshere-hideimages' => 'Ferwisangen tu dateien $1',
+'nolinkshere-ns' => "Nian sidj ferwiset üüb '''„[[:$1]]“''' uun di ütjsoocht nöömrüm.",
+'isredirect' => 'widjerfeerang',
+'istemplate' => 'iinbünjen föörlaagen',
+'isimage' => 'Dateilink',
+'whatlinkshere-prev' => '{{PLURAL:$1|leetst|leetst $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|naist|naist $1}}',
+'whatlinkshere-links' => '← ferwisangen',
+'whatlinkshere-hideredirs' => '$1 widjerfeerangen',
+'whatlinkshere-hidetrans' => '$1 iinbünjen föörlaagen',
+'whatlinkshere-hidelinks' => '$1 ferwisangen',
+'whatlinkshere-hideimages' => 'Ferwisangen tu datein $1',
 'whatlinkshere-filters' => 'Filtere',
 
 # Block/unblock
-'blockip' => 'IP-adräs/brüker späre',
-'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',
+'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ünj:2 hours,1 dai:1 day,3 daar:3 days,1 weg:1 week,2 weg:2 weeks,1 muun:1 month,3 muuner:3 months,6 muuner:6 months,1 juar:1 year,saner aanj:infinite',
+'ipbotheroption' => 'Ööder sperdüür',
+'ipbotherreason' => 'Ööder/noch en grünj:',
+'ipbhidename' => 'Brükernööm uun feranrangen 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' => 'Speret brükern',
 'ipblocklist-legend' => 'Spärd brükere fine',
-'ipblocklist-submit' => 'Sjük',
-'expiringblock' => 'iinjet aw e $1 am e klook $2',
-'blocklink' => 'späre',
-'unblocklink' => 'frijeewe',
+'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' => 'lääpt di $1 am a klook $2 uf',
+'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' => 'Ei muar spere',
 'change-blocklink' => 'Späring änre',
-'contribslink' => 'tujeefte',
-'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',
-'blocklogentry' => 'spärd „[[$1]]“ for di tidrüm: $2 $3',
-'reblock-logentry' => 'änerd jü spär for „[[$1]]“ for di tidrüm: $2 $3',
+'contribslink' => 'Bidracher',
+'emaillink' => 'E-mail schüür',
+'autoblocker' => 'Automaatisk speret, auer dü en gemiansoom IP-adres mä [[User:$1|brüker:$1]] brükst. Grünj för det brükersper: „$2“.',
+'blocklogpage' => 'Brükersper-logbuk',
+'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' => 'hää „[[$1]]“ speret för di tidjrüm: $2 $3',
+'reblock-logentry' => 'hää det sper för „[[$1]]“ anert för di tidjrü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',
-'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-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.',
+'unblocklogentry' => 'hää det sper faan „$1“ apheewen',
+'block-log-flags-anononly' => 'bluas IPs/anonüümen',
+'block-log-flags-nocreate' => 'brükerkontos kön ei iinracht wurd.',
+'block-log-flags-noautoblock' => 'autoblock ei aktiif',
+'block-log-flags-noemail' => 'e-mail fersjüüren ufsteld',
+'block-log-flags-nousertalk' => 'koon sin aanj diskusjuunssidj ei bewerke',
+'block-log-flags-angry-autoblock' => 'ütjwidjet autoblock aktiwiaret',
+'block-log-flags-hiddenname' => 'brükernööm ferbürgen',
+'range_block_disabled' => 'Det mögelkhaid, hialer adresrümer tu sperin, as ei aktiif.',
+'ipb_expiry_invalid' => 'Didiar tidjrüm gongt ei.',
+'ipb_expiry_temp' => 'Ferbürgen brükernööm-speren skel permanent wees.',
+'ipb_hide_invalid' => 'Detdiar brükerkonto koon ei ferbürgen wurd, auer diar tuföl feranrangen uun a ferluup stun.',
+'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' => 'Fersü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 bloots 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.",
-'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.
-
-Önj dadeere fåle möist dü, wan wansched, di önjhålt foon jü sid foon hönj ferschüwe unti tuhuupefääre.
-
-Hål di '''naie''' tiitel uner '''muul''' önjdreege, deeruner jü ambenååming hål '''begrüne.'''",
-'movearticle' => 'Sid ferschüwe:',
+'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 widjerfeer 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' => "Uk det diskusjuunssidj woort fersköwen, wan det diar as, '''oober ei, wan:'''
+*Diar al en diskusjuunssidj mä didiar nööm as, of
+*Dü detdiar mögelkhaid ütjslotst.
+
+Uun didiar faal skel dü a diskusjuunssidjen faan hun tuupfeer.
+
+Dreeg di '''nei''' tiitel bi '''ööder sidj''' iin, an diaroner '''en grünj''' för't amnäämen.",
+'movearticle' => 'Sidj fersküüw:',
+'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',
+'move-watch' => "Jodiar sidjen uun't uug behual",
+'movepagebtn' => 'Sidj fersküüw',
 'pagemovedsub' => 'Ferschüwing luket',
-'movepage-moved' => "'''Jü sid „$1“ wörd eefter „$2“ ferschääwen.'''",
-'articleexists' => 'Uner dideere noome bestoont ål en sid. Wääl hål en nai noome.',
-'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',
+'movepage-moved' => "'''Det sidj „$1“ as efter „$2“ fersköwen wurden.'''",
+'movepage-moved-redirect' => 'En widjerfeerang as iinracht wurden.',
+'movepage-moved-noredirect' => 'Det maagin faan en widjerfeerang as ferhanert wurden.',
+'articleexists' => 'En sidj mä didiar nööm jaft at al. Wees so gud an nem en öödern nööm.',
+'cantmove-titleprotected' => 'Dü könst det sidj ei so fersküüw, auer di nei nööm speret as.',
+'talkexists' => 'Detdiar sidj as fersköwen wurden, oober det diskusjuunssidj ei, auer diar al son diskusjuunssidj wiar. Fal det salew mä bidracher faan det ual sidj ap.',
+'movedto' => 'fersköwen efter',
+'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',
-'movereason' => 'Begrüning:',
-'revertmove' => 'tubääg ferschüwe',
+'movelogpage' => 'Fersküüw-logbuk',
+'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' => 'Grünj:',
+'revertmove' => 'turag fersküüw',
+'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",
+'thumbnail-more' => 'Fergratre',
+'filemissing' => 'Datei ei diar',
+'thumbnail_error' => "Bi't skriiwen faan det föörskaubil 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 föörskaubil 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-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-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-protect' => 'Jüdeer sid schütse',
+'tooltip-pt-userpage' => 'Din brükersidj',
+'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' => 'Min iinstelangen',
+'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' => 'Nei kirew began',
+'tooltip-ca-viewsource' => 'Detdiar sidj as seekert wurden.
+Dü könst di kweltekst uunluke.',
+'tooltip-ca-history' => 'Ääler werjuunen faan detdiar sidj',
+'tooltip-ca-protect' => 'Detdiar sidj seekre',
 'tooltip-ca-unprotect' => 'Seekerang feranere',
-'tooltip-ca-delete' => 'Jüdeer sid tunintemååge',
-'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-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-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-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-emailuser' => 'En e-mail tu dideere brüker siinje',
-'tooltip-t-upload' => 'Bile huuchschake',
-'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-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-template' => 'Forlååge wise',
+'tooltip-ca-delete' => 'Detdiar sidj strik',
+'tooltip-ca-undelete' => 'Iindracher faan det sidj turaghaale, iar det stregen wurden as.',
+'tooltip-ca-move' => 'Detdiar sidj fersküüw',
+'tooltip-ca-watch' => "Detdiar sidj uk uun't uug behual",
+'tooltip-ca-unwatch' => "Detdiar sidj ei muar uun't uug behual",
+'tooltip-search' => 'Schük uun {{SITENAME}}',
+'tooltip-search-go' => 'Gung tu det sidj, diar jüst so het.',
+'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' => 'Auer det projekt, wat dü maage könst, an huar dü wat fanjst.',
+'tooltip-n-currentevents' => 'Muar auer a "miilstianer", diar det wurden an waaksen faan\'t Nuurdfresk Wikipedia eftertiakne',
+'tooltip-n-recentchanges' => 'Leetst feranrangen faan {{SITENAME}}',
+'tooltip-n-randompage' => 'Tufelag sidj',
+'tooltip-n-help' => 'Halepsidj uunwise',
+'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 för detdiar sidj',
+'tooltip-feed-atom' => 'Atom-feed för detdiar sidj',
+'tooltip-t-contributions' => 'List mä bidracher faan didiar brüker uunluke',
+'tooltip-t-emailuser' => 'En e-mail tu didiar brüker schüür',
+'tooltip-t-upload' => 'Datein huuchschüür',
+'tooltip-t-specialpages' => 'Auersicht auer aal a spezial-sidjen',
+'tooltip-t-print' => 'Drükföörskau',
+'tooltip-t-permalink' => 'Permanent ferwisang tu detdiar werjuun faan det sidj.',
+'tooltip-ca-nstab-main' => 'Sidj uunluke',
+'tooltip-ca-nstab-user' => 'Brükersidj uunluke',
+'tooltip-ca-nstab-media' => 'Mediendateisidj uunwise',
+'tooltip-ca-nstab-special' => 'Det as en spezial-sidj. Hat koon ei bewerket wurd.',
+'tooltip-ca-nstab-project' => 'Projektsidj uunluke',
+'tooltip-ca-nstab-image' => 'Dateisidj uunluke',
+'tooltip-ca-nstab-mediawiki' => 'MediaWiki-süsteemtekst uunwise',
+'tooltip-ca-nstab-template' => 'Föörlaag uunluke',
 '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-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-watch' => 'Fäig jüdeer sid foon din eefterkiikliste tubai',
-'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-ca-nstab-category' => 'Kategoriisidj uunluke',
+'tooltip-minoredit' => 'Detdiar feranrang üs letj kääntiakne.',
+'tooltip-save' => 'Feranrangen seekre',
+'tooltip-preview' => 'Föörskau faan feranrangen üüb detdiar sidj. Iarst noch ans luke, iar dü det sidj seekerst!',
+'tooltip-diff' => 'Feranrangen bi a tekst wise',
+'tooltip-compareselectedversions' => 'Ferskeel tesken tau werjuunen faan detdiar sidj uunwise.',
+'tooltip-watch' => "Detdiar sidj uk uun't uug behual",
+'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' => 'Saat aal a leetst feranrangen faan disalew brüker mä ään klik turag.',
+'tooltip-undo' => 'Saat bluas det leetst feranrang turag an wiset det resultoot uun en föörskau uun. Uun det tuupfaadet beskriiwang skul en grünj för det turagsaaten uunden wurd.',
+'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' => 'Informatjuun tu „$1“',
+'pageinfo-not-current' => 'Det informatjuun 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' => 'Informatjuun',
+'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',
+'previousdiff' => '← Leetst feranrang',
 'nextdiff' => 'Tu di näist färsjoonsferschääl →',
 
 # Media information
-'file-info-size' => '$1 × $2 pixele, dååtäigrutelse: $3, MIME-typ: $4',
-'file-nohires' => 'Niinj huuger apliising as deer.',
-'svg-long-desc' => 'SVG-dåtäi, basisgrutelse: $1 × $2 pixel, dåtäigrutelse: $3',
-'show-big-image' => 'Färsjon önj huuger apliising',
+'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 pixels, dateigrate: $3, MIME-typ: $4',
+'file-info-size-pages' => '$1 × $2 pixel, dateigrate: $3, MIME-typ: $4, $5 {{PLURAL:$5|sidj|sidjen}}',
+'file-nohires' => 'Diar as nian huuger apliasang diar.',
+'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' => 'Huuger apliasang',
+'show-big-image-preview' => 'Grate faan detdiar föörskaubil: $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
-'ilsubmit' => 'Sjük',
+'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',
-'metadata-help' => 'Jüdeer dåtäi önjthålt widere informasjoon, jü önj e räigel foon jü digitoolamera unti di ferwånd scanner ståme. Döör eefterdräägen beårbing foon jü originooldåtäi koone hu detaile feränret wörden weese.',
-'metadata-expand' => 'Ütbriidede detaile wise',
-'metadata-collapse' => 'Ütbriidede detaile fersteege',
-'metadata-fields' => 'Da füliende fälje foon da EXIF-metadååte, da önj dideere MediaWiki-systeemtäkst önjjääwen san, wårde aw bilbeschriwingsside ma inklapede metadååtetabäle wist. Widere wårde standardmääsi ai wised.
+'metadata' => 'Metadooten',
+'metadata-help' => 'Uun detdiar datei stun muar dooten, jo kem miast faan en digitaal knipskasche of faan en scanner. Ferlicht san hög dooten uk leederhen feranert wurden.',
+'metadata-expand' => 'Ütjwidjet dooten wise',
+'metadata-collapse' => 'Ütjwidjet dooten fersteeg',
+'metadata-fields' => 'Jodiar EXIF-metadooten wurd uunwiset, wan det metadootentabel ferbürgen as. Jo öödern san iarst ans ferbürgen.
 * make
 * model
 * datetimeoriginal
@@ -1805,19 +2957,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-help' => '(Sii da [//www.mediawiki.org/wiki/Manual:External_editors Installationsanweisungen] for widere Informasjoon)',
+'edit-externally' => 'Detdiar datei mä en ekstern program bewerke',
+'edit-externally-help' => "(Luk efter uun't [//www.mediawiki.org/wiki/Manual:External_editors hoonbuk] am muar diartu)",
 
 # '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.',
@@ -1825,25 +3464,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-view' => "Uun't uug behual: Feranrangen",
+'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-software-version' => 'Werjuun',
+'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-submit' => 'Sjük',
+'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>
@@ -1856,38 +3597,156 @@ 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-selectorother-other' => 'Oudere',
+'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' => 'Öödern',
+'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 {{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 wersjuun|$5 wersjuunen}} faan det sidj $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 wersjuunen faan det sidj $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 wersjuun|$5 wersjuunen}} faan det sidj $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 wersjuunen faan det sidj $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',
+'revdelete-restricted' => 'mögelkhaiden för administratooren wechnimen',
+'revdelete-unrestricted' => 'mögelkhaiden för administratooren ütjwidjet',
 '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' => 'Sjük',
+'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 feranrang, wat dü maage wulst, as faan en ütjwidjet software-funktjuun ufbreegen wurden.',
+'api-error-http' => 'Intern feeler: Ferbinjang tu a server as skiaf gingen.',
+'api-error-illegal-filename' => 'Didiar dateinööm as ei tuläät.',
+'api-error-internal-error' => "Intern feeler: diar as wat skiaf gingen bi't huuchschüüren faan det datei tu det Wiki.",
+'api-error-invalid-file-key' => 'Intern feeler: Det datei as uun det tidjwiis archiif ei fünjen wurden.',
+'api-error-missingparam' => 'Intern feeler: Det uunfraag as ei hial uunkimen.',
+'api-error-missingresult' => 'Intern feeler: Küd ei luke, of det kopiarin loket hää.',
+'api-error-mustbeloggedin' => 'Dü skel di uunmelde, am datein huuchtuschüüren.',
+'api-error-mustbeposted' => 'Intern feeler: Ferkiard HTTP-muude.',
+'api-error-noimageinfo' => 'Det huuchschüüren hää loket, oober di server hää nian datei-dooten.',
+'api-error-nomodule' => 'Intern feeler: Diar as nian modul tu 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}}',
@@ -1900,4 +3759,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..a62ab15 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',
@@ -326,7 +325,6 @@ $messages = array(
 'disclaimers' => 'Avîs legâi',
 'disclaimerpage' => 'Project:Avîs gjenerâi',
 'edithelp' => 'Jutori pai cambiaments',
-'edithelppage' => 'Help:Cambiaments',
 'helppage' => 'Help:Contignûts',
 'mainpage' => 'Pagjine principâl',
 'mainpage-description' => 'Pagjine principâl',
@@ -546,12 +544,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)',
@@ -667,7 +666,6 @@ Leiende: (cur) = difarencis cun la version atuâl, (prec) = difarencis cun la ve
 'searchmenu-legend' => 'Opzions de ricercje',
 'searchmenu-exists' => "'''E je une pagjine di non \"[[:\$1]]\" su cheste wiki'''",
 'searchmenu-new' => "'''Cree la pagjine \"[[:\$1]]\" su cheste wiki!'''",
-'searchhelp-url' => 'Help:Contignûts',
 'searchprofile-articles' => 'Pagjinis di contignûts',
 'searchprofile-project' => 'Pagjinis di jutori e sul progjet',
 'searchprofile-images' => 'Multimedia',
@@ -703,17 +701,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 +926,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 +1033,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 +1112,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 +1130,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 +1148,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 +1244,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 +1281,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 +1471,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 +1522,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 +1540,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 +1556,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 +1625,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..040883f 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Geitost
  * @author Maartenvdbent
  * @author Purodha
  * @author Pyt
@@ -171,8 +172,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.',
@@ -369,7 +368,6 @@ $1",
 'disclaimers' => 'Foarbehâld',
 'disclaimerpage' => 'Project:Algemien foarbehâld',
 'edithelp' => 'Bewurk-help',
-'edithelppage' => 'Help:Bewurk-rie',
 'helppage' => 'Help:Help',
 'mainpage' => 'Haadside',
 'mainpage-description' => 'Haadside',
@@ -518,7 +516,7 @@ Mûglik wurdt noch in tal siden werjûn as wiene Jo oanmeld, oant Jo de cache fa
 'logout' => 'Ofmelde',
 'userlogout' => 'Ofmelde',
 'notloggedin' => 'Net oanmelde',
-'nologin' => "Noch net oanmelden as meidogger? '''$1'''.",
+'nologin' => 'Noch net oanmelden as meidogger? $1.',
 'nologinlink' => 'Meitsje in brûker oan',
 'createaccount' => 'Nije ynstellings oanmeitsje',
 'gotaccount' => "Hawwe jo jo al as meidogger oanmelde? '''$1'''.",
@@ -918,7 +916,6 @@ Prebearje in oare sykopdracht.',
 'searchmenu-legend' => 'Sykopsjes',
 'searchmenu-exists' => "'''Der is in side mei namme \"[[:\$1]]\" yn dizze wiki'''",
 'searchmenu-new' => "'''Meitsje de side \"[[:\$1]]\" yn dizze wiki!'''",
-'searchhelp-url' => 'Help:Help',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Sidenammen mei dit foarheaksel werjaan]]',
 'searchprofile-articles' => 'Ynhâldlike siden',
 'searchprofile-project' => 'Projektsiden',
@@ -960,14 +957,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',
@@ -1350,12 +1339,12 @@ PICT # ferskaat
 'upload-proto-error-text' => "Oanbieden mei dizze metoade freget URL's dy't begjinne mei <code>http://</code> of <code>ftp://</code>.",
 'upload-file-error' => 'Ynterne fout',
 'upload-file-error-text' => "Der wie in ynterne fout doe't in tydlike triem op'e server oanmakke waard.
-Nim kontakt op mei in [[Special:ListUsers/sysop|systeembehearder]].",
+Nim kontakt op mei in [[Special:ListUsers/sysop|behearder]].",
 'upload-misc-error' => 'Unbekende oanbiedfout',
 'upload-misc-error-text' => 'Der is by it oanbieden in ûnbekende fout optreden.
 Kontrolearje of de URL krekt en beskikber is en besykje it nochris.
 As it probleem oanhâldt, nim dan kontakt op mei in
-[[Special:ListUsers/sysop|systeembehearder]].',
+[[Special:ListUsers/sysop|behearder]].',
 'upload-unknown-size' => 'Unbekinde grutte',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2117,10 +2106,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 +2163,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 +2301,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..8b913ca 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',
@@ -326,7 +324,6 @@ $messages = array(
 'disclaimers' => 'Séanadh',
 'disclaimerpage' => 'Project:Séanadh_ginearálta',
 'edithelp' => 'Cabhair eagarthóireachta',
-'edithelppage' => 'Help:Eagarthóireacht',
 'helppage' => 'Help:Clár_ábhair',
 'mainpage' => 'Príomhleathanach',
 'mainpage-description' => 'Príomhleathanach',
@@ -787,7 +784,6 @@ Treoir: (rth) = difríocht ón leagan reatha, (rmh) = difríocht ón leagan roim
 'viewprevnext' => 'Taispeáin ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-legend' => 'Sainroghanna cuardaithe',
 'searchmenu-new' => "'''Cruthaigh an leathanach \"[[:\$1]]\" ar an vicí seo!'''",
-'searchhelp-url' => 'Help:Clár_ábhair',
 'searchprofile-articles' => 'Leathanaigh ábhair',
 'searchprofile-project' => 'Leathanaigh thionscadail agus cabhair',
 'searchprofile-images' => 'Ilmheáin',
@@ -823,14 +819,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 +1285,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 +1768,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 +1843,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 +1960,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 +2192,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..8d04b05 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',
@@ -290,7 +288,6 @@ $messages = array(
 'disclaimers' => 'Cuvapçılık reti',
 'disclaimerpage' => 'Project:Genel cuvapçılık reti',
 'edithelp' => 'Nesoy var nicä diiştirmää?',
-'edithelppage' => 'Help:Nesoy var nicä sayfa diiştirmää',
 'helppage' => 'Help:İçindekilär',
 'mainpage' => 'Baş yaprak',
 'mainpage-description' => 'Baş yaprak',
@@ -576,7 +573,6 @@ Nışannar: (bitki) = şindiki versiyalan aradaki fark,
 'prevn' => 'ilerki {{PLURAL:$1|$1}}',
 'nextn' => 'geeriki {{PLURAL:$1|$1}}',
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3).',
-'searchhelp-url' => 'Help:İçindekilär',
 'search-result-size' => '$1 ({{PLURAL:$2|1 laf|$2 laf}})',
 'search-redirect' => '(göndermää $1)',
 'search-section' => '(bölüm $1)',
@@ -797,7 +793,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..136a532 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' => '冇改动注解时要同偶话',
@@ -268,7 +266,6 @@ $1',
 'disclaimers' => '免责声明',
 'disclaimerpage' => 'Project:免责声明',
 'edithelp' => '编写帮助',
-'edithelppage' => 'Help:啷编写文章',
 'helppage' => 'Help:说明',
 'mainpage' => '封面',
 'mainpage-description' => '封面',
@@ -743,7 +740,6 @@ $2',
 'viewprevnext' => '眵吖($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''个只wiki已有一只叫「[[:$1]]」𠮶页。'''",
 'searchmenu-new' => "'''嘚个只wiki上建立「[[:$1]]」页!'''",
-'searchhelp-url' => 'Help:说明',
 'searchprofile-articles' => '内容页',
 'searchprofile-project' => '帮助同得计划页',
 'searchprofile-images' => '多媒体',
@@ -776,14 +772,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 +1259,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 +1846,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => '阔',
 'exif-imagelength' => '高',
 'exif-bitspersample' => '每像素byte数',
@@ -1972,7 +1960,7 @@ $1',
 'exif-gpsdatestamp' => 'GPS日期',
 'exif-gpsdifferential' => 'GPS差动修正',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => '冇压缩',
 
 'exif-unknowndate' => '未知𠮶日期',
@@ -2234,11 +2222,6 @@ $3
 'version-software' => '装正𠮶软件',
 'version-software-version' => '版本',
 
-# Special:FilePath
-'filepath' => '文件路径',
-'filepath-page' => '文件:',
-'filepath-submit' => '路径',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => '文件名:',
 'fileduplicatesearch-submit' => '寻',
index 95b292c..b66da51 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' => '不過意,箇隻伺服器到箇時間超吥最大負荷。
@@ -290,7 +288,6 @@ $1',
 'disclaimers' => '免責聲明',
 'disclaimerpage' => 'Project:免責聲明',
 'edithelp' => '編寫幫助',
-'edithelppage' => 'Help:啷編寫文章',
 'helppage' => 'Help:説明',
 'mainpage' => '封面',
 'mainpage-description' => '封面',
@@ -311,13 +308,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 +368,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 +471,8 @@ $2',
 'noemailprefs' => '話正隻email來用箇隻功能',
 'emailconfirmlink' => '確認倷嗰email',
 'invalidemailaddress' => '電子郵件地址嗰格式伓對,請輸隻對嗰電子郵件地址或者清吥箇隻輸入框。',
-'accountcreated' => '帳戶扤正嘍',
-'accountcreatedtext' => '扤正嘍$1嗰帳戶。',
+'accountcreated' => '帳戶舞正哩',
+'accountcreatedtext' => '舞正哩$1嗰帳戶。',
 'createaccount-title' => '到{{SITENAME}}創建嗰帳戶',
 'createaccount-text' => '有人到{{SITENAME}}用倷嗰電子郵件地址開設嘍隻名字係 "$2" 嗰新帳戶($4),密碼係 "$3" 。請倷仰上登錄同到修改密碼。
 
@@ -529,8 +526,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 +535,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 +565,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 +574,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 +632,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 +666,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 +685,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 +711,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 +749,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,10 +759,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' => "'''嘚箇隻wiki上建立「[[:$1]]」頁!'''",
-'searchhelp-url' => 'Help:説明',
+'searchmenu-new' => "'''到箇隻wiki上建立「[[:$1]]」頁!'''",
 'searchprofile-articles' => '內容頁',
 'searchprofile-project' => '幫助同得計劃頁',
 'searchprofile-images' => '多媒體',
@@ -798,14 +794,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 +806,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 +819,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 +889,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 +906,7 @@ $2',
 'rcshowhideanons' => '$1匿名用戶嗰編輯',
 'rcshowhidepatr' => '$1檢查過嗰編輯',
 'rcshowhidemine' => '$1我嗰編輯',
-'rclinks' => '顯示最晏$2日之內最新嗰$1回改動。<br />$3',
+'rclinks' => '顯示頂晏$2日之內頂新嗰$1回改動。<br />$3',
 'diff' => '差異',
 'hist' => '歷史',
 'hide' => '弆到',
@@ -939,8 +927,8 @@ $2',
 'recentchangeslinked-toolbox' => '連結頁嗰更改',
 'recentchangeslinked-title' => '連結頁嗰改動到 "$1"',
 'recentchangeslinked-noresult' => '箇段時間嗰連結頁冇更改。',
-'recentchangeslinked-summary' => "箇隻特殊頁列出箇頁連出去頁面嗰最晏改動(或係某隻分類嗰頁面)。
-[[Special:Watchlist|嗰監視列表]]頁面會用'''粗體'''顯到。",
+'recentchangeslinked-summary' => "箇隻特殊頁列出箇頁連出去頁面嗰頂晏嗰改動(或係某隻分類嗰頁面)。
+[[Special:Watchlist|嗰監視列表]]頁面會用'''粗體'''顯到。",
 'recentchangeslinked-page' => '頁面名子:',
 'recentchangeslinked-to' => '顯示連到搦出來嗰頁面',
 
@@ -995,7 +983,7 @@ $2',
 'uploadwarning' => '上傳警告',
 'savefile' => '保存檔案',
 'uploadedimage' => '上傳正哩"[[$1]]"',
-'overwroteimage' => 'ä¸\8aå\82³æ­£å\98\9e"[[$1]]"嗰新版本',
+'overwroteimage' => 'ä¸\8aå\82³æ­£å\93©"[[$1]]"嗰新版本',
 'uploaddisabled' => '上傳伓正',
 'uploaddisabledtext' => '上傳伓正文件到{{SITENAME}}。',
 'uploadscripted' => '箇隻檔案包到可能會誤導網絡瀏覽器錯誤解釋嗰 HTML 或腳本代碼。',
@@ -1005,7 +993,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 +1031,7 @@ $2',
 'filehist-help' => '按到日期/時間去眵吖許時間有過嗰檔案。',
 'filehist-deleteall' => '全部刪掉',
 'filehist-deleteone' => '刪吥箇隻',
-'filehist-revert' => '還原',
+'filehist-revert' => '還原',
 'filehist-current' => '眼前',
 'filehist-datetime' => '日期/時間',
 'filehist-thumb' => '縮圖',
@@ -1067,9 +1055,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 +1067,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 +1120,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 +1142,7 @@ $2',
 'withoutinterwiki-legend' => '前綴',
 'withoutinterwiki-submit' => '顯到',
 
-'fewestrevisions' => '改得少嗰文章',
+'fewestrevisions' => '改得少嗰文章',
 
 # Miscellaneous special pages
 'nbytes' => '$1字節',
@@ -1175,12 +1163,12 @@ $2',
 'popularpages' => '熱門頁面',
 'wantedcategories' => '等撰嗰分類',
 'wantedpages' => '等撰嗰頁面',
-'mostlinked' => '多連結嗰頁面',
-'mostlinkedcategories' => '多連結嗰分類',
-'mostlinkedtemplates' => '多連結嗰模板',
-'mostcategories' => '多分類嗰文章',
-'mostimages' => '連結多嗰圖像',
-'mostrevisions' => '最常改動嗰文章',
+'mostlinked' => '多連結嗰頁面',
+'mostlinkedcategories' => '多連結嗰分類',
+'mostlinkedtemplates' => '多連結嗰模板',
+'mostcategories' => '多分類嗰文章',
+'mostimages' => '連結多嗰圖像',
+'mostrevisions' => '頂多改動嗰文章',
 'prefixindex' => '首碼索引',
 'shortpages' => '短文章',
 'longpages' => '長文章',
@@ -1206,7 +1194,7 @@ $2',
 
 # Book sources
 'booksources' => '書籍來源',
-'booksources-search-legend' => '尋書籍來源',
+'booksources-search-legend' => '尋書籍來源',
 'booksources-go' => '跳到',
 'booksources-text' => '底下係一部分網絡書店嗰連結列表,可以提供到倷要找嗰書籍嗰更多資料:',
 
@@ -1273,8 +1261,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 +1281,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 +1330,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 +1348,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 +1366,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 +1393,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 +1425,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 +1448,7 @@ $1',
 
 # Namespace form on various pages
 'namespace' => '空間名:',
-'invert' => '倒得',
+'invert' => '倒得',
 'blanknamespace' => '(主要)',
 
 # Contributions
@@ -1482,7 +1470,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 +1517,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 +1526,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 +1547,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 +1575,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 +1607,7 @@ $1',
 'newtitle' => '新標題:',
 'move-watch' => '眏到箇頁',
 'movepagebtn' => '換卟箇頁',
-'pagemovedsub' => '移正å\98\9e',
+'pagemovedsub' => '移正å\93©',
 'movepage-moved' => "'''「$1」拕移到「$2」'''",
 'articleexists' => '已經有頁面叫箇隻名字,要伓倷揀嗰名字冇用。請揀過隻名字。',
 'cantmove-titleprotected' => '倷移伓正一隻頁面到箇隻位置,箇隻新題目已經拕保護起來嘞,新建伓正。',
@@ -1627,9 +1615,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 +1675,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 +1684,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 +1709,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 +1718,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 +1736,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 +1776,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 +1789,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 +1798,7 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'markedaspatrolled' => '標到係檢查過嗰',
 'markedaspatrolledtext' => '選正嗰版本標到係檢查過嗰。',
 'rcpatroldisabled' => '近來修改檢查拕關閉',
-'rcpatroldisabledtext' => '該朝子改動檢查嗰功能拕關閉嘞。',
+'rcpatroldisabledtext' => '該朝子改動檢查嗰功能拕關吥哩。',
 'markedaspatrollederror' => '標伓正佢係檢查過嗰',
 'markedaspatrollederrortext' => '倷要指正某隻版本才標得正佢係檢查過嗰。',
 'markedaspatrollederror-noautopatrol' => '倷標伓正倷自家嗰修改係檢查過嗰。',
@@ -1819,12 +1807,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 +1868,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => '闊',
 'exif-imagelength' => '高',
 'exif-bitspersample' => '每像素byte數',
@@ -1933,7 +1921,7 @@ $1',
 'exif-aperturevalue' => '光圈',
 'exif-brightnessvalue' => '亮度',
 'exif-exposurebiasvalue' => '曝光補償',
-'exif-maxaperturevalue' => '最大陸地光圈',
+'exif-maxaperturevalue' => '頂大嗰陸地光圈',
 'exif-subjectdistance' => '物距',
 'exif-meteringmode' => '測量模式',
 'exif-lightsource' => '光源',
@@ -1994,7 +1982,7 @@ $1',
 'exif-gpsdatestamp' => 'GPS日期',
 'exif-gpsdifferential' => 'GPS差動修正',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => '冇壓縮',
 
 'exif-unknowndate' => '未知嗰日期',
@@ -2141,15 +2129,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 +2154,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 +2202,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 +2244,6 @@ $3
 'version-software' => '裝正嗰軟件',
 'version-software-version' => '版本',
 
-# Special:FilePath
-'filepath' => '文件路徑',
-'filepath-page' => '文件:',
-'filepath-submit' => '路徑',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => '文件名:',
 'fileduplicatesearch-submit' => '尋',
index 09968d0..229c407 100644 (file)
@@ -276,7 +276,6 @@ $1",
 'disclaimers' => 'Aithrisean-àichidh',
 'disclaimerpage' => 'Project:Aithris-àichidh choitcheann',
 'edithelp' => 'Cobhair deasachaidh',
-'edithelppage' => 'Help:Deasachadh',
 'helppage' => 'Help:Susbaint',
 'mainpage' => 'Prìomh dhuilleag',
 'mainpage-description' => 'Prìomh dhuilleag',
@@ -572,10 +571,8 @@ 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 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}}',
 'passwordreset-username' => 'Ainm-cleachdaiche:',
 'passwordreset-domain' => 'Àrainn-lìn:',
 'passwordreset-capture' => "A bheil thu airson coimhead air a' phost-d?",
@@ -942,7 +939,6 @@ Feuch is [[Special:Search|lorg duilleagan ùra iomachaidh air an uici]]",
 '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",
@@ -1328,7 +1324,7 @@ Nochdaidh mùthaidhean a nithear air an duilleag seo \'s air an duilleag deasbai
 '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.",
+'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.',
index 99f2746..c2cd9d1 100644 (file)
@@ -11,6 +11,7 @@
  * @author Dferg
  * @author Elisardojm
  * @author Gallaecio
+ * @author Geitost
  * @author Gustronico
  * @author Kaganer
  * @author Lameiro
@@ -94,6 +95,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 +112,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 +124,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' ),
@@ -356,6 +360,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}}',
@@ -437,6 +453,7 @@ $messages = array(
 'create-this-page' => 'Crear esta páxina',
 'delete' => 'Borrar',
 'deletethispage' => 'Borrar esta páxina',
+'undeletethispage' => 'Restaurar esta páxina',
 'undelete_short' => 'Restaurar {{PLURAL:$1|unha edición|$1 edicións}}',
 'viewdeleted_short' => 'Ver {{PLURAL:$1|unha edición borrada|$1 edicións borradas}}',
 'protect' => 'Protexer',
@@ -490,7 +507,6 @@ $1',
 'disclaimers' => 'Advertencias',
 'disclaimerpage' => 'Project:Advertencia xeral',
 'edithelp' => 'Axuda de edición',
-'edithelppage' => 'Help:Como editar unha páxina',
 'helppage' => 'Help:Axuda',
 'mainpage' => 'Portada',
 'mainpage-description' => 'Portada',
@@ -639,6 +655,8 @@ $2',
 'namespaceprotected' => "Non dispón de permisos para modificar páxinas no espazo de nomes '''$1'''.",
 'customcssprotected' => 'Non dispón de permisos para modificar esta páxina de CSS, dado que contén a configuración persoal doutro usuario.',
 'customjsprotected' => 'Non dispón de permisos para modificar esta páxina de JavaScript, dado que contén a configuración persoal doutro usuario.',
+'mycustomcssprotected' => 'Non ten permiso para editar esta páxina de CSS.',
+'mycustomjsprotected' => 'Non ten permiso para editar esta páxina de JavaScript.',
 'ns-specialprotected' => 'Non se poden editar as páxinas no espazo de nomes "{{ns:special}}".',
 'titleprotected' => "Este título foi protexido da creación por [[User:$1|$1]].
 O motivo achegado é ''$2''.",
@@ -664,9 +682,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.',
@@ -679,18 +706,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.
@@ -750,7 +797,7 @@ Insira un enderezo cun formato válido ou baleire ese campo.',
 'cannotchangeemail' => 'Neste wiki non se poden mudar os enderezos de correo electrónico asociados a unha conta.',
 'emaildisabled' => 'Este sitio non pode enviar correos electrónicos.',
 'accountcreated' => 'Conta creada',
-'accountcreatedtext' => 'Creouse a conta de usuario para "$1".',
+'accountcreatedtext' => 'Creouse a conta de usuario para [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|conversa]]).',
 'createaccount-title' => 'Creación dunha conta para {{SITENAME}}',
 'createaccount-text' => 'Alguén creou unha conta chamada "$2" para o seu enderezo de correo electrónico en {{SITENAME}} ($4), e con contrasinal "$3".
 Debe acceder ao sistema e mudar o contrasinal agora.
@@ -776,8 +823,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',
@@ -785,14 +833,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-emaildisabled' => 'As funcións do correo electrónico están desactivadas neste wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Introduza un dos datos a continuación}}',
 'passwordreset-username' => 'Nome de usuario:',
 'passwordreset-domain' => 'Dominio:',
 'passwordreset-capture' => 'Quere ollar o correo electrónico?',
@@ -823,7 +872,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',
@@ -907,14 +956,14 @@ Teña en conta que non pode empregar a característica "Enviar un correo electr
 O seu enderezo IP actual é $3 e o ID do bloqueo é #$5.
 Por favor, inclúa eses datos nas consultas que faga.',
 'blockednoreason' => 'non se deu ningunha razón',
-'whitelistedittext' => 'Ten que $1 para poder editar páxinas.',
+'whitelistedittext' => 'Debe $1 para poder editar páxinas.',
 'confirmedittext' => 'Debe confirmar o correo electrónico antes de comezar a editar. Por favor, configure e dea validez ao correo mediante as súas [[Special:Preferences|preferencias de usuario]].',
 'nosuchsectiontitle' => 'Non se pode atopar a sección',
 'nosuchsectiontext' => 'Intentou editar unha sección que non existe.
 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.',
+'loginreqpagetext' => 'Debe $1 para poder ver outras páxinas.',
 'accmailtitle' => 'Enviouse o contrasinal',
 'accmailtext' => 'Un contrasinal xerado ao chou para "[[User talk:$1|$1]]" foi enviado a "$2".
 
@@ -939,8 +988,8 @@ O [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistro de borrad
 'blocked-notice-logextract' => 'Este usuario está bloqueado.
 Velaquí está a última entrada do rexistro de bloqueos, por se quere consultala:',
 'clearyourcache' => "'''Nota:''' Despois de gardar, cómpre limpar a memoria caché do seu navegador para ver os cambios.
-* '''Firefox / Safari:''' Prema ''Maiúsculas'' á vez que en ''Recargar'', ou prema en ''Ctrl-F5'' ou ''Ctrl-R'' (''⌘-R'' nos Mac)
-* '''Google Chrome:''' Prema en ''Ctrl-Shift-R'' (''⌘-Shift-R'' nos Mac)
+* '''Firefox/Safari:''' Prema ''Maiúsculas'' á vez que en ''Recargar'', ou prema en ''Ctrl-F5'' ou ''Ctrl-R'' (''⌘-R'' nos Mac)
+* '''Google Chrome:''' Prema en ''Ctrl-Maiús-R'' (''⌘-Maiús-R'' nos Mac)
 * '''Internet Explorer:''' Prema ''Ctrl'' ao tempo que fai clic en ''Refrescar'', ou prema en ''Ctrl-F5''
 * '''Opera:''' Limpe a súa memoria caché en ''Ferramentas → Preferencias''",
 'usercssyoucanpreview' => "'''Nota:''' Use o botón \"{{int:showpreview}}\" para verificar o novo CSS antes de gardalo.",
@@ -1037,6 +1086,7 @@ 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',
@@ -1044,7 +1094,7 @@ Esta xa existe.',
 '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 "{{int:prefs-editing}}" das súas preferencias.',
+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',
@@ -1286,7 +1336,6 @@ O [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistro de borrad
 'searchmenu-legend' => 'Opcións de busca',
 'searchmenu-exists' => "* Páxina \"'''[[\$1]]'''\"",
 'searchmenu-new' => "'''Crear a páxina \"[[:\$1]]\" neste wiki!'''",
-'searchhelp-url' => 'Help:Contidos',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Navegue polas páxinas que comezan coas mesmas iniciais]]',
 'searchprofile-articles' => 'Páxinas de contido',
 'searchprofile-project' => 'Páxinas do proxecto e de axuda',
@@ -1473,6 +1522,8 @@ 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.',
+'userrights-removed-self' => 'Retirou correctamente os seus propios dereitos. Polo tanto, xa non ten acceso a esta páxina.',
 
 # Groups
 'group' => 'Grupo:',
@@ -1540,9 +1591,13 @@ Ha de ter menos {{PLURAL:$1|dun carácter|de $1 caracteres}}.',
 'right-protect' => 'Trocar os niveis de protección e editar páxinas protexidas',
 'right-editprotected' => 'Editar páxinas protexidas (que non teñan protección en serie)',
 'right-editinterface' => 'Editar a interface de usuario',
-'right-editusercssjs' => 'Editar os ficheiros CSS e JS doutros usuarios',
+'right-editusercssjs' => 'Editar os ficheiros CSS e JavaScript doutros usuarios',
 'right-editusercss' => 'Editar os ficheiros CSS doutros usuarios',
-'right-edituserjs' => 'Editar os ficheiros JS doutros usuarios',
+'right-edituserjs' => 'Editar os ficheiros JavaScript doutros usuarios',
+'right-editmyusercss' => 'Editar os ficheiros CSS propios',
+'right-editmyuserjs' => 'Editar os ficheiros JavaScript propios',
+'right-viewmywatchlist' => 'Ver a lista de vixilancia propia',
+'right-editmywatchlist' => 'Editar a lista de vixilancia propia. Teña en conta que algunhas accións engadirán páxinas igualmente mesmo sen este dereito.',
 'right-rollback' => 'Reverter rapidamente as edicións do último usuario que editou unha páxina en particular',
 'right-markbotedits' => 'Marcar as edicións desfeitas como edicións dun bot',
 'right-noratelimit' => 'Non lle afectan os límites de frecuencia',
@@ -1604,6 +1659,8 @@ Ha de ter menos {{PLURAL:$1|dun carácter|de $1 caracteres}}.',
 'action-userrights-interwiki' => 'editar os permisos de usuario dos usuarios doutros wikis',
 'action-siteadmin' => 'bloquear ou desbloquear a base de datos',
 'action-sendemail' => 'enviar correos electrónicos',
+'action-editmywatchlist' => 'editar a súa lista de vixilancia',
+'action-viewmywatchlist' => 'ver a súa lista de vixilancia',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|modificación|modificacións}}',
@@ -1658,7 +1715,7 @@ As páxinas da súa [[Special:Watchlist|lista de vixilancia]] aparecen en '''neg
 'reuploaddesc' => 'Cancelar a carga e volver ao formulario de carga',
 'upload-tryagain' => 'Enviar a descrición do ficheiro modificada',
 'uploadnologin' => 'Non accedeu ao sistema',
-'uploadnologintext' => 'Debe [[Special:UserLogin|acceder ao sistema]] para poder cargar ficheiros.',
+'uploadnologintext' => 'Debe $1 para poder cargar ficheiros.',
 'upload_directory_missing' => 'Falta o directorio de carga ($1) e non pode ser creado polo servidor da páxina web.',
 'upload_directory_read_only' => 'O servidor web non pode escribir no directorio de carga ($1).',
 'uploaderror' => 'Erro ao cargar',
@@ -1795,11 +1852,11 @@ $1',
 '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.',
+Por favor, póñase en contacto cun [[Special:ListUsers/sysop|administrador]].',
 'upload-misc-error' => 'Erro de carga descoñecido',
 'upload-misc-error-text' => 'Ocorreu un erro descoñecido durante a carga.
 Comprobe que o enderezo URL é válido e accesible e, despois, inténteo de novo.
-Se o problema persiste, póñase en contacto cun [[Special:ListUsers/sysop|administrador]] do sistema.',
+Se o problema persiste, póñase en contacto cun [[Special:ListUsers/sysop|administrador]].',
 'upload-too-many-redirects' => 'O enderezo URL contiña moitas redireccións',
 'upload-unknown-size' => 'Tamaño descoñecido',
 'upload-http-error' => 'Produciuse un erro HTTP: $1',
@@ -2220,6 +2277,15 @@ Cómpre, polo menos, un dominio de nivel superior; por exemplo, "*.org".<br />
 'listusers-noresult' => 'Non se atopou ningún usuario.',
 'listusers-blocked' => '(bloqueado)',
 
+# Special:ActiveUsers
+'activeusers' => 'Lista de usuarios activos',
+'activeusers-intro' => 'Esta é unha lista cos usuarios que tiveron algún tipo de actividade {{PLURAL:$1|no último día|nos últimos $1 días}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|acción|accións}} {{PLURAL:$3|no último día|nos últimos $3 días}}',
+'activeusers-from' => 'Mostrar os usuarios que comecen por:',
+'activeusers-hidebots' => 'Agochar os bots',
+'activeusers-hidesysops' => 'Agochar os administradores',
+'activeusers-noresult' => 'Non se atopou ningún usuario.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Dereitos dun usuario segundo o seu grupo',
 'listgrouprights-summary' => 'A seguinte lista mostra os grupos de usuario definidos neste wiki, cos seus dereitos de acceso asociados.
@@ -2297,8 +2363,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}}.',
@@ -2402,8 +2468,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;
@@ -2876,6 +2942,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',
@@ -3030,7 +3098,6 @@ Pode ver o código fonte.',
 '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 */',
@@ -3200,11 +3267,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:
 
@@ -3233,7 +3314,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',
@@ -3411,7 +3492,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',
@@ -3835,12 +3916,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',
@@ -3932,6 +4018,7 @@ As imaxes móstranse na súa resolución completa; outros tipos de ficheiros in
 '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..ffd043d 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' => 'Προμήνυσόν με εἰ εἰσάγω κενὴν σύνοψιν μεταγραφῆς',
@@ -273,7 +271,6 @@ $1',
 'disclaimers' => 'Ἀποποιήσεις',
 'disclaimerpage' => 'Project:Γενικὴ ἀποποίησις',
 'edithelp' => 'Βοήθεια περὶ τοῦ μεταγράφειν',
-'edithelppage' => 'Help:Βοήθεια περὶ τοῦ μεταγράφειν',
 'helppage' => 'Help:Περιεχόμενα',
 'mainpage' => 'Κυρία Δέλτος',
 'mainpage-description' => 'Κυρία Δέλτος',
@@ -798,7 +795,6 @@ $1",
 'searchmenu-legend' => 'Ἐπιλογαὶ ζητήσεως',
 'searchmenu-exists' => "'''Ὑπάρχει δέλτος τις ὀνόματι \"[[:\$1]]\" ἐν τῷδε τῷ βίκι'''",
 'searchmenu-new' => "'''Ποιεῖν τὴν δέλτον \"[[:\$1]]\" ἐν τῷδε τῷ βίκι'''",
-'searchhelp-url' => 'Help:Περιεχόμενα',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ζήτησις δέλτων ἐχουσῶν τόδε τὸ πρόθεμα]]',
 'searchprofile-articles' => 'Δέλτοι περιεχομένων',
 'searchprofile-project' => 'Βοήθεια  καὶ δέλτοι ἐγχειρήματος',
@@ -839,14 +835,6 @@ $1",
 'powersearch-togglenone' => 'Οὐδέν',
 'search-external' => 'Ἐξωτέρα ἀναζήτησις',
 
-# Quickbar
-'qbsettings' => 'Ταχεῖα πρόσβασις',
-'qbsettings-none' => 'Οὐδέν',
-'qbsettings-fixedleft' => 'Σταθερὰ ἀριστερώς',
-'qbsettings-fixedright' => 'Σταθερὰ δεξιώς',
-'qbsettings-floatingleft' => 'Πλανώμενα αριστερώς',
-'qbsettings-floatingright' => 'Πλανώμενα δεξιώς',
-
 # Preferences page
 'preferences' => 'Προαιρέσεις',
 'mypreferences' => 'Αἱ προαιρέσεις μου',
@@ -1544,7 +1532,7 @@ $1",
 'notvisiblerev' => 'Ἀναθεώρησις διαγεγραμμένη',
 'watchnochange' => 'Οὐδὲν ἐκ τῶν ἐφορωμένων τεμαχίων σου μετεγράφη τῷ δεικνυμένῳ χρόνῳ.',
 'watchlist-details' => '{{PLURAL:$1|$1 δέλτος|$1 δέλτοι}} ἐφορωμέναι, ἄνευ τῶν δέλτων διαλέξεως περιλαμβανομένων.',
-'wlheader-enotif' => 'Σύστημα εἰδήσεως μέσῳ ἠλ-ἐπιστολῶν ἐνεργόν.',
+'wlheader-enotif' => 'Σύστημα εἰδήσεως μέσῳ ἠλ-ἐπιστολῶν ἐνεργόν.',
 'watchmethod-recent' => 'ἐλέγχειν προσφάτους μεταγραφὰς περὶ ἐφορωμένων δέλτων',
 'watchmethod-list' => 'ἐλέγχειν ἐφορωμένας δέλτους περὶ μεταγραφὰς προσφάτους',
 'watchlistcontains' => 'Ἡ ἐφοροδιαλογὴ σου περιέχει $1 {{PLURAL:$1|δέλτον|δέλτους}}.',
@@ -2197,7 +2185,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Πλάτος',
 'exif-imagelength' => 'Ὕψος',
 'exif-bitspersample' => 'Δυφία ἀνὰ συνιστῶσαν',
@@ -2319,7 +2307,7 @@ $1',
 'exif-label' => 'Ἐπιγραφή',
 'exif-disclaimer' => 'Ἀποποίησις εὐθύνης',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ἀσυμπίεστος',
 
 'exif-copyrighted-true' => 'Ὑποκείμενον έν δικαιώμασιν',
@@ -2614,11 +2602,6 @@ $5
 'version-software-product' => 'Προϊόν',
 'version-software-version' => 'Ἔκδοσις',
 
-# Special:FilePath
-'filepath' => 'Διαδρομὴ ἀρχείου',
-'filepath-page' => 'Ἀρχεῖον:',
-'filepath-submit' => 'Ἰέναι',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Ζήτησις διπλότυπων ἀρχείων',
 'fileduplicatesearch-summary' => 'Ζητεῖν διπλότυπα ἀρχεῖα βάσει κερματιζομένων τιμῶν.',
index e38cb95..d6d3511 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',
@@ -374,7 +374,6 @@ Di maximal Wartezyt fir e Lock isch umme',
 'disclaimers' => 'Impressum',
 'disclaimerpage' => 'Project:Impressum',
 'edithelp' => 'Rotschläg fir s Bearbeite',
-'edithelppage' => 'Help:Ändere',
 'helppage' => 'Help:Hilf',
 'mainpage' => 'Houptsyte',
 'mainpage-description' => 'Houptsyte',
@@ -553,7 +552,7 @@ Ochat: s cha syy, ass bstimmti Syte eso aazeigt wäre, wie wänn Du allno aagmä
 'logout' => 'Abmälde',
 'userlogout' => 'Abmälde',
 'notloggedin' => 'Nit aagmäldet',
-'nologin' => "No kei Benutzerkonto? '''$1'''.",
+'nologin' => 'No kei Benutzerkonto? $1.',
 'nologinlink' => '»Konto aaleege«',
 'createaccount' => 'Nöis Benutzerkonto aalege',
 'gotaccount' => "Du häsch scho a Konto? '''$1'''",
@@ -654,10 +653,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 +890,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',
@@ -1128,7 +1127,6 @@ Einzelheite chasch im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'searchmenu-legend' => 'Suechoptione',
 'searchmenu-exists' => "* Syte '''[[$1]]'''",
 'searchmenu-new' => "'''[[:$1|Leg d Syte ''$1'' in dem Wiki aa!]]'''",
-'searchhelp-url' => 'Help:Hilf',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Zeige alli Syte, wu mit dem Suechbegriff aafange]]',
 'searchprofile-articles' => 'Inhaltssyte',
 'searchprofile-project' => 'Hilf- un Projäktsyte',
@@ -1170,15 +1168,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 +1706,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 +2105,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 +2952,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 +3130,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 +3539,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 4a90c60..c901c3d 100644 (file)
@@ -148,6 +148,8 @@ $digitTransformTable = array(
 
 $digitGroupingPattern = "##,##,###";
 
+$linkTrail = '/^((?:[a-z]|ક્|ખ્|ગ્|ઘ્|ચ્|છ્|જ્|ઝ્|ટ્|ઠ્|ડ્|ઢ્|ણ્|ત્|થ્|દ્|ધ્|ન્|પ્|ફ્|બ્|ભ્|મ્|ય્|ર્|લ્|વ્|સ્|શ્|ષ્|હ્|ળ્|ક્ષ્|જ્ઞ્|અ|આ|ઇ|ઈ|ઉ|ઊ|એ|ઐ|ઓ|ઔ|અં|અઃ|અઁ|ઍ|ઑ|ઋ|ઁ|઼|।|્|ા|િ|ી|ુ|ૂ|ે|ૈ|ો|ૌ|ં|ઃ|ઁ|ૅ|ૉ|ૃ)+)(.*)$/sDu';
+
 $messages = array(
 # User preference toggles
 'tog-underline' => 'કડીઓની નીચે લીટી (અંડરલાઇન) ઉમેરો:',
@@ -156,7 +158,7 @@ $messages = array(
 'tog-hidepatrolled' => 'હાલના સલામતી માટે કરવામાં આવેલાં થયેલા ફેરફારો છુપાવો.',
 'tog-newpageshidepatrolled' => 'નવાં પાનાંની યાદીમાંથી દેખરેખ હેઠળનાં પાનાં છુપાવો',
 'tog-extendwatchlist' => 'ધ્યાનસૂચિને વિસ્તૃત કરો જેથી,ફક્ત તાજેતરનાજ નહીં, બધા આનુષાંગિક ફેરફારો જોઇ શકાય',
-'tog-usenewrc' => 'તાàª\9cà«\87તરનાàª\82 àªµàª°à«\8dધિત àª«à«\87રફારà«\8b àªµàª¾àªªàª°à«\8b(જાવાસ્ક્રીપ્ટ જરૂરી)',
+'tog-usenewrc' => 'તાàª\9cા àª«à«\87રફારà«\8bમાàª\82 àª\85નà«\87 àª§à«\8dયાનસà«\82àª\9aિમાàª\82 àª«à«\87રફારà«\8bનà«\87 àªªàª¾àª¨àª¾àª\82 àª\85નà«\81સાર àª\9cà«\82થમાàª\82 àª\97à«\8bઠવà«\8b (જાવાસ્ક્રીપ્ટ જરૂરી)',
 'tog-numberheadings' => 'મથાળાંઓને આપો-આપ ક્રમ (ઑટો નંબર) આપો',
 'tog-showtoolbar' => 'ફેરફારો માટેનો ટૂલબાર બતાવો (જાવા સ્ક્રિપ્ટ)',
 'tog-editondblclick' => 'ડબલ ક્લિક દ્વારા ફેરફાર કરો (જાવાસ્ક્રિપ્ટ જરૂરી)',
@@ -164,7 +166,7 @@ $messages = array(
 'tog-editsectiononrightclick' => 'વિભાગના મથાળાં ને રાઇટ ક્લિક દ્વારા ફેરફાર કરવાની રીત અપનાવો. (જાવાસ્ક્રિપ્ટ જરૂરી)',
 'tog-showtoc' => 'અનુક્રમણિકા દર્શાવો (૩થી વધુ પેટા-મથાળા વાળા લેખો માટે)',
 'tog-rememberpassword' => 'આ કમ્પ્યૂટર પર મારી લોગ-ઇન વિગતો યાદ રાખો (મહત્તમ $1 {{PLURAL:$1|દિવસ|દિવસ}} માટે)',
-'tog-watchcreations' => 'મà«\87àª\82 àª\89મà«\87રà«\87લા àªªàª¾àª¨àª¾àª\82àª\93 àª\85નà«\87 àª\85પલà«\8bડ àª\95રà«\87લ àª«àª¾àª\87લà«\8dસ મારી ધ્યાનસૂચિમાં ઉમેરો',
+'tog-watchcreations' => 'મà«\87àª\82 àª¬àª¨àª¾àªµà«\87લાàª\82 àªªàª¾àª¨àª¾àª\82 àª\85નà«\87 àª\85પલà«\8bડ àª\95રà«\87લà«\80 àª«àª¾àª\87લà«\8b મારી ધ્યાનસૂચિમાં ઉમેરો',
 'tog-watchdefault' => 'હું ફેરફાર કરૂં તે પાનાં અને ફાઇલ્સ મારી ધ્યાનસૂચિમાં ઉમેરો',
 'tog-watchmoves' => 'હું ખસેડું તે પાનાં અને ફાઇલ્સ મારી ધ્યાનસૂચિમાં ઉમેરો',
 'tog-watchdeletion' => 'હું દૂર કરું તે પાનાં અને ફાઇલ્સ મારી ધ્યાનસૂચિમાં ઉમેરો',
@@ -257,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|શ્રેણી|શ્રેણીઓ}}',
@@ -277,7 +291,7 @@ $messages = array(
 'noindex-category' => 'અનુક્રમણિકા નહી બનાવેલા પાનાં',
 'broken-file-category' => 'ફાઇલોની ત્રૂટક કડીઓવાળાં પાનાં',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^(.*?)((?:[a-zA-Z\\x80-\\xff]|ક્|ખ્|ગ્|ઘ્|ચ્|છ્|જ્|ઝ્|ટ્|ઠ્|ડ્|ઢ્|ણ્|ત્|થ્|દ્|ધ્|ન્|પ્|ફ્|બ્|ભ્|મ્|ય્|ર્|લ્|વ્|સ્|શ્|ષ્|હ્|ળ્|ક્ષ્|જ્ઞ્|અ|આ|ઇ|ઈ|ઉ|ઊ|એ|ઐ|ઓ|ઔ|અં|અઃ|અઁ|ઍ|ઑ|ઋ|ઁ|઼|।|્|ા|િ|ી|ુ|ૂ|ે|ૈ|ો|ૌ|ં|ઃ|ૅ|ૉ|ૃ)+)$/sD',
 
 'about' => 'વિષે',
 'article' => 'લેખનું પાનું',
@@ -396,7 +410,6 @@ $1',
 'disclaimers' => 'જાહેર ઇનકાર',
 'disclaimerpage' => 'Project:સામાન્ય જાહેર ઇનકાર',
 'edithelp' => 'ફેરફારો માટે મદદ',
-'edithelppage' => 'Help:ફેરફાર',
 'helppage' => 'Help:સૂચિ',
 'mainpage' => 'મુખપૃષ્ઠ',
 'mainpage-description' => 'મુખપૃષ્ઠ',
@@ -570,9 +583,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' => 'તમે આ વિકિ માટે પાસવર્ડ્સ બદલી શકતા નથી.',
@@ -585,18 +607,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' => 'દાખલ કરેલું સભ્ય નુ નામ વપરાશમાં છે.</br>
+'userexists' => 'દાખલ કરેલું સભ્યનામ વપરાશમાં છે.</br>
 કૃપયા અન્ય નામ પસંદ કરો.',
 'loginerror' => 'પ્રવેશ ત્રુટિ',
+'createacct-error' => 'ખાતું બનાવવામાં ક્ષતિ આવી',
 'createaccounterror' => 'ખાતું ખોલી શકાયું નથી: $1',
 'nocookiesnew' => 'તમારુ સભ્ય ખાતું બની ગયું છે પણ તમે પ્રવેશ (લોગ ઇન) કર્યો નથી.
 
@@ -640,8 +682,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 સમયે પ્રમાણિત કરેલું છે.',
@@ -691,27 +733,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' => 'કોઈક (કદાચ તમો , $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
 
@@ -720,7 +762,7 @@ $2
 કામચલાઉ પાસવર્ડ: $2',
 'passwordreset-emailsent' => 'પાસવર્ડ બદલવાનો ઇમેલ મોકલવામાં આવ્યો છે.',
 'passwordreset-emailsent-capture' => 'પાસવર્ડ બદલવાનો ઇમેલ મોકલવામાં આવ્યો છે, જે નીચે પ્રમાણે છે.',
-'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-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' => 'ઈ મેલ ખાતુ બદલવા માટે',
@@ -896,7 +938,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' => "'''ચેતવણી : આ પાના પર સંરક્ષણ વિકલ્પ સક્રીય છે અને માત્ર પ્રબંધકો જ આમાં ફેરફાર કરી શકે.'''
@@ -1172,7 +1214,6 @@ $1",
 'searchmenu-legend' => 'શોધ વિકલ્પો',
 'searchmenu-exists' => "''' આ વિકિ પર  \"[[:\$1]]\" નામે પાનું પહેલેથી અસ્તિત્વમાં છે.'''",
 'searchmenu-new' => "'''આ વિકિ પર \"[[:\$1]]\" નામે પાનું બનાવો!'''",
-'searchhelp-url' => 'Help:સૂચિ',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|આ પૂર્વાક્ષર વાળા પાનાં જુઓ]]',
 'searchprofile-articles' => 'લેખનું પાનું',
 'searchprofile-project' => 'મદદ અને યોજના પાનું',
@@ -1296,7 +1337,7 @@ $1",
 'prefs-emailconfirm-label' => 'ઇ-મેલ પુષ્ટી',
 'prefs-textboxsize' => 'ફેરફાર ફલકનું માપ',
 'youremail' => 'ઇ-મેઇલ:',
-'username' => '{{GENDER:$1|સભ્ય નામ}}:',
+'username' => '{{GENDER:$1|સભ્યનામ}}:',
 'uid' => '{{GENDER:$1|સભ્ય}} ઓળખ:',
 'prefs-memberingroups' => '{{PLURAL:$1|સમુહ|સમુહો}}ના {{GENDER:$2|સભ્ય}}:',
 'prefs-registration' => 'નોંધણી સમય',
@@ -1992,7 +2033,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'usereditcount' => '$1 {{PLURAL:$1|ફેરફાર|ફેરફારો}}',
 'usercreated' => '$1 તારીખે $2 વાગ્યે {{GENDER:$3|બનાવ્યું}}',
 'newpages' => 'નવાં પાનાં',
-'newpages-username' => 'સભ્ય નામ:',
+'newpages-username' => 'સભ્યનામ:',
 'ancientpages' => 'સૌથી જૂનાં પાનાં',
 'move' => 'નામ બદલો',
 'movethispage' => 'આ પાનું ખસેડો',
@@ -2070,7 +2111,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' => 'યજમાન નામની શરૂઆતમાં જ વાઈલ્ડકાર્ડ પ્રકટ થશે',
 
@@ -2080,6 +2121,15 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'listusers-noresult' => 'કોઇ સભ્ય ન મળ્યો',
 'listusers-blocked' => '(પ્રતિબંધિત)',
 
+# Special:ActiveUsers
+'activeusers' => 'સક્રિય સભ્યોની યાદી',
+'activeusers-intro' => 'છેલ્લા  $1 {{PLURAL:$1|દિવસ|દિવસો}}માં જે સભ્યોએ કંઈક યોગદાન કર્યું હોય તેમની યાદી.',
+'activeusers-count' => '$1 {{PLURAL:$1|ફેરફાર|ફેરફારો}} છેલ્લા {{PLURAL:$3|દિવસ |$3 દિવસો }}માં',
+'activeusers-from' => 'આનાથી શરૂ થતા સભ્યો દર્શાવો:',
+'activeusers-hidebots' => 'બોટને છુપાવો',
+'activeusers-hidesysops' => 'પ્રબંધકો છુપાવો',
+'activeusers-noresult' => 'કોઇ સક્રીય સભ્ય ન મળ્યો',
+
 # Special:ListGroupRights
 'listgrouprights' => 'સભ્ય જૂથ ના હક્કો',
 'listgrouprights-summary' => 'નીચે આ વિકિ પર વ્યાખ્યાયિત સભ્ય જૂથોની યાદી, તેમની સાથે સંકળાયેલા હક્કો સાથે આપી છે.
@@ -2157,8 +2207,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|પાનું|પાનાં}} છે.',
@@ -2620,7 +2670,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ય.
+એ વાતની નોંધ લેશો કે, જો તમે પસંદ કરેલા નવા નામ વાળું પાનું અસ્તિત્વમાં હશે તો જુનું પાનું '''નહી ખસે''', સિવાયકે તે પણ અન્યત્ર વાળતું પાનું હોય અને તેનો કોઈ ઇતિહાસ ના હોય.
 આનો અર્થ એમ થાય છે કે જો તમે કોઈ તબક્કે ભુલ કરશો તો જે પાનાનું નામ બદલવાનો પ્રયત્ન કરતા હોવ તેને તમે ફરી પાછા જુના નામ પર જ પાછું વાળી શકશો, અને બીજું કે પહેલેથી બનેલા પાનાનું નામ તમે નામફેર કરવા માટે ના વાપરી શકો.
 
 '''ચેતવણી!'''
@@ -2935,6 +2985,7 @@ $1',
 'pageinfo-robot-noindex' => 'અનુક્રમિય નહી',
 'pageinfo-views' => 'જોનારાની સંખ્યા',
 'pageinfo-watchers' => 'પાના નીરીક્ષકોની સંખ્યા',
+'pageinfo-redirects-name' => 'આ પાનાં પર વાળો',
 'pageinfo-subpages-name' => 'આ પાનાંનું ઉપપાનું',
 'pageinfo-firstuser' => 'પૃષ્ઠ સર્જક',
 'pageinfo-firsttime' => 'પૃષ્ઠ સર્જનની તારીખ',
@@ -2943,6 +2994,8 @@ $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' => 'હા',
@@ -3023,6 +3076,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' => 'ફોર્મેટ નીચે મુજબ છે:
 
@@ -3052,7 +3115,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'પહોળાઈ',
 'exif-imagelength' => 'ઊંચાઈ',
 'exif-bitspersample' => 'બીટ્સ પ્રતિ ભાગ',
@@ -3230,7 +3293,7 @@ $1',
 'exif-originalimageheight' => 'છબી પર ફેરફાર કર્યા પહેલા ની ઊંચાઈ',
 'exif-originalimagewidth' => 'છબી પર ફેરફાર કર્યા પહેલા ની પહોળાઈ',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'અસંકોચિત',
 'exif-compression-2' => 'CCITT સમુદાય ૩ ૧-પરિમાણિય ફેરફાર કરેલુ Huffman રન લંબઈ એન્કોડિંગ',
 'exif-compression-3' => 'CCITT સમૂહ 3 ફેક્સ ઍનકોડિંગ',
@@ -3638,12 +3701,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' => 'નકલ ફાઇલ શોધો',
@@ -3734,23 +3798,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' => 'વપરાશકર્તા નામ છુપાયેલા',
@@ -3759,7 +3826,7 @@ $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 પર વાળ્યું પણ પાછળ દિશાનિર્દેશન છોડ્યું નહી',
@@ -3802,6 +3869,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' => 'આ પ્રકારની ફાઈલ પ્રતિબંધિત છે.',
@@ -3821,6 +3889,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..a0b7895 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',
@@ -250,7 +251,6 @@ $messages = array(
 'disclaimers' => 'Jiooldeyderyn',
 'disclaimerpage' => 'Project:Obbalys cadjin',
 'edithelp' => 'Cooney reaghee',
-'edithelppage' => 'Help:Reaghey',
 'helppage' => 'Help:Cummal',
 'mainpage' => 'Ard-ghuillag',
 'mainpage-description' => 'Ard-ghuillag',
@@ -500,6 +500,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',
@@ -571,7 +573,6 @@ Ogher: '''({{int:cur}})''' = anchaslyssyn rish y lhieggan t'ayn nish,
 'prevn' => '{{PLURAL:$1|$1}} roish shoh',
 'nextn' => 'nah {{PLURAL:$1|$1}}',
 'viewprevnext' => 'Jeeagh er ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:Cummal',
 'searchprofile-project' => 'Duillagyn Coonee as Shalee',
 'search-result-size' => "$1 ({{PLURAL:$2|1 fockle|$2 'ockle|$2 'ockle|$2 focklyn}})",
 'search-result-score' => 'Bentynys: $1%',
@@ -594,9 +595,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 +1351,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 +1449,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..78be061 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' => '編寫幫手',
+'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]]”!'''",
+'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]]',
-'protect-legend' => 'Khok-ngin pó-fu',
-'protectcomment' => 'Ngièn-yîn:',
-'protectexpiry' => 'Chûng-chṳ́ sṳ̀-kiên',
-'protect_expiry_invalid' => 'Sû-ngi̍p ke chûng-chṳ́ sṳ̀-kiên mò-háu.',
-'protect_expiry_old' => 'Chûng-chṳ́ sṳ̀-kiên yí-kîn ko-hi.',
-'protect-text' => "Ngì khó-yî chhai liá-piên chhùng-siû tui vùn-chông '''$1''' ke pó-fu kip-phe̍t.",
-'protect-locked-blocked' => "Ngì put-nèn chhai pûn chhà-fûng sṳ̀ kiên-kói pó-fu khi̍p-phe̍t. Yî-ha he '''$1''' hien-sṳ̀ ke pó-fu khi̍p-phe̍t:",
-'protect-locked-dblock' => "Chhai chṳ̂-liau-khu só-thin sṳ̀ mò-fap kiên-kói pó-fu khi̍p-phe̍t.
-Yî-ha he '''$1''' hien-sṳ̀ ke pó-fu khi̍p-phe̍t:",
-'protect-locked-access' => "Ngì-ke chong-fu khièn-han put-nèn kói-chho pó-fu khi̍p-phe̍t, Yî-ha he '''$1''' hien-sṳ̀ ke pó-fu khi̍p-phe̍t:",
-'protect-cascadeon' => 'Yî-ha ke {{PLURAL:$1|yit-ke|tô-ke}} hong-mien pâu-hàm pún vùn-chông ke thùng-sṳ̀, khí-thung liáu lièn-só pó-fu, só-yî pún vùn-chông muk-chhièn ya-he pûn pó-fu, vù-nèn phiên-siá. Ngì hí-khó sat-thin pún hong-mien ke pó-fu khi̍p-phe̍t, than liá put tui lièn-só pó-fu yû yáng-hióng.',
-'protect-default' => 'Yùng-chún só-yû yung-fu',
+'protect-title' => '更改“$1”嘅保護等級',
+'prot_1movedto2' => '[[$1]]移動到[[$2]]',
+'protect-legend' => '確認保護',
+'protectcomment' => '理由:',
+'protectexpiry' => '到期:',
+'protect_expiry_invalid' => '輸入嘅終止時間無效。',
+'protect_expiry_old' => '終止時間既經過去。',
+'protect-text' => "汝做得在邇位瀏覽同修改對頁面'''$1'''嘅保護級別。",
+'protect-locked-blocked' => "汝做毋得在分查封時更改保護級別。
+下背係'''$1'''今下嘅保護級別:",
+'protect-locked-dblock' => "在數據庫鎖定時無法更改保護級別。
+下背係'''$1'''今下嘅保護級別:",
+'protect-locked-access' => "汝嘅賬戶權限做毋得修改保護級別。
+下背係'''$1'''今下嘅保護級別:",
+'protect-cascadeon' => '下背嘅{{PLURAL:$1|一個|多個}}頁面包含緊本頁面嘅同時,啟動矣連鎖保護,故所本頁面目前也分保護,還吂做得編寫。汝做得設定本頁面嘅保護級別,毋過邇並不會對連鎖保護有所影響。',
+'protect-default' => '容許所有用戶',
 'protect-fallback' => 'Sî-yeu "$1" ke hí-khó',
 'protect-level-autoconfirmed' => 'Kim-chṳ́  sîn-ke lâu hàn-mò chu-chhak ke yung-fu',
 'protect-level-sysop' => 'Kón-lî-yèn chôn-cho',
-'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-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:',
-'minimum-size' => 'Chui-séu thai-séu',
-'maximum-size' => 'Chui-thai thai-séu:',
-'pagesize' => '(Vi-ngièn-chû)',
+'protect-summary-cascade' => '連鎖',
+'protect-expiring' => '終止於$1(UTC)',
+'protect-cascade' => '保護本頁中包含嘅頁面(連鎖保護)',
+'protect-cantedit' => '汝無法更改邇隻頁面嘅保護等級,因為汝無權限去編寫其。',
+'protect-expiry-options' => '1小時:1 hour,1天:1 day,1周:1 week,2周:2 weeks,1隻月:1 month,3隻月:3 months,6隻月:6 months,1年:1 year,永久:infinite',
+'restriction-type' => '權限:',
+'restriction-level' => '限制級別:',
+'minimum-size' => '最細大細',
+'maximum-size' => '最大大細:',
+'pagesize' => '(字節)',
 
 # Restrictions (nouns)
-'restriction-edit' => 'Phiên-siá',
-'restriction-move' => 'Yì-thung',
-'restriction-create' => 'Tshóng-kien',
+'restriction-edit' => '編寫',
+'restriction-move' => '移動',
+'restriction-create' => '建立',
 
 # Restriction levels
-'restriction-level-sysop' => 'Chhiòn pó-fu',
-'restriction-level-autoconfirmed' => 'Pan pó-fu',
-'restriction-level-all' => 'Ngim-hò khi̍p-phe̍t',
+'restriction-level-sysop' => '全保護',
+'restriction-level-autoconfirmed' => '半保護',
+'restriction-level-all' => '任何級別',
 
 # Undelete
-'undelete' => 'Fî-fu̍k pûn chhù-hi vùn-chông',
-'undeletepage' => 'Fî-fu̍k pûn chhù-thet vùn-chông',
-'viewdeletedpage' => 'Kiám-sṳ pûn chhù-thet ke vùn-chông',
+'undelete' => '恢復分刪頁面',
+'undeletepage' => '瀏覽及恢復分刪頁面',
+'viewdeletedpage' => '查看分刪除嘅頁面',
 'undeletepagetext' => 'Yî-ha vùn-chông yí-kîn pûn chhù-thet, than yî-yèn chhai tóng-on chûng pin khó-yî pûn fî-fu̍k. Tóng-on-khu khó-nèn pûn thin-sṳ̀ chhîn-lî.',
 'undeleteextrahelp' => "Fî-fu̍k cháng-ke vùn-chông sṳ̀, chhiáng chhîn-chhù só-yû fu̍k-sién khiông-heu on '''''fî-fu̍k'''''.  Fî-fu̍k thi̍t-thin pán-pún sṳ̀, chhiáng sién-chet siông-yin pán-pún chhièn-ke fu̍k-sién khiông-heu on '''''fî-fu̍k'''''. On '''''chhûng-sat''''' chiông chhîn-chhù phìn-lun nui-yùng khi̍p só-yû fu̍k-sién khiông.",
-'undeleterevisions' => '$1 pán-pún chhùn-tong',
+'undeleterevisions' => '$1版本存檔',
 'undeletehistory' => 'Kó-yèn ngì fî-fu̍k liáu ke-vùn-chông, só-yû pán-pún chiông-voi pûn fî-fu̍k to siû-thin li̍t-sṳ́ chûng. Kó-yèn pún-chông chhù-hi heu yû yit-ke thùng-miàng ke sîn vùn-chông kien-li̍p, pûn fî-fu̍k ke pán-pún chiông-voi chhṳ̂n-vi kha-sîn ke li̍t-sṳ́, sîn vùn-chông ke tong-chhièn pán-pún chiông mò-fap pûn chhṳ-thung fu̍k-ngièn.',
 'undeleterevdel' => 'Kó-yèn pá chui-sîn siû-thin phu-fun chhù-thet, fán chhù-hi phien mò-fap chin-hàng. Kó-yèn ngi-to liá-chúng chhìn-khóng, ngì pit-sî fán-sién fe̍t-chá fán-chhòng chui-sîn yí-kîn chhù-hi ke siû-thin. Tui-yî ngì mò-yû khièn-han hi kiám-sṳ ke siû-thin he mò-fap fî-fu̍k ke.',
-'undeletehistorynoadmin' => 'Liá-ke vùn-chông yí-kîn pûn chhù-thet, chhù-hi ngièn-yîn hién-sṳ chhai hâ-fông phiên-si̍p chak-yeu chûng.
-Pûn chhù-thet chhièn ke só-yû siû-thin pán-pún, lièn-thùng chhù-thet chhièn kung-hien yung-fu tén-tén se-chiet chṳ́-yû kón-lî-yèn khó-yî khon-kien.',
+'undeletehistorynoadmin' => '邇隻頁面已經分刪除,刪除原因顯示在下方編寫摘要肚。分刪除前嘅所有修訂版本,連同刪除前貢獻用戶等等細節單淨管理員做得看見。',
 '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',
-'undeletereset' => 'Chhùng-sat',
+'undeleterevision-missing' => '無效或者丟失嘅修訂版本。汝可能使用矣有差錯嘅鏈接,或者本修訂版本既經分從存檔肚恢復或移除。',
+'undeletebtn' => '恢復',
+'undeletelink' => '查看/恢復',
+'undeleteviewlink' => '查看',
+'undeletereset' => '重設',
 'undeletecomment' => 'Ngièn-yîn:',
-'undeletedrevisions' => '$1-ke siû-thin pán-pún yí-kîn fî-fu̍k',
-'undeletedrevisions-files' => '$1-ke pán-pún lâu $2-ke vùn-khien pûn fî-fu̍k',
-'undeletedfiles' => '$1-ke vùn-khien pûn fî-fu̍k',
+'undeletedrevisions' => '$1隻修訂版本已經恢復',
+'undeletedrevisions-files' => '$1隻版本撈$2隻文件分恢復',
+'undeletedfiles' => '$1隻文件分恢復',
 'cannotundelete' => 'Fî-fu̍k sṳt-phai; khó-nèn chṳ̂-chhièn yí-kîn pûn khì-thâ-ngìn fî-fu̍k.',
-'undeletedpage' => "'''$1 yí-kîn pûn fî-fu̍k '''
-
-Chhiáng chhâm-kháu [[Special:Log/delete|chhù-hi ngit-ki]] lòi chhà-chhut chhù-thet khi̍p fî-fu̍k ki-liu̍k.",
-'undelete-header' => 'Kó-yèn yeu chhà-chhut chui-khiûn ke ki-liu̍k chhiáng chhâm-siòng [[Special:Log/delete|Chhù-thet ngit-ki]].',
-'undelete-search-box' => 'Chhìm-cháu yí-kîn chhù-hi vùn-chông',
-'undelete-search-prefix' => 'Hién-sṳ vùn-chông chhṳ:',
-'undelete-search-submit' => 'Chhìm-cháu',
-'undelete-no-results' => 'Chhù-thet ki-liu̍k lî mò-yû fù-ha̍p ke kiet-kó.',
+'undeletedpage' => "'''$1已經分恢復''' 請參考[[Special:Log/delete|刪除日誌]]來查詢刪除撈恢復記錄。",
+'undelete-header' => '假使愛查詢最近嘅記錄請參看[[Special:Log/delete|刪除日誌]]。',
+'undelete-search-box' => '搜尋已刪除頁面',
+'undelete-search-prefix' => '展示頁面自:',
+'undelete-search-submit' => '搜尋',
+'undelete-no-results' => '刪除記錄肚無符合嘅結果。',
 
 # 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]].',
-'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í',
+'whatlinkshere' => '鏈接入頁面',
+'whatlinkshere-title' => '鏈接到“$1”嘅頁面',
+'whatlinkshere-page' => '頁面:',
+'linkshere' => '下背頁面鏈接到[[:$1]]:',
+'nolinkshere' => "無頁面鏈接到'''[[:$1]]'''。",
+'nolinkshere-ns' => '在所選嘅名字空間肚無頁面連接到[[:$1]]。',
+'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',
-'blockiptext' => 'Yung ha-mien ke péu-tân kim-chṳ́ lòi-chhṳ mêu-yit thi̍t-thin IP thi-tiám ke kiên-kói hí-khó-khièn. Chṳ́-yû chhai-vi fòng-chṳ́ pho-fái, khi̍p fù-ha̍p [[{{MediaWiki:Policy-url}}|Sú-chet]] ke chhìn-khóng hâ chhòi khó chhái-chhí chhṳ́ hàng-thung. Chhiáng chhai ha-mien sû-ngi̍p yit-ke khí-thí ke lî-yù (chhiong-he yîn-sut yit-ke pûn-ngìn pho-fái ke hong-mien).',
-'ipadressorusername' => 'IP thi-tiám fe̍t-he yung-fu-miàng',
-'ipbexpiry' => 'Khì-han:',
-'ipbreason' => 'Ngièn-yîn:',
-'ipbreasonotherlist' => 'Khì-thâ ngièn-yîn',
-'ipbreason-dropdown' => '*Yit-pân ke fûng-kim lî-yù
-** Su-chhṳ chen-kâ put-sṳ̍t chṳ̂-liau
-** Chhù-thet vùn-chông nui-yùng
-** Ngoi-phu lièn-kiet kóng-ko
-** Chhai vùn-chông chûng chen-kâ mò yi-ngi vùn-sṳ
-** Mò-lî ke hàng-vì, kûng-kit/sâu-yéu phe̍t-ngìn
-** Lam-yung tô-ke chong-ho
-** Put-nèn chiap-su ke yung-fu-miàng',
-'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',
-'ipbotheroption' => 'khì-thâ',
-'ipbotherreason' => 'Khì-thâ lî-yù:',
+'blockip' => '封禁用戶',
+'blockiptext' => '用下背嘅表單來禁止來自某一特定IP地址嘅修改許可權。
+單淨在為防止破壞,撈符合[[{{MediaWiki:Policy-url}}|守則]]嘅情況下正做得採取邇行動。
+請在下背輸入一隻具體嘅理由(例如引述一隻分破壞嘅頁面)。',
+'ipadressorusername' => 'IP地址或用戶名:',
+'ipbexpiry' => '期限:',
+'ipbreason' => '原因:',
+'ipbreasonotherlist' => '其他理由',
+'ipbreason-dropdown' => '*一般嘅封禁理由
+** 多次加入虛假資料
+** 刪除頁面內容
+** 外部鏈接廣告
+** 在頁面肚增加無意義文字
+** 無禮嘅行為、攻擊/騷擾別儕
+** 濫用多隻賬號
+** 做毋得接受嘅用戶名',
+'ipbcreateaccount' => '阻止創建新賬號',
+'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',
+'ipbotheroption' => '其他',
+'ipbotherreason' => '其他/附加理由:',
 'ipbhidename' => 'Chhai chhà-fûng ngit-ki, fa̍t-chhiok chhà-fûng lie̍t-péu yî-khi̍p yung-fu lie̍t-péu chûng yún-chhòng yung-fu-miàng.',
-'badipaddress' => 'IP-ke thi-tiám mò chṳn-khok.',
-'blockipsuccesssub' => 'chhà-fûng sṳ̀n-kûng',
+'badipaddress' => '無效IP地址',
+'blockipsuccesssub' => '查封成功',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] yí-kîn pûn chhà-fûng. <br />Chhâm-siòng [[Special:BlockList|pûn-fûng IP thi-tiám lie̍t-péu]] yî fu̍k-sṳ́m chhà-fûng.',
-'ipb-edit-dropdown' => 'Phiên-siá chhà-fûng ngièn-yîn',
-'ipb-unblock-addr' => 'Kié-chhù fûng-kim $1',
-'ipb-unblock' => 'Kié-chhù kim-fûng yung-fu miàng fe̍t-chá IP thi-tiám',
-'ipb-blocklist' => 'Kiám-sṳ fûng-kim lie̍t-péu',
-'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.',
+'ipb-edit-dropdown' => '編寫查封原因',
+'ipb-unblock-addr' => '解封$1',
+'ipb-unblock' => '解封用戶名或IP地址',
+'ipb-blocklist' => '查看今下嘅封禁',
+'unblockip' => '解封用戶',
+'unblockiptext' => '用下背嘅表單來恢復先前分查封嘅IP地址或用戶嘅寫權限。',
 'ipusubmit' => 'Kié-chhù kim-fûng',
-'unblocked' => '[[User:$1|$1]]-ke fûng-kim yí-kîn kié-chhù',
-'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-submit' => 'Chhìm-cháu',
-'infiniteblock' => 'yún-kiú',
+'unblocked' => '[[User:$1|$1]]已經分解封。',
+'unblocked-id' => '封禁$1已經分移除',
+'ipblocklist' => '分封用戶列表',
+'ipblocklist-submit' => '搜尋',
+'infiniteblock' => '無限期',
 'expiringblock' => '$1 $2 to-khì',
-'anononlyblock' => 'Han-chṳ ngia̍k-miàng yung-fu.',
-'noautoblockblock' => 'Kim-yung chhṳ-thung chhà-fûng',
-'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',
+'anononlyblock' => '單淨匿名用戶',
+'noautoblockblock' => '禁用自動查封',
+'createaccountblock' => '禁止創建賬戶',
+'ipblocklist-empty' => '查封列表係空嘅。',
+'ipblocklist-no-results' => '所請求嘅IP地址/用戶名無分查封。',
+'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',
-'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-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.',
+'unblocklogentry' => '$1已分解封',
+'block-log-flags-anononly' => '單淨匿名用戶',
+'block-log-flags-nocreate' => '帳號建立已禁',
+'block-log-flags-noautoblock' => '禁用自動查封',
+'range_block_disabled' => '單淨管理員正做得創建禁止查封嘅範圍。',
+'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ì.',
-'proxyblocker' => 'Thoi-lî fûng-só hi-khí',
-'proxyblockreason' => 'Ngì-ke IP thi-tiám he yit-ke khôi-fong ke thoi-lî, kì yí-kîn pûn fûng-só. Chhiáng lièn-kiê Ngì-ke mióng-chi mióng-lu fu̍k-vu thì-kiûng-sông fe̍t-he kî-su̍t kî-yèn-chá pin lo-tî ke-ngiàm-chhung ke ôn-chhiòn mun-thì.',
-'proxyblocksuccess' => 'Vàn-sṳ̀n.',
+'ipb_cant_unblock' => '差錯: 尋毋到查封ID$1。可能已經解除封禁。',
+'ip_range_invalid' => '無效嘅IP範圍。',
+'proxyblocker' => '代理封鎖器',
+'proxyblockreason' => '汝嘅IP地址係一隻開放嘅代理,其已經分封鎖。請聯繫汝嘅網際網路服務提供商或技術支援者並講佢兜聽邇隻嚴重嘅安全問題。',
+'proxyblocksuccess' => '完成。',
 'sorbsreason' => 'Ngì-ke IP chhô-vi pûn DNSBL lie̍t-vi su̍k-yî khôi-fong thoi-lî fu̍k-vu-khí.',
 '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 +1607,154 @@ 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',
-'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',
+'movereason' => '原因:',
+'revertmove' => '恢復',
+'delete_and_move' => '刪除並移動',
+'delete_and_move_text' => '==愛刪除==
+
+目標頁面"[[:$1]]"已經存在。汝確認愛刪除原頁面並進行移動係無?',
+'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 +1774,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 +1790,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 +1800,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 +1826,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 +1856,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 +1899,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 +1923,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 +1943,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 +1957,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..cf3e1f6 100644 (file)
@@ -262,7 +262,6 @@ $messages = array(
 'disclaimers' => 'Palapala hoʻokuʻu kuleana',
 'disclaimerpage' => 'Project:Palapala hoʻokuʻu kuleana',
 'edithelp' => 'Kōkua me ka ho‘ololi ‘ana',
-'edithelppage' => 'Help:Ho‘ololi',
 'helppage' => 'Help:Papa kuhikuhi',
 'mainpage' => "Kahua pa'a",
 'mainpage-description' => 'Ka papa kinohi',
@@ -464,7 +463,6 @@ E ʻoluʻolu, e hōʻoia i ka hoʻokūkū ʻana i lalo, a laila, e mālama i nā
 'prevn' => '{{PLURAL:$1|$1}} ma mua',
 'nextn' => '{{PLURAL:$1|$1}} ma hope',
 'viewprevnext' => 'Nānā i nā ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:Papa kuhikuhi',
 'search-result-size' => '$1 ({{PLURAL:$2|1 huaʻōlelo|$2 huaʻōlelo}})',
 'search-section' => '(māhele $1)',
 'search-suggest' => 'ʻO kēia paha kou manaʻo: $1',
@@ -641,7 +639,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 5eef837..a33c093 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,21 +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-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' => 'הסתרת עריכות של משתמשים אנונימיים ברשימת המעקב',
@@ -459,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|קטגוריה|קטגוריות}}',
@@ -482,7 +498,7 @@ $messages = array(
 'about' => 'אודות',
 'article' => 'דף תוכן',
 'newwindow' => '(נפתח בחלון חדש)',
-'cancel' => 'ביטול / יציאה',
+'cancel' => 'ביטול',
 'moredotdotdot' => 'עוד…',
 'morenotlisted' => 'עוד פריטים שאינם ברשימה…',
 'mypage' => 'דף משתמש',
@@ -540,6 +556,7 @@ $messages = array(
 'create-this-page' => 'יצירת דף זה',
 'delete' => 'מחיקה',
 'deletethispage' => 'מחיקת דף זה',
+'undeletethispage' => 'שחזור דף זה',
 'undelete_short' => 'שחזור {{PLURAL:$1|עריכה אחת|$1 עריכות}}',
 'viewdeleted_short' => 'צפייה ב{{PLURAL:$1|עריכה מחוקה אחת|־$1 עריכות מחוקות}}',
 'protect' => 'הגנה',
@@ -593,7 +610,6 @@ $1',
 'disclaimers' => 'הבהרה משפטית',
 'disclaimerpage' => 'Project:הבהרה משפטית',
 'edithelp' => 'עזרה לעריכה',
-'edithelppage' => 'Help:עריכת דף',
 'helppage' => 'Help:תפריט ראשי',
 'mainpage' => 'עמוד ראשי',
 'mainpage-description' => 'עמוד ראשי',
@@ -743,6 +759,8 @@ $2',
 'namespaceprotected' => "אינכם מורשים לערוך דפים במרחב השם '''$1'''.",
 'customcssprotected' => 'אינכם מורשים לערוך דף CSS זה, כיוון שהוא כולל את ההגדרות האישיות של משתמש אחר.',
 'customjsprotected' => 'אינכם מורשים לערוך דף JavaScript זה, כיוון שהוא כולל את ההגדרות האישיות של משתמש אחר.',
+'mycustomcssprotected' => 'אינכם מורשים לערוך דף CSS זה.',
+'mycustomjsprotected' => 'אינכם מורשים לערוך דף JavaScript זה.',
 'ns-specialprotected' => 'לא ניתן לערוך דפים מיוחדים.',
 'titleprotected' => 'לא ניתן ליצור דף זה, כיוון שהמשתמש [[User:$1|$1]] הגן עליו מפני יצירה.
 הסיבה שניתנה לכך היא "$2".',
@@ -773,10 +791,13 @@ $2',
 'yourpassword' => 'סיסמה:',
 'userlogin-yourpassword' => 'סיסמה',
 'userlogin-yourpassword-ph' => 'יש להקליד את הסיסמה',
+'createacct-yourpassword-ph' => 'יש להקליד סיסמה',
 'yourpasswordagain' => 'חזרה על הסיסמה:',
+'createacct-yourpasswordagain' => 'אימות הסיסמה',
+'createacct-yourpasswordagain-ph' => 'יש להקליד את הסיסמה שנית',
 'remembermypassword' => 'שמירת הכניסה שלי בדפדפן הזה (ל{{PLURAL:$1|יום אחד|יומיים|־$1 ימים}} לכל היותר)',
-'userlogin-remembermypassword' => '×\96×\9b×\95ר ×\90×\95תי',
-'userlogin-signwithsecure' => '×\9b× ×\99ס×\94 ×\9c×\97ש×\91×\95×\9f ×¢×\9d ×©×¨×ª מאובטח',
+'userlogin-remembermypassword' => '×\9c×\96×\9b×\95ר ×©× ×\9bנסתי',
+'userlogin-signwithsecure' => 'ש×\99×\9e×\95ש ×\91×\97×\99×\91×\95ר מאובטח',
 'securelogin-stick-https' => 'המשך שימוש ב־HTTPS אחרי הכניסה',
 'yourdomainname' => 'המתחם שלך:',
 'password-change-forbidden' => 'אינכם יכולים לשנות סיסמאות באתר זה.',
@@ -797,14 +818,30 @@ $2',
 '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}} משתמש בעוגיות כדי להכניס משתמשים למערכת.
@@ -862,7 +899,7 @@ $2',
 'cannotchangeemail' => 'לא ניתן לשנות את כתובות הדוא"ל של חשבונות באתר ויקי זה.',
 'emaildisabled' => 'אתר זה לא יכול לשלוח דואר אלקטרוני.',
 'accountcreated' => 'החשבון נוצר',
-'accountcreatedtext' => 'חשבון המשתמש $1 נוצר.',
+'accountcreatedtext' => 'חשבון המשתמש [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|שיחה]]) נוצר.',
 'createaccount-title' => 'יצירת חשבון ב{{grammar:תחילית|{{SITENAME}}}}',
 'createaccount-text' => 'מישהו יצר חשבון בשם $2 ב{{grammar:תחילית|{{SITENAME}}}} ($4), והסיסמה הזמנית של החשבון היא "$3". עליכם להיכנס ולשנות עכשיו את הסיסמה.
 
@@ -897,14 +934,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-emaildisabled' => 'שירותי הדוא"ל בוטלו באתר ויקי זה.',
-'passwordreset-pretext' => '{{PLURAL:$1||הקלידו אחד מפריטי המידע למטה}}',
 'passwordreset-username' => 'שם משתמש:',
 'passwordreset-domain' => 'תחום:',
 'passwordreset-capture' => 'לצפות בדוא"ל הנשלח?',
@@ -934,7 +972,7 @@ $2
 סיסמה זמנית: $2',
 'passwordreset-emailsent' => 'נשלח דואר אלקטרוני לאיפוס הסיסמה.',
 'passwordreset-emailsent-capture' => 'נשלח דואר אלקטרוני לאיפוס הסיסמה, והוא מוצג להלן.',
-'passwordreset-emailerror-capture' => 'נוצר דואר אלקטרוני לאיפוס הסיסמה, והוא מוצג להלן, אך שליחתו למשתמש נכשלה: $1',
+'passwordreset-emailerror-capture' => 'נוצר דואר אלקטרוני לאיפוס הסיסמה, והוא מוצג להלן, אך שליחתו ל{{GENDER:$2|משתמש|משתמשת}} נכשלה: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'שינוי כתובת דוא"ל',
@@ -1016,7 +1054,7 @@ $2
 'confirmedittext' => 'עליכם לאמת את כתובת הדוא"ל שלכם לפני שתוכלו לערוך דפים. אנא הגדירו ואמתו את כתובת הדוא"ל שלכם באמצעות [[Special:Preferences|העדפות המשתמש]] שלכם.',
 'nosuchsectiontitle' => 'הפסקה לא נמצאה',
 'nosuchsectiontext' => 'ניסיתם לערוך פסקה שאינה קיימת. ייתכן שהיא הועברה או נמחקה בעת שצפיתם בדף.',
-'loginreqtitle' => '×\9b× ×\99ס×\94 ×\9c×\97ש×\91×\95×\9f × ×\93רשת',
+'loginreqtitle' => '× ×\93רשת ×\9b× ×\99ס×\94 ×\9c×\97ש×\91×\95×\9f',
 'loginreqlink' => 'להיכנס לחשבון',
 'loginreqpagetext' => 'עליכם $1 כדי לצפות בדפים אחרים.',
 'accmailtitle' => 'הסיסמה נשלחה',
@@ -1142,6 +1180,7 @@ $2
 נראה שהוא נמחק.',
 'edit-conflict' => 'התנגשות עריכה.',
 'edit-no-change' => 'המערכת התעלמה מעריכתכם, כיוון שלא נעשה שינוי בטקסט.',
+'postedit-confirmation' => 'עריכתך נשמרה.',
 'edit-already-exists' => 'לא ניתן ליצור דף חדש.
 הוא כבר קיים.',
 'defaultmessagetext' => 'טקסט ההודעה המקורי',
@@ -1390,7 +1429,6 @@ $1",
 'searchmenu-legend' => 'אפשרויות חיפוש',
 'searchmenu-exists' => "'''קיים דף בשם \"[[:\$1]]\" באתר זה.'''",
 'searchmenu-new' => "'''יצירת הדף \"[[:\$1]]\" באתר זה.'''",
-'searchhelp-url' => 'Help:תפריט ראשי',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|מציאת דפים עם קידומת זו]]',
 'searchprofile-articles' => 'דפי תוכן',
 'searchprofile-project' => 'עזרה ודפי המיזם',
@@ -1465,7 +1503,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' => 'שורות:',
@@ -1579,6 +1617,8 @@ $1",
 'userrights-notallowed' => 'לחשבון המשתמש שלכם אין הרשאה להוסיף או להסיר הרשאות של משתמשים.',
 'userrights-changeable-col' => 'קבוצות שבאפשרותכם לשנות',
 'userrights-unchangeable-col' => 'קבוצות שאין באפשרותכם לשנות',
+'userrights-conflict' => 'התנגשות הרשאות משתמש! אנא בצעו את השינויים שלכם שוב.',
+'userrights-removed-self' => 'הסרת בהצלחה את הרשאות המשתמש שלך. לכן אין לך כעת אפשרות לגשת לדף זה.',
 
 # Groups
 'group' => 'קבוצה:',
@@ -1649,6 +1689,10 @@ $1",
 'right-editusercssjs' => 'עריכת דפי CSS ו־JavaScript של משתמשים אחרים',
 'right-editusercss' => 'עריכת דפי CSS של משתמשים אחרים',
 'right-edituserjs' => 'עריכת דפי JavaScript של משתמשים אחרים',
+'right-editmyusercss' => 'עריכת דפי CSS של עצמך',
+'right-editmyuserjs' => 'עריכת דפי JavaScript של עצמך',
+'right-viewmywatchlist' => 'צפייה ברשימת המעקב של עצמך',
+'right-editmywatchlist' => 'עריכת רשימת המעקב של עצמך. יצוין שמספר פעולות עדיין יוסיפו דפים גם ללא הרשאה זו.',
 'right-rollback' => 'שחזור מהיר של עריכות המשתמש האחרון שערך דף מסוים',
 'right-markbotedits' => 'סימון עריכות משוחזרות כעריכות של בוט',
 'right-noratelimit' => 'עקיפת הגבלת קצב העריכות',
@@ -1710,6 +1754,8 @@ $1",
 'action-userrights-interwiki' => 'לערוך את ההרשאות של משתמשים באתרי ויקי אחרים',
 'action-siteadmin' => 'לנעול או לבטל את נעילת בסיס הנתונים',
 'action-sendemail' => 'לשלוח דואר אלקטרוני',
+'action-editmywatchlist' => 'לערוך את רשימת המעקב שלך',
+'action-viewmywatchlist' => 'לצפות ברשימת המעקב שלך',
 
 # Recent changes
 'nchanges' => '{{PLURAL:$1|שינוי אחד|$1 שינויים}}',
@@ -1764,7 +1810,7 @@ $1",
 'reuploaddesc' => 'ביטול ההעלאה וחזרה לטופס העלאת קבצים לשרת',
 'upload-tryagain' => 'שליחת התיאור החדש של הקובץ',
 'uploadnologin' => 'לא נכנסתם לחשבון',
-'uploadnologintext' => 'עליכם [[Special:UserLogin|להיכנס לחשבון]] כדי להעלות קבצים.',
+'uploadnologintext' => 'עליכם $1 כדי להעלות קבצים.',
 'upload_directory_missing' => 'שרת האינטרנט אינו יכול ליצור את תיקיית ההעלאות ($1) החסרה.',
 'upload_directory_read_only' => 'שרת האינטרנט אינו יכול לכתוב בתיקיית ההעלאות ($1).',
 'uploaderror' => 'שגיאה בהעלאת הקובץ',
@@ -2007,8 +2053,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' => 'דף מיוחד זה מציג את כל הקבצים שהועלו.
@@ -2321,6 +2367,15 @@ $1',
 'listusers-noresult' => 'לא נמצאו משתמשים.',
 'listusers-blocked' => '(חסום)',
 
+# Special:ActiveUsers
+'activeusers' => 'רשימת משתמשים פעילים',
+'activeusers-intro' => 'זוהי רשימת המשתמשים שביצעו פעולה כלשהי {{PLURAL:$1|ביום האחרון|ביומיים האחרונים|ב־$1 הימים האחרונים}}.',
+'activeusers-count' => '{{PLURAL:$1|פעולה אחת|$1 פעולות}} ב{{PLURAL:$3|יום האחרון|יומיים האחרונים|־$3 הימים האחרונים}}',
+'activeusers-from' => 'הצגת משתמשים החל מ:',
+'activeusers-hidebots' => 'הסתרת בוטים',
+'activeusers-hidesysops' => 'הסתרת מפעילי מערכת',
+'activeusers-noresult' => 'לא נמצאו משתמשים.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'רשימת הרשאות לקבוצה',
 'listgrouprights-summary' => 'זוהי רשימה של קבוצות המשתמש המוגדרות באתר זה, עם ההרשאות של כל אחת.
@@ -2398,8 +2453,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 דפים}}.',
@@ -2645,7 +2700,7 @@ $1',
 'mycontris' => 'תרומות',
 'contribsub2' => 'עבור $1 ($2)',
 'nocontribs' => 'לא נמצאו שינויים המתאימים לקריטריונים אלו.',
-'uctop' => '(×\90×\97ר×\95×\9f)',
+'uctop' => '(× ×\95×\9b×\97×\99)',
 'month' => 'עד החודש:',
 'year' => 'עד השנה:',
 
@@ -2973,6 +3028,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,7 +3185,6 @@ $1',
 'modern.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב Modern בלבד */',
 'vector.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב Vector בלבד */',
 'print.css' => '/* הסגנונות הנכתבים כאן ישפיעו על הפלט בהדפסה בלבד */',
-'handheld.css' => '/* הסגנונות הנכתבים כאן ישפיעו על מכשירים ניידים המבוססים על העיצוב שבהגדרה $wgHandheldStyle בלבד */',
 'noscript.css' => '/* הסגנונות הנכתבים כאן ישפיעו על משתמשים עם JavaScript מבוטל */',
 'group-autoconfirmed.css' => '/* הסגנונות הנכתבים כאן ישפיעו על משתמשים ותיקים בלבד */',
 'group-bot.css' => '/* הסגנונות הנכתבים כאן ישפיעו על בוטים בלבד */',
@@ -3302,11 +3358,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' => 'דרך הכתיבה בהודעה היא כמתואר להלן:
 
@@ -3336,7 +3406,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'רוחב',
 'exif-imagelength' => 'גובה',
 'exif-bitspersample' => 'ביטים לרכיב',
@@ -3515,7 +3585,7 @@ $1',
 'exif-originalimageheight' => 'גובה התמונה לפני קיטוע',
 'exif-originalimagewidth' => 'רוחב התמונה לפני קיטוע',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'לא דחוס',
 'exif-compression-2' => 'קידוד הופמן מואתם חד-מימדי לאורך ריצה CCITT קבוצה 3',
 'exif-compression-3' => 'קידוד פקס CCITT קבוצה 3',
@@ -3990,12 +4060,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' => 'חיפוש קבצים כפולים',
@@ -4087,6 +4162,7 @@ $5
 'htmlform-selectorother-other' => 'אחר',
 'htmlform-no' => 'לא',
 'htmlform-yes' => 'כן',
+'htmlform-chosen-placeholder' => 'נא לבחור אפשרות',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 עם תמיכה בחיפוש בטקסט מלא',
@@ -4129,8 +4205,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..b3fbe47 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' => 'यदि बदलाव सारांश ना दिया गया हो तो मुझे सूचित करें',
@@ -428,7 +426,6 @@ $1',
 'disclaimers' => 'अस्वीकरण',
 'disclaimerpage' => 'Project:साधारण अस्वीकरण',
 'edithelp' => 'सम्पादन सहायता',
-'edithelppage' => 'Help:संपादन',
 'helppage' => 'Help:सहायता',
 'mainpage' => 'मुख्य पृष्ठ',
 'mainpage-description' => 'मुख्य पृष्ठ',
@@ -719,10 +716,8 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'कूटशब्द रीसेट',
-'passwordreset-text' => 'अपने खाते के विवरण का एक ई-मेल अनुस्मारक प्राप्त करने के लिए इस फ़ॉर्म को पूरा करें।',
 'passwordreset-legend' => 'कूटशब्द रीसेट करें',
 'passwordreset-disabled' => 'कूटशब्द रीसेट करना इस विकी पर अक्षम है।',
-'passwordreset-pretext' => '{{PLURAL:$1||नीचे पूछे गए डेटा में से एक लिखें}}',
 'passwordreset-username' => 'सदस्यनाम:',
 'passwordreset-domain' => 'डोमेन:',
 'passwordreset-capture' => 'परिणामस्वरूप बना ई-मेल देखें?',
@@ -1193,7 +1188,6 @@ $1",
 'searchmenu-legend' => 'खोज विकल्प',
 'searchmenu-exists' => "'''इस विकि पर \"[[:\$1]]\" नाम का एक पृष्ठ है'''",
 'searchmenu-new' => "'''इस विकि पर \"[[:\$1]]\" नाम का पृष्ठ बनाएँ!'''",
-'searchhelp-url' => 'Help:सहायता',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|इस उपसर्ग वाले पृष्ठ देखें]]',
 'searchprofile-articles' => 'सामग्री पृष्ठ',
 'searchprofile-project' => 'सहायता और परियोजना पृष्ठ',
@@ -1237,15 +1231,6 @@ $1",
 आप गूगल से खोज कर सकते हैं।
 ध्यान रखें कि उनकी {{SITENAME}} सामग्री की सूची पुरानी हो सकती है।',
 
-# Quickbar
-'qbsettings' => 'शीघ्रपट',
-'qbsettings-none' => 'बिल्कुल नहीं',
-'qbsettings-fixedleft' => 'स्थिर बाईं ओर',
-'qbsettings-fixedright' => 'स्थिर दाहिनी ओर',
-'qbsettings-floatingleft' => 'अस्थिर बाईं ओर',
-'qbsettings-floatingright' => 'अस्थिर दाहिनी ओर',
-'qbsettings-directionality' => 'निश्चित, आपकी भाषा की लिपि की दिशात्मकता पर निर्भर',
-
 # Preferences page
 'preferences' => 'मेरी वरीयताएँ',
 'mypreferences' => 'पसंद',
@@ -1805,7 +1790,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 +2195,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 +3089,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'चौडाई',
 'exif-imagelength' => 'ऊँचाई',
 'exif-bitspersample' => 'प्रति घटक बीट्स',
@@ -3282,7 +3266,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 +3708,6 @@ $5
 'version-software-version' => 'अवतरण',
 'version-entrypoints-header-url' => 'यू॰आर॰एल',
 
-# Special:FilePath
-'filepath' => 'सञ्चिका पथ',
-'filepath-page' => 'सञ्चिका:',
-'filepath-submit' => 'जाइए',
-'filepath-summary' => 'यह विशेष पृष्ठ सञ्चिका का पूरा पथ देता है।
-चित्र पूरे रिज़ोल्यूशन के साथ दिखता हैं, अन्य सञ्चिका प्रकार उनके सम्बन्धित प्रोग्रेम डाइरेक्टरी से आरम्भ होते हैं।',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'फ़ाईल द्विरावृत्ति खोजें',
 'fileduplicatesearch-summary' => 'हैश वैल्यू के अनुसार फ़ाईल की द्विरावृत्ति खोजें।',
index b1bc115..476bc1a 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',
@@ -276,7 +274,6 @@ $1',
 'disclaimers' => 'Jimmewari se chhutkaari',
 'disclaimerpage' => 'Project:Saadharan jimmewari nai lo',
 'edithelp' => 'Badlao pe madat',
-'edithelppage' => 'Help:Badle me',
 'helppage' => 'Help:Madat',
 'mainpage' => 'Pahila Panna',
 'mainpage-description' => 'Pahila Panna',
@@ -566,10 +563,8 @@ Sait aap password ke safalta se badal sia hoga nai to nawaa temporary password k
 
 # Special:PasswordReset
 'passwordreset' => 'Password ke badlo',
-'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}}',
 'passwordreset-username' => 'Sadasya ke naam:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Banawa gais e-mail ke dekho',
@@ -1057,7 +1052,6 @@ Iske baare me aur jaankari [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAM
 'searchmenu-legend' => 'Khoje ke option',
 'searchmenu-exists' => "'''Ii wiki me \"[[\$1]]\" naam ke panna hai'''",
 'searchmenu-new' => "'''Ii wiki me \"[[:\$1]]\" panna ke banao!'''",
-'searchhelp-url' => 'Help:Madat',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ii prefix ke panna ke browse karo]]',
 'searchprofile-articles' => 'Content panna',
 'searchprofile-project' => 'Madat aur Project panna',
@@ -1968,6 +1962,15 @@ Support karaa gais protocol: <code>$1</code> (defaults to http:// if no protocol
 'listusers-noresult' => 'Koi sadasya ke nai pawa gais hai.',
 'listusers-blocked' => '(rok dewa gais hai)',
 
+# Special:ActiveUsers
+'activeusers' => 'Active sadasya ke list',
+'activeusers-intro' => 'Ii suchi uu sadasya ke hae jon ki pahile {{PLURAL:$1|din|din}} me kuchh karin hae.',
+'activeusers-count' => '$1 haali ke {{PLURAL:$1|badlao|badlao}} pichhle {{PLURAL:$3|din|$3 din}} me',
+'activeusers-from' => 'Sadasya jon ki hian se suruu hoe hai ke dekhao:',
+'activeusers-hidebots' => 'Bots ke lukao',
+'activeusers-hidesysops' => 'Administrator log ke lukao',
+'activeusers-noresult' => 'koi sadasya ke pawa nai gais hai.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Sadasya  ke group adhikar',
 'listgrouprights-summary' => 'Niche likha hai ek suchi hai groups ke jon ki ii wiki me defined hai, aapan  associated access rights ke saathe
@@ -2045,8 +2048,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.',
@@ -2960,7 +2963,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',
@@ -3167,9 +3170,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..51edc67 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',
@@ -260,7 +258,6 @@ $1',
 'disclaimers' => 'Diskleymer',
 'disclaimerpage' => 'Project:Kabilogan nga diskleymer',
 'edithelp' => 'Bulig sa pag Ilis',
-'edithelppage' => 'Help:I-husto',
 'helppage' => 'Help:Mga Unod',
 'mainpage' => 'Mayor nga Panid',
 'mainpage-description' => 'Mayor nga Panid',
@@ -561,10 +558,8 @@ Mahimo nga madinalag-on mo nga nga gin-ilisan ang imo pasword ukon nagpangabay k
 
 # Special:PasswordReset
 'passwordreset' => 'Liwaton ang pasword',
-'passwordreset-text' => 'Taposon ang ini nga formas agod nga makabaton sang e-mail nga nagapahanumdom sang mga detalye sang imo akawnt.',
 'passwordreset-legend' => 'Liwaton ang pasword',
 'passwordreset-disabled' => 'Ang mga pagliwat sang pasword gin-untat sa sini nga wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Magbutang sang isa sang mga datos sa idalom}}',
 'passwordreset-username' => 'Ngalan sang Manog-gamit"',
 'passwordreset-domain' => 'Domeyn:',
 'passwordreset-capture' => 'Lantawon ang nagresuta nga e-mail?',
@@ -1065,7 +1060,6 @@ Ang mga detalye mahimo nga makita sa [{{fullurl:{{#Special:Log}}/delete|page={{F
 'searchmenu-legend' => 'Mga pililian sa pagpangita',
 'searchmenu-exists' => "'''May yara sang panid nga ginhingalanan nga \"[[:\$1]]\" sa sini nga wiki.'''",
 'searchmenu-new' => "'''Gintuga ang panid nga \"[[:\$1]]\" sa sini nga wiki!'''",
-'searchhelp-url' => 'Help:Mga Unod',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Magbasa-basa sang mga panid gamit ang ini nga unpali]]',
 'searchprofile-articles' => 'Mga panid sang unod',
 'searchprofile-project' => 'Mga panid sang Bulig kag Proyekto',
@@ -1110,15 +1104,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 +1885,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 f1bc100..b190e32 100644 (file)
  * @author Dalibor Bosits
  * @author Demicx
  * @author Dnik
+ * @author DzWiki
  * @author Ex13
  * @author Excaliboor
  * @author FriedrickMILBarbarossa
+ * @author Geitost
  * @author Herr Mlinka
  * @author Kaganer
  * @author Luka Krstulovic
  * @author MayaSimFan
  * @author Meno25
  * @author Mvrban
+ * @author Nemo bis
  * @author Roberta F.
  * @author SpeedyGonsales
  * @author Tivek
@@ -343,8 +346,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 +359,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 +432,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.',
@@ -554,7 +556,6 @@ $1',
 'disclaimers' => 'Odricanje od odgovornosti',
 'disclaimerpage' => 'Project:General_disclaimer',
 'edithelp' => 'Kako uređivati stranicu',
-'edithelppage' => 'Help:Kako_uređivati_stranicu',
 'helppage' => 'Help:Pomoć',
 'mainpage' => 'Glavna stranica',
 'mainpage-description' => 'Glavna stranica',
@@ -722,9 +723,17 @@ Neke se stranice mogu prikazivati kao da ste još uvijek prijavljeni, sve dok ne
 'welcomecreation-msg' => 'Vaš je suradnički račun otvoren.
 Ne zaboravite prilagoditi Vaše [[Special:Preferences|{{SITENAME}} postavke]].',
 'yourname' => 'Suradničko ime',
+'userlogin-yourname' => 'Suradničko ime',
+'userlogin-yourname-ph' => 'Unesite Vaše suradničko ime',
 'yourpassword' => 'Lozinka:',
+'userlogin-yourpassword' => 'Zaporka',
+'userlogin-yourpassword-ph' => 'Unesite Vašu zaporku',
+'createacct-yourpassword-ph' => 'Unesite zaporku',
 'yourpasswordagain' => 'Ponovno upišite lozinku',
+'createacct-yourpasswordagain-ph' => 'Unesite zaporku ponovno',
 'remembermypassword' => 'Zapamti moju lozinku na ovom računalu (najduže $1 {{PLURAL:$1|dan|dana}})',
+'userlogin-remembermypassword' => 'Zapamti me',
+'userlogin-signwithsecure' => 'Rabi sigurnu vezu',
 'securelogin-stick-https' => 'Ostani spojen na HTTPS nakon prijave',
 'yourdomainname' => 'Vaša domena',
 'password-change-forbidden' => 'Ne možete promjeniti zaporku na ovom projektu.',
@@ -737,14 +746,19 @@ Ne zaboravite prilagoditi Vaše [[Special:Preferences|{{SITENAME}} postavke]].',
 'logout' => 'Odjavi se',
 'userlogout' => 'Odjavi se',
 'notloggedin' => 'Niste prijavljeni',
-'nologin' => "Nemate suradnički račun? '''$1'''.",
+'userlogin-noaccount' => 'Nemate suradnički račun?',
+'userlogin-joinproject' => 'Pridružite se {{SITENAME}}',
+'nologin' => 'Nemate suradnički račun? $1.',
 'nologinlink' => 'Otvorite račun',
 'createaccount' => 'Otvori novi suradnički račun',
 'gotaccount' => "Već imate suradnički račun? '''$1'''.",
 'gotaccountlink' => 'Prijavite se',
 'userlogin-resetlink' => 'Zaboravili ste detalje vaše prijave?',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoć pri prijavi]]',
 'createaccountmail' => 'poštom',
 'createaccountreason' => 'Razlog:',
+'createacct-imgcaptcha-ph' => 'Unesite tekst koji vidite iznad',
+'createacct-submit' => 'Stvorite svoj suradnički račun',
 'badretype' => 'Unesene lozinke nisu istovjetne.',
 'userexists' => 'Uneseno suradničko ime već je u upotrebi.
 Unesite neko drugo ime.',
@@ -834,10 +848,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 +991,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''
@@ -1070,12 +1082,15 @@ Razlog nije ponuđen.',
 Čini se kako je obrisana.',
 'edit-conflict' => 'Sukob uređivanja.',
 'edit-no-change' => 'Vaše uređivanje je zanemareno, jer nikakva promjena sadržaja nije napravljena.',
+'postedit-confirmation' => 'Vaše je uređivanje sačuvano.',
 'edit-already-exists' => 'Neuspješno stvaranje nove stranice.
 Stranica već postoji.',
 'defaultmessagetext' => 'Prvotni tekst poruke',
 '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',
@@ -1314,7 +1329,6 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
 'searchmenu-legend' => 'Mogućnosti pretraživanja',
 'searchmenu-exists' => "* Stranica '''[[$1]]'''",
 'searchmenu-new' => "'''Stvori stranicu \"[[:\$1]]\" na ovoj wiki!'''",
-'searchhelp-url' => 'Help:Pomoć',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Pretraži stranice s ovim prefiksom]]',
 'searchprofile-articles' => 'Stranice sa sadržajem',
 'searchprofile-project' => 'Pomoć i stranice projekta',
@@ -1356,15 +1370,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 +1902,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>
@@ -2213,6 +2217,15 @@ Podržani {{PLURAL:$2|protokol|protokoli}}: <code>$1</code> (default je http://
 'listusers-noresult' => 'Nema takvih suradnika.',
 'listusers-blocked' => '(blokiran)',
 
+# Special:ActiveUsers
+'activeusers' => 'Popis aktivnih suradnika',
+'activeusers-intro' => 'Ovo je popis suradnika koji su napravili neku aktivnost u {{PLURAL:$1|zadnji $1 dan|zadnja $1 dana|zadnjih $1 dana}}.',
+'activeusers-count' => '{{PLURAL:$1|nedavna $1 izmjena|nedavne $1 izmjene|nedavnih $1 izmjena}} u {{PLURAL:$3|posljednji $3 dan|posljednja $3 dana|posljednjih $3 dana}}',
+'activeusers-from' => 'Prikaži suradnike počevši od:',
+'activeusers-hidebots' => 'Sakrij botove',
+'activeusers-hidesysops' => 'Sakrij administratore',
+'activeusers-noresult' => 'Niti jedan suradnik nije nađen.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Prava suradničkih skupina',
 'listgrouprights-summary' => 'Ovo je popis suradničkih skupina određenih na ovoj wiki, s njihovim pripadajućim pravima.
@@ -2293,8 +2306,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}}.',
@@ -3082,12 +3095,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',
@@ -3197,7 +3206,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',
@@ -3375,7 +3384,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',
@@ -3844,13 +3853,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 6e5cb8c..7f419d6 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',
@@ -262,6 +262,18 @@ $messages = array(
 'oct' => 'okt',
 'nov' => 'now',
 'dec' => 'dec',
+'january-date' => '$1. januara',
+'february-date' => '$1. februara',
+'march-date' => '$1. měrca',
+'april-date' => '$1. apryla',
+'may-date' => '$1. meje',
+'june-date' => '$1. junija',
+'july-date' => '$1. julija',
+'august-date' => '$1. awgusta',
+'september-date' => '$1. septembra',
+'october-date' => '$1. oktobra',
+'november-date' => '$1. nowembra',
+'december-date' => '$1. decembra',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorija|Kategoriji|Kategorije|Kategorije}}',
@@ -396,7 +408,6 @@ $1',
 'disclaimers' => 'Licencne postajenja',
 'disclaimerpage' => 'Project:Impresum',
 'edithelp' => 'Pomoc za wobdźěłowanje',
-'edithelppage' => 'Help:Wobdźěłowanje',
 'helppage' => 'Help:Wobsah',
 'mainpage' => 'Hłowna strona',
 'mainpage-description' => 'Hłowna strona',
@@ -565,9 +576,18 @@ 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ć',
+'createacct-yourpasswordagain-ph' => 'Zapodaj hesło hišće raz',
 'remembermypassword' => 'Na tutym ličaku přizjewjeny wostać (za maksimalnje $1 {{PLURAL:$1|dźeń|dnjej|dny|dnjow}})',
+'userlogin-remembermypassword' => 'Přizjewjeny wostać',
+'userlogin-signwithsecure' => 'Wěsty zwisk wužiwać',
 'securelogin-stick-https' => 'Po přizjewjenju z HTTPS zwjazany wostać',
 'yourdomainname' => 'Twoja domejna:',
 'password-change-forbidden' => 'Njemóžeš hesła na tutym wikiju změnić.',
@@ -580,18 +600,38 @@ Njezabudź swoje [[Special:Preferences|nastajenja za {{GRAMMAR:akuzatiw|{{SITENA
 'logout' => 'wotzjewić',
 'userlogout' => 'wotzjewić',
 'notloggedin' => 'Njepřizjewjeny',
+'userlogin-noaccount' => 'Nimaš žane konto?',
+'userlogin-joinproject' => 'Konto za {{GRAMMAR:akuzatiw|{{SITENAME}}}} załožić',
 'nologin' => 'Nimaš žane konto? $1.',
 'nologinlink' => 'Konto załožić',
 'createaccount' => 'Konto załožić',
 'gotaccount' => 'Maš hižo wužiwarske konto? $1.',
 'gotaccountlink' => 'Přizjewić',
 'userlogin-resetlink' => 'Přizjewjenske daty zabył?',
+'userlogin-resetpassword-link' => 'Hesło anulować',
+'helplogin-url' => 'Help:Přizjewić',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoc za přizjewjenje]]',
+'createacct-join' => 'Zapodaj deleka swoje informacije.',
+'createacct-emailrequired' => 'E-mejlowa adresa',
+'createacct-emailoptional' => 'E-mejlowa adresa (opcionalny)',
+'createacct-email-ph' => 'Zapodaj swoju e-mejlowu adresu',
 'createaccountmail' => 'Nachwilne přidatne hesło wužiwać a jo na slědowacu e-mejlowu adresu pósłać',
+'createacct-realname' => 'Woprawdźite mjeno (opcionalny)',
 'createaccountreason' => 'Přičina:',
+'createacct-reason' => 'Přičina',
+'createacct-reason-ph' => 'Čehodla załožuješ druhe konto?',
+'createacct-captcha' => 'Wěstotna kontrola',
+'createacct-imgcaptcha-ph' => 'Zapodaj tekst, kotryž deleka widźiš',
+'createacct-submit' => 'Twoje konto załožić',
+'createacct-benefit-heading' => '{{SITENAME}} je so wot ludźi kaž ty wutworił.',
+'createacct-benefit-body1' => '{{PLURAL:$1|změna|změnje|změny|změnow}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|strona|stronje|strony|stronow}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|aktiwny sobuskutkowar|aktiwnej sobuskutkowarjej|aktiwni sobuskutkowarjo}}',
 'badretype' => 'Hesle, kotrejž sy zapodał, so njekryjetej.',
 'userexists' => 'Wužiwarske mjeno, kotrež sy zapodał, so hižo wužiwa.
 Prošu wubjer druhe mjeno.',
 'loginerror' => 'Zmylk při přizjewjenju',
+'createacct-error' => 'Zmylk při załožowanju konta',
 'createaccounterror' => 'Wužiwarske konto njeda so załožić: $1',
 'nocookiesnew' => 'Wužiwarske konto bu załožene, njejsy pak přizjewjeny. {{SITENAME}} wužiwa placki (cookies), zo bychu so wužiwarjo přizjewili. Sy placki znjemóžnił. Prošu zmóžń je a přizjew so potom ze swojim nowym wužiwarskim mjenom a hesłom.',
 'nocookieslogin' => '{{SITENAME}} wužiwa placki za přizjewjenje wužiwarjow.
@@ -636,7 +676,7 @@ Prjedy hač so druha e-mejlka na konto pósćele, dyrbiš so po instrukcijach w
 'cannotchangeemail' => 'Kontowe e-mejlowe adresy njehodźa so na tutym wikiju změnić.',
 'emaildisabled' => 'Tute sydło njemóže e-mejle pósłać.',
 'accountcreated' => 'Wužiwarske konto załožene',
-'accountcreatedtext' => 'Wužiwarske konto za $1 bu załožene.',
+'accountcreatedtext' => 'Wužiwarske konto za [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|diskusiju]]) bu załožene.',
 'createaccount-title' => 'Wutworjenje wužiwarskeho konta za {{SITENAME}}',
 'createaccount-text' => 'Něchtó je wužiwarske konto za twoju e-mejlowu adresu na {{SITENAME}} ($4) z mjenom "$2" z hesłom "$3" wutworił. Ty měł so nětko přizjewić a swoje hesło změnić.
 
@@ -669,13 +709,15 @@ Móžeš tutu zdźělenku ignorować, jeli so wužiwarske konto zmylnje wutwori
 'resetpass-wrong-oldpass' => 'Njepłaćiwe nachwilne abo aktualne hesło.
 Snano sy swoje hesło hižo wuspěšnje změnił abo nowe nachwilne hesło požadał.',
 'resetpass-temp-password' => 'Nachwilne hesło:',
+'resetpass-abort-generic' => 'Měnjenje hesła je so přez rozšěrjenje přetorhnyło.',
 
 # Special:PasswordReset
 'passwordreset' => 'Hesło wróćo stajić',
-'passwordreset-text' => 'Wupjelń tutón formular, zo by swoje hesło anulował.',
+'passwordreset-text-one' => 'Wupjelń tutón formular, zo by swoje hesło anulował.',
+'passwordreset-text-many' => '{{PLURAL:$1|Zapodaj jedyn z datow, 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-emaildisabled' => 'E-mejlowe funkcije su so na tutym wikiju znjemóžnili.',
 'passwordreset-username' => 'Wužiwarske mjeno:',
 'passwordreset-domain' => 'Domena:',
 'passwordreset-capture' => 'E-mejlku sej wobhladać?',
@@ -698,7 +740,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 +940,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óža so změny zhubić, kotrež sy přewjedł. Jeli sy přizjewjeny, móžeš tute warnowanje we wotrězku "Wobdźěłowanje" swojich nastajenjow znjemóžnić.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1140,7 +1184,6 @@ Podrobnosće móžeš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}
 'searchmenu-legend' => 'Pytanske opcije',
 'searchmenu-exists' => "'''Je strona z mjenom \"[[\$1]]\" na tutym wikiju'''",
 'searchmenu-new' => "'''Wutwor stronu \"[[:\$1|\$1]]\" na tutym wikiju!'''",
-'searchhelp-url' => 'Help:Wobsah',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Strony z tutym prefiksom přepytać]]',
 'searchprofile-articles' => 'Wobsahowe strony',
 'searchprofile-project' => 'Pomoc a projektowe strony',
@@ -1182,6 +1225,7 @@ Spytaj swoje naprašowanje z prefiksom ''all:'' wužiwać, zo by wšón wobsah (
 'powersearch-togglenone' => 'Žadyn',
 '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ć.',
+'search-error' => 'Při pytanju je so zmylk wustupił: $1',
 
 # Preferences page
 'preferences' => 'Nastajenja',
@@ -1324,6 +1368,7 @@ Smě mjenje hač $1 {{PLURAL:$1|znamješko|znamješce|znamješka|znamješkow}} d
 'userrights-notallowed' => 'Twoje konto nima trěbne prawa, zo by wužiwarske prawa přidźěliło abo zebrało.',
 'userrights-changeable-col' => 'Skupiny, kotrež móžeš změnić',
 'userrights-unchangeable-col' => 'Skupiny, kotrež njemóžeš změnić',
+'userrights-conflict' => 'Konflikt wužiwarskich prawow! Prošu čiń swoje změny hišće raz.',
 
 # Groups
 'group' => 'Skupina:',
@@ -1494,9 +1539,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).
@@ -1510,7 +1555,7 @@ Strony na [[Special:Watchlist|wobkedźbowankach]] su '''tučne'''.",
 'reuploaddesc' => 'Nahraće přetorhnyć a so k nahrawanskemu formularej wróćić.',
 'upload-tryagain' => 'Změnjene datajowe wopisanje wotpósłać',
 'uploadnologin' => 'Njepřizjewjeny',
-'uploadnologintext' => 'Dyrbiš [[Special:UserLogin|přizjewjeny]] być, zo by dataje nahrawać móhł.',
+'uploadnologintext' => 'Dyrbiš so $1, zo by dataje nahrawać móhł.',
 'upload_directory_missing' => 'Zapis nahraćow ($1) faluje a njeda so přez webserwer wutworić.',
 'upload_directory_read_only' => 'Nahrawanski zapis ($1) njehodźi so přez webserwer popisować.',
 'uploaderror' => 'Zmylk při nahrawanju',
@@ -2050,6 +2095,15 @@ Znajmjeńša hłowna domena je trěbna, na přikład "*.org".<br />
 'listusers-noresult' => 'Njemóžno wužiwarjow namakać. Prošu wobkedźbuj, zo so mało- abo wulkopisanje na wotprašowanje wuskutkuje.',
 'listusers-blocked' => '(blokowany)',
 
+# Special:ActiveUsers
+'activeusers' => 'Lisćina aktiwnych wužiwarjow',
+'activeusers-intro' => 'To je lisćina wužiwarjow, kotřiž běchu aktiwni za {{PLURAL:$1|posledni dźeń|poslednjej $1 dnjej|poslednje $1 dny|poslednich $1 dnjow}}:',
+'activeusers-count' => '$1 {{PLURAL:$1|akcija|akciji|akcije|akcijow}} w {{PLURAL:$3|zańdźenej dnju|zańdźenymaj $3 dnjomaj|zańdźenych $3 dnjach}}',
+'activeusers-from' => 'Wužiwarjow zwobraznić, započinajo z:',
+'activeusers-hidebots' => 'Boćiki schować',
+'activeusers-hidesysops' => 'Administratorow schować',
+'activeusers-noresult' => 'Žani wužiwarjo namakani.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Prawa wužiwarskeje skupiny',
 'listgrouprights-summary' => 'Slěduje lisćina wužiwarskich skupinow na tutej wikiju z jich wotpowědnymi přistupnymi prawami. Tu móžeš [[{{MediaWiki:Listgrouprights-helppage}}|dalše informacije]] wo jednotliwych prawach namakać.',
@@ -2126,8 +2180,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-mejlowa zdźělenska słužba je zmóžnjena.',
+'wlheader-showupdated' => "Strony, kotrež su so po twojim poslednim wopyće změnili, so '''tučne''' 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.',
@@ -2368,7 +2422,7 @@ $1',
 'mycontris' => 'Přinoški',
 'contribsub2' => 'za wužiwarja $1 ($2)',
 'nocontribs' => 'Žane změny, kotrež podatym kriterijam wotpowěduja.',
-'uctop' => '(aktualnje)',
+'uctop' => '(aktualny)',
 'month' => 'wot měsaca (a do toho):',
 'year' => 'wot lěta (a do toho):',
 
@@ -2676,6 +2730,8 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
 'thumbnail-more' => 'powjetšić',
 'filemissing' => 'Dataja pobrachuje',
 'thumbnail_error' => 'Zmylk při wutworjenju miniaturki: $1',
+'thumbnail_error_remote' => 'Zmylkowa zdźělenka wot $1:
+$2',
 'djvu_page_error' => 'Strona DjVU zwonka wobłuka strony',
 'djvu_no_xml' => 'Daty XML njemóža so za dataju DjVU wotwołać',
 'thumbnail-temp-create' => 'Temporerna dataja za miniaturny wobrazk njeda so wutworić',
@@ -2978,11 +3034,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}}',
+'minutes-ago' => 'před $1 {{PLURAL:$1|mjeńšinu|mjeńšinomaj|mjeńšinami}}',
+'seconds-ago' => 'před $1 {{PLURAL:$1|sekundu|sekundomaj|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:
 
@@ -3009,7 +3079,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',
@@ -3187,7 +3257,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',
@@ -3595,12 +3665,17 @@ 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:Redirect
+'redirect' => 'Po datajowym mjenje, wužiwarju abo wersijowym ID dale sposrědkować',
+'redirect-legend' => 'Do dataje abo strony dale sposrědkować',
+'redirect-summary' => 'Tuta specialna strona so do dataje (datajowe mjeno je podate), strony (wersijowy ID je podaty) abo wužiwarskeje strony (numeriski wužiwarski ID je podaty) dale sposrědkuje.',
+'redirect-submit' => 'Los',
+'redirect-lookup' => 'Pytać:',
+'redirect-value' => 'Hódnota:',
+'redirect-user' => 'ID wužiwarja',
+'redirect-revision' => 'Wersija strony',
+'redirect-file' => 'Datajowe mjeno',
+'redirect-not-exists' => 'Hódnota njeje so namakała',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Dwójne dataje pytać',
@@ -3691,6 +3766,9 @@ 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',
+'htmlform-chosen-placeholder' => 'Wubjer móžnosć',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 połnotekstowe pytanje podpěruje.',
index ef8f3eb..07192ab 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',
@@ -380,7 +378,6 @@ $1',
 'disclaimers' => 'Avètisman',
 'disclaimerpage' => 'Project:Avètisman jeneral yo',
 'edithelp' => 'Èd pou modifye paj',
-'edithelppage' => 'Help:Modifye yon paj',
 'helppage' => 'Help:Èd',
 'mainpage' => 'Paj prensipal',
 'mainpage-description' => 'Paj prensipal',
@@ -890,7 +887,6 @@ Lejand : ({{MediaWiki:Cur}}) = diferans ak vèsyon kounye a, ({{MediaWiki:Last}}
 'prevn' => '{{PLURAL:$1|$1}} anvan yo',
 'nextn' => '{{PLURAL:$1|$1}} swivan yo',
 'viewprevnext' => 'Wè ($1 {{int:pipe-separator}} $2) ($3).',
-'searchhelp-url' => 'Help:Èd',
 'searchprofile-everything' => 'Tout',
 'search-result-size' => '$1 ({{PLURAL:$2| mo|$2 mo yo}})',
 'search-redirect' => '(redireksyon depi $1)',
index 178f1e5..9487d00 100644 (file)
  * @author Dj
  * @author Dorgan
  * @author Enbéká
+ * @author Geitost
  * @author Glanthor Reviol
  * @author Gondnok
  * @author Hunyadym
  * @author Kaganer
  * @author KossuthRad
  * @author Misibacsi
+ * @author Nemo bis
  * @author R-Joe
  * @author Samat
  * @author Sucy
@@ -343,8 +345,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 +358,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 +422,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}}',
@@ -554,7 +567,6 @@ $1',
 'disclaimers' => 'Jogi nyilatkozat',
 'disclaimerpage' => 'Project:Jogi nyilatkozat',
 'edithelp' => 'Szerkesztési segítség',
-'edithelppage' => 'Help:Szerkesztés',
 'helppage' => 'Help:Tartalom',
 'mainpage' => 'Kezdőlap',
 'mainpage-description' => 'Kezdőlap',
@@ -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.)',
-'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}}',
+'youhavenewmessagesfromusers' => '$2 kaptál {{PLURAL:$3|egy|$3}} szerkesztőtől $1!',
+'youhavenewmessagesmanyusers' => '$2 kaptál több szerkesztőtől $1.',
+'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,18 +759,38 @@ Ne felejtsd el módosítani a [[Special:Preferences|{{SITENAME}} beállításaid
 'logout' => 'Kijelentkezés',
 'userlogout' => 'Kijelentkezés',
 'notloggedin' => 'Nem vagy bejelentkezve',
-'nologin' => "Nem rendelkezel még felhasználói fiókkal? '''$1'''.",
+'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ális)',
+'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',
+'createacct-benefit-heading' => 'A(z) {{SITENAME}}-t hozzád hasonló emberek készítik.',
+'createacct-benefit-body1' => '{{PLURAL:$1|szerkesztés|szerkesztés}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|lap|lap}}',
+'createacct-benefit-body3' => 'aktív {{PLURAL:$1|szerkesztő|szerkesztő}}',
 'badretype' => 'A megadott jelszavak nem egyeznek.',
 'userexists' => 'A megadott felhasználónév már foglalt.
 Kérlek, válassz másikat!',
 'loginerror' => 'Hiba történt a bejelentkezés során',
+'createacct-error' => 'Fióklétrehozási hiba',
 'createaccounterror' => 'Nem sikerült létrehozni a felhasználói fiókot: $1',
 'nocookiesnew' => 'A felhasználói fiókod létrejött, de nem vagy bejelentkezve. A wiki sütiket („cookie”) használ a szerkesztők azonosítására. Nálad ezek le vannak tiltva. Kérlek, engedélyezd őket a böngésződben, majd lépj be az új azonosítóddal és jelszavaddal.',
 'nocookieslogin' => 'A wiki sütiket („cookie”) használ a szerkesztők azonosításhoz.
@@ -834,33 +875,35 @@ Várj egy kicsit, mielőtt újra próbálkozol.',
 'resetpass-wrong-oldpass' => 'Nem megfelelő ideiglenes vagy jelenlegi jelszó.
 Lehet, hogy már sikeresen megváltoztattad a jelszavad, vagy pedig időközben új ideiglenes jelszót kértél.',
 'resetpass-temp-password' => 'Ideiglenes jelszó:',
+'resetpass-abort-generic' => 'A jelszómódosítást megszakította egy kiterjesztés.',
 
 # 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-text-one' => 'A jelszavad alaphelyzetbe állításához töltsd ki az űrlapot.',
+'passwordreset-text-many' => '{{PLURAL:$1|A jelszavad alaphelyzetbe állításához írd be az alábbi adatok egyikét.}}',
 '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
@@ -1069,12 +1112,15 @@ Nem lett magyarázat csatolva.',
 Úgy tűnik, hogy törölve lett.',
 'edit-conflict' => 'Szerkesztési ütközés.',
 'edit-no-change' => 'A szerkesztésed figyelmen kívül lett hagyva, mivel nem változtattál a lap szövegén.',
+'postedit-confirmation' => 'A szerkesztésedet elmentettük.',
 'edit-already-exists' => 'Az új lap nem készíthető el.
 Már létezik.',
 'defaultmessagetext' => 'Alapértelmezett szöveg',
 '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 „Szerkesztés” szakaszában.',
 
 # Content models
 'content-model-wikitext' => 'wikiszöveg',
@@ -1309,7 +1355,6 @@ Ezt általában egy elavult, törölt oldalra mutató laptörténeti hivatkozás
 'searchmenu-legend' => 'Keresési beállítások',
 'searchmenu-exists' => "'''A wikin már van „[[:$1]]” nevű lap'''",
 'searchmenu-new' => "'''Hozd létre a(z) „[[:$1]]” nevű lapot ezen a wikin!'''",
-'searchhelp-url' => 'Help:Tartalom',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ilyen előtagú lapok listázása]]',
 'searchprofile-articles' => 'Tartalmi oldalak',
 'searchprofile-project' => 'Segítség- és projektlapok',
@@ -1350,15 +1395,7 @@ Ezt általában egy elavult, törölt oldalra mutató laptörténeti hivatkozás
 'powersearch-togglenone' => 'Egyik sem',
 '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',
+'search-error' => 'A keresés közben hiba történt: $1',
 
 # Preferences page
 'preferences' => 'Beállítások',
@@ -1500,6 +1537,7 @@ A műveletet nem lehet visszavonni.',
 'userrights-notallowed' => 'Nincs jogosultságod jogosultságok adására vagy elvételére.',
 'userrights-changeable-col' => 'Megváltoztatható csoportok',
 'userrights-unchangeable-col' => 'Nem megváltoztatható csoportok',
+'userrights-conflict' => 'Felhasználói jogok ütközése! Kérlek, végez el újra a változtatásokat.',
 
 # Groups
 'group' => 'Csoport:',
@@ -1818,7 +1856,7 @@ $1',
 'upload-file-error-text' => 'Belső hiba történt egy ideiglenes fájl szerveren történő létrehozásakor.
 Kérjük, hogy lépj kapcsolatba egy  [[Special:ListUsers/sysop|adminisztrátorral]].',
 'upload-misc-error' => 'Ismeretlen feltöltési hiba',
-'upload-misc-error-text' => 'A feltöltés során ismeretlen hiba történt.  Kérjük, ellenőrizd, hogy az URL érvényes-e és hozzáférhető-e, majd próbáld újra.  Ha a probléma továbbra is fennáll, akkor lépj kapcsolatba a rendszergazdával.',
+'upload-misc-error-text' => 'A feltöltés során ismeretlen hiba történt.  Kérjük, ellenőrizd, hogy az URL érvényes-e és hozzáférhető-e, majd próbáld újra.  Ha a probléma továbbra is fennáll, akkor lépj kapcsolatba a [[Special:ListUsers/sysop|adminisztrátorral]].',
 'upload-too-many-redirects' => 'Az URL túl sokszor volt átirányítva',
 'upload-unknown-size' => 'Ismeretlen méretű',
 'upload-http-error' => 'HTTP-hiba történt: $1',
@@ -1853,6 +1891,7 @@ Kérjük, hogy lépj kapcsolatba egy  [[Special:ListUsers/sysop|adminisztrátorr
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Nem sikerült csatlakozni a napló adatbázis "$1 " háttér tárolójához.',
+'filejournal-fail-dbquery' => 'Nem sikerült frissíteni a naplóadatbázis "$1 " háttértárolóját.',
 
 # Lock manager
 'lockmanager-notlocked' => 'Nem lehet a zárolást feloldani: „$1”; nincs zárolva.',
@@ -1909,7 +1948,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 +2348,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 +3071,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 +3084,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 +3162,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 +3273,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 +3451,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 +3865,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.',
@@ -3938,6 +3953,8 @@ A képek teljes méretben jelennek meg, más fájltípusok közvetlenül a hozz
 'htmlform-submit' => 'Elküldés',
 'htmlform-reset' => 'Változtatások visszavonása',
 'htmlform-selectorother-other' => 'egyéb',
+'htmlform-no' => 'Nem',
+'htmlform-yes' => 'Igen',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 teljes szöveges keresés támogatással',
@@ -3946,14 +3963,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..34ee847 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' => 'Երբեք',
@@ -381,6 +381,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|Կատեգորիա|Կատեգորիաներ}}',
@@ -428,7 +440,8 @@ $messages = array(
 'vector-action-move' => 'Տեղափոխել այս էջը',
 'vector-action-protect' => 'Պաշտպանել',
 'vector-action-undelete' => 'Վերականգնել',
-'vector-action-unprotect' => 'Հանել պաշտպանումից',
+'vector-action-unprotect' => 'Փոխել պաշտպանումը',
+'vector-simplesearch-preference' => 'Միացնել պարզեցված որոնման դաշտը (միայն Վեկտոր թեմայի դեպքում)',
 'vector-view-create' => 'Ստեղծել',
 'vector-view-edit' => 'Խմբագրել',
 'vector-view-history' => 'Դիտել պատմությունը',
@@ -511,7 +524,6 @@ $1',
 'disclaimers' => 'Ազատում պատասխանատվությունից',
 'disclaimerpage' => 'Project:Ազատում պատասխանատվությունից',
 'edithelp' => 'Խմբագրման ուղեցույց',
-'edithelppage' => 'Help:Խմբագրում',
 'helppage' => 'Help:Գլխացանկ',
 'mainpage' => 'Գլխավոր էջ',
 'mainpage-description' => 'Գլխավոր էջ',
@@ -672,9 +684,19 @@ $2',
 'welcomecreation-msg' => 'Ձեր հաշիվն ստեղծված է։
 Չմոռանաք փոփոխել ձեր [[Special:Preferences|նախընտրությունները]]։',
 'yourname' => 'Մասնակցի անուն՝',
+'userlogin-yourname' => 'Մասնակցային անուն',
+'userlogin-yourname-ph' => 'Մուտքագրեք ձեր մասնակցային անունը',
 'yourpassword' => 'Գաղտնաբառ՝',
+'userlogin-yourpassword' => 'Գաղտնաբառ',
+'userlogin-yourpassword-ph' => 'Մուտքագրեք ձեր գաղտնաբառը',
+'createacct-yourpassword-ph' => 'Մուտքագրեք գաղտնաբառը',
 'yourpasswordagain' => 'Կրկնեք գաղտնաբառը',
-'remembermypassword' => 'Հիշել իմ մուտքագրված տվյալները այս համակարգչում ($1 {{PLURAL:$1|օրից|օրից}} ոչ ավել ժամկետով)',
+'createacct-yourpasswordagain' => 'Հաստատեք գաղտնաբառը',
+'createacct-yourpasswordagain-ph' => 'Կրկին մուտքագրեք գաղտնաբառը',
+'remembermypassword' => 'Հիշել իմ մուտքը այս դիտարկչում ($1 {{PLURAL:$1|օրից}} ոչ ավել ժամկետով)',
+'userlogin-remembermypassword' => 'Մուտք գործած մնալ',
+'userlogin-signwithsecure' => 'Օգտագործել անվտանգ միացում',
+'securelogin-stick-https' => 'Մուտք գործելուց հետո շարունակել աշխատանքը HTTPS–ով',
 'yourdomainname' => 'Ձեր դոմենը՝',
 'password-change-forbidden' => 'Այս վիքիում չեք կարող փոխել գաղտնաբառ։',
 'externaldberror' => 'Տեղի է ունեցել վավերացման արտաքին տվյալների բազայի սխալ, կամ դուք չունեք բավարար իրավունքներ ձեր արտաքին հաշվի փոփոխման համար։',
@@ -686,14 +708,31 @@ $2',
 'logout' => 'Դուրս գալ համակարգից',
 'userlogout' => 'Ելնել համակարգից',
 'notloggedin' => 'Դուք չեք մտել համակարգ',
-'nologin' => "Դեռևս չե՞ք գրանցվել։ '''$1'''։",
-'nologinlink' => 'Ստեղծեք մասնակցային հաշիվ',
+'userlogin-noaccount' => 'Հաշիվ չունե՞ք։',
+'userlogin-joinproject' => 'Միացեք {{SITENAME}} նախագծին',
+'nologin' => "Չունե՞ք հաշիվ '''$1'''։",
+'nologinlink' => 'Ստեղծել մասնակցային հաշիվ',
 'createaccount' => 'Ստեղծել նոր հաշիվ',
 'gotaccount' => "Դուք արդեն գրանցվա՞ծ եք։ '''$1'''։",
 'gotaccountlink' => 'Մուտք գործեք համակարգ',
-'userlogin-resetlink' => 'Մոռացե՞լ եք Ձեր լոգին տվյալները։',
-'createaccountmail' => 'էլ-փոստով',
+'userlogin-resetlink' => 'Մոռացե՞լ եք Ձեր հաշվի տվյալները։',
+'userlogin-resetpassword-link' => 'Զրոյացնել ձեր գաղտնաբառը։',
+'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' => 'Մուտքի սխալ',
@@ -774,11 +813,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' => 'Ուղարկվեց հիշեցնող էլ․ նամակ։',
@@ -1003,7 +1043,10 @@ $2',
 'log-fulllog' => 'Դիտել ամբողջական տեղեկամատյանը',
 'edit-conflict' => 'Խմբագրման ընհարում։',
 'edit-no-change' => 'Ձեր խմբագրումը անտեսվել է, քանի որ ոչ մի փոփոխություն չի կատարվել տեքստի մեջ։',
+'postedit-confirmation' => 'Ձեր խմբագրումը պահպանված է:',
 'defaultmessagetext' => 'Լռելյան տեքստը',
+'editwarning-warning' => 'Այս էջը լքելով դուք կարող եք կորցնել ձեր կատարած փոփոխությունները։
+Եթե դուք գրանցված եք համակարգում, կարող եք անջատել այս նախազգուշացումը ձեր նախընրությունների «{{int:prefs-editing}}» բաժնում։',
 
 # Content models
 'content-model-wikitext' => 'վիքիտեքստ',
@@ -1139,7 +1182,6 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'searchmenu-legend' => 'Որոնման ընտրանքներ',
 'searchmenu-exists' => "'''Այս վիքիում, գոյություն ունի \"[[:\$1]]\" անվանումով էջը։'''",
 'searchmenu-new' => "'''Ստեղծե՛լ \"[[:\$1]]\" էջը այս վիքիում'''",
-'searchhelp-url' => 'Help:Գլխացանկ',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ցուցադրել այս նախածանցով սկսվող էջերը]]',
 'searchprofile-articles' => 'Հիմնական էջեր',
 'searchprofile-project' => 'Օգնության և նախագծերի էջեր',
@@ -1181,14 +1223,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 +1847,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 +2474,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 +2571,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Լայնք',
 'exif-imagelength' => 'Բարձրություն',
 'exif-artist' => 'Հեղինակ',
@@ -2685,10 +2714,6 @@ $3
 # Special:Version
 'version' => 'ՄեդիաՎիքի տարբերակը',
 
-# Special:FilePath
-'filepath-page' => 'Նիշք՝',
-'filepath-submit' => 'Անցնել',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Փնտրել կրկնօրինակ պատկերներ',
 'fileduplicatesearch-summary' => 'Փնտրել կրկնօրինակ պատկերներ՝ հեշ արժեքների հիման վրա',
index 2bc316d..7f51bf1 100644 (file)
@@ -7,10 +7,12 @@
  * @ingroup Language
  * @file
  *
+ * @author Geitost
  * @author Julian Mendez
  * @author Kaganer
  * @author Malafaya
  * @author McDutchie
+ * @author Nemo bis
  * @author Reedy
  * @author Yfdyh000
  * @author לערי ריינהארט
@@ -172,8 +174,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 +188,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 +252,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}}',
@@ -332,6 +345,7 @@ $messages = array(
 'create-this-page' => 'Crear iste pagina',
 'delete' => 'Deler',
 'deletethispage' => 'Deler iste pagina',
+'undeletethispage' => 'Restaurar iste pagina',
 'undelete_short' => 'Restaurar {{PLURAL:$1|un modification|$1 modificationes}}',
 'viewdeleted_short' => 'Vider {{PLURAL:$1|un modification|$1 modificationes}} delite',
 'protect' => 'Proteger',
@@ -385,7 +399,6 @@ $1',
 'disclaimers' => 'Declaration de non-responsabilitate',
 'disclaimerpage' => 'Project:Declaration general de non-responsabilitate',
 'edithelp' => 'Adjuta de modification',
-'edithelppage' => 'Help:Modification',
 'helppage' => 'Help:Contento',
 'mainpage' => 'Pagina principal',
 'mainpage-description' => 'Pagina principal',
@@ -534,6 +547,8 @@ $2',
 'namespaceprotected' => "Tu non ha le permission de modificar paginas in le spatio de nomines '''$1'''.",
 'customcssprotected' => 'Tu non ha le permission de modificar iste pagina de CSS perque illo contine le configuration personal de un altere usator.',
 'customjsprotected' => 'Tu non ha le permission de modificar iste pagina de JavaScript perque illo contine le configuration personal de un altere usator.',
+'mycustomcssprotected' => 'Tu non ha le permission de modificar iste pagina de CSS.',
+'mycustomjsprotected' => 'Tu non ha le permission de modificar iste pagina de JavaScript.',
 'ns-specialprotected' => 'Le paginas special non es modificabile.',
 'titleprotected' => "Iste titulo ha essite protegite contra creation per [[User:$1|$1]].
 Le motivo specificate es ''$2''.",
@@ -559,9 +574,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 +598,38 @@ Non oblida personalisar tu [[Special:Preferences|preferentias in {{SITENAME}}]].
 'logout' => 'Clauder session',
 'userlogout' => 'Clauder session',
 'notloggedin' => 'Tu non ha aperite un session',
-'nologin' => "Tu non ha un conto? '''$1'''.",
+'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.
@@ -645,7 +689,7 @@ Entra un adresse ben formatate, o vacua ille campo.',
 'cannotchangeemail' => 'Le adresses de e-mail associate al contos non pote esser cambiate in iste wiki.',
 'emaildisabled' => 'Iste sito non pote inviar e-mail.',
 'accountcreated' => 'Conto create',
-'accountcreatedtext' => 'Le conto del usator $1 ha essite create.',
+'accountcreatedtext' => 'Le conto de usator [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|discussion]]) ha essite create.',
 'createaccount-title' => 'Creation de un conto pro {{SITENAME}}',
 'createaccount-text' => 'Un persona ha create un conto in tu adresse de e-mail a {{SITENAME}} ($4) denominate "$2", con le contrasigno "$3".
 Tu deberea aperir un session e cambiar tu contrasigno ora.
@@ -681,13 +725,15 @@ 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' => 'Completa iste formulario pro reinitialisar tu contrasigno.',
+'passwordreset-text-one' => 'Completa iste formulario pro reinitialisar tu contrasigno.',
+'passwordreset-text-many' => '{{PLURAL:$1|Entra un de iste datos 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?',
@@ -705,7 +751,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 +763,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',
@@ -940,12 +986,15 @@ Nulle explication disponibile.',
 Pare que illo ha essite delite.',
 'edit-conflict' => 'Conflicto inter modificationes.',
 'edit-no-change' => 'Tu modification ha essite ignorate, proque nulle cambio esseva facite in le texto.',
+'postedit-confirmation' => 'Tu modification ha essite salveguardate.',
 'edit-already-exists' => 'Non poteva crear un nove pagina.
 Illo existe ja.',
 'defaultmessagetext' => 'Texto predefinite del message',
 '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 "Modification" de tu preferentias.',
 
 # Content models
 'content-model-wikitext' => 'wikitexto',
@@ -1191,7 +1240,6 @@ Detalios se trova in le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}
 'searchmenu-legend' => 'Optiones de recerca',
 'searchmenu-exists' => "'''Existe un pagina nominate \"[[\$1]]\" in iste wiki'''",
 'searchmenu-new' => "'''Crea le pagina \"[[:\$1]]\" in iste wiki!'''",
-'searchhelp-url' => 'Help:Contento',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Navigar per le paginas con iste prefixo]]',
 'searchprofile-articles' => 'Paginas de contento',
 'searchprofile-project' => 'Paginas de adjuta e del projecto',
@@ -1235,15 +1283,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 +1427,8 @@ 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.',
+'userrights-removed-self' => 'Tu ha removite con successo tu proprie derectos. In consequentia, tu non plus pote acceder a iste pagina.',
 
 # Groups
 'group' => 'Gruppo:',
@@ -1457,6 +1499,10 @@ Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contribut
 'right-editusercssjs' => 'Modificar le files CSS e JS de altere usatores',
 'right-editusercss' => 'Modificar le files CSS de altere usatores',
 'right-edituserjs' => 'Modificar le files JS de altere usatores',
+'right-editmyusercss' => 'Modificar le proprie files CSS de usator',
+'right-editmyuserjs' => 'Modificar le proprie files JavaScript de usator',
+'right-viewmywatchlist' => 'Vider le proprie observatorio',
+'right-editmywatchlist' => 'Modificar le proprie observatorio. Remarca que alcun actiones totevia adde paginas mesmo sin iste derecto.',
 'right-rollback' => 'Rapidemente revocar le modificationes del ultime usator que modificava un pagina particular',
 'right-markbotedits' => 'Marcar modificationes de reversion como facite per un bot',
 'right-noratelimit' => 'Non esser subjecte al limites de frequentia de actiones',
@@ -1518,6 +1564,8 @@ Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contribut
 'action-userrights-interwiki' => 'modificar le derectos de usatores in altere wikis',
 'action-siteadmin' => 'blocar e disblocar le base de datos',
 'action-sendemail' => 'inviar e-mail',
+'action-editmywatchlist' => 'modificar le proprie observatorio',
+'action-viewmywatchlist' => 'vider le proprie observatorio',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|modification|modificationes}}',
@@ -1572,7 +1620,7 @@ Le paginas presente in [[Special:Watchlist|tu observatorio]] appare in litteras
 'reuploaddesc' => 'Cancellar e retornar al formulario de incargamento',
 'upload-tryagain' => 'Submitter description modificate del file',
 'uploadnologin' => 'Tu non ha aperite un session',
-'uploadnologintext' => 'Tu debe [[Special:UserLogin|aperir un session]] pro poter incargar files.',
+'uploadnologintext' => 'Tu debe $1 pro poter incargar files.',
 'upload_directory_missing' => 'Le directorio de incargamento ($1) manca, e le servitor de web non poteva crear lo.',
 'upload_directory_read_only' => 'Le servitor web non ha le permission de scriber in le directorio de incargamento ($1).',
 'uploaderror' => 'Error de incargamento',
@@ -1806,7 +1854,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>
@@ -2136,6 +2183,15 @@ Isto necessita specificar al minus le dominio de nivello superior, per exemplo "
 'listusers-noresult' => 'Nulle usator trovate.',
 'listusers-blocked' => '(blocate)',
 
+# Special:ActiveUsers
+'activeusers' => 'Lista de usatores active',
+'activeusers-intro' => 'Isto es un lista de usatores que habeva alcun typo de activitate intra le ultime $1 {{PLURAL:$1|die|dies}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|action|actiones}} in le ultime {{PLURAL:$3|die|$3 dies}}',
+'activeusers-from' => 'Presentar usatores a partir de:',
+'activeusers-hidebots' => 'Celar bots',
+'activeusers-hidesysops' => 'Celar administratores',
+'activeusers-noresult' => 'Nulle usator trovate.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Derectos del gruppos de usatores',
 'listgrouprights-summary' => 'Lo sequente es un lista de gruppos de usatores definite in iste wiki, con lor derectos de accesso associate.
@@ -2216,8 +2272,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}}.',
@@ -2642,6 +2698,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',
@@ -2810,6 +2867,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',
@@ -2960,27 +3019,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 */',
 
@@ -3056,13 +3104,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
@@ -3140,11 +3183,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:
 
@@ -3174,7 +3231,7 @@ Le alteres essera initialmente celate.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Latitude',
 'exif-imagelength' => 'Altitude',
 'exif-bitspersample' => 'Bits per componente',
@@ -3352,7 +3409,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',
@@ -3771,12 +3828,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',
@@ -3867,23 +3929,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',
@@ -3892,20 +3957,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 82212ea..074e463 100644 (file)
@@ -17,6 +17,7 @@
  * @author Borgx
  * @author Dosmiin Barsbold
  * @author Farras
+ * @author Geitost
  * @author Gombang
  * @author Irwangatot
  * @author IvanLanin
@@ -262,6 +263,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' ),
@@ -443,6 +445,18 @@ $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}}',
@@ -536,7 +550,7 @@ $messages = array(
 'unprotectthispage' => 'Ubah perlindungan halaman ini',
 'newpage' => 'Halaman baru',
 'talkpage' => 'Bicarakan halaman ini',
-'talkpagelinktext' => 'Bicara',
+'talkpagelinktext' => 'bicara',
 'specialpage' => 'Halaman istimewa',
 'personaltools' => 'Peralatan pribadi',
 'postcomment' => 'Bagian baru',
@@ -580,7 +594,6 @@ $1',
 'disclaimers' => 'Penyangkalan',
 'disclaimerpage' => 'Project:Penyangkalan umum',
 'edithelp' => 'Bantuan penyuntingan',
-'edithelppage' => 'Help:Penyuntingan',
 'helppage' => 'Help:Isi',
 'mainpage' => 'Halaman Utama',
 'mainpage-description' => 'Halaman Utama',
@@ -749,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.',
@@ -764,18 +786,38 @@ Perhatikan bahwa beberapa halaman mungkin masih terus menunjukkan bahwa Anda mas
 'logout' => 'Keluar log',
 'userlogout' => 'Keluar log',
 'notloggedin' => 'Belum masuk log',
-'nologin' => "Belum mempunyai akun? '''$1'''.",
+'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.",
@@ -857,13 +899,15 @@ 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 menyetel ulang kata sandi.',
-'passwordreset-legend' => 'Setel ulang sandi',
+'passwordreset' => 'Setel ulang kata sandi',
+'passwordreset-text-one' => 'Lengkapi formulir ini untuk menyetel ulang kata sandi.',
+'passwordreset-text-many' => '{{PLURAL:$1|Masukkan data di bawah ini untuk menyetel ulang kata sandi Anda.}}',
+'passwordreset-legend' => 'Setel ulang kata 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?',
@@ -893,7 +937,7 @@ ingin mengubahnya, Anda dapat mengabaikan pesan ini dan terus menggunakan sandi
 Sandi sementara: $2',
 'passwordreset-emailsent' => 'Surel setel ulang kata sandi telah dikirimkan.',
 'passwordreset-emailsent-capture' => 'Surel setel ulang kata sandi telah dikirim, yang ditampilkan di bawah.',
-'passwordreset-emailerror-capture' => 'Surel setel ulang kata sandi telah dihasilkan, yang ditampilkan di bawah, tetapi gagal mengirimkannya ke pengguna: $1',
+'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',
@@ -1102,6 +1146,7 @@ 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',
@@ -1109,7 +1154,7 @@ karena telah ada.',
 '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 "{{int:prefs-editing}}" pada halaman preferensi Anda.',
+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 +1264,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',
@@ -1348,7 +1393,6 @@ Rinciannya dapat ditemukan di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGE
 'searchmenu-legend' => 'Opsi pencarian',
 'searchmenu-exists' => "* Halaman '''[[$1]]'''",
 'searchmenu-new' => "'''Buat halaman \"[[:\$1]]\" di wiki ini!'''",
-'searchhelp-url' => 'Help:Isi',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Lihat daftar halaman dengan awalan ini]]',
 'searchprofile-articles' => 'Halaman isi',
 'searchprofile-project' => 'Halaman Bantuan dan Proyek',
@@ -1538,6 +1582,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:',
@@ -1550,8 +1595,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}}',
@@ -1674,8 +1719,8 @@ Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan
 'nchanges' => '$1 {{PLURAL:$1|perubahan|perubahan}}',
 'recentchanges' => 'Perubahan terbaru',
 'recentchanges-legend' => 'Opsi perubahan terbaru',
-'recentchanges-summary' => "Temukan perubahan terbaru dalam wiki di halaman ini. Keterangan: (beda) = perubahan, (versi) = sejarah revisi, '''B''' = halaman baru, '''k''' = suntingan kecil, '''b''' = suntingan bot, (± ''bita'') = jumlah penambahan/pengurangan isi, → = suntingan bagian, ← = ringkasan otomatis.
-----",
+'recentchanges-summary' => "Temukan perubahan terbaru dalam wiki di halaman ini.<br />
+;Keterangan:(<span style=\"color:blue;\">beda</span>) perubahan, (<span style=\"color:blue;\">versi</span>) sejarah revisi, '''B''' halaman baru, '''b''' suntingan bot, '''k''' suntingan kecil, <span class=\"unpatrolled\">!</span> perubahan belum dipatroli,<br /><span style=\"color:green;\">'''(+ ''bita'')'''</span> isi konten bertambah, <span style=\"color:red;\">(- ''bita'')</span> isi konten berkurang, (← Ringkasan otomatis), (→ <span style=\"color:grey;\">Suntingan bagian</span>)",
 'recentchanges-feed-description' => 'Temukan perubahan terbaru dalam wiki di umpan ini.',
 'recentchanges-label-newpage' => 'Suntingan ini membuat halaman baru',
 'recentchanges-label-minor' => 'Ini adalah suntingan kecil',
@@ -1817,7 +1862,7 @@ Jika Anda tetap ingin memuatkan berkas Anda, harap kembali dan gunakan nama lain
 'uploadjava' => 'Berkas ini adalah berkas ZIP yang mengnadung berkas .class Java.
 Penggunggahan berkas Java tidak diperbolehkan karena dapat menyebabkan pengabaian batasan keamanan.',
 'upload-source' => 'Berkas sumber',
-'sourcefilename' => 'Jeneng berkas sumber:',
+'sourcefilename' => 'Nama berkas sumber:',
 'sourceurl' => 'URL sumber:',
 'destfilename' => 'Nama berkas tujuan:',
 'upload-maxfilesize' => 'Ukuran berkas maksimum: $1',
@@ -2108,7 +2153,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.
@@ -2124,7 +2169,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',
 
@@ -2154,7 +2199,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',
@@ -2180,7 +2225,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',
@@ -2231,7 +2276,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".',
@@ -2273,6 +2318,15 @@ Perlu sedikitnya satu domain tingkat atas, misalnya "*.org".<br />
 'listusers-noresult' => 'Pengguna tidak ditemukan.',
 'listusers-blocked' => '(diblokir)',
 
+# Special:ActiveUsers
+'activeusers' => 'Daftar pengguna aktif',
+'activeusers-intro' => 'Berikut adalah daftar pengguna yang memiliki suatu bentuk aktivitas selama paling tidak $1 {{PLURAL:$1|hari|hari}} terakhir.',
+'activeusers-count' => '$1 {{PLURAL:$1|aktivitas|aktivitas}} dalam {{PLURAL:$3|1 hari|$3 hari}} terakhir',
+'activeusers-from' => 'Tampilkan pengguna mulai dari:',
+'activeusers-hidebots' => 'Sembunyikan bot',
+'activeusers-hidesysops' => 'Sembunyikan pengurus',
+'activeusers-noresult' => 'Pengguna tidak ditemukan.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Daftar kelompok pengguna',
 'listgrouprights-summary' => 'Berikut adalah daftar kelompok pengguna yang terdapat di wiki ini, dengan daftar hak akses mereka masing-masing. Informasi lebih lanjut mengenai hak masing-masing dapat ditemukan di [[{{MediaWiki:Listgrouprights-helppage}}|halaman bantuan hak pengguna]].',
@@ -2284,7 +2338,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',
@@ -2352,8 +2406,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}}.',
@@ -2597,7 +2651,7 @@ $1',
 'mycontris' => 'Kontribusi',
 'contribsub2' => 'Untuk $1 ($2)',
 'nocontribs' => 'Tidak ada perubahan yang sesuai dengan kriteria tersebut.',
-'uctop' => ' (atas)',
+'uctop' => '(saat ini)',
 'month' => 'Sejak bulan (dan sebelumnya):',
 'year' => 'Sejak tahun (dan sebelumnya):',
 
@@ -3071,9 +3125,8 @@ Simpan ke komputer Anda dan unggah ke sini.',
 '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. */',
 '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 */',
@@ -3113,7 +3166,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
@@ -3149,10 +3202,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',
@@ -3246,15 +3299,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:
 
@@ -3264,8 +3331,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',
@@ -3316,7 +3381,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',
@@ -3509,7 +3574,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',
@@ -3672,8 +3737,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',
@@ -3911,8 +3976,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',
@@ -4004,12 +4069,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',
@@ -4019,7 +4082,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
@@ -4099,6 +4162,9 @@ 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',
index 281987d..3477f08 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',
@@ -348,7 +346,6 @@ $1',
 'disclaimers' => 'Advertimentes',
 'disclaimerpage' => 'Project:Advertimentes comun',
 'edithelp' => 'Redacter auxilie',
-'edithelppage' => 'Help:Redactant',
 'helppage' => 'Help:Contenete',
 'mainpage' => 'Págine principal',
 'mainpage-description' => 'Págine principal',
@@ -626,7 +623,6 @@ Vider li [[Special:IPBlockList|liste de bloc de IP]] por li liste de bloces e ba
 'viewprevnext' => 'Vider ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''Vi un págine nominat \"[[:\$1]]\" in ti wiki.'''",
 'searchmenu-new' => "'''Crear li págine \"[[:\$1]]\" in ti wiki!'''",
-'searchhelp-url' => 'Help:Contenete',
 'searchprofile-articles' => 'Págines de contenete',
 'searchprofile-project' => 'Auxilie e Págines de projecte',
 'searchprofile-images' => 'Multimedia',
@@ -648,9 +644,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 +989,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 +1365,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..0873601 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ị',
@@ -314,7 +312,6 @@ $1',
 'disclaimers' => 'Ihe anyí chọrọ ki ma',
 'disclaimerpage' => 'Project:Ihe I kweshiri ma',
 'edithelp' => 'Inyetuáká I rüwa',
-'edithelppage' => 'Help: I rüwa',
 'helppage' => 'Help: Ihe di ime',
 'mainpage' => 'Ihü Mbu',
 'mainpage-description' => 'Ihü Mbu',
@@ -715,7 +712,6 @@ Okwu ụmà: '''({{int:cur}})''' = gbánwe na nké orü mbu, '''({{int:last}})''
 'viewprevnext' => 'Lé ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-legend' => 'Màkà nchöwa',
 'searchmenu-new' => "'''Ké ihü \"[[:\$1]]\" na wiki nke á!'''",
-'searchhelp-url' => 'Help:Ihe di ime',
 'searchprofile-articles' => 'Ihü ihe dị',
 'searchprofile-project' => 'Ihü Nkwádo na Orürü',
 'searchprofile-images' => 'Nkaníle',
@@ -749,14 +745,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 +1103,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 +1512,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 +1683,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 bc66a9e..9679b1b 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}}',
@@ -277,7 +288,6 @@ $1',
 'disclaimers' => 'Dagiti renunsia',
 'disclaimerpage' => 'Project:Sapasap ti karbengan ken rebbeng',
 'edithelp' => 'Tulong ti panag-urnos',
-'edithelppage' => 'Help:Panag-urnos',
 'helppage' => 'Help:Dagiti linaon',
 'mainpage' => 'Umuna a Panid',
 'mainpage-description' => 'Umuna a Panid',
@@ -453,9 +463,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 +487,38 @@ Dimo liplipatan a sukatan dagiti kakaykayatam idiay [[Special:Preferences|{{SITE
 'logout' => 'Rummuar',
 'userlogout' => 'Rummuar',
 'notloggedin' => 'Saan a nakastrek',
-'nologin' => "Awan kadi pay ti pakabilangam? '''$1'''.",
+'userlogin-noaccount' => 'Awan ti pakabilangam?',
+'userlogin-joinproject' => 'Tumipon iti {{SITENAME}}',
+'nologin' => "Awan ti pakabilangam? '''$1'''.",
 'nologinlink' => 'Agaramid ti pakabilangan',
 'createaccount' => 'Agaramid 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.
@@ -567,7 +606,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,13 +616,15 @@ 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-text-one' => 'Lippasem daytoy a porma tapno maidisso manen ti bukodmo a kontrasenias.',
+'passwordreset-text-many' => '{{PLURAL:$1|Ikabil ti maysa kadagiti pirgis ti datos tapno maiyasentar 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?',
@@ -613,7 +654,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',
@@ -833,12 +874,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',
@@ -872,7 +916,7 @@ Dagitoy a panangipalawag 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
@@ -1082,7 +1126,6 @@ Dagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/delete
 'searchmenu-legend' => 'Pagpilian ti panagbiruk',
 'searchmenu-exists' => "'''Adda panid a nanaganan ti \"[[:\$1]]\" iti daytoy a wiki.'''",
 'searchmenu-new' => "'''Partuaten ti panid ti \"[[:\$1]]\" iti daytoy a wiki!'''",
-'searchhelp-url' => 'Help:Dagiti linaon',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Kitaem dagiti panid nga adda kastoy a naipasaruno]]',
 'searchprofile-articles' => 'Dagiti naglaon a panid',
 'searchprofile-project' => 'Tulong ken Gandat a pam-panid',
@@ -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',
@@ -1175,7 +1210,7 @@ Laglagipem laeng a dagiti pagsurotan nagyan ti {{SITENAME}} ket baka baak.',
 'resultsperpage' => 'Nabirukan ti tunggal maysa a panid:',
 'stub-threshold' => 'Pangruggian ti <a href="#" class="stub">pungol a panilpo</a>panagporma (dagiti byte):',
 'stub-threshold-disabled' => 'Nabaldado',
-'recentchangesdays' => 'Alaldaw nga ipakita dagiti kinaudi a binalbaliwan:',
+'recentchangesdays' => 'Al-aldaw nga ipakita dagiti kinaudi a binalbaliwan:',
 'recentchangesdays-max' => 'Kabayag nga $1 {{PLURAL:$1|nga aldaw|nga al-aldaw}}',
 'recentchangescount' => 'Dagiti bilang dagiti naurnos a kinasigud a maiparang:',
 'prefs-help-recentchangescount' => 'Nairaman dagiti kinaudian a baliwan, dagiti pakasaritaan ti panid, ken dagiti listaan.',
@@ -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:',
@@ -1880,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}}',
@@ -2017,6 +2053,15 @@ Masapul ti kangatuan a pagturayan, a kaspagarigan "*.org".<br />
 'listusers-noresult' => 'Awan ti nasarakan nga agar-aramat.',
 'listusers-blocked' => '(naserraan)',
 
+# Special:ActiveUsers
+'activeusers' => 'Listaan dagiti nasiglat nga agar-aramat',
+'activeusers-intro' => 'Daytoy ti listaan dagiti agar-aramat nga adda inararamidda kadagiti napalabas a $1 {{PLURAL:$1|nga aldaw|nga alaldaw}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|a tignay|tigtignay}} idi kalpasan ti {{PLURAL:$3|nga aldaw|$3 nga alaldaw}}',
+'activeusers-from' => 'Iparang dagiti agar-aramat a mangrugi iti:',
+'activeusers-hidebots' => 'Ilemmeng dagiti bot',
+'activeusers-hidesysops' => 'Ilemmeng dagiti administrador',
+'activeusers-noresult' => 'Awan ti nasarakan nga agar-aramat.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Dagiti karbengan ti grupo ti agar-aramat',
 'listgrouprights-summary' => 'Dagiti sumaganad a listaan ti bunggoy ti agar-aramat a naipalawag iti daytoy a wiki, a nairaman dagiti karbengan ti panagserrekda.
@@ -2094,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}}.',
@@ -2683,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',
@@ -2979,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:
 
@@ -3013,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',
@@ -3190,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',
@@ -3603,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',
@@ -3700,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',
@@ -3725,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..7fa36f2 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' => 'Хоам бе, хувцамий лоацам белгал даь деце',
@@ -247,7 +246,6 @@ $messages = array(
 'disclaimers' => 'Бокъонах юхавалаp',
 'disclaimerpage' => 'Project:Бокъонах юхавалаp',
 'edithelp' => 'Хувцама куцтохкам',
-'edithelppage' => 'Help:ГӀалатнийсдар',
 'helppage' => 'Help:Чулоацам',
 'mainpage' => 'Кертера оагӀув',
 'mainpage-description' => 'Кертера оагӀув',
@@ -522,7 +520,6 @@ $messages = array(
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) хьажа',
 'searchmenu-exists' => "'''Укх масса-хьахьоадайтамач ер оаг|ув \"[[:\$1]]\" я'''",
 'searchmenu-new' => "'''Укх \"[[:\$1]]\" масса-хьахоадайтамач оагIув хьае!'''",
-'searchhelp-url' => 'Help:Чулоацам',
 'searchprofile-articles' => 'Гомлен оагIувнаш',
 'searchprofile-project' => 'Дагарлеи хьахоадайтами оагIувнаш',
 'searchprofile-images' => 'Медифаг',
@@ -556,9 +553,6 @@ $messages = array(
 'powersearch-toggleall' => 'Деррига',
 'powersearch-togglenone' => 'Цхьаккха',
 
-# Quickbar
-'qbsettings-none' => 'Цхьаккха',
-
 # Preferences page
 'preferences' => 'Оттамаш',
 'mypreferences' => 'Оттамаш',
@@ -796,7 +790,7 @@ $messages = array(
 # Special:ListGroupRights
 'listgrouprights-members' => '(тоабий дагарче)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Дакъалаьцархочоа д-хоамни:',
 
 # Watchlist
@@ -1072,7 +1066,7 @@ $messages = array(
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Шерал',
 'exif-imagelength' => 'Лакхал',
 'exif-imagedescription' => 'Сурта цIи',
@@ -1132,11 +1126,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..33cc816 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Albonio
  * @author Artomo
+ * @author Geitost
  * @author Kaganer
  * @author Lakaoso
  * @author Malafaya
@@ -137,7 +138,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',
@@ -225,7 +225,7 @@ $messages = array(
 'cancel' => 'Anular',
 'moredotdotdot' => 'Plus...',
 'mypage' => 'Mea pagino',
-'mytalk' => 'Mea diskuti',
+'mytalk' => 'Diskuti',
 'anontalk' => 'Diskuto relatant ad ica IP',
 'navigation' => 'Navigado',
 'and' => '&#32;ed',
@@ -317,7 +317,6 @@ $messages = array(
 'disclaimers' => 'Legala averto',
 'disclaimerpage' => 'Project:Generala des-agnosko',
 'edithelp' => 'Helpo pri redaktado',
-'edithelppage' => 'Help:Redaktado',
 'helppage' => 'Help:Helpo',
 'mainpage' => 'Frontispico',
 'mainpage-description' => 'Frontispico',
@@ -423,7 +422,7 @@ Atencez ke kelka pagini posible duras montresar semblante ke vu ne ekirus, til v
 'logout' => 'Ekirar',
 'userlogout' => 'Ekirar',
 'notloggedin' => 'Sesiono ne esas iniciata',
-'nologin' => "Ka vu ne havas konto? '''$1'''.",
+'nologin' => 'Ka vu ne havas konto? $1.',
 'nologinlink' => 'Kreez konto',
 'createaccount' => 'Krear nova konto',
 'gotaccount' => "Ka vu ja havas konto? '''$1'''.",
@@ -475,6 +474,9 @@ Voluntez enirar altrafoye pos recevar ol.',
 # Special:PasswordReset
 'passwordreset-username' => 'Uzantonomo:',
 
+# Special:ChangeEmail
+'changeemail' => 'Chanjar e-adreso*',
+
 # Edit page toolbar
 'bold_sample' => 'Dika literi',
 'bold_tip' => 'Dika literi',
@@ -597,6 +599,7 @@ La efaco-registraro e movo-registraro dil pagino provizesar sequante por refero.
 Surskriburo: '''({{int:cur}})''' = diferi kun l'aktuala versiono,
 '''({{int:last}})''' = diferi kun l'antea versiono,
 '''{{int:minoreditletter}}''' = mikra redakto.",
+'history-show-deleted' => 'Nur efacita',
 'histfirst' => 'Maxim anciena',
 'histlast' => 'Maxim nova',
 'historysize' => '({{PLURAL:$1|1 bicoko|$1 bicoki}})',
@@ -649,9 +652,10 @@ Surskriburo: '''({{int:cur}})''' = diferi kun l'aktuala versiono,
 'notextmatches' => 'Nula paginala texto fitas',
 'prevn' => 'antea {{PLURAL:$1|$1}}',
 'nextn' => 'sequanta {{PLURAL:$1|$1}}',
+'prevn-title' => 'Antea $1 {{PLURAL:$1|rezultajo|rezultaji}}',
+'nextn-title' => 'Sequanta $1 {{PLURAL:$1|rezultajo|rezultaji}}',
 'viewprevnext' => 'Vidar ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-new' => "'''Kreez la pagino \"[[:\$1]]\" in ca wiki!'''",
-'searchhelp-url' => 'Help:Helpo',
 'searchprofile-articles' => 'Temala pagini',
 'searchprofile-project' => 'Helpo',
 'searchprofile-images' => "''Media''",
@@ -670,6 +674,7 @@ Surskriburo: '''({{int:cur}})''' = diferi kun l'aktuala versiono,
 'searchall' => 'omna',
 'showingresults' => "Montrante infre {{PLURAL:$1|'''1''' rezulto|'''$1''' rezulti}}, qui komencas kun numero #'''$2'''.",
 'showingresultsnum' => "Montrante infre {{PLURAL:$3|'''1''' rezulto|'''$3''' rezulti}}, qui komencas kun numero #'''$2'''.",
+'showingresultsheader' => "{{PLURAL:$5|Rezultajo '''$1''' ek '''$3'''|Rezultaji '''$1 - $2''' ek '''$3'''}} di '''$4'''",
 'nonefound' => "'''Atencez''': Nespecigite, nur ula nomari esas serchata.
 Probez prefixizar vua demando kun ''all:'' por serchar omna kontenajo (inkluzanta debato-pagini, shabloni, edc.), od uzar la dezirata nomaro kom prefixo.",
 'powersearch' => 'Avancita sercho',
@@ -682,13 +687,9 @@ 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',
+'mypreferences' => 'Preferaji',
 'prefs-edits' => 'Nombro di redaktaji:',
 'prefsnologin' => 'Vu ne eniris',
 'prefsnologintext' => 'Vu mustas <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} enirir]</span> por establisar la preferaji.',
@@ -894,7 +895,7 @@ Volutez kontrolar <strong>[[:$1]]</strong> se vu ne esas certa pri chanjar olu.
 'filehist-dimensions' => 'Dimensioni',
 'filehist-filesize' => 'Grandeso dil arkivo',
 'filehist-comment' => 'Komento',
-'imagelinks' => 'Ligili al arkivo',
+'imagelinks' => 'Uzadi di arkivo',
 'linkstoimage' => 'La {{PLURAL:$1|pagino|$1 pagini}} infre ligas a ca arkivo:',
 'nolinkstoimage' => 'Nula pagino ligas a ca pagino.',
 'sharedupload' => 'Ca arkivo esas de $1 e posible esas uzata da altra projekti.',
@@ -975,7 +976,7 @@ Volutez kontrolar <strong>[[:$1]]</strong> se vu ne esas certa pri chanjar olu.
 'protectedtitles' => 'Protektita tituli',
 'listusers' => 'Uzanto-listo',
 'usereditcount' => '$1 {{PLURAL:$1|redakto|redakti}}',
-'usercreated' => 'Kreita ye $1 $2',
+'usercreated' => '{{GENDER:$3|Kreita}} ye $1 $2',
 'newpages' => 'Nova pagini',
 'newpages-username' => 'Uzantonomo:',
 'ancientpages' => 'Maxim anciena artikli',
@@ -1035,7 +1036,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',
@@ -1051,8 +1052,8 @@ Volutez kontrolar <strong>[[:$1]]</strong> se vu ne esas certa pri chanjar olu.
 'emailsenttext' => 'Vua e-posto sendesis.',
 
 # Watchlist
-'watchlist' => 'Mea surveyaji',
-'mywatchlist' => 'Mea surveyaji',
+'watchlist' => 'Surveyaji',
+'mywatchlist' => 'Surveyaji',
 'nowatchlist' => 'Vu ne havas objekti en vua listo di surveyaji.',
 'watchnologin' => 'Vu ne startis sesiono',
 'watchnologintext' => 'Vu mustas [[Special:UserLogin|enirir]] por modifikar vua surveyaji.',
@@ -1170,12 +1171,12 @@ restauris ad lasta versiono da $2.',
 'blanknamespace' => '(Chefa)',
 
 # Contributions
-'contributions' => 'Kontributadi dil uzanto',
+'contributions' => 'Kontributadi dil {{GENDER:$1|uzanto}}',
 'contributions-title' => 'Uzanto-kontributadi di $1',
-'mycontris' => 'Mea kontributadi',
+'mycontris' => 'Kontributadi',
 'contribsub2' => 'Pro $1 ($2)',
 'nocontribs' => 'Ne trovesis chanji qui fitez ita kriterii.',
-'uctop' => ' (lasta modifiko)',
+'uctop' => '(aktuala)',
 'month' => 'De monato (e plu frue):',
 'year' => 'De yaro (e plu frue):',
 
@@ -1183,6 +1184,7 @@ restauris ad lasta versiono da $2.',
 'sp-contributions-newbies-sub' => 'Di nova konti',
 'sp-contributions-blocklog' => 'blokusar-registraro',
 'sp-contributions-deleted' => 'efacita uzanto-kontributadi',
+'sp-contributions-logs' => 'registrari',
 'sp-contributions-talk' => 'diskutez',
 'sp-contributions-search' => 'Serchar kontributadi',
 'sp-contributions-username' => 'IP-adreso od uzantonomo:',
@@ -1196,13 +1198,14 @@ restauris ad lasta versiono da $2.',
 'nolinkshere' => "Nula pagino ligas ad '''[[:$1]]'''.",
 'isredirect' => 'ridirektanta pagino',
 'istemplate' => 'inkluzo',
-'isimage' => 'imajo-ligilo',
+'isimage' => 'arkivo-ligilo',
 'whatlinkshere-prev' => '{{PLURAL:$1|antea|antea $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|sequanta|sequanta $1}}',
 'whatlinkshere-links' => '← ligili',
 'whatlinkshere-hideredirs' => '$1 ridirektili',
+'whatlinkshere-hidetrans' => '$1 inkluzi',
 'whatlinkshere-hidelinks' => '$1 ligili',
-'whatlinkshere-hideimages' => '$1 ligili di imaji',
+'whatlinkshere-hideimages' => '$1 ligili di arkivi',
 'whatlinkshere-filters' => 'Filtrili',
 
 # Block/unblock
@@ -1234,7 +1237,7 @@ Videz [[Special:BlockList|IP-blokuslisto]] por revizor blokusadi.',
 'unblockip' => 'Desblokusar uzanto',
 'unblockiptext' => 'Uzez la sequanta formularo por restaurar la skribo-aceso ad IP-adreso qua blokusesis antee.',
 'ipusubmit' => 'Desblokusar',
-'ipblocklist' => 'Blokusita IP-adresi ed uzantonomi',
+'ipblocklist' => 'Blokusita uzanti',
 'ipblocklist-submit' => 'Serchar',
 'blocklink' => 'blokusar',
 'unblocklink' => 'desblokusar',
@@ -1415,7 +1418,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 +1461,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 +1519,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 c97e167..11f0d32 100644 (file)
@@ -10,6 +10,7 @@
  * @author Bjarki S
  * @author Cessator
  * @author Friðrik Bragi Dýrfjörð
+ * @author Geitost
  * @author Gott wisst
  * @author Jóna Þórunn
  * @author Kaganer
@@ -262,8 +263,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 +276,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 +316,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 +340,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}}',
@@ -423,6 +435,7 @@ $messages = array(
 'create-this-page' => 'Skapa þessari síðu',
 'delete' => 'Eyða',
 'deletethispage' => 'Eyða þessari síðu',
+'undeletethispage' => 'Endurvekja þessa síðu',
 'undelete_short' => 'Endurvekja {{PLURAL:$1|eina breytingu|$1 breytingar}}',
 'viewdeleted_short' => 'Skoða {{PLURAL:$1|eina eydda breytingu|$1 eyddar breytingar}}',
 'protect' => 'Vernda',
@@ -476,7 +489,6 @@ $1',
 'disclaimers' => 'Fyrirvarar',
 'disclaimerpage' => 'Project:Almennur fyrirvari',
 'edithelp' => 'Breytingarhjálp',
-'edithelppage' => 'Help:Breyta',
 'helppage' => 'Help:Efnisyfirlit',
 'mainpage' => 'Forsíða',
 'mainpage-description' => 'Forsíða',
@@ -623,6 +635,8 @@ $2',
 'namespaceprotected' => "Þú hefur ekki leyfi til að breyta síðum í '''$1''' nafnrýminu.",
 'customcssprotected' => 'Þú hefur ekki leyfi að breyta þessari CSS-umbrotsíðu, því hún hefur notendastillingar annars notanda.',
 'customjsprotected' => 'Þú hefur ekki leyfi til að breyta þessari JavaScript síðu, því hún hefur notendastillingar annars notanda.',
+'mycustomcssprotected' => 'Þú hefur ekki leyfi til þess að breyta þessari CSS-síðu.',
+'mycustomjsprotected' => 'Þú hefur ekki leyfi til þess að breyta þessari JavaScript-síðu.',
 'ns-specialprotected' => 'Kerfissíðum er ekki hægt að breyta.',
 'titleprotected' => "Þessi titill hefur verið verndaður fyrir sköpun af [[User:$1|$1]].
 Ástæðan sem gefin var ''$2''.",
@@ -648,9 +662,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 +686,38 @@ Ekki gleyma að breyta [[Special:Preferences|{{SITENAME}} stillingunum]] þínum
 'logout' => 'Útskráning',
 'userlogout' => 'Útskrá',
 'notloggedin' => 'Ekki innskráð(ur)',
-'nologin' => "Ekki með aðgang? '''$1'''.",
+'userlogin-noaccount' => 'Áttu ekki aðgang?',
+'userlogin-joinproject' => 'Sameina {{SITENAME}}',
+'nologin' => 'Ekki með aðgang? $1.',
 'nologinlink' => 'Stofnaðu aðgang',
 'createaccount' => 'Nýskrá',
 'gotaccount' => "Nú þegar með notandanafn? '''$1'''.",
 'gotaccountlink' => 'Skráðu þig inn',
 'userlogin-resetlink' => 'Gleymdir þú notendaupplýsingunum þínum?',
+'userlogin-resetpassword-link' => '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}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|nýlegur stuðningsaðili|nýlegir stuðningsaðilar}}',
 '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.
@@ -727,7 +770,7 @@ Gjörðu svo vel og settu inn netfang á gildu formi eða tæmdu reitinn.',
 'cannotchangeemail' => 'Ekki er hægt að breyta netföngum notenda á þessum wiki',
 'emaildisabled' => 'Þessi síða getur ekki sent tölvupóst.',
 'accountcreated' => 'Aðgangur búinn til',
-'accountcreatedtext' => 'Notandaaðgangur fyrir $1 er tilbúinn.',
+'accountcreatedtext' => 'Notandaaðgangurinn fyrir [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|spjall]]) hefur verið búinn til.',
 'createaccount-title' => 'Innskráningagerð á {{SITENAME}}',
 'createaccount-text' => 'Einhver bjó til aðgang fyrir netfangið þitt á {{SITENAME}} ($4) undir nafninu „$2“, með lykilorðið „$3“.
 Þú ættir að skrá þig inn og breyta lykilorðinu núna.
@@ -763,13 +806,14 @@ Til að klára að skrá þig inn, verður þú að endurstilla lykilorðið hé
 'resetpass-wrong-oldpass' => 'Vitlaust tímabundið eða núverandi lykilorð.
 Þú gætir þegar verið búin/n að breyta lykilorðinu eða sótt um nýtt tímabundið lykilorð',
 'resetpass-temp-password' => 'Tímabundið lykilorð:',
+'resetpass-abort-generic' => 'Breytingum á lykilorðum hefur verið hætt með viðbót.',
 
 # Special:PasswordReset
 'passwordreset' => 'Endurstilla lykilorð',
-'passwordreset-text' => 'Fylltu út þennan reit til að endursetja lykilorðið þitt.',
+'passwordreset-text-one' => 'Útfylltu þetta eyðublað til þess að endursetja lykilorðið.',
 '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-emaildisabled' => 'Tölvupósteiginleikar hafa verið gerðir óvirkir á þessum wiki.',
 'passwordreset-username' => 'Notandanafn:',
 'passwordreset-domain' => 'Lén:',
 'passwordreset-capture' => 'Sjá áminninguna sem var send í tölvupósti?',
@@ -795,7 +839,7 @@ Ef það varst ekki þú sem fórst fram á þetta, eða ef þú mannst lykilor
 Tímabundið lykilorð: $2',
 'passwordreset-emailsent' => 'Töluvpóstur til að endursetja lykilorðið hefur verið sendur.',
 'passwordreset-emailsent-capture' => 'Tölvupóstur til að endursetja lykilorðið hefur verið sendur í tölvupósti, sem er sýndur hér fyrir neðan.',
-'passwordreset-emailerror-capture' => 'Tölvupóstur til að endursetja lykilorðið var búinn til, sem er sýndur hér fyrir neðan, en ekki tókst að senda hana til notandans: $1',
+'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',
@@ -1004,12 +1048,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',
@@ -1253,7 +1300,6 @@ Frekari upplýsingar eru í [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
 'searchmenu-legend' => 'Leitarvalmöguleikar',
 'searchmenu-exists' => "'''Það er síða að nafni „[[:$1]]“ á þessum wiki'''",
 'searchmenu-new' => "'''Skapaðu síðuna \"[[:\$1]]\" á þessum wiki!'''",
-'searchhelp-url' => 'Help:Efnisyfirlit',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Leita að síðum með þessu forskeyti]]',
 'searchprofile-articles' => 'Efnissíður',
 'searchprofile-project' => 'Hjálpar- og verkefnasíður',
@@ -1296,6 +1342,7 @@ Frekari upplýsingar eru í [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
 'searchdisabled' => '{{SITENAME}}-leit er óvirk.
 Þú getur leitað í genum Google á meðan.
 Athugaðu að skrár þeirra yfir {{SITENAME}}-efni kunna að vera úreltar.',
+'search-error' => 'Villa kom upp við leit að: $1',
 
 # Preferences page
 'preferences' => 'Stillingar',
@@ -1509,6 +1556,8 @@ Tölvupóstfang þitt er ekki gefið upp þegar aðrir notendur hafa samband vi
 'right-editusercssjs' => 'Breyta CSS- og JS-skrám annarra',
 'right-editusercss' => 'Breyta CSS-skrám annarra',
 'right-edituserjs' => 'Breyta JS-skrám annarra',
+'right-editmyusercss' => 'Breyta þinni eigin CSS-notandaskrá',
+'right-editmyuserjs' => 'Breyta þinni eigin JavaScript-notandaskrá',
 'right-rollback' => 'Taka snögglega aftur breytingar síðasta notanda sem breytti síðunni',
 'right-markbotedits' => 'Merkja endurtektar breytingar sem vélmennabreytingar',
 'right-noratelimit' => 'Sneiða hjá takmörkunum',
@@ -1747,7 +1796,7 @@ $1',
 'upload-proto-error-text' => 'Upphlöðun frá öðrum vefþjón þarfnast vefslóðar sem byrjar á <code>http://</code> eða <code>ftp://</code>.',
 'upload-file-error' => 'Innri villa',
 'upload-file-error-text' => 'Innri villa: Gat ekki búið til tímabundna skrá á vefþjóni.
-Vinsamlegast hafðu samband við [[Special:ListUsers/sysop|möppudýr]].',
+Vinsamlegast hafðu samband við [[Special:ListUsers/sysop|stjórnanda]].',
 'upload-misc-error' => 'Óþekkt innhleðsluvilla',
 'upload-misc-error-text' => 'Upphal þitt mistókst vegna óþekktrar villu.
 Athugaðu hvort vefslóðin sé rétt og aðgengileg og að því loknu reyndu aftur.
@@ -2003,6 +2052,8 @@ Leitarstrengurinn á að vera á þessu formi: efnistag/myndasnið, t.d. <code>i
 Laga ætti tenglanna og láta þá vísa á rétta síðu.<br />
 Farið er með síðu sem aðgreiningarsíðu ef að hún inniheldur snið sem vísað er í frá [[MediaWiki:Disambiguationspage]]",
 
+'pageswithprop-submit' => 'Áfram',
+
 'doubleredirects' => 'Tvöfaldar tilvísanir',
 'doubleredirectstext' => 'Þessi síða er listi yfir skrár sem eru tilvísanir á aðrar tilvísanir.
 Hver lína inniheldur tengla á fyrstu og aðra tilvísun auk þeirrar síðu sem seinni tilvísunin beinist að, sem er oftast sú síða sem allar tilvísanirnar eiga að benda á.
@@ -2166,6 +2217,15 @@ Leitin þarf að minnsta kosti að innihalda rótarlén, eins og "*.org"
 'listusers-noresult' => 'Enginn notandi fannst.',
 'listusers-blocked' => '(bannaður)',
 
+# Special:ActiveUsers
+'activeusers' => 'Virkir notendur',
+'activeusers-intro' => 'Þetta er listi yfir notendur sem hafa verið virkir {{PLURAL:$1|síðasta|síðustu}} $1 {{PLURAL:$1|dag|daga}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|aðgerð|aðgerðir}} á {{PLURAL:$3|síðastliðnum degi|síðustu $3 dögum}}',
+'activeusers-from' => 'Sýna notendur sem byrja á:',
+'activeusers-hidebots' => 'Fela vélmenni',
+'activeusers-hidesysops' => 'Fela möppudýr',
+'activeusers-noresult' => 'Enginn notandi fannst.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Notandahópréttindi',
 'listgrouprights-summary' => 'Hér er listi yfir notendahópa á þessum wiki, með þeirra réttindum. 
@@ -2243,8 +2303,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}}.',
@@ -2498,7 +2558,7 @@ $1',
 'mycontris' => 'Framlög',
 'contribsub2' => 'Eftir $1 ($2)',
 'nocontribs' => 'Engar breytingar fundnar sem passa við þessa viðmiðun.',
-'uctop' => '(nýjast)',
+'uctop' => '(núverandi)',
 'month' => 'Frá mánuðinum (og fyrr):',
 'year' => 'Frá árinu (og fyrr):',
 
@@ -2823,6 +2883,8 @@ Vinsamlegast heimsæktu [//www.mediawiki.org/wiki/Localisation MediaWiki-staðf
 'thumbnail-more' => 'Stækka',
 'filemissing' => 'Skrá vantar',
 'thumbnail_error' => 'Villa við gerð smámyndar: $1',
+'thumbnail_error_remote' => 'Villumelding frá $1:
+$2',
 'djvu_page_error' => 'DjVu-blaðsíða er utan marka',
 'djvu_no_xml' => 'Mistókst að sækja XML-gögn fyrir DjVu skrá',
 'thumbnail-temp-create' => 'Mistókst að búa til tímabundna smámynd.',
@@ -3127,11 +3189,25 @@ Vinsamlegast reyndu aftur.',
 'minutes' => '{{PLURAL:$1|einni mínútu|$1 mínútum}}',
 'hours' => '{{PLURAL:$1|einum klukkutíma|$1 klukkutímum}}',
 'days' => '{{PLURAL:$1|einum degi|$1 dögum}}',
+'weeks' => '{{PLURAL:$1|$1 vika|$1 vikur}}',
 'months' => '{{PLURAL:$1|$1 mánuði|$1 mánuðum}}',
 'years' => '{{PLURAL:$1|$1 ári|$1 árum}}',
 'ago' => '$1 síðan',
 'just-now' => 'akkúrat núna',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|klukkutíma|klukkutímum}} síðan',
+'minutes-ago' => '$1 {{PLURAL:$1|mínútu|mínútum}} síðan',
+'seconds-ago' => '$1 {{PLURAL:$1|sekúndu|sekúndum}} síðan',
+'monday-at' => 'Mánudag klukkan $1',
+'tuesday-at' => 'Þriðjudag klukkan $1',
+'wednesday-at' => 'Miðvikudag klukkan $1',
+'thursday-at' => 'Fimmtudag klukkan $1',
+'friday-at' => 'Föstudag klukkan $1',
+'saturday-at' => 'Laugardag klukkan $1',
+'sunday-at' => 'Sunnudag klukkan $1',
+'yesterday-at' => 'Í gær klukkan $1',
+
 # Bad image list
 'bad_image_list' => 'Sniðið er eftirfarandi:
 
@@ -3161,7 +3237,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',
@@ -3320,7 +3396,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ð',
@@ -3697,12 +3773,13 @@ 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:Redirect
+'redirect-submit' => 'Áfram',
+'redirect-lookup' => 'Fletta upp:',
+'redirect-value' => 'Gildi:',
+'redirect-user' => 'Notandanúmer',
+'redirect-file' => 'Skráarnafn',
+'redirect-not-exists' => 'Gildi fannst ekki',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Leita að afriti',
@@ -3793,6 +3870,9 @@ Tæknilegir örðugleikar eru á þessari síðu.',
 'htmlform-submit' => 'Senda',
 'htmlform-reset' => 'Taka aftur breytingu',
 'htmlform-selectorother-other' => 'Annað',
+'htmlform-no' => 'Nei',
+'htmlform-yes' => 'Já',
+'htmlform-chosen-placeholder' => 'Veldu valmöguleika',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 með fullum texta leitar stuðningi',
index 06d4955..94bbf76 100644 (file)
@@ -28,6 +28,7 @@
  * @author F. Cosoleto
  * @author Felis
  * @author FollowTheMedia
+ * @author Geitost
  * @author Gianfranco
  * @author HalphaZ
  * @author Jasonbleinel
@@ -394,6 +395,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}}',
@@ -446,7 +459,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',
@@ -475,6 +488,7 @@ $messages = array(
 'create-this-page' => 'Crea questa pagina',
 'delete' => 'Cancella',
 'deletethispage' => 'Cancella questa pagina',
+'undeletethispage' => 'Recupera questa pagina',
 'undelete_short' => 'Recupera {{PLURAL:$1|una revisione|$1 revisioni}}',
 'viewdeleted_short' => 'Vedi {{PLURAL:$1|una modifica cancellata|$1 modifiche cancellate}}',
 'protect' => 'Proteggi',
@@ -505,7 +519,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',
@@ -528,7 +542,6 @@ $1',
 'disclaimers' => 'Avvertenze',
 'disclaimerpage' => 'Project:Avvertenze generali',
 'edithelp' => 'Guida',
-'edithelppage' => 'Help:Modifica',
 'helppage' => 'Help:Indice',
 'mainpage' => 'Pagina principale',
 'mainpage-description' => 'Pagina principale',
@@ -542,7 +555,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',
@@ -576,7 +589,6 @@ $1',
 'site-atom-feed' => 'Feed Atom di $1',
 'page-rss-feed' => 'Feed RSS per "$1"',
 'page-atom-feed' => 'Feed Atom per "$1"',
-'feed-rss' => 'RSS',
 'red-link-title' => '$1 (la pagina non esiste)',
 'sort-descending' => 'Ordinamento decrescente',
 'sort-ascending' => 'Ordinamento crescente',
@@ -676,6 +688,8 @@ $2',
 'namespaceprotected' => "Non si dispone dei permessi necessari per modificare le pagine del namespace '''$1'''.",
 'customcssprotected' => 'Non si dispone dei permessi necessari alla modifica di questa pagina CSS, in quanto contiene le impostazioni personali di un altro utente.',
 'customjsprotected' => 'Non si dispone dei permessi necessari alla modifica di questa pagina JavaScript, in quanto contiene le impostazioni personali di un altro utente.',
+'mycustomcssprotected' => 'Non si dispone dei permessi necessari per modificare questa pagina CSS.',
+'mycustomjsprotected' => 'Non si dispone dei permessi necessari per modificare questa pagina JavaScript.',
 'ns-specialprotected' => 'Non è possibile modificare le pagine speciali.',
 'titleprotected' => "La creazione di una pagina con questo titolo è stata bloccata da [[User:$1|$1]].
 La motivazione è la seguente: ''$2''.",
@@ -701,9 +715,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.',
@@ -716,18 +739,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.",
@@ -773,7 +816,7 @@ Non verranno inviati messaggi email per le funzioni elencate di seguito.",
 'cannotchangeemail' => 'Gli indirizzi e-mail non possono essere modificati in questo wiki.',
 'emaildisabled' => 'Questo sito non può inviare messaggi di posta elettronica.',
 'accountcreated' => 'Accesso creato',
-'accountcreatedtext' => "È stato creato un accesso per l'utente $1.",
+'accountcreatedtext' => "È stata creata un'utenza per [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|msg]]).",
 'createaccount-title' => 'Creazione di un accesso a {{SITENAME}}',
 'createaccount-text' => 'Qualcuno ha creato un accesso a {{SITENAME}} ($4) a nome di $2, associato a questo indirizzo di posta elettronica. La password per l\'utente "$2" è impostata a "$3".
 È opportuno eseguire un accesso quanto prima e cambiare la password immediatamente.
@@ -808,13 +851,15 @@ 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-text-many' => '{{PLURAL:$1|Compila uno dei campi 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?',
@@ -841,7 +886,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",
@@ -939,7 +984,8 @@ La password per questo nuovo account può essere modificata all'accesso nella pa
 'newarticletext' => "Il collegamento appena seguito corrisponde ad una pagina non ancora esistente.
 Se vuoi creare la pagina ora, basta cominciare a scrivere il testo nella casella qui sotto (vedi la [[{{MediaWiki:Helppage}}|pagina di aiuto]] per maggiori informazioni).
 Se il collegamento è stato aperto per errore, è sufficiente fare clic sul pulsante '''Indietro''' del proprio browser.",
-'anontalkpagetext' => "----''Questa è la pagina di discussione di un utente anonimo, che non ha ancora creato un accesso o comunque non lo usa. Per identificarlo è quindi necessario usare il numero del suo indirizzo IP. Gli indirizzi IP possono però essere condivisi da più utenti. Se sei un utente anonimo e ritieni che i commenti presenti in questa pagina non si riferiscano a te, [[Special:UserLogin/signup|crea un nuovo accesso]] o [[Special:UserLogin|entra con quello che già hai]] per evitare di essere confuso con altri utenti anonimi in futuro.''",
+'anontalkpagetext' => "----
+''Questa è la pagina di discussione di un utente anonimo, che non ha ancora creato un'utenza o comunque non la sta usando. Per identificarlo è quindi necessario usare il numero del suo indirizzo IP. Gli indirizzi IP possono però essere condivisi da più utenti. Se sei un utente anonimo e ritieni che i commenti presenti in questa pagina non si riferiscano a te, [[Special:UserLogin/signup|crea una nuova utenza]] o [[Special:UserLogin|entra con quella che già hai]] per evitare di essere confuso con altri utenti anonimi in futuro.''",
 'noarticletext' => 'In questo momento la pagina richiesta è vuota. È possibile [[Special:Search/{{PAGENAME}}|cercare questo titolo]] nelle altre pagine del sito, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercare nei registri correlati] oppure [{{fullurl:{{FULLPAGENAME}}|action=edit}} modificare la pagina ora]</span>.',
 'noarticletext-nopermission' => 'In questo momento la pagina richiesta è vuota. È possibile [[Special:Search/{{PAGENAME}}|cercare questo titolo]] nelle altre pagine del sito o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercare nei registri correlati]</span>, ma non hai i permessi per creare questa pagina.',
 'missing-revision' => 'La revisione #$1 della pagina "{{PAGENAME}}" non esiste.
@@ -1041,14 +1087,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 costarti la perdita di tutti i cambiamenti effettuati.
-Se sei loggato, puoi disattivare questo avviso nella sezione "{{int:prefs-editing}}" delle tue preferenze.',
+'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',
@@ -1078,7 +1125,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]])',
@@ -1095,7 +1143,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',
@@ -1282,7 +1330,6 @@ I dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{
 'searchmenu-legend' => 'Opzioni di ricerca',
 'searchmenu-exists' => "'''Sul sito esiste una pagina il cui nome è \"[[:\$1]]\"'''",
 'searchmenu-new' => 'Crea la pagina "[[:$1]]" su questo sito',
-'searchhelp-url' => 'Help:Indice',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Visualizza le pagine con questo prefisso]]',
 'searchprofile-articles' => 'Pagine di contenuti',
 'searchprofile-project' => 'Pagine di aiuto e relative al progetto',
@@ -1451,7 +1498,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
@@ -1464,6 +1511,8 @@ 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.',
+'userrights-removed-self' => 'Hai rimosso con successo i tuoi diritti. E quindi, non sarai più in grado di accedere a questa pagina.',
 
 # Groups
 'group' => 'Gruppo:',
@@ -1473,7 +1522,7 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
 'group-sysop' => 'Amministratori',
 'group-bureaucrat' => 'Burocrati',
 'group-suppress' => 'Oversight',
-'group-all' => 'Utenti',
+'group-all' => '(tutti)',
 
 'group-user-member' => '{{GENDER:$1|utente}}',
 'group-autoconfirmed-member' => '{{GENDER:$1|utente autoconvalidato|utente autoconvalidata|utente autoconvalidato/a}}',
@@ -1534,6 +1583,10 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
 'right-editusercssjs' => 'Modifica i file CSS e JS di altri utenti',
 'right-editusercss' => 'Modifica i file CSS di altri utenti',
 'right-edituserjs' => 'Modifica i file JS di altri utenti',
+'right-editmyusercss' => 'Modifica il file CSS del proprio utente',
+'right-editmyuserjs' => 'Modifica il file JavaScript del proprio utente',
+'right-viewmywatchlist' => 'Visualizza i propri osservati speciali',
+'right-editmywatchlist' => 'Modifica i propri osservati speciali. Da notare che alcune azioni potranno ancora aggiungere pagine anche senza questo diritto.',
 'right-rollback' => "Annulla rapidamente le modifiche dell'ultimo utente che ha modificato una particolare pagina",
 'right-markbotedits' => 'Segna le modifiche soggette a rollback come effettuate da bot',
 'right-noratelimit' => 'Non soggetto al limite di azioni',
@@ -1579,7 +1632,7 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
 'action-deleterevision' => 'cancellare questa versione',
 'action-deletedhistory' => 'visualizzare la cronologia cancellata di questa pagina',
 'action-browsearchive' => 'cercare pagine cancellate',
-'action-undelete' => 'recuperare custa pàgina',
+'action-undelete' => 'recuperare questa pagina',
 'action-suppressrevision' => 'rivedere e ripristinare le modifiche nascoste',
 'action-suppressionlog' => 'visionare questo log privato',
 'action-block' => 'bloccare questo utente in scrittura',
@@ -1595,6 +1648,8 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
 'action-userrights-interwiki' => 'modificare i diritti degli utenti su altre wiki',
 'action-siteadmin' => 'bloccare e sbloccare il database',
 'action-sendemail' => 'inviare e-mail',
+'action-editmywatchlist' => 'modificare i propri osservati speciali',
+'action-viewmywatchlist' => 'vedere i propri osservati speciali',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|modifica|modifiche}}',
@@ -1649,7 +1704,7 @@ Le pagine contenute nella propria lista degli [[Special:Watchlist|Osservati spec
 'reuploaddesc' => 'Torna al modulo per il caricamento.',
 'upload-tryagain' => 'Invia la descrizione del file modificato',
 'uploadnologin' => 'Accesso non effettuato',
-'uploadnologintext' => "Il caricamento dei file è consentito solo agli utenti registrati che hanno eseguito [[Special:UserLogin|l'accesso]] al sito.",
+'uploadnologintext' => 'Per caricare file è necessario $1.',
 'upload_directory_missing' => 'La directory di upload ($1) non esiste e non può essere creata dal server web.',
 'upload_directory_read_only' => 'Il server web non è in grado di scrivere nella directory di upload ($1).',
 'uploaderror' => 'Errore nel caricamento',
@@ -1725,7 +1780,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.',
@@ -1770,9 +1825,9 @@ $1',
 'upload-proto-error' => 'Protocollo errato',
 'upload-proto-error-text' => "Per l'upload remoto è necessario specificare URL che iniziano con <code>http://</code> oppure <code>ftp://</code>.",
 'upload-file-error' => 'Errore interno',
-'upload-file-error-text' => 'Si è verificato un errore interno durante la creazione di un file temporaneo sul server. Contattare un [[Special:ListUsers/sysop|amministratore]] del sito.',
+'upload-file-error-text' => 'Si è verificato un errore interno durante la creazione di un file temporaneo sul server. Contattare un [[Special:ListUsers/sysop|amministratore]].',
 'upload-misc-error' => 'Errore di caricamento sconosciuto',
-'upload-misc-error-text' => 'Si è verificato un errore non identificato durante il caricamento del file. Verificare che la URL sia corretta e accessibile e provare di nuovo. Se il problema persiste, contattare un [[Special:ListUsers/sysop|amministratore]] del sito.',
+'upload-misc-error-text' => 'Si è verificato un errore non identificato durante il caricamento del file. Verificare che la URL sia corretta e accessibile e provare di nuovo. Se il problema persiste, contattare un [[Special:ListUsers/sysop|amministratore]].',
 'upload-too-many-redirects' => "L'URL conteneva troppi redirect",
 'upload-unknown-size' => 'Dimensione sconosciuta',
 'upload-http-error' => 'Si è verificato un errore HTTP: $1',
@@ -2126,7 +2181,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).",
@@ -2188,6 +2243,15 @@ Vedi anche le [[Special:WantedCategories|categorie richieste]].',
 'listusers-noresult' => 'Nessun utente risponde ai criteri impostati.',
 'listusers-blocked' => '(bloccato)',
 
+# Special:ActiveUsers
+'activeusers' => 'Elenco degli utenti attivi',
+'activeusers-intro' => 'Questo è un elenco di utenti che hanno avuto qualche tipo di attività da $1 {{PLURAL:$1|giorno|giorni}} a questa parte.',
+'activeusers-count' => "$1 {{PLURAL:$1|azione|azioni}} {{PLURAL:$3|nell'ultimo giorno|negli ultimi $3 giorni}}",
+'activeusers-from' => 'Mostra gli utenti a partire da:',
+'activeusers-hidebots' => 'Nascondi i bot',
+'activeusers-hidesysops' => 'Nascondi gli amministratori',
+'activeusers-noresult' => 'Nessun utente risponde ai criteri impostati.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Diritti del gruppo utente',
 'listgrouprights-summary' => "Di seguito sono elencati i gruppi utente definiti per questo sito, con i diritti d'accesso loro associati.
@@ -2265,8 +2329,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}}.',
@@ -2408,7 +2472,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).',
@@ -2452,7 +2516,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.
@@ -2476,7 +2541,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.",
@@ -2506,7 +2571,7 @@ $1',
 'mycontris' => 'contributi',
 'contribsub2' => 'Per $1 ($2)',
 'nocontribs' => 'Non sono state trovate modifiche che soddisfino i criteri di ricerca.',
-'uctop' => '(ultima per la pagina)',
+'uctop' => '(attuale)',
 'month' => 'Dal mese (e precedenti):',
 'year' => "Dall'anno (e precedenti):",
 
@@ -2817,6 +2882,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',
@@ -2969,7 +3036,6 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
 '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 * /',
@@ -3093,7 +3159,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',
@@ -3135,11 +3201,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:
 
@@ -3166,7 +3246,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',
@@ -3344,7 +3424,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',
@@ -3678,7 +3758,7 @@ Per favore, conferma che vuoi 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',
@@ -3687,7 +3767,7 @@ Per favore, conferma che vuoi 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',
@@ -3776,12 +3856,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',
@@ -3874,6 +3959,7 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
 '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 ae9d691..d4b33d9 100644 (file)
@@ -142,6 +142,7 @@ $specialPageAliases = array(
        'Filepath'                  => array( 'パスの取得' ),
        'Import'                    => array( 'データ取り込み', 'データー取り込み', 'インポート' ),
        'Invalidateemail'           => array( 'メール無効化', 'メール無効' ),
+       'JavaScriptTest'            => array( 'JavaScriptテスト', 'JavaScript試験' ),
        'BlockList'                 => array( 'ブロック一覧', 'ブロックの一覧' ),
        'LinkSearch'                => array( '外部リンク検索' ),
        'Listadmins'                => array( '管理者一覧' ),
@@ -158,6 +159,7 @@ $specialPageAliases = array(
        'MIMEsearch'                => array( 'MIME検索', 'MIMEタイプ検索' ),
        'Mostcategories'            => array( 'カテゴリの多いページ', 'カテゴリの多い項目' ),
        'Mostimages'                => array( '被リンクの多いファイル', '使用箇所の多いファイル' ),
+       'Mostinterwikis'            => array( 'ウィキ間リンクの多いページ' ),
        'Mostlinked'                => array( '被リンクの多いページ' ),
        'Mostlinkedcategories'      => array( '被リンクの多いカテゴリ' ),
        'Mostlinkedtemplates'       => array( '使用箇所の多いテンプレート', '被リンクの多いテンプレート' ),
@@ -168,7 +170,8 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'トークページ', '会話ページ', 'マイトーク', 'マイ・トーク' ),
        'Myuploads'                 => array( '自分のアップロード記録' ),
        'Newimages'                 => array( '新着ファイル', '新しいファイルの一覧', '新着画像展示室' ),
-       'Newpages'                  => array( '新しいページ', '新規項目' ),
+       'Newpages'                  => array( '新しいページ' ),
+       'PagesWithProp'             => array( 'プロパティがあるページ' ),
        'PasswordReset'             => array( 'パスワード再設定', 'パスワードの再設定', 'パスワードのリセット', 'パスワードリセット' ),
        'PermanentLink'             => array( '固定リンク', 'パーマリンク' ),
        'Popularpages'              => array( '人気ページ' ),
@@ -180,6 +183,7 @@ $specialPageAliases = array(
        'Randomredirect'            => array( 'おまかせリダイレクト', 'おまかせ転送' ),
        'Recentchanges'             => array( '最近の更新', '最近更新したページ' ),
        'Recentchangeslinked'       => array( '関連ページの更新状況', 'リンク先の更新状況' ),
+       'Redirect'                  => array( '転送', 'リダイレクト' ),
        'Revisiondelete'            => array( '版指定削除', '特定版削除' ),
        'Search'                    => array( '検索' ),
        'Shortpages'                => array( '短いページ' ),
@@ -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|カテゴリ}}',
@@ -552,6 +568,7 @@ $messages = array(
 'create-this-page' => 'このページを作成',
 'delete' => '削除',
 'deletethispage' => 'このページを削除',
+'undeletethispage' => 'このページを復元',
 'undelete_short' => '{{PLURAL:$1|$1 編集}}を復元',
 'viewdeleted_short' => '{{PLURAL:$1|削除された $1 編集}}を閲覧',
 'protect' => '保護',
@@ -605,7 +622,6 @@ $1',
 'disclaimers' => '免責事項',
 'disclaimerpage' => 'Project:免責事項',
 'edithelp' => '編集の仕方',
-'edithelppage' => 'Help:編集',
 'helppage' => 'Help:目次',
 'mainpage' => 'メインページ',
 'mainpage-description' => 'メインページ',
@@ -758,6 +774,8 @@ $2',
 'namespaceprotected' => "'''$1'''名前空間にあるページを編集する権限がありません。",
 'customcssprotected' => 'この CSS ページは他の利用者の個人設定を含んでいるため、あなたには編集する権限がありません。',
 'customjsprotected' => 'この JavaScript ページは他の利用者の個人設定を含んでいるため、あなたには編集する権限がありません。',
+'mycustomcssprotected' => 'あなたには CSS ページを編集する権限がありません。',
+'mycustomjsprotected' => 'あなたには JavaScript ページを編集する権限がありません。',
 'ns-specialprotected' => '特別ページは編集できません。',
 'titleprotected' => "[[User:$1|$1]]によりこのページ名を持つページの作成は保護されています。
 理由は「''$2''」です。",
@@ -788,10 +806,13 @@ $2',
 'yourpassword' => 'パスワード:',
 'userlogin-yourpassword' => 'パスワード',
 'userlogin-yourpassword-ph' => 'パスワードを入力',
+'createacct-yourpassword-ph' => 'パスワードを入力',
 'yourpasswordagain' => 'パスワード再入力:',
+'createacct-yourpasswordagain' => 'パスワード再入力',
+'createacct-yourpasswordagain-ph' => 'パスワードを再入力',
 'remembermypassword' => 'このブラウザーにログイン情報を保存 (最長 $1 {{PLURAL:$1|日|日間}})',
-'userlogin-remembermypassword' => 'ログイン情報を保存',
-'userlogin-signwithsecure' => 'セキュリティで保護された接続でログイン',
+'userlogin-remembermypassword' => 'ログイン状態を保持',
+'userlogin-signwithsecure' => 'SSL (https) 接続を使用',
 'securelogin-stick-https' => 'ログイン後にHTTPS接続を維持',
 'yourdomainname' => 'ドメイン:',
 'password-change-forbidden' => 'このウィキではパスワードを変更できません。',
@@ -812,14 +833,30 @@ $2',
 '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 を使用します。
@@ -879,7 +916,7 @@ Cookieを有効にしていることを確認して、このページを再読
 'cannotchangeemail' => 'このウィキではアカウントのメールアドレスを変更できません。',
 'emaildisabled' => 'このサイトではメールを送信できません。',
 'accountcreated' => 'アカウントを作成しました',
-'accountcreatedtext' => '利用者アカウント「$1」を作成しました。',
+'accountcreatedtext' => '利用者アカウント [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|トーク]]) を作成しました。',
 'createaccount-title' => '{{SITENAME}}のアカウント作成',
 'createaccount-text' => '誰か (おそらくあなた) が、{{SITENAME}} ($4) にあなたのメールアドレスのアカウントを作成しました。
 アカウント名「$2」、パスワード「$3」です。
@@ -917,14 +954,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-emaildisabled' => 'メール機能は、このウィキでは無効化されています。',
-'passwordreset-pretext' => '{{PLURAL:$1||下記のデータのいずれか 1 つを入力してください}}',
 'passwordreset-username' => '利用者名:',
 'passwordreset-domain' => 'ドメイン:',
 'passwordreset-capture' => 'お送りするメールの内容を表示しますか?',
@@ -957,7 +995,7 @@ $2
 仮パスワード: $2',
 'passwordreset-emailsent' => 'パスワード再設定メールをお送りしました。',
 'passwordreset-emailsent-capture' => '下記の内容の、パスワード再設定メールをお送りしました。',
-'passwordreset-emailerror-capture' => '以下の内容のパスワード再設定メールを生成しましたが、利用者への送信に失敗しました: $1',
+'passwordreset-emailerror-capture' => '以下の内容のパスワード再設定メールを生成しましたが、{{GENDER:$2|利用者}}への送信に失敗しました: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'メールアドレスの変更',
@@ -1179,6 +1217,7 @@ $1または他の[[{{MediaWiki:Grouppage-sysop}}|管理者]]にこのブロッ
 既に削除されているようです。',
 'edit-conflict' => '編集が競合。',
 'edit-no-change' => '文章が変更されていないため、編集は無視されました。',
+'postedit-confirmation' => '編集を保存しました。',
 'edit-already-exists' => '新しいページを作成できませんでした。
 そのページは既に存在します。',
 'defaultmessagetext' => '既定のメッセージ文',
@@ -1430,7 +1469,6 @@ $1",
 'searchmenu-legend' => '検索オプション',
 'searchmenu-exists' => "'''このウィキには「[[:$1]]」という名前のページがあります'''",
 'searchmenu-new' => "'''このウィキでページ「[[:$1]]」を新規作成する'''",
-'searchhelp-url' => 'Help:目次',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|この文字列から始まる名前のページを見る]]',
 'searchprofile-articles' => '本文ページ',
 'searchprofile-project' => 'ヘルプとプロジェクトページ',
@@ -1625,6 +1663,8 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'userrights-changeable-col' => '変更できるグループ',
 'userrights-unchangeable-col' => '変更できないグループ',
 'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => '利用者権限に競合があります! 変更内容をもう一度適用してください。',
+'userrights-removed-self' => 'あなた自身の権限を除去しました。そのため、このページにはもうアクセスできません。',
 
 # Groups
 'group' => 'グループ:',
@@ -1691,10 +1731,14 @@ $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ファイルを編集',
+'right-editmyusercss' => '自身のCSSファイルを編集',
+'right-editmyuserjs' => '自身のJavaScriptファイルを編集',
+'right-viewmywatchlist' => 'ウォッチリストを閲覧',
+'right-editmywatchlist' => '自身のウォッチリストを編集 (注: この権限がなくてもページを追加できる権限が他にもあります)',
 'right-rollback' => '特定ページを最後に編集した利用者の編集を即時巻き戻し',
 'right-markbotedits' => '巻き戻しをボットの編集として扱う',
 'right-noratelimit' => '速度制限を受けない',
@@ -1756,6 +1800,8 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'action-userrights-interwiki' => '他のウィキの利用者の利用者権限変更',
 'action-siteadmin' => 'データベースのロックまたはロック解除',
 'action-sendemail' => 'メールの送信',
+'action-editmywatchlist' => '自身のウォッチリストの編集',
+'action-viewmywatchlist' => '自身のウォッチリストの閲覧',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|回の変更}}',
@@ -1812,7 +1858,7 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'reuploaddesc' => 'アップロードを中止してアップロードフォームへ戻る',
 'upload-tryagain' => '修正したファイル解説を投稿',
 'uploadnologin' => 'ログインしていません',
-'uploadnologintext' => 'ファイルをアップロードするには[[Special:UserLogin|ログイン]]する必要があります。',
+'uploadnologintext' => 'ファイルをアップロードするには$1する必要があります。',
 'upload_directory_missing' => 'アップロード先ディレクトリ ($1) が見つかりませんでした。ウェブ サーバーによる作成もできませんでした。',
 'upload_directory_read_only' => 'アップロード先ディレクトリ ($1) には、ウェブサーバーが書き込めません。',
 'uploaderror' => 'アップロードのエラー',
@@ -2102,7 +2148,7 @@ URLが正しいものであり、ウェブサイトが稼働していること
 'filehist-comment' => 'コメント',
 'filehist-missing' => 'ファイルがありません',
 'imagelinks' => 'ファイルの使用状況',
-'linkstoimage' => '以下の{{PLURAL:1|ページ|&#32;$1 ページ}}がこのファイルにリンクしています:',
+'linkstoimage' => '以下の{{PLURAL:$1|ページ|&#32;$1 ページ}}がこのファイルにリンクしています:',
 'linkstoimage-more' => 'このファイルへは $1 を超える数のページからリンクがあります。
 以下の一覧ではこのファイルにリンクしている最初の $1 ページのみを表示しています。
 [[Special:WhatLinksHere/$2|完全な一覧]]も参照してください。',
@@ -2383,6 +2429,15 @@ contenttype/subtypeの形式で入力してください (例: <code>image/jpeg</
 'listusers-noresult' => '利用者が見つかりませんでした。',
 'listusers-blocked' => '(ブロック中)',
 
+# Special:ActiveUsers
+'activeusers' => '活動中の利用者一覧',
+'activeusers-intro' => 'これは過去 $1 {{PLURAL:$1|日|日間}}に何らかの活動をした利用者の一覧です。',
+'activeusers-count' => '過去 {{PLURAL:$3|1 日|$3 日間}}に $1 {{PLURAL:$1|回の操作}}',
+'activeusers-from' => '最初に表示する利用者:',
+'activeusers-hidebots' => 'ボットを隠す',
+'activeusers-hidesysops' => '管理者を隠す',
+'activeusers-noresult' => '利用者が見つかりませんでした。',
+
 # Special:ListGroupRights
 'listgrouprights' => '利用者グループの権限',
 'listgrouprights-summary' => '以下は、このウィキに登録されている利用者グループと、それぞれに割り当てられている権限の一覧です。
@@ -2462,8 +2517,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 ページ}}が登録されています。',
@@ -2746,9 +2801,9 @@ $1',
 'whatlinkshere' => 'リンク元',
 'whatlinkshere-title' => '「$1」へリンクしているページ',
 'whatlinkshere-page' => 'ページ:',
-'linkshere' => "以下のページが、'''[[:$1]]'''にリンクしています:",
-'nolinkshere' => "'''[[:$1]]'''にリンクしているページはありません。",
-'nolinkshere-ns' => "指定した名前空間内に、'''[[:$1]]'''にリンクしているページはありません。",
+'linkshere' => "以下のページが、'''[[:$1]]''' にリンクしています:",
+'nolinkshere' => "'''[[:$1]]''' にリンクしているページはありません。",
+'nolinkshere-ns' => "指定した名前空間内に、'''[[:$1]]''' にリンクしているページはありません。",
 'isredirect' => '転送ページ',
 'istemplate' => '参照読み込み',
 'isimage' => 'ファイルへのリンク',
@@ -3054,6 +3109,8 @@ MediaWiki 全般のローカライズ (地域化) に貢献したい場合は、
 'thumbnail-more' => '拡大',
 'filemissing' => 'ファイルがありません',
 'thumbnail_error' => 'サムネイルの作成エラー: $1',
+'thumbnail_error_remote' => '$1が返したエラーメッセージ:
+$2',
 'djvu_page_error' => 'DjVuページが範囲外です',
 'djvu_no_xml' => 'DjVuファイルのXMLデータを取得できません',
 'thumbnail-temp-create' => '一時的なサムネイルファイルを作成できません',
@@ -3112,7 +3169,7 @@ MediaWiki 全般のローカライズ (地域化) に貢献したい場合は、
 'import-error-interwiki' => 'ページ名が外部リンク (ウィキ間リンク) に予約されているため、ページ「$1」を取り込みませんでした。',
 'import-error-special' => 'ページ「$1」は、ページが許可されない特別名前空間に属しているため取り込みません。',
 'import-error-invalid' => '名前が正しくないため、ページ「$1」を取り込みませんでした。',
-'import-error-unserialize' => 'ページ「$1」の版 $2 は直列化復元できませんでした。この版は $4 として直列化されたコンテンツモデル $3 を使用していると報告されています。',
+'import-error-unserialize' => 'ページ「$1」の版 $2 はシリアライズ解除できませんでした。この版は $4 としてシリアライズされたコンテンツモデル $3 を使用していると報告されています。',
 'import-options-wrong' => '間違った{{PLURAL:$2|オプション}}です: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => '入力したルートページの名前は無効です。',
 'import-rootpage-nosubpage' => 'ルートページの名前空間「$1」では、下位ページが許可されていません。',
@@ -3212,7 +3269,6 @@ MediaWiki 全般のローカライズ (地域化) に貢献したい場合は、
 '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はボットのみに影響します */',
@@ -3389,11 +3445,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' => '書式は以下の通りです:
 
@@ -3403,8 +3473,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' => '中国語 (簡体)',
@@ -3478,7 +3546,7 @@ Variants for Chinese language
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => '画像の幅',
 'exif-imagelength' => '画像の高さ',
 'exif-bitspersample' => '画像のビットの深さ',
@@ -3656,7 +3724,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 ファックス符号化',
@@ -4155,12 +4223,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' => '重複ファイルの検索',
@@ -4253,6 +4326,7 @@ MediaWikiは、有用であることを期待して配布されていますが
 'htmlform-selectorother-other' => 'その他',
 'htmlform-no' => 'いいえ',
 'htmlform-yes' => 'はい',
+'htmlform-chosen-placeholder' => '選択してください',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 (全文検索あり)',
index a9ecb16..8ec6c93 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',
@@ -252,7 +251,6 @@ $1',
 'disclaimers' => 'Diskliema',
 'disclaimerpage' => 'Project: Jinaral diskliema',
 'edithelp' => 'Editin elp',
-'edithelppage' => 'Help: Editin',
 'helppage' => 'Help: Kantent',
 'mainpage' => 'Mien piej',
 'mainpage-description' => 'Mien piej',
index 4279d5f..fb47d8b 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Geitost
  * @author Huslåke
  * @author Urhixidur
  * @author Ælsån
@@ -42,8 +43,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',
@@ -205,7 +204,6 @@ $messages = array(
 'disclaimers' => 'Førbeholt',
 'disclaimerpage' => 'Project:Huses førbeholt',
 'edithelp' => 'Hjælp til redigærenge',
-'edithelppage' => "Help:Vordan redigærer a'n side",
 'helppage' => 'Help:Hjælpførside',
 'mainpage' => 'Førsit',
 'mainpage-description' => 'Førsit',
@@ -313,7 +311,7 @@ Førespørgsel: $2',
 'userlogin' => 'Åpret æ konto æller loĝ på',
 'logout' => 'Loĝ åf',
 'userlogout' => 'Loĝ åf',
-'nologin' => "Du har engen brugerkonto? '''$1'''.",
+'nologin' => 'Du har engen brugerkonto? $1.',
 'nologinlink' => 'Åpret ny brugerkonto',
 'createaccount' => 'Åpret en ny konto',
 'gotaccount' => "Du har ålerede en brugerkonto? '''$1'''.",
@@ -440,7 +438,6 @@ hersenenge, (førge) = førskel til den førge hersenenge, l = lile til mendre 
 'prevn' => 'førge {{PLURAL:$1|$1}}',
 'nextn' => 'nægste {{PLURAL:$1|$1}}',
 'viewprevnext' => 'Ves ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:Hjælpførside',
 'searchall' => 'ål',
 'powersearch' => 'Søĝ',
 
@@ -609,7 +606,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 e2c8beb..0e29054 100644 (file)
@@ -292,7 +292,6 @@ $1',
 'disclaimers' => 'Pamaidonan',
 'disclaimerpage' => 'Project:Panyangkalan umum',
 'edithelp' => 'Pitulung panyuntingan',
-'edithelppage' => 'Help:panyuntingan',
 'helppage' => 'Help:Isi',
 'mainpage' => 'Kaca Utama',
 'mainpage-description' => 'Kaca Utama',
@@ -454,6 +453,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}})',
@@ -560,10 +561,8 @@ Panjengen manawa wis kasil ganti tembung sandi utawa nyuwun tembung sandi saunta
 
 # Special:PasswordReset
 'passwordreset' => 'Balèni setèl tembung sandhi',
-'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}}',
 'passwordreset-username' => 'Jeneng panganggo:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Delok layang èlèktronik sing diasilaké?',
@@ -1026,7 +1025,6 @@ Rinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'searchmenu-legend' => 'Pilihan panggolèkan',
 'searchmenu-exists' => "'''Ana kaca kanthi jeneng \"[[\$1]]\" ing wiki iki'''",
 'searchmenu-new' => "'''Gawé kaca \"[[:\$1]]\" ing wiki iki!'''",
-'searchhelp-url' => 'Help:Isi',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Tlusuri kaca-kaca kanthi tembung-wiwitan iki]]',
 'searchprofile-articles' => 'Kaca isi',
 'searchprofile-project' => 'Kaca pitulung lan proyèk',
@@ -1930,6 +1928,15 @@ Perlu sedikitnya satu domain tingkat atas, misalnya "*.org".<br />
 'listusers-noresult' => 'Panganggo ora ditemokaké.',
 'listusers-blocked' => '(diblokir)',
 
+# Special:ActiveUsers
+'activeusers' => 'Dhaptar panganggo aktif',
+'activeusers-intro' => 'Iki daptar panganggo sing katon lakuné ing $1 {{PLURAL:$1|dina|dina}} kapungkur.',
+'activeusers-count' => '$1 {{PLURAL:$1|suntingan|suntingan}} ing {{PLURAL:$3|dina|$3 dina}} pungkasan',
+'activeusers-from' => 'Tampilna panganggo wiwit saka:',
+'activeusers-hidebots' => 'Delikna bot',
+'activeusers-hidesysops' => 'Delikna pangurus',
+'activeusers-noresult' => 'Panganggo ora ditemokaké.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Hak-hak grup panganggo',
 'listgrouprights-summary' => 'Ing ngisor iki kapacak dhaftar grup panganggo sing didéfinisi ing wiki iki, kanthi hak-hak aksès gandhèngané.
@@ -2007,8 +2014,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}}.',
@@ -2896,7 +2903,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',
@@ -3074,7 +3081,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',
@@ -3474,13 +3481,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-é.',
index 2e70002..415564d 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' => 'გამაფრთხილე ცარიელი რედაქტირების რეზიუმეს შემთხვევაში',
@@ -212,7 +211,8 @@ $messages = array(
 'tog-diffonly' => 'დამალე გვერდის შიგთავსი ცვლილების ქვევით',
 'tog-showhiddencats' => 'დამალული კატეგორიების ჩვენება',
 'tog-noconvertlink' => 'სათაურის გარდაქმნის ბმულის გამორთვა',
-'tog-norollbackdiff' => 'გამოტოვეთ ცვლილება გაუქმებისას',
+'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|კატეგორია|კატეგორიები}}',
@@ -328,7 +340,7 @@ $messages = array(
 'vector-action-protect' => 'დაცვა',
 'vector-action-undelete' => 'აღდგენა',
 'vector-action-unprotect' => 'დაცვის დონის შეცვლა',
-'vector-simplesearch-preference' => 'á\83«á\83\94á\83\91á\83\9cá\83\98ს გაფართოებული ველის ჩართვა (მხოლოდ ვექტორული იერსახისთვის)',
+'vector-simplesearch-preference' => 'á\83«á\83\98á\83\94á\83\91á\83\98á\83¡ს გაფართოებული ველის ჩართვა (მხოლოდ ვექტორული იერსახისთვის)',
 'vector-view-create' => 'შექმნა',
 'vector-view-edit' => 'რედაქტირება',
 'vector-view-history' => 'ისტორია',
@@ -360,6 +372,7 @@ $messages = array(
 'create-this-page' => 'ამ გვერდის შექმნა',
 'delete' => 'წაშლა',
 'deletethispage' => 'გვერდის წაშლა',
+'undeletethispage' => 'ამ გვერდის აღდგენა',
 'undelete_short' => 'გააუქმე წაშლა {{PLURAL:$1|ერთი რედაქტირება|$1 რედაქტირება}}',
 'viewdeleted_short' => '{{PLURAL:$1|წაშლილი რედაქტირების|$1 წაშლილი რედაქტირებების}} ხილვა',
 'protect' => 'დაბლოკე',
@@ -413,7 +426,6 @@ $1',
 'disclaimers' => 'პასუხისმგებლობის მოხსნა',
 'disclaimerpage' => 'Project:პასუხისმგებლობის უარყოფა',
 'edithelp' => 'დახმარება',
-'edithelppage' => 'Help:ტექსტის რედაქტირება (მარტივი)',
 'helppage' => 'Help:დახმარება',
 'mainpage' => 'მთავარი გვერდი',
 'mainpage-description' => 'მთავარი გვერდი',
@@ -566,6 +578,8 @@ $2',
 'namespaceprotected' => "თქვენ არ გაქვთ '''$1''' სახელთა სივრცეში გვერდების რედაქტირების უფლება.",
 'customcssprotected' => 'თქვენ არ გაქვთ ამ CSS გვერდის რედაქტირების უფლება, ვინაიდან ის სხვა მომხმარებლის პირად კონფიგურაციას შეიცავს.',
 'customjsprotected' => 'თქვენ არ გაქვთ ამ JavaScript გვერდის რედაქტირების უფლება, ვინაიდან ის სხვა მომხმარებლის პირად კონფიგურაციას შეიცავს.',
+'mycustomcssprotected' => 'თქვენ არ გაქვთ ამ CSS-გვერდის რედაქტირების უფლება.',
+'mycustomjsprotected' => 'თქვენ არ გაქვთ ამ JavaScript-გვერდის რედაქტირების უფლება.',
 'ns-specialprotected' => 'გვერდების რედაქტირება სახელთა სივრცეში {{ns:special}} შეუძლებელია.',
 'titleprotected' => "შემდეგი გვერდის შექმნა აკრძალულია მომხმარებელ [[User:$1|$1]]-ს მიერ.
 მოცემულია შემდეგი ახსნა: „''$2''“.",
@@ -592,9 +606,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,18 +630,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}} იყენებს cookies, რომლებიც თქვენს ბრაუზერში გათიშულია. გთხოვთ, აამოქმედოთ ისინი და შემდგომ ხელახლა გაიარეთ რეგისტრაცია.',
 'nocookieslogin' => '{{SITENAME}} მომხმარებლების შესვლისთვის იყენებს "ქუქის ჩანაწერს". თქვენ იგი გათიშეთ. გთხოვთ, ჩართოთ ისინი და ხელმეორედ მოსინჯოთ.',
@@ -673,7 +716,7 @@ $2',
 'cannotchangeemail' => 'ანგარიშის ელ-ფოსტის მისამართების შეცვლა ამ ვიკიში შეუძლებელია.',
 'emaildisabled' => 'ამ საიტს არ შეუძლია ელ.ფოსტის გაგზავნა.',
 'accountcreated' => 'ანგარიში შეიქმნა',
-'accountcreatedtext' => 'á\83¨á\83\94á\83¥á\83\9bá\83\9cá\83\98á\83\9aá\83\98á\83\90 á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\9aá\83\98á\83¡ á\83\90á\83\9cá\83\92á\83\90á\83 á\83\98á\83¨á\83\98 $1.',
+'accountcreatedtext' => 'á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\9aá\83\98á\83¡ á\83\90á\83\9cá\83\92á\83\90á\83 á\83\98á\83¨á\83\98 [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|á\83\92á\83\90á\83\9cá\83®á\83\98á\83\9aá\83\95á\83\90]]) á\83¨á\83\94á\83¥á\83\9bá\83\9cá\83\98á\83\9aá\83\98á\83\90.',
 'createaccount-title' => 'ანგარიშის შექმნა {{SITENAME}}-თვის',
 'createaccount-text' => 'ვიღაცამ შექმნა ანგარიში სახელით „$2“ და პაროლით „$3“ თქვენი ელექტრონული ფოსტისთვის {{SITENAME}}-ში ($4). გთხოვთ დარეგისტრირდეთ და შეცვალოთ პაროლი.
 
@@ -707,13 +750,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' => 'გამოსული ელ-ფოსტის ხილვა?',
@@ -746,7 +791,7 @@ $2
 დროებითი პაროლი: $2',
 'passwordreset-emailsent' => 'პაროლის თავიდან დასაყენებელი ელ.ფოსტა გაიგზავნა.',
 'passwordreset-emailsent-capture' => 'ქვემოთ ნაჩვენები პაროლის თავიდან დასაყენებელი წერილი გაიგზავნა.',
-'passwordreset-emailerror-capture' => 'ქვემოთ მოცემულია შექმნილი პაროლის დასაყენებელი წერილი, რომლის გაგზავნაც ვერ მოხერხდა: $1 გამო',
+'passwordreset-emailerror-capture' => 'ქვემოთ მოცემულია შექმნილი პაროლის დასაყენებელი წერილი, რომლის გაგზავნაც {{GENDER:$2|მომხმარებელთან}} ვერ მოხერხდა: $1 გამო',
 
 # Special:ChangeEmail
 'changeemail' => 'ელ-ფოსტის მისამართის შეცვლა',
@@ -959,12 +1004,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' => 'ვიკიტექსტი',
@@ -1205,7 +1253,6 @@ $1",
 'searchmenu-legend' => 'ძიების დაწყობა:',
 'searchmenu-exists' => "'''ამ ვიკიპროექტში არის გვერდი «[[:$1]]»'''",
 'searchmenu-new' => "'''შექმენით გვერდი „[[:$1]]“ ამ ვიკიში!'''",
-'searchhelp-url' => 'Help:დახმარება',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|აჩვენეთ გვერდები ამ პრეფიქსით]]',
 'searchprofile-articles' => 'ძირითადი გვერდები',
 'searchprofile-project' => 'დახმარების და პროექტის გვერდები',
@@ -1247,6 +1294,7 @@ $1",
 'powersearch-togglenone' => 'არაფერი',
 'search-external' => 'გარე ძიება',
 'searchdisabled' => '{{SITENAME}}ში ძებნა გაუქმებულია. თქვენ შეგიძლიათ დროის შუალედით Google-ით ძებნა. მიაქციეთ ყურადღება, რომ {{SITENAME}}ში შესაძლებელია მათი ინდექსები აქტუალური არ არის.',
+'search-error' => 'ძიებისას მოხდა შეცდომა: $1',
 
 # Preferences page
 'preferences' => 'კონფიგურაცია',
@@ -1267,7 +1315,7 @@ $1",
 'prefs-watchlist' => 'კონტროლის სია',
 'prefs-watchlist-days' => 'კონტროლის სიაში საჩვენებელი დღეები:',
 'prefs-watchlist-days-max' => 'მაქსიმუმ $1 {{PLURAL:$1|დღე|დღე}}',
-'prefs-watchlist-edits' => 'á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83\98á\83¡ á\83\9bá\83\90á\83¥á\83¡á\83\98á\83\9bá\83\90á\83\9aá\83£á\83 á\83\98 á\83 á\83\90á\83\9dá\83\93á\83\94á\83\9cá\83\9dá\83\91á\83\98á\83¡ á\83©á\83\95á\83\94á\83\9cá\83\94á\83\91á\83\90 á\83\95á\83 á\83ªá\83\94á\83\9a á\83\99á\83\9dá\83\9cá\83¢á\83 á\83\9dá\83\9aá\83\98á\83¡ á\83¡á\83\98á\83\90á\83¨á\83\98:',
+'prefs-watchlist-edits' => 'á\83\92á\83\90á\83¤á\83\90á\83 á\83\97á\83\9dá\83\94á\83\91á\83£á\83\9a á\83\99á\83\9dá\83\9cá\83¢á\83 á\83\9dá\83\9aá\83\98á\83¡ á\83¡á\83\98á\83\90á\83¨á\83\98 á\83¡á\83\90á\83©á\83\95á\83\94á\83\9cá\83\94á\83\91á\83\94á\83\9aá\83\98 á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83\98á\83¡ á\83\9bá\83\90á\83¥á\83¡á\83\98á\83\9bá\83\90á\83\9aá\83£á\83 á\83\98 á\83 á\83\90á\83\9dá\83\93á\83\94á\83\9cá\83\9dá\83\91á\83\90:',
 'prefs-watchlist-edits-max' => 'მაქსიმალური რაოდენობა: 1000',
 'prefs-watchlist-token' => 'კონტროლის სიის ტოკენი:',
 'prefs-misc' => 'სხვადასხვა',
@@ -1287,9 +1335,9 @@ $1",
 'resultsperpage' => 'შედეგები გვერდის მიხედვით:',
 'stub-threshold' => 'გაფორმების გასაუმჯობესებლად <a href="#" class="stub"> მოცემულია ესკიზების ბმულები</a> (ბაიტებში):',
 'stub-threshold-disabled' => 'გათიშულია',
-'recentchangesdays' => 'á\83\93á\83¦á\83\94á\83\94á\83\91á\83\98á\83¡ á\83©á\83\95á\83\94á\83\9cá\83\94á\83\91á\83\90 á\83\91á\83\9dá\83\9aá\83\9d á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83¨ი:',
+'recentchangesdays' => 'á\83\91á\83\9dá\83\9aá\83\9d á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83¨á\83\98 á\83¡á\83\90á\83©á\83\95á\83\94á\83\9cá\83\94á\83\91á\83\94á\83\9aá\83\98 á\83\93á\83¦á\83\94á\83\94á\83\91ი:',
 'recentchangesdays-max' => 'მაქსიმუმ $1 {{PLURAL:$1|დღე}}',
-'recentchangescount' => 'á\83 á\83\94á\83\93á\83\90á\83¥á\83ªá\83\98á\83\94á\83\91á\83\98á\83¡ á\83 á\83\90á\83\9dá\83\93á\83\94á\83\9cá\83\9dá\83\91á\83\90 á\83¡á\83\90á\83©á\83\95á\83\94á\83\9cá\83\94á\83\91á\83\9aá\83\90á\83\93:',
+'recentchangescount' => 'á\83¡á\83\90á\83©á\83\95á\83\94á\83\9cá\83\94á\83\91á\83\94á\83\9aá\83\98 á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83\98á\83¡ á\83 á\83\90á\83\9dá\83\93á\83\94á\83\9cá\83\9dá\83\91á\83\90:',
 'prefs-help-recentchangescount' => 'შეიცავს ახალ შესწორებებს, გვერდების ისტორიებს, ჟურნალებს.',
 'prefs-help-watchlist-token' => 'ამ ველის შევსება საიდუმლო გასაღებით შექმნის RSS ტრანსლაციას თქვენი კონტროლის სიისთვის.
 ყველა, ვინც იცის გასაღები, შესძლებს იხილოს თქვენი კონტროლის სია. ფრთხილად იყავით საიდუმლო მნიშვნელობის არჩევისას.
@@ -1355,7 +1403,7 @@ $1",
 'prefs-i18n' => 'ინტერნაციონალიზაცია',
 'prefs-signature' => 'ხელმოწერა',
 'prefs-dateformat' => 'თარიღის ფორმატი',
-'prefs-timeoffset' => 'á\83\93á\83 á\83\9dá\83\98á\83¡ á\83\92á\83\90á\83 á\83\93á\83\90á\83\90á\83\93á\83\92ილება',
+'prefs-timeoffset' => 'á\83¡á\83\90á\83¡á\83\90á\83\90á\83\97á\83\9d á\83¡á\83\90á\83 á\83¢á\83§á\83\9aá\83\98á\83¡ á\83ªá\83\95á\83\9aილება',
 'prefs-advancedediting' => 'გაფართოებული პარამეტრები',
 'prefs-advancedrc' => 'გაფართოებული პარამეტრები',
 'prefs-advancedrendering' => 'გაფართოებული პარამეტრები',
@@ -1393,6 +1441,7 @@ $1",
 'userrights-changeable-col' => 'ჯგუფები, რომლებიც შეგიძლიათ შეცვალოთ',
 'userrights-unchangeable-col' => 'ჯგუფები, რომლებიც არ შეგიძლიათ შეცვალოთ',
 'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => 'მომხმარებელთა უფლებების კონფლიქტი! გთხოვთ, ხელმეორედ შეინახოთ თქვენი ცვლილებები.',
 
 # Groups
 'group' => 'ჯგუფი:',
@@ -1463,6 +1512,8 @@ $1",
 'right-editusercssjs' => 'სხვა მომხმარებლების CSS- и JS- ფაილების შესწორება',
 'right-editusercss' => 'სხვა მომხმარებლების CSS- ფაილების შესწორება',
 'right-edituserjs' => 'სხვა მომხმარებლების JS- ფაილების შესწორება',
+'right-editmyusercss' => 'თქვენი საკუთარი CSS-ფაილების რედაქტირება',
+'right-editmyuserjs' => 'თქვენი საკუთარი JavaScript-ფაილების რედაქტირება',
 'right-rollback' => 'გარკვეულ გვერდზე ბოლო მომხმარებლის რედაქტირების სწრაფი გაუქმება',
 'right-markbotedits' => 'გაუქმებული შესწორებების მონიშვნა როგორც ბოტის',
 'right-noratelimit' => 'სიჩქარის შეზღუდვის არ არსებობა',
@@ -2121,6 +2172,15 @@ $1',
 'listusers-noresult' => 'მომხმარებელი ვერ ვიპოვეთ.',
 'listusers-blocked' => '(დაბლოკილია)',
 
+# Special:ActiveUsers
+'activeusers' => 'აქტიურ მომხმარებელთა სია',
+'activeusers-intro' => 'ეს არის მომხმარებელთა სია, რომელთაც აქვს წვლილი უკანასკნელი $1 {{PLURAL:$1|დღის|დღის}} განმავლობაში.',
+'activeusers-count' => '$1 {{PLURAL:$1|მოქმედება|მოქმედება}} {{PLURAL:$3|დღის|$3 დღის}} განმავლობაში.',
+'activeusers-from' => 'მომხმარებელთა ჩვენება, დაწყებული:',
+'activeusers-hidebots' => 'რობოტების დამალვა',
+'activeusers-hidesysops' => 'ადმინისტრატორების დამალვა',
+'activeusers-noresult' => 'მომხმარებლები არ არიან ნაპოვნი.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'მომხმარებელთა ჯგუფების უფლებები',
 'listgrouprights-summary' => 'ქვემოთ წარმოდგენილია ამ ვიკიში გარკვეულ ჯგუფთა სია და მათი უფლებები.
@@ -2202,8 +2262,8 @@ $1',
 'notvisiblerev' => 'შესწორება წაშლილია',
 'watchnochange' => 'არც ერთი თქვენი კონტროლის ქვეშ მყოფი ერთეული არ იქნა რედაქტირებული ნაჩვენებ დროში.',
 'watchlist-details' => '$1 გვერდია თქვენი კონტროლის სიაში განხილვის გვერდების ჩაუთვლელად.',
-'wlheader-enotif' => '* ელ. ფოსტით შეტყობინება ჩართულია.',
-'wlheader-showupdated' => '* გვერდები, რომლებშიც შეტანილ იქნა ცვლილებები თქვენი ბოლო ვიზიტის შემდეგ, აღნიშნულია მუქად.',
+'wlheader-enotif' => 'ელ.ფოსტით შეტყობინება ჩართულია.',
+'wlheader-showupdated' => "თქვენი ბოლო ვიზიტის შემდეგ შეცვლილი გვერდები, აღნიშნულია '''მუქად'''.",
 'watchmethod-recent' => 'მიმდინარეობს უახლესი შესწორებების შემოწმება კონტროლის ქვეშ მყოფი გვერდების მიხედვით.',
 'watchmethod-list' => 'მიმდინარეობს თქვენი კონტროლის ქვეშ მყოფი გვერდების შემოწმება უახლესი შესწორებების მიხედვით.',
 'watchlistcontains' => 'თქვენი კონტროლის სია შეიცავს $1 გვერდს.',
@@ -2453,7 +2513,7 @@ $1',
 'mycontris' => 'წვლილი',
 'contribsub2' => '$1 ($2) თვის',
 'nocontribs' => 'ძებნისას მითითებული პარამეტრების შესაბამისი არც ერთი ცვლილება ნაპოვნი არ არის',
-'uctop' => '(á\83\97á\83\90á\83\95á\83\98)',
+'uctop' => '(á\83\9bá\83\98á\83\9bá\83\93á\83\98á\83\9cá\83\90á\83 á\83\94)',
 'month' => 'თვე:',
 'year' => 'წელი:',
 
@@ -2776,6 +2836,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' => 'დროებითი ესკიზის ფაილის შექმნა ვერ ხერხდება',
@@ -3094,11 +3156,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' => 'ფორმატი შემდეგია:
 
@@ -3129,7 +3205,7 @@ $1',
 'metadata-langitem' => "'''$2:''' $1",
 'metadata-langitem-default' => '$1',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'სიგანე',
 'exif-imagelength' => 'სიმაღლე',
 'exif-bitspersample' => 'ფერის კომპონენტთა სიღრმე',
@@ -3322,7 +3398,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 ფაქსის კოდირება',
@@ -3797,11 +3873,16 @@ 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-submit' => 'მიდი',
+'redirect-lookup' => 'ძიება:',
+'redirect-value' => 'მნიშვნელობა:',
+'redirect-user' => 'მომხმარებლის იდენტიფიკატორი',
+'redirect-revision' => 'გვერდის ვერსია',
+'redirect-file' => 'ფაილის სახელი',
+'redirect-not-exists' => 'მნიშვნელობა ვერ მოიძებნა',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ერთნაირი ფაილების ძიება',
@@ -3889,6 +3970,9 @@ MediaWiki ვრცელდება იმ იმედით, რომ ი
 'htmlform-submit' => 'შენახვა',
 'htmlform-reset' => 'ცვლილებების გაუქმება',
 'htmlform-selectorother-other' => 'სხვა',
+'htmlform-no' => 'არა',
+'htmlform-yes' => 'დიახ',
+'htmlform-chosen-placeholder' => 'აირჩიეთ პარამეტრი',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 სრული ტექსტის ძიების მხარდაჭერით',
index 37e4005..6f34b18 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",
@@ -370,7 +368,6 @@ $messages = array(
 'disclaimers' => 'Juwapkershilikten bas tartıw',
 'disclaimerpage' => 'Project:Juwapkershilikten bas tartıw',
 'edithelp' => "O'zgertiw anıqlaması",
-'edithelppage' => "Help:O'zgertiw",
 'helppage' => 'Help:Mazmunı',
 'mainpage' => 'Bas bet',
 'mainpage-description' => 'Bas bet',
@@ -827,7 +824,6 @@ Sha'rtli belgiler: (ha'z.) = ha'zirgi nusqasi menen parqı,
 'searchmenu-legend' => 'İzlew sazlawları',
 'searchmenu-exists' => "'''Bul wikide \"[[:\$1]]\" atamalı bet bar'''",
 'searchmenu-new' => "'''Bul wikide \"[[:\$1]]\" betin jaratıw!'''",
-'searchhelp-url' => 'Help:Mazmunı',
 'searchmenu-prefix' => "[[Special:PrefixIndex/$1|Usı prefiks penen baslanıwshı betlerdi ko'rset]]",
 'searchprofile-articles' => "Mag'lıwmat betleri",
 'searchprofile-project' => "Ja'rdem ha'm Proekt betleri",
@@ -863,14 +859,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 +1400,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 +1817,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 +1920,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..df2487f 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',
@@ -283,7 +281,6 @@ $1',
 'disclaimers' => 'Iɣtalen',
 'disclaimerpage' => 'Project:Iɣtalen',
 'edithelp' => 'Tallat deg ubeddel',
-'edithelppage' => 'Help:Abeddel',
 'helppage' => 'Help:Agbur',
 'mainpage' => 'Asebter amenzawi',
 'mainpage-description' => 'Asebter amenzawi',
@@ -553,10 +550,8 @@ Ahat ilaq ad beddeleḍ awal ik/im n uɛaddi naɣ ad ssutereḍ awal n uɛaddi a
 
 # Special:PasswordReset
 'passwordreset' => 'Awennez tikkelt nniḍen n awal uɛaddi',
-'passwordreset-text' => 'Ččur tiferkit agi iwakken ad eṭṭfeḍ tirawt n usmekti  deg-es tilɣa n umiḍan inek/inem.',
 'passwordreset-legend' => 'Awennez tikkelt nniḍen n awal uɛaddi',
 'passwordreset-disabled' => 'Awennez n awal uɛaddi yensa deg uwiki agi.',
-'passwordreset-pretext' => '{{PLURAL:$1||Sekcem aferdis n isefka ddaw agi}}',
 'passwordreset-username' => 'Isem n useqdac',
 'passwordreset-domain' => 'Talɣut :',
 'passwordreset-capture' => 'Ẓeṛ tirawt ?',
@@ -1017,7 +1012,6 @@ Tzemreḍ ad affeḍ tilɣa deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPA
 'searchmenu-legend' => 'Tixtiṛiyin n unadi',
 'searchmenu-exists' => "'''Yella asebter s isem \"[[:\$1]]\" deg wiki agi.'''",
 'searchmenu-new' => "'''Snulfud asebter « [[:$1|$1]] » deg wiki agi !'''",
-'searchhelp-url' => 'Help:Agbur',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Nadi isebtar i zwaren s adat agi]]',
 'searchprofile-articles' => 'Isebtar n ugbur',
 'searchprofile-project' => 'Isebtaren n tallat dɣa n usenfa',
@@ -1060,15 +1054,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 +1592,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 +1996,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 +2525,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 +2564,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 +2979,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..6040d1e 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' => 'КъэӀохун, гъэтэрэзыгъуэм и тепсэлъыхьыпӀэм зыри имытхамэ',
@@ -294,7 +292,6 @@ $1',
 'disclaimers' => 'Жэуап Ӏыгъыныр зыщхьэщыхын',
 'disclaimerpage' => 'Project:Пщэрылъу къэмыштэн',
 'edithelp' => 'Гъэтэрэзыным и щӀэупщӀэ',
-'edithelppage' => 'Help:Гъэтэрэзыным и дэIэпыкъуэгъу',
 'helppage' => 'Help:ДэӀэпыкъуэгъу',
 'mainpage' => 'НапэкӀуэцӀ нэхъыщхьэ',
 'mainpage-description' => 'НапэкӀуэцӀ нэхъыщхьэ',
index 57caf22..7c987ae 100644 (file)
  * @author לערי ריינהארט
  */
 
+$namespaceNames = array(
+       NS_TALK             => 'Disolo',
+       NS_USER             => 'Kisadi',
+       NS_USER_TALK        => 'Disolo_kisadi',
+       NS_PROJECT_TALK     => 'Disolo_$1',
+       NS_FILE             => 'Fisye',
+       NS_FILE_TALK        => 'Disolo_fisye',
+       NS_HELP             => 'Lusadisu',
+       NS_HELP_TALK        => 'Disolo_lusadisu',
+       NS_CATEGORY         => 'Kalasi',
+       NS_CATEGORY_TALK    => 'Disolo_kalasi',
+);
+
 $messages = array(
 'underline-always' => 'Bambala nyonso',
 'underline-never' => 'Ata mbala mosi ve',
index b8a1b06..2184c40 100644 (file)
@@ -11,7 +11,6 @@
  */
 
 $fallback = 'ur';
-
 $rtl = true;
 
 $messages = array(
@@ -45,8 +44,6 @@ $messages = array(
 'tog-shownumberswatching' => 'لوڑاک ممبرانن تعدادان پشاؤے',
 'tog-oldsig' => 'موجودہ دستخطو نمائش:',
 'tog-fancysig' => '(سادہ دسخط بلا خودکار ربط)',
-'tog-externaleditor' => 'ہمیشہ بیرونی تدوین کار استعمال کورے (صرفی ماہرینن بچے، ھمو بچے کمپیوٹرا خاص ترتیبات درکار بونیان)',
-'tog-externaldiff' => 'ہمیشہ بیرونی تدوین کار استعمال کورے (صرفی ماہرینن بچے، ھمو بچے کمپیوٹرا خاص ترتیبات درکار بونیان)',
 'tog-showjumplinks' => 'ھیہ ووشکی څروٹھاوے',
 'tog-uselivepreview' => 'براہِ راست نمائش استعمال کورے (JavaScript ضرورت بوی)',
 'tog-forceeditsummary' => 'کیاوتکی آوا ترمیمی خلاصو خالی پیڅھیتام تھے متے لو دیت',
@@ -250,7 +247,6 @@ $1',
 'disclaimers' => 'اعلانات',
 'disclaimerpage' => 'Project:عام کھوار اعلان',
 'edithelp' => 'مدد براۓ ترمیم',
-'edithelppage' => 'Help:ترمیم',
 'helppage' => 'Help:فھرست',
 'mainpage' => 'آویلو صفحہ',
 'mainpage-description' => 'سرورق',
@@ -1117,10 +1113,6 @@ HTML tags لوڑے.',",
 # Core parser functions
 'duplicate-defaultsort' => '\'\'\'خبردار:\'\'\' ڈیفالٹ تاڑٰ(نغڑی) "$2" پروشٹیو ڈیفالٹ تاڑا "$1" لیگی شیر۔',
 
-# Special:FilePath
-'filepath-page' => 'فایل',
-'filepath-submit' => 'Go/بوغے',
-
 # Special:SpecialPages
 'specialpages' => 'اسپیشل صفحہ',
 
index 3a6fa9d..f61021a 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',
@@ -294,7 +292,6 @@ $1',
 'disclaimers' => 'Diwanê mesulêti',
 'disclaimerpage' => 'Project:Diwanê mesuliyetê bıngey',
 'edithelp' => 'Phoştdariya vurnaişi',
-'edithelppage' => 'Help:Pele çıturi vurnina',
 'helppage' => 'Help:Tedeestey',
 'mainpage' => 'Pela Seri',
 'mainpage-description' => 'Pela seri',
@@ -743,7 +740,6 @@ Eke şertê ilawekerdey ke niyê ro, idarekerê bini {{SITENAME}} de nêşikinê
 'viewprevnext' => 'Bıvêne ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "''Ena 'Wikipediya de ser \"[[:\$1]]\" yew pel esto'''",
 'searchmenu-new' => "'''Nê wiki de pela \"[[:\$1]]\" baferne!'''",
-'searchhelp-url' => 'Help:Tedeestey',
 'searchprofile-articles' => 'Pelê tedeesteu',
 'searchprofile-project' => 'Pelê yardımi u procey',
 'searchprofile-images' => 'Multimedya',
@@ -782,14 +778,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 +791,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 +832,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 +1136,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 +1188,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 +1456,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 +1514,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 +1544,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 +1559,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..f4d0c9d 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' => 'وڭدەمەنىڭ قىسقاشا مازمۇنداماسى بوس قالعاندا ماعان ەسكەرت',
@@ -589,7 +587,6 @@ $messages = array(
 'disclaimers' => 'جاۋاپكەرشىلىكتەن باس تارتۋ',
 'disclaimerpage' => 'Project:جاۋاپكەرشىلىكتەن باس تارتۋ',
 'edithelp' => 'وندەۋ انىقتاماسى',
-'edithelppage' => 'Help:وڭدەۋ',
 'helppage' => 'Help:مازمۇنى',
 'mainpage' => 'باستى بەت',
 'mainpage-description' => 'باستى بەت',
@@ -1114,7 +1111,6 @@ $3 كەلتىرىلگەن سەبەبى: ''$2''",
 'prevn' => 'الدىڭعى {{PLURAL:$1|$1}}',
 'nextn' => 'كەلەسى {{PLURAL:$1|$1}}',
 'viewprevnext' => 'كورسەتىلۋى: ($1 {{int:pipe-separator}} $2) ($3) جازبا',
-'searchhelp-url' => 'Help:مازمۇنى',
 'search-result-size' => '$1 ($2 ٴسوز)',
 'search-result-score' => 'اراقاتىناستىلىعى: $1 %',
 'search-redirect' => '(ايداعىش $1)',
@@ -1140,14 +1136,6 @@ $3 كەلتىرىلگەن سەبەبى: ''$2''",
 ازىرشە Google ارقىلى ىزدەۋگە بولادى.
 اڭعارتپا: {{SITENAME}} تورابىنىڭ ماعلۇمات تىزبەلەرى ەسكىرگەن بولۋى مۇمكىن.',
 
-# Quickbar
-'qbsettings' => 'ٴمازىر',
-'qbsettings-none' => 'ەشقانداي',
-'qbsettings-fixedleft' => 'سولعا بەكىتىلگەن',
-'qbsettings-fixedright' => 'وڭعا بەكىتىلگەن',
-'qbsettings-floatingleft' => 'سولعا قالقىعان',
-'qbsettings-floatingright' => 'وڭعا قالقىعان',
-
 # Preferences page
 'preferences' => 'باپتالىمدار',
 'mypreferences' => 'باپتالىمدارىم',
@@ -1732,8 +1720,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 +2260,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 +2293,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 +2383,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ەنى',
 'exif-imagelength' => 'بىيىكتىگى',
 'exif-bitspersample' => 'قۇراش سايىن بىيت سانى',
@@ -2524,7 +2497,7 @@ $1',
 'exif-gpsdatestamp' => 'GPS كۇن-ايى',
 'exif-gpsdifferential' => 'GPS سارالانعان دۇرىستاۋ',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'ۇلعايتىلعان',
 
 'exif-unknowndate' => 'بەلگىسىز كۇن-ايى',
@@ -2858,13 +2831,6 @@ $5
 'version-software-product' => 'ٴونىم',
 'version-software-version' => 'نۇسقاسى',
 
-# Special:FilePath
-'filepath' => 'فايل ورنالاسۋى',
-'filepath-page' => 'فايل اتى:',
-'filepath-submit' => 'ورنالاسۋىن تاپ',
-'filepath-summary' => 'بۇل ارنايى بەت فايل ورنالاسۋى تولىق جولىن قايتارادى.
-سۋرەتتەر تولىق اجىراتىلىمدىعىمەن كورسەتىلەدى, باسقا فايل تۇرلەرىنە قاتىستى باعدارلاماسى تۋرا جەگىلەدى.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'فايل تەلنۇسقالارىن ىزدەۋ',
 'fileduplicatesearch-summary' => 'فايل حەشى ماعىناسى نەگىزىندە تەلنۇسقالارىن ىزدەۋ.',
index 3dd54eb..f8e98fb 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' => 'Өңдеменің қысқаша мазмұндамасы бос қалғанда маған ескерт',
@@ -404,6 +403,7 @@ $messages = array(
 'tog-showhiddencats' => 'Жасырын санаттарды көрсету',
 'tog-noconvertlink' => 'Сілтеме атауларын ауыстырма',
 'tog-norollbackdiff' => 'Шегіндіруден кейін нұсқалардың айырмашылығын көрсетпеу',
+'tog-useeditwarning' => 'Өңдемесі сақталмаған парақшадан шығар кезде ескерту',
 
 'underline-always' => 'Әрқашан',
 'underline-never' => 'Ешқашан',
@@ -467,6 +467,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|Санат|Санаттар}}',
@@ -492,8 +504,9 @@ $messages = array(
 'newwindow' => '(жаңа терезеде)',
 'cancel' => 'Болдырмау',
 'moredotdotdot' => 'Көбірек…',
-'mypage' => 'Жеке бетім',
-'mytalk' => 'Талқылауым',
+'morenotlisted' => 'Басқасы көрсетілмеген...',
+'mypage' => 'Жеке бет',
+'mytalk' => 'Талқылау',
 'anontalk' => 'IP талқылауы',
 'navigation' => 'Бағыттау',
 'and' => '&#32;және',
@@ -525,6 +538,7 @@ $messages = array(
 'namespaces' => 'Есім кеңістігі',
 'variants' => 'Нұсқалар',
 
+'navigation-heading' => 'Бағыттау',
 'errorpagetitle' => 'Қате',
 'returnto' => '$1 дегенге қайта келу.',
 'tagline' => '{{SITENAME}} жобасынан алынған мәлімет',
@@ -546,6 +560,7 @@ $messages = array(
 'create-this-page' => 'Осы бетті бастау',
 'delete' => 'Жою',
 'deletethispage' => 'Бетті жою',
+'undeletethispage' => 'Жойылған бетті қайтару',
 'undelete_short' => '$1 өңдеме жоюын болдырмау',
 'viewdeleted_short' => 'Көру {{PLURAL:$1|жойылған өңдеуді $1|жойылған өңдеулерді $1| жойылған өңдеулерді $1}}',
 'protect' => 'Қорғау',
@@ -599,7 +614,6 @@ $1',
 'disclaimers' => 'Жауапкершіліктен бас тарту',
 'disclaimerpage' => 'Project:Жауапкершіліктен бас тарту',
 'edithelp' => 'Өндеу анықтамасы',
-'edithelppage' => 'Help:Өңдеу',
 'helppage' => 'Help:Мазмұны',
 'mainpage' => 'Басты бет',
 'mainpage-description' => 'Басты бет',
@@ -622,6 +636,10 @@ $1',
 'youhavenewmessages' => 'Сізде $1 бар ($2).',
 'newmessageslink' => 'жаңа хабарламалар',
 'newmessagesdifflink' => 'соңғы өзгерiс',
+'youhavenewmessagesfromusers' => 'Сіз {{PLURAL:$3|бөгде қолданушыдан|$3 қатысушылардан}} $1 алдыңыз ($2).',
+'youhavenewmessagesmanyusers' => 'Сіз бірнеше қатысушыдан $1 алдыңыз ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|жаңа хабарлама|жаңа хабарламалар}}',
+'newmessagesdifflinkplural' => 'соңғы {{PLURAL:$1|өзгеріс|өзгерістер}}',
 'youhavenewmessagesmulti' => '$1 дегенде жаңа хабарламалар бар',
 'editsection' => 'өңдеу',
 'editold' => 'өңдеу',
@@ -714,6 +732,8 @@ $1',
 'cannotdelete' => '«$1» бетін немесе файлын жою мүмкін емес. 
 Мұны әлдекім жойған болуы мүмкін.',
 'cannotdelete-title' => '«$1» бетін жою мүмкін емес',
+'delete-hook-aborted' => 'Түзету ілмек арқылы тоқтатылды.
+Қосымша түсіндірмелер көрсетілмеген.',
 'badtitle' => 'Жарамсыз тақырып аты',
 'badtitletext' => 'Сұралған бет тақырыбының аты жарамсыз, бос, тіларалық сілтемесі не уики-аралық тақырып аты бұрыс енгізілген.
 Мында тақырып атында қолдалмайтын бірқатар таңбалар болуы мүмкін.',
@@ -728,7 +748,7 @@ $1',
 'actionthrottled' => 'Әрекет бәсеңдетілді',
 'actionthrottledtext' => 'Спамға қарсы күрес есебінде, осы әрекетті қысқа уақытта тым көп рет орындауыңыз шектелінді, және бұл шектеу шамасынан асып кеткенсіз.
 Бірнеше минуттан қайта байқап көріңіз.',
-'protectedpagetext' => 'Өңдеуді қақпайлау үшін бұл бет құлыпталынған.',
+'protectedpagetext' => 'Бұл бет өңдеу немесе басқа өзгерістер енгізілмес үшін қорғалған.',
 'viewsourcetext' => 'Бұл беттің қайнарын қарауыңызға және көшіріп алуыңызға болады:',
 'viewyourtext' => 'Осы бет арқылы "өзіңіз жасаған өңдеулердің" бастапқы мәтінін көруге және көшіруге мүмкіндігіңіз болады.',
 'protectedinterface' => 'Бұл бет бағдарламалық жасақтаманың тілдесу мәтінін жетістіреді, сондықтан қиянатты қақпайлау үшін өзгертуі құлыпталған.',
@@ -872,10 +892,8 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Құпия сөзді қайтару',
-'passwordreset-text' => 'Сіздің тіркелгіңіздің баптаулары туралы хабарламаларды алу үшін мына пішінді толтырыңыз.',
 'passwordreset-legend' => 'Құпия сөзді қайтару',
 'passwordreset-disabled' => 'Бұл уикиде құпия сөзді қайтару ажыратылған.',
-'passwordreset-pretext' => '{{PLURAL:$1||Төменде көрсетілгендердің ішіндегі біреуін жазыңыз}}',
 'passwordreset-username' => 'Қатысушы аты:',
 'passwordreset-domain' => 'Домен:',
 'passwordreset-capture' => 'Келген хатты қарау керек пе?',
@@ -1076,6 +1094,8 @@ IP-мекенжайыңыз бұл беттің түзету тарихында
 'edit-already-exists' => 'Жаңа бет жасау мүмкін емес.
 Ол әлдеқашан бар.',
 'defaultmessagetext' => 'Әдепкі мәтіні',
+'editwarning-warning' => 'Басқа бетке өтсеңіз сіздің жазған соңғы өңдемелеріңіз жойылуы мүмкін. 
+Егер сiз жүйеде тiркелсеңiз, онда сiз баптауларыңыздағы «{{int:prefs-editing}}» бөлігіне кіріп, бұл ескертуді өшіре аласыз.',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Құлақтандыру: Бұл бетте тым көп шығыс алатын құрылым талдатқыш жетелерінің қоңырау шалулары бар.
@@ -1250,7 +1270,6 @@ $3 келтірілген себебі: ''$2''",
 'searchmenu-legend' => 'Іздеу бапталымдары',
 'searchmenu-exists' => "'''Бұл жобада «[[:$1]]» деген бет бар.'''",
 'searchmenu-new' => "'''\"[[:\$1]]\" осындай атпен бетті бастау'''",
-'searchhelp-url' => 'Help:Мазмұны',
 'searchprofile-articles' => 'Негізгі беттер',
 'searchprofile-project' => 'Анықтама және жоба беттері',
 'searchprofile-images' => 'Мультимедиа',
@@ -1291,14 +1310,6 @@ $3 келтірілген себебі: ''$2''",
 Әзірше Google арқылы іздеуге болады.
 Аңғартпа: {{SITENAME}} торабының мағлұмат тізбелері ескірген болуы мүмкін.',
 
-# Quickbar
-'qbsettings' => 'Мәзір',
-'qbsettings-none' => 'Ешқандай',
-'qbsettings-fixedleft' => 'Солға бекітілген',
-'qbsettings-fixedright' => 'Оңға бекітілген',
-'qbsettings-floatingleft' => 'Солға қалқыған',
-'qbsettings-floatingright' => 'Оңға қалқыған',
-
 # Preferences page
 'preferences' => 'Бапталымдар',
 'mypreferences' => 'Баптауларым',
@@ -1968,8 +1979,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 +2553,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 +2586,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 +2677,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Ені',
 'exif-imagelength' => 'Биіктігі',
 'exif-bitspersample' => 'Құраш сайын бит саны',
@@ -2795,7 +2791,7 @@ $1',
 'exif-gpsdatestamp' => 'GPS күн-айы',
 'exif-gpsdifferential' => 'GPS сараланған дұрыстау',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ұлғайтылған',
 
 'exif-unknowndate' => 'Белгісіз күн-айы',
@@ -3129,13 +3125,6 @@ $5
 'version-software-product' => 'Өнім',
 'version-software-version' => 'Нұсқасы',
 
-# Special:FilePath
-'filepath' => 'Файл орналасуы',
-'filepath-page' => 'Файл аты:',
-'filepath-submit' => 'Орналасуын тап',
-'filepath-summary' => 'Бұл арнайы бет файл орналасуы толық жолын қайтарады.
-Суреттер толық ажыратылымдығымен көрсетіледі, басқа файл түрлеріне қатысты бағдарламасы тура жегіледі.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Файл телнұсқаларын іздеу',
 'fileduplicatesearch-summary' => 'Файл хеші мағынасы негізінде телнұсқаларын іздеу.',
index 608ad71..1a4ae9d 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',
@@ -552,7 +550,6 @@ $messages = array(
 'disclaimers' => 'Jawapkerşilikten bas tartw',
 'disclaimerpage' => 'Project:Jawapkerşilikten bas tartw',
 'edithelp' => 'Öndew anıqtaması',
-'edithelppage' => 'Help:Öñdew',
 'helppage' => 'Help:Mazmunı',
 'mainpage' => 'Bastı bet',
 'mainpage-description' => 'Bastı bet',
@@ -1077,7 +1074,6 @@ Añğartpa: bağıttaw siltemelerin qoldanğanda bul bağan qaýta qoýıladı.'
 'prevn' => 'aldıñğı {{PLURAL:$1|$1}}',
 'nextn' => 'kelesi {{PLURAL:$1|$1}}',
 'viewprevnext' => 'Körsetilwi: ($1 {{int:pipe-separator}} $2) ($3) jazba',
-'searchhelp-url' => 'Help:Mazmunı',
 'search-result-size' => '$1 ($2 söz)',
 'search-result-score' => 'Araqatınastılığı: $1 %',
 'search-redirect' => '(aýdağış $1)',
@@ -1103,14 +1099,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 +1683,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 +2224,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 +2257,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 +2346,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 +2460,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 +2790,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 3d6afa0..2886ff7 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|ចំណាត់ថ្នាក់ក្រុម|ចំណាត់ថ្នាក់ក្រុម}}',
@@ -504,7 +516,6 @@ $1',
 'disclaimers' => 'ការបដិសេធ',
 'disclaimerpage' => 'Project:ការបដិសេធ​ទូទៅ',
 'edithelp' => 'ជំនួយ​ក្នុងការកែប្រែ',
-'edithelppage' => 'Help:របៀបកែប្រែ',
 'helppage' => 'Help:មាតិកា',
 'mainpage' => 'ទំព័រដើម',
 'mainpage-description' => 'ទំព័រដើម',
@@ -674,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' => 'អ្នកមិនអាចផ្លាស់ប្ដូរពាក្យសម្ងាត់ក្នុងវិគីនេះទេ។',
@@ -690,18 +710,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' => 'គណនីប្រើប្រាស់របស់អ្នកត្រូវបានបង្កើតហើយ ក៏ប៉ុន្តែអ្នកមិនទាន់បានកត់ឈ្មោះចូលទេ។
 
@@ -812,40 +852,38 @@ $2',
 
 # 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) បានស្នើសុំសារក្រើនរំលឹកពីព័ត៌មានពិស្ដារ
-អំពីគណនីរបស់អ្នកសំរាប់ {{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' => 'ផ្លាស់ប្ដូរអាសយដ្ឋានអ៊ីមែល',
@@ -1029,9 +1067,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' => "'''ប្រយ័ត្ន៖ ទំព័រនេះ​ត្រូវបានចាក់សោ។ ដូច្នេះ​មានតែ​អ្នកប្រើប្រាស់​ដែល​មាន​អភ័យឯកសិទ្ឋិ​ជាអ្នកអភិបាលទេទើបអាច​កែប្រែ​វាបាន។'''
 
 ខាងក្រោមនេះជាកំណត់ហេតុចូលចុងក្រោយ៖",
@@ -1073,10 +1112,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' => "'''ប្រយ័ត្ន៖''' ទំព័រនេះមានប្រើអនុគមន៍ញែកច្រើនពេកហើយ។
@@ -1294,7 +1337,6 @@ $1",
 'searchmenu-legend' => 'ជម្រើសនានាក្នុងការស្វែងរក',
 'searchmenu-exists' => "* ទំព័រ '''[[$1]]'''",
 'searchmenu-new' => "'''បង្កើតទំព័រ \"[[:\$1]]\" នៅ​លើ​វិគី​នេះ!'''",
-'searchhelp-url' => 'Help:មាតិកា',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|រុក​រក​ក្នុង​ទំព័រ​នានា​ជាមួយ​បុព្វបទ​នេះ​]]',
 'searchprofile-articles' => 'ទំព័រ​មាតិកា',
 'searchprofile-project' => 'ជំនួយ និង​ទំព័រ​គម្រោង',
@@ -1339,15 +1381,6 @@ $1",
 ក្នុង​ពេល​ឥឡូវ​នេះ​ អ្នកអាច​ស្វែង​រក​តាម​រយៈ​ Google បាន​។
 សូមចងចាំ​ថា​ លិបិក្រម​នៃ​មាតិការ​របស់​{{SITENAME}} អាចហួស​សម័យ​។​',
 
-# Quickbar
-'qbsettings' => 'របារទាន់ចិត្ត',
-'qbsettings-none' => 'ទទេ',
-'qbsettings-fixedleft' => 'ចុងខាងឆ្វេង',
-'qbsettings-fixedright' => 'ចុងខាងស្តាំ',
-'qbsettings-floatingleft' => 'អណ្តែតឆ្វេង',
-'qbsettings-floatingright' => 'អណ្តែតស្តាំ',
-'qbsettings-directionality' => 'នៅមួយកន្លែង, អាស្រ័យលើទិសដៅសរសេររបស់ភាសារបស់អ្នក',
-
 # Preferences page
 'preferences' => 'ចំណង់ចំណូលចិត្ត',
 'mypreferences' => 'ចំណង់ចំណូលចិត្ត​',
@@ -1857,7 +1890,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',
@@ -2182,6 +2214,15 @@ $1',
 'listusers-noresult' => 'រកមិនឃើញអ្នកប្រើប្រាស់នេះទេ។',
 'listusers-blocked' => '(ស្ថិតក្រោមការហាមឃាត់)',
 
+# Special:ActiveUsers
+'activeusers' => 'បញ្ជីរាយនាមអ្នកប្រើប្រាស់សកម្ម',
+'activeusers-intro' => 'នេះជាបញ្ជីរាយនាមអ្នកប្រើប្រាស់ដែលមានសកម្មភាពក្នុងរូបភាពណាមួយក្នុងរយៈពេល $1 {{PLURAL:$1|ថ្ងៃ|ថ្ងៃ}}ចុងក្រោយ។',
+'activeusers-count' => '{{PLURAL:$1|សកម្មភាព|សកម្មភាព}}ចំនួន$1 ក្នុងរយៈពេល{{PLURAL:$3|១ថ្ងៃ|$3 ថ្ងៃ}}ចុងក្រោយ',
+'activeusers-from' => 'បង្ហាញអត្តនាមផ្ដើមដោយ៖',
+'activeusers-hidebots' => 'លាក់រូបយន្ត',
+'activeusers-hidesysops' => 'លាក់អភិបាល',
+'activeusers-noresult' => 'អ្នកប្រើប្រាស់​រកមិនឃើញ​។​',
+
 # Special:ListGroupRights
 'listgrouprights' => 'សិទ្ធិនិងក្រុមអ្នកប្រើប្រាស់',
 'listgrouprights-summary' => 'ខាងក្រោមនេះជាបញ្ជីរាយឈ្មោះក្រុមអ្នកប្រើប្រាស់ដែលបានកំណត់ជាមួយនឹងសិទ្ធិរបស់គេនៅលើវិគីនេះ។ មាន[[{{MediaWiki:Listgrouprights-helppage}}|ព័ត៌មានបន្ថែម]] អំពីសិទ្ធិផ្ទាល់ខ្លួន។',
@@ -2246,7 +2287,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 +2298,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|ទំព័រ|ទំព័រ}}។',
@@ -2469,9 +2510,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 +2954,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 +3020,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 +3092,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 +3137,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ទទឹង',
 'exif-imagelength' => 'កម្ពស់',
 'exif-bitspersample' => '',
@@ -3201,7 +3246,7 @@ $1',
 'exif-originalimageheight' => 'កំពស់របស់រូបភាពមុនពេលកាត់តំរឹម',
 'exif-originalimagewidth' => 'ទទឹងរបស់រូបភាពមុនពេលកាត់តំរឹម',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'លែងបានបង្ហាប់',
 
 'exif-copyrighted-true' => 'រក្សាសិទ្ឋ',
@@ -3549,15 +3594,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 +3670,8 @@ $5
 'htmlform-submit' => 'ដាក់ស្នើ',
 'htmlform-reset' => 'ធ្វើដូចដើមវិញ',
 'htmlform-selectorother-other' => 'ផ្សេងទៀត',
+'htmlform-no' => 'ទេ',
+'htmlform-yes' => 'ព្រម',
 
 # New logging system
 'logentry-delete-delete' => '$1 បានលុបទំព័រ $3 ចោល',
index d4937e4..2dcbdc7 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' => 'ಈ ಐ.ಪಿ ಗೆ ಮಾತನಾಡಿ',
@@ -300,7 +300,6 @@ $messages = array(
 'disclaimers' => 'ಅಬಾಧ್ಯತೆಗಳು',
 'disclaimerpage' => 'Project:ಸಾಮಾನ್ಯ ಅಬಾಧ್ಯತೆಗಳು',
 'edithelp' => 'ಸಂಪಾದನೆಗೆ ಸಹಾಯ',
-'edithelppage' => 'Help:ಸಂಪಾದನೆ',
 'helppage' => 'Help:ಪರಿವಿಡಿ',
 'mainpage' => 'ಮುಖ್ಯ ಪುಟ',
 'mainpage-description' => 'ಮುಖ್ಯ ಪುಟ',
@@ -322,6 +321,7 @@ $messages = array(
 'youhavenewmessages' => 'ನಿಮಗೆ $1 ಇವೆ ($2).',
 'newmessageslink' => 'ಹೊಸ ಸಂದೇಶಗಳು',
 'newmessagesdifflink' => 'ಕೊನೆಯ ಬದಲಾವಣೆ',
+'newmessagesdifflinkplural' => 'ಕಡೆಯ {{PLURAL:$1|ಬದಲಾವಣೆ|ಬದಲಾವಣೆಗಳು}}',
 'youhavenewmessagesmulti' => '$1 ಅಲ್ಲಿ ನಿಮಗೆ ಹೊಸ ಸಂದೇಶಗಳಿವೆ',
 'editsection' => 'ಬದಲಾಯಿಸಿ',
 'editold' => 'ಬದಲಾಯಿಸಿ',
@@ -371,12 +371,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 +410,7 @@ MySQL ಹಿಂದಿರುಗಿಸಿದ ದೋಷ "$3: $4"',
 'unexpected' => 'ಅನಿರೀಕ್ಷಿತ ಮೌಲ್ಯ: "$1"="$2".',
 'formerror' => 'ದೋಷ: ಅರ್ಜಿ ಕಳುಹಿಸಲಾಗಲಿಲ್ಲ',
 'badarticleerror' => 'ಈ ಪುಟದ ಮೇಲೆ ನೀವು ಪ್ರಯತ್ನಿಸಿದ ಕಾರ್ಯವನ್ನು ನಡೆಸಲಾಗದು.',
-'cannotdelete' => 'ಈ ಪುಟ ಅಥವಾ ಚಿತ್ರವನ್ನು ಅಳಿಸಲಾಗಲಿಲ್ಲ. (ಬೇರೊಬ್ಬ ಸದಸ್ಯರಿಂದ ಆಗಲೇ ಅಳಿಸಲ್ಪಟ್ಟಿರಬಹುದು.)',
+'cannotdelete' => '"$1" ಈ ಪುಟ ಅಥವಾ ಚಿತ್ರವನ್ನು ಅಳಿಸಲಾಗಲಿಲ್ಲ. (ಬೇರೊಬ್ಬ ಸದಸ್ಯರಿಂದ ಆಗಲೇ ಅಳಿಸಲ್ಪಟ್ಟಿರಬಹುದು.)',
 'cannotdelete-title' => '"$1" ಪುಟವನ್ನು ಅಳಿಸಲಾಗುವುದಿಲ್ಲ',
 'badtitle' => 'ಸರಿಯಿಲ್ಲದ ಹೆಸರು',
 'badtitletext' => 'ನೀವು ಕೋರಿದ ಪುಟದ ಶೀರ್ಷಿಕೆ ಸಿಂಧುವಲ್ಲದ್ದು ಅಥವ ಖಾಲಿ ಅಥವ ಸರಿಯಾದ ಕೊಂಡಿಯಲ್ಲದ ಅಂತರ-ಭಾಷೆ/ಅಂತರ-ವಿಕಿ ಸಂಪರ್ಕವಾಗಿದೆ.
@@ -454,7 +454,12 @@ $2',
 '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' => 'ನಿಮ್ಮ ಕ್ಷೇತ್ರ:',
@@ -642,7 +647,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' => 'ಈ ಬಳಕೆದಾರರನ್ನು  ಪ್ರಸ್ತುತವಾಗಿ  ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ. 
 ಇತ್ತೀಚಿನ  ನಿರ್ಬಂಧನೆಯ ದಾಖಲೆಯನ್ನು ಉಲ್ಲೇಖಕ್ಕಾಗಿ ಕೆಳಗೆ ಕೊಟ್ಟಿದೆ:',
@@ -655,7 +660,8 @@ $2',
 'sitejspreview' => "'''ನೆನಪಿಡಿ: ನೀವು ಇಲ್ಲಿ ಕೇವಲ ನಿಮ್ಮ ಬಳಕೆದಾರ CSSನ ಮುನ್ನೋಟ ನೋಡುತ್ತಿರುವಿರಿ.''''''ಅದನ್ನು ಇನ್ನೂ ಉಳಿಸಲಾಗಿಲ್ಲ!'''",
 'updated' => '(ನಕಲೆರಿಸಲಾಗಿದೆ)',
 'note' => "'''ಸೂಚನೆ:'''",
-'previewnote' => "'''ಇದು ಕೇವಲ ಮುನ್ನೋಟ; ಪುಟವನ್ನು ಇನ್ನೂ ಉಳಿಸಲಾಗಿಲ್ಲ ಎಂಬುದನ್ನು ಮರೆಯದಿರಿ!'''",
+'previewnote' => "'''ಇದು ಕೇವಲ ಮುನ್ನೋಟ.'''
+ಪುಟವನ್ನು ಇನ್ನೂ ಉಳಿಸಲಾಗಿಲ್ಲ ಎಂಬುದನ್ನು ಮರೆಯದಿರಿ!",
 'continue-editing' => 'ಸಂಪಾದನೆಯ ಪ್ರದೇಶಕ್ಕೆ  ಹೋಗಿ',
 'editing' => "'$1' ಲೇಖನ ಬದಲಾಯಿಸಲಾಗುತ್ತಿದೆ",
 'editingsection' => '$1 (ವಿಭಾಗ) ಅನ್ನು ಸಂಪಾದಿಸುತ್ತಿರುವಿರಿ',
@@ -831,7 +837,7 @@ $2',
 'compareselectedversions' => 'ಆಯ್ಕೆ ಮಾಡಿದ ಆವೃತ್ತಿಗಳನ್ನು ಹೊಂದಾಣಿಕೆ ಮಾಡಿ ನೋಡಿ',
 'showhideselectedversions' => 'ಆಯ್ದ ಆವೃತ್ತಿಗಳನ್ನು ತೋರಿಸು/ಅಡಗಿಸು',
 'editundo' => 'ಹಿಂದಿನಂತೆ',
-'diff-multi' => '(ಮಧ್ಯದಲ್ಲಿ ಆಗಿರುವ {{PLURAL:$1|೧ ಬದಲಾವಣೆಯನ್ನು|$1 ಬದಲಾವಣೆಗಳನ್ನು}} ತೋರಿಸಲಾಗಿಲ್ಲ.)',
+'diff-multi' => '(ಮಧ್ಯದಲ್ಲಿ {{PLURAL:$2|ಒಬ್ಬ|$2}} ಸದಸ್ಯರಿಂದ ಆಗಿರುವ {{PLURAL:$1|೧ ಬದಲಾವಣೆಯನ್ನು|$1 ಬದಲಾವಣೆಗಳನ್ನು}} ತೋರಿಸಲಾಗಿಲ್ಲ.)',
 
 # Search results
 'searchresults' => 'ಶೋಧನೆಯ ಫಲಿತಾಂಶಗಳು',
@@ -852,7 +858,6 @@ $2',
 'viewprevnext' => 'ವೀಕ್ಷಿಸು ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''\"[[:\$1]]\" ಹೆಸರಿನ ಪುಟ ಈ ವಿಕಿಯಲ್ಲಿದೆ.'''",
 'searchmenu-new' => "'''''[[:$1]]'' ಪುಟವನ್ನು ಈ ವಿಕಿಯಲ್ಲಿ ಸೃಷ್ಟಿಸಿ!'''",
-'searchhelp-url' => 'Help:ಪರಿವಿಡಿ',
 'searchprofile-articles' => 'ಲೇಖನ ಪುಟ',
 'searchprofile-project' => 'ಸಹಾಯ ಮತ್ತು ಯೋಜನೆ ಪುಟಗಳು',
 'searchprofile-images' => 'ಬಹುಮಾಧ್ಯಮ',
@@ -893,11 +898,6 @@ $2',
 ಈ ವೇಳೆಯಲ್ಲಿ ನೀವು ಗೂಗಲ್ ಉಪಯೋಗಿಸಿ ಹುಡುಕಾಟ ನಡೆಸಬಹುದು.
 ಗಮನಿಸಿ: ಅವರ {{SITENAME}} ಮಾಹಿತಿಯು ಪ್ರಸಕ್ತವಾಗಿಲ್ಲದಿರಬಹುದು.',
 
-# Quickbar
-'qbsettings-none' => 'ಯಾವುದೂ ಇಲ್ಲ',
-'qbsettings-floatingleft' => 'ಎಡಕ್ಕ ತೇಲುತ್ತಿದೆ',
-'qbsettings-floatingright' => 'ಬಲಕ್ಕೆ ತೇಲುತ್ತಿದೆ',
-
 # Preferences page
 'preferences' => 'ಪ್ರಾಶಸ್ತ್ಯಗಳು',
 'mypreferences' => 'ಪ್ರಾಶಸ್ತ್ಯಗಳು',
@@ -962,8 +962,7 @@ $2',
 'gender-female' => 'ಸ್ತ್ರೀ',
 'email' => 'ಇ-ಅಂಚೆ',
 'prefs-help-realname' => 'ನಿಜ ಹೆಸರು ನೀಡುವುದು ಐಚ್ಛಿಕ. ನೀವು ಅದನ್ನು ನೀಡಿದಲ್ಲಿ ನಿಮ್ಮ ಕಾಣಿಕೆಗಳಿಗೆ ನಿಮಗೆ ಮನ್ನಣೆ ನೀಡಲಾಗುವುದು.',
-'prefs-help-email' => 'ಇ-ಅಂಚೆ ವಿಳಾಸ ಕಡ್ಡಾಯವಲ್ಲ, ಆದರೆ ನೀವು ಅದನ್ನು ನೀಡಿದರೆ ನೀವು ನಿಮ್ಮ ಪ್ರವೇಶ ಪದವನ್ನು ಮರೆತರೆ ಅದನ್ನು ನಿಮಗೆ ಇ-ಅಂಚೆಯಿಂದ ಕಳುಹಿಸಿಬಹುದು.
-ಅಲ್ಲದೆ ಬೇರೆಯವರು ನಿಮ್ಮನ್ನು ಇತರರಿಗೆ ತಿಳಿಯದಂತೆ ನಿಮ್ಮ ಸದಸ್ಯ ಪುಟ ಅಥವ ಚರ್ಚೆ ಪುಟದ ಮೂಲಕ ಸಂಪರ್ಕಿಸಬಹುದು.',
+'prefs-help-email' => 'ಇ-ಅಂಚೆ ವಿಳಾಸ ಕಡ್ಡಾಯವಲ್ಲ, ಆದರೆ ನೀವು ಅದನ್ನು ನೀಡಿದರೆ ನೀವು ನಿಮ್ಮ ಪ್ರವೇಶ ಪದವನ್ನು ಮರೆತರೆ ಅದನ್ನು ನಿಮಗೆ ಇ-ಅಂಚೆಯಿಂದ ಕಳುಹಿಸಿಬಹುದು.',
 'prefs-help-email-required' => 'ಇ-ಅಂಚೆ ವಿಳಾಸ ಬೇಕಾಗಿದೆ.',
 'prefs-i18n' => 'ಅಂತರರಾಷ್ಟ್ರೀಕರಣ',
 'prefs-signature' => 'ಸಹಿ',
@@ -1438,6 +1437,10 @@ $2',
 'listusers-submit' => 'ತೋರು',
 'listusers-noresult' => 'ಯಾವ ಬಳಕೆದಾರರೂ ಸಿಗಲಿಲ್ಲ.',
 
+# Special:ActiveUsers
+'activeusers' => 'ಸಕ್ರಿಯ ಸದಸ್ಯರ ಪಟ್ಟಿ',
+'activeusers-noresult' => 'ಯಾವ ಬಳಕೆದಾರರೂ ಸಿಗಲಿಲ್ಲ.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'ಬಳಕೆದಾರ ಗುಂಪು ಹಕ್ಕುಗಳು',
 'listgrouprights-summary' => 'ಈ ವಿಕಿಯಲ್ಲಿ ಪ್ರಚಲಿತವಾಗಿರುವ ಬಳಕೆದಾರ ಗುಂಪುಗಳು ಮತ್ತು ಆ ಗುಂಪುಗಳಿಗೆ ಅನ್ವಯಿಸುವ ಹಕ್ಕುಗಳು ಈ ಕೆಳಗಿನಂತಿದೆ.',
@@ -1484,7 +1487,7 @@ $2',
 'unwatchthispage' => 'ವೀಕ್ಷಣೆ ನಿಲ್ಲಿಸು',
 'notvisiblerev' => 'ಆವೃತ್ತಿಯನ್ನು ಅಳಿಸಲಾಗಿದೆ',
 'watchlist-details' => 'ಚರ್ಚೆ ಪುಟಗಳನ್ನು ಹೊರತುಪಡಿಸಿ, ನಿಮ್ಮ ವೀಕ್ಷಣಾಪಟ್ಟಿಯಲ್ಲಿ {{PLURAL:$1|$1 ಪುಟ ಇದೆ|$1 ಪುಟಗಳು ಇವೆ}}.',
-'wlheader-showupdated' => "ನೀವು ಕೊನೆಯ ಬಾರಿ ಭೇಟಿ ನೀಡಿದ ನಂತರ ಬದಲಾವಣೆಗಳು ಆಗಿರುವ ಪುಟಗಳು '''ದಪ್ಪ ಅಕ್ಷರಗಳಲ್ಲಿ''' ತೋರಿಸಲಾಗಿದೆ",
+'wlheader-showupdated' => "ನೀವು ಕೊನೆಯ ಬಾರಿ ಭೇಟಿ ನೀಡಿದ ನಂತರ ಬದಲಾವಣೆಗಳು ಆಗಿರುವ ಪುಟಗಳು '''ದಪ್ಪ ಅಕ್ಷರಗಳಲ್ಲಿ''' ತೋರಿಸಲಾಗಿದೆ",
 'watchmethod-recent' => 'ಇತ್ತೀಚಿನ ಸಂಪಾದನೆಗಳಲ್ಲಿ ವೀಕ್ಷಣಾಪಟ್ಟಿಗೆ ಸೇರುವ ಪುಟಗಳ ಹುಡುಕು',
 'watchmethod-list' => 'ವೀಕ್ಷಣಾಪಟ್ಟಿಗೆ ಸೇರುವ ಪುಟಗಳಲ್ಲಿ ಇತ್ತೀಚಿನ ಸಂಪಾದನೆಗಳಿಗೆ ಹುಡುಕು',
 'watchlistcontains' => 'ನಿಮ್ಮ ವೀಕ್ಷಣಾಪಟ್ಟಿಯಲ್ಲಿ $1 {{PLURAL:$1|ಪುಟ|ಪುಟಗಳು}} ಇವೆ.',
@@ -1602,7 +1605,7 @@ $2',
 'blanknamespace' => '(ಮುಖ್ಯ)',
 
 # Contributions
-'contributions' => 'ಸದಸ್ಯರ ಕಾಣಿಕೆಗಳು',
+'contributions' => '{{GENDER:$1|User}} ಕಾಣಿಕೆಗಳು',
 'contributions-title' => '$1 ಸದಸ್ಯರ ಕಾಣಿಕೆಗಳು',
 'mycontris' => 'ಕಾಣಿಕೆಗಳು',
 'contribsub2' => '$1 ($2) ಗೆ',
@@ -1676,7 +1679,7 @@ $2',
 'ipusubmit' => 'ಈ ವಿಳಾಸದ ತಡೆಯನ್ನು ತೆಗೆ',
 'unblocked' => '[[User:$1|$1]] ಖಾತೆಯ ತಡೆಯನ್ನು ತೆಗೆಯಲಾಗಿದೆ',
 'unblocked-id' => '$1 ತಡೆಯನ್ನು ತೆಗೆಯಲಾಗಿದೆ',
-'ipblocklist' => 'ನಿರ್ಬಂಧಿಸಲಾಗಿರುವ IP ವಿಳಾಸಗಳು ಹಾಗೂ ಬಳಕೆಯ ಹೆಸರುಗಳು',
+'ipblocklist' => 'ನಿರ್ಬಂಧಿಸಲಾಗಿರುವ ಸದಸ್ಯರು',
 'ipblocklist-legend' => 'ತಡೆಹಿಡಿಯಲಾದ ಬಳಕೆದಾರನನ್ನು ಹುಡುಕು',
 'ipblocklist-submit' => 'ಹುಡುಕು',
 'infiniteblock' => 'ಅನಂತ',
@@ -1941,7 +1944,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ಅಗಲ',
 'exif-imagelength' => 'ಎತ್ತರ',
 'exif-bitspersample' => 'ಪ್ರತಿ ಭಾಗಕ್ಕಿರುವ ಬಿಟ್‍ಗಳು',
@@ -2142,11 +2145,6 @@ $5
 'version-software-product' => 'ಉತ್ಪನ್ನ',
 'version-software-version' => 'ಆವೃತ್ತಿ',
 
-# Special:FilePath
-'filepath' => 'ಫೈಲಿನ ಮಾರ್ಗ',
-'filepath-page' => 'ಫೈಲು:',
-'filepath-submit' => 'ಹೋಗು',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ದ್ವಿಪ್ರತಿ ಫೈಲುಗಳಿಗೆ ಹುಡುಕು',
 'fileduplicatesearch-legend' => 'ದ್ವಿಪ್ರತಿಯನ್ನು ಹುಡುಕು',
index d0bf0bc..cdfc55e 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' ),
@@ -345,7 +351,7 @@ $dateFormats = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline' => '링크에 밑줄 표시하기:',
+'tog-underline' => '링크에 밑줄:',
 'tog-justify' => '문단 정렬하기',
 'tog-hideminor' => '최근 바뀜에서 사소한 편집을 숨기기',
 'tog-hidepatrolled' => '최근 바뀜에서 검토한 편집을 숨기기',
@@ -375,7 +381,7 @@ $messages = array(
 'tog-oldsig' => '현재 서명:',
 'tog-fancysig' => '서명을 위키텍스트로 취급 (자동으로 링크를 걸지 않음)',
 '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' => '주시문서 목록에서 봇 편집을 숨기기',
@@ -388,7 +394,7 @@ $messages = array(
 'tog-showhiddencats' => '숨은 분류 보기',
 'tog-noconvertlink' => '링크 제목 변환을 비활성화',
 'tog-norollbackdiff' => '되돌리기 후 차이를 보이지 않기',
-'tog-useeditwarning' => 'ì\88\98ì \95í\95\9c ë\82´ì\9a©ì\9d\84 ì \80ì\9e¥í\95\98ì§\80 ì\95\8aê³  í\8e¸ì§\91 ì\96\91ì\8b\9dì\9d\84 ë\8b«ê±°ë\82\98 ë\8b¤ë¥¸ í\8e\98ì\9d´ì§\80ë¡\9c ì\9d´ë\8f\99í\95  ë\95\8c ì\95\8c림',
+'tog-useeditwarning' => 'ë°\94ê¾¼ ë\82´ì\9a©ì\9d\84 ì \80ì\9e¥í\95\98ì§\80 ì\95\8aê³  í\8e¸ì§\91 í\8e\98ì\9d´ì§\80를 ë²\97ì\96´ë\82  ë\95\8c ì\95\8c림',
 
 'underline-always' => '항상',
 'underline-never' => '치지 않음',
@@ -452,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|분류}}',
@@ -518,8 +536,8 @@ $messages = array(
 'help' => '도움말',
 'search' => '찾기',
 'searchbutton' => '찾기',
-'go' => '기',
-'searcharticle' => '기',
+'go' => '기',
+'searcharticle' => '기',
 'history' => '문서 역사',
 'history_short' => '역사',
 'updatedmarker' => '마지막으로 방문한 뒤 바뀜',
@@ -533,6 +551,7 @@ $messages = array(
 'create-this-page' => '이 문서 만들기',
 'delete' => '삭제',
 'deletethispage' => '이 문서 삭제하기',
+'undeletethispage' => '이 문서 되살리기',
 'undelete_short' => '{{PLURAL:$1|편집 $1개}} 되살리기',
 'viewdeleted_short' => '{{PLURAL:$1|삭제된 편집 $1개}} 보기',
 'protect' => '보호',
@@ -586,7 +605,6 @@ $1',
 'disclaimers' => '면책 조항',
 'disclaimerpage' => 'Project:면책 조항',
 'edithelp' => '편집 도움말',
-'edithelppage' => 'Help:편집하기',
 'helppage' => 'Help:목차',
 'mainpage' => '대문',
 'mainpage-description' => '대문',
@@ -608,11 +626,11 @@ $1',
 'retrievedfrom' => '원본 주소 "$1"',
 'youhavenewmessages' => '다른 사용자가 $1에 글을 남겼습니다. ($2)',
 'newmessageslink' => '사용자 토론',
-'newmessagesdifflink' => '마지막 바뀐 내용',
+'newmessagesdifflink' => '마지막으로 바뀐 내용',
 'youhavenewmessagesfromusers' => '{{PLURAL:$3|다른 사용자가|사용자 $3명이}} $1에 글을 남겼습니다. ($2)',
 'youhavenewmessagesmanyusers' => '여러 사용자가 $1에 글을 남겼습니다. ($2)',
 'newmessageslinkplural' => '{{PLURAL:$1|사용자 토론}}',
-'newmessagesdifflinkplural' => '마지막 {{PLURAL:$1|바뀐 내용}}',
+'newmessagesdifflinkplural' => '마지막으로 {{PLURAL:$1|바뀐 내용}}',
 'youhavenewmessagesmulti' => '다른 사용자가 $1에 글을 남겼습니다',
 'editsection' => '편집',
 'editold' => '편집',
@@ -625,8 +643,8 @@ $1',
 'hidetoc' => '숨기기',
 'collapsible-collapse' => '접기',
 'collapsible-expand' => '펼치기',
-'thisisdeleted' => '$1 보거나 되살리겠습니까?',
-'viewdeleted' => '$1 보겠습니까?',
+'thisisdeleted' => '$1 문서를 보거나 되살리겠습니까?',
+'viewdeleted' => '$1 문서를 보겠습니까?',
 'restorelink' => '{{PLURAL:$1|삭제된 편집 $1개}}',
 'feedlinks' => '피드:',
 'feed-invalid' => '잘못된 구독 피드 방식입니다.',
@@ -708,7 +726,7 @@ URL을 잘못 입력하였거나, 잘못된 링크를 따라갔을 수 있습니
 'delete-hook-aborted' => '훅에 의해 삭제가 중단되었습니다.
 아무런 설명도 주어지지 않았습니다.',
 'badtitle' => '잘못된 제목',
-'badtitletext' => '문서 제목이 잘못되었거나 비어있습니다. 또는 잘못된 인터위키 제목으로 링크했습니다.
+'badtitletext' => '요청한 문서 제목이 잘못되었거나, 비어있거나, 잘못된 인터위키 제목으로 링크했습니다.
 문서 제목에 사용할 수 없는 문자를 사용했을 수 있습니다.',
 'perfcached' => '다음 자료는 캐시된 것이므로 현재 상황을 반영하지 않을 수 있습니다. 캐시에 최대 {{PLURAL:$1|결과 $1개}}가 있습니다.',
 'perfcachedts' => '다음 자료는 캐시된 것으로, $1에 마지막으로 새로 고쳐졌습니다.  캐시에 최대 {{PLURAL:$4|결과 $4개}}가 있습니다.',
@@ -736,6 +754,8 @@ $2',
 'namespaceprotected' => "'''$1''' 이름공간을 편집할 수 있는 권한이 없습니다.",
 'customcssprotected' => '여기에는 다른 사용자의 개인 설정이 포함되어 있기 때문에 이 CSS 문서를 편집할 수 없습니다.',
 'customjsprotected' => '여기에는 다른 사용자의 개인 설정이 포함되어 있기 때문에 이 자바스크립트 문서를 편집할 수 없습니다.',
+'mycustomcssprotected' => '이 CSS 문서를 편집할 권한이 없습니다.',
+'mycustomjsprotected' => '이 자바스크립트 문서를 편집할 권한이 없습니다.',
 'ns-specialprotected' => '특수 문서는 편집할 수 없습니다.',
 'titleprotected' => '[[User:$1|$1]] 사용자가 문서 만들기를 금지했습니다.
 이유는 다음과 같습니다. "$2"',
@@ -761,15 +781,18 @@ $2',
 'welcomecreation-msg' => '계정이 만들어졌습니다.
 [[Special:Preferences|{{SITENAME}} 사용자 환경 설정]]을 바꿀 수 있습니다.',
 'yourname' => '사용자 이름:',
-'userlogin-yourname' => '계정 이름',
-'userlogin-yourname-ph' => '계정 이름을 입력하십시오',
+'userlogin-yourname' => '사용자 이름',
+'userlogin-yourname-ph' => '사용자 이름을 입력하세요',
 'yourpassword' => '비밀번호:',
 'userlogin-yourpassword' => '비밀번호',
-'userlogin-yourpassword-ph' => '비밀번호를 입력하십시오',
+'userlogin-yourpassword-ph' => '비밀번호를 입력하세요',
+'createacct-yourpassword-ph' => '비밀번호 입력',
 'yourpasswordagain' => '비밀번호 다시 입력:',
+'createacct-yourpasswordagain' => '비밀번호 확인',
+'createacct-yourpasswordagain-ph' => '비밀번호 다시 입력',
 'remembermypassword' => '이 브라우저에서 로그인 상태를 저장하기 (최대 $1{{PLURAL:$1|일}})',
-'userlogin-remembermypassword' => 'ë\82´ ë¡\9cê·¸ì\9d¸ì\9d\84 ê¸°ì\96µ하기',
-'userlogin-signwithsecure' => 'ë³´ì\95\88 ì\84\9cë²\84ë¡\9c ë¡\9cê·¸ì\9d¸',
+'userlogin-remembermypassword' => 'ë¡\9cê·¸ì\9d¸ ì\83\81í\83\9c를 ì\9c ì§\80하기',
+'userlogin-signwithsecure' => 'ë³´ì\95\88 ì\97°ê²° ì\82¬ì\9a©',
 'securelogin-stick-https' => '로그인 후에도 HTTPS 연결 상태를 유지합니다',
 'yourdomainname' => '도메인 이름:',
 'password-change-forbidden' => '이 위키에서 비밀번호를 바꿀 수 없습니다.',
@@ -790,14 +813,30 @@ $2',
 '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}}에서는 로그인 정보를 저장하기 위해 쿠키를 사용합니다.
@@ -856,7 +895,7 @@ $2',
 'cannotchangeemail' => '이 위키에서는 계정의 이메일 주소를 바꿀 수 없습니다.',
 'emaildisabled' => '이 사이트에서는 이메일을 보낼 수 없습니다.',
 'accountcreated' => '계정 만들어짐',
-'accountcreatedtext' => '"$1" 사용자 계정이 만들어졌습니다.',
+'accountcreatedtext' => '[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|토론]]) 사용자 계정이 만들어졌습니다.',
 'createaccount-title' => '{{SITENAME}} 계정 만들기',
 'createaccount-text' => '누군가가 {{SITENAME}} ($4)에서 사용자 이름 "$2", 비밀번호 "$3"로 당신의 이메일 주소가 등록된 계정을 만들었습니다. 
 지금 로그인하여 비밀번호를 바꾸십시오.
@@ -864,7 +903,7 @@ $2',
 실수로 계정을 잘못 만들었다면 이 메시지는 무시해도 됩니다.',
 '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' => '브라우저에 이상이 있거나 캐싱 프록시에서 로그아웃을 요청했기 때문에 로그아웃이 거부되었습니다.',
@@ -893,14 +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-emaildisabled' => '이 위키에서 이메일 기능이 비활성화되어 있습니다.',
-'passwordreset-pretext' => '{{PLURAL:$1||아래에 한 가지 정보를 입력하세요}}',
 'passwordreset-username' => '사용자 이름:',
 'passwordreset-domain' => '도메인:',
 'passwordreset-capture' => '발송 결과 이메일을 보시겠습니까?',
@@ -929,12 +969,12 @@ $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 ë³´ì\97¬ì ¸ ì\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' => '이메일 주소 바꾸기',
 'changeemail-header' => '계정 메일 주소 바꾸기',
-'changeemail-text' => 'ì\9d´ë©\94ì\9d¼ ì£¼ì\86\8c를 ë°\94꾸려면 ì\9d´ ì\96\91ì\8b\9dì\9d\84 ì±\84ì\9a°세요. 바뀜 내용을 확인하기 위해 비밀번호를 입력해야 합니다.',
+'changeemail-text' => 'ì\9d´ë©\94ì\9d¼ ì£¼ì\86\8c를 ë°\94꾸려면 ì\9d´ ì\96\91ì\8b\9dì\9d\84 ì\9e\91ì\84±í\95´ì£¼세요. 바뀜 내용을 확인하기 위해 비밀번호를 입력해야 합니다.',
 'changeemail-no-info' => '이 특수 문서에 직접 접근하려면 반드시 로그인해야 합니다.',
 'changeemail-oldemail' => '현재 이메일 주소 :',
 'changeemail-newemail' => '새 이메일 주소:',
@@ -1021,7 +1061,7 @@ $1 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 대
 'loginreqlink' => '로그인',
 'loginreqpagetext' => '다른 문서를 보기 위해서는 $1해야 합니다.',
 'accmailtitle' => '비밀번호를 보냈습니다',
-'accmailtext' => '[[User talk:$1|$1]] 사용자의 비밀번호가 임의로 만들어져 $2ë¡\9c ì \84ì\86¡ë\90\98ì\97\88ì\8aµë\8b\88ë\8b¤.
+'accmailtext' => '[[User talk:$1|$1]] 사용자의 비밀번호가 임의로 만들어져 $2\9c¼)ë¡\9c ë³´ë\83\88ì\8aµë\8b\88ë\8b¤.
 
 새 비밀번호는 로그인한 후 [[Special:ChangePassword|비밀번호를 바꿀]] 수 있습니다.',
 'newarticle' => '(새 문서)',
@@ -1032,7 +1072,7 @@ $1 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 대
 여기는 계정을 만들지 않았거나 사용하고 있지 않은 익명 사용자를 위한 토론 문서입니다.
 익명 사용자를 구별하기 위해서는 숫자로 된 IP 주소를 사용해야만 합니다.
 IP 주소는 여러 사용자가 공유할 수 있습니다.
-자신과 관계없는 의견이 자신에게 남겨져 있어 불쾌하다고 생각하는 익명 사용자는 [[Special:UserLogin/signup|계정을 만들고]] [[Special:UserLogin|로그인 하여]] 나중에 다른 익명 사용자에게 줄 혼란을 줄일 수 있습니다.',
+자신과 관계없는 의견이 자신에게 남겨져 있어 불쾌하다고 생각하는 익명 사용자는 [[Special:UserLogin/signup|계정을 만들고]] [[Special:UserLogin|로그인해서]] 나중에 다른 익명 사용자에게 줄 혼란을 줄일 수 있습니다.',
 'noarticletext' => '이 문서가 현재 존재하지 않습니다.
 이 문서와 제목이 비슷한 문서가 있는지 [[Special:Search/{{PAGENAME}}|찾거나]],
 이 문서에 관련된 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 기록]을 확인하거나,
@@ -1149,14 +1189,15 @@ IP 주소는 여러 사용자가 공유할 수 있습니다.
 문서가 삭제된 것 같습니다.',
 'edit-conflict' => '편집 충돌.',
 'edit-no-change' => '문서에 어떠한 바뀜도 없기 때문에 편집은 무시되었습니다.',
+'postedit-confirmation' => '편집을 저장했습니다.',
 'edit-already-exists' => '새 문서를 만들 수 없습니다.
 문서가 이미 존재합니다.',
-'defaultmessagetext' => '기본 ë©\94ì\84¸ì§\80 ë\82´ì\9a©',
+'defaultmessagetext' => '기본 ë©\94ì\8b\9cì§\80 ê¸\80',
 'content-failed-to-parse' => '$1 모델에 대한 $2 내용을 구문 분석하는 데 실패했습니다: $3',
 'invalid-content-data' => '잘못된 내용 데이터입니다',
 'content-not-allowed-here' => '"$1" 내용은 [[$2]] 문서예 허용하지 않습니다',
-'editwarning-warning' => '이 창에서 벗어나면 저장하지 않은 편집이 모두 사라집니다.
-로그인한 경우, 환경 설정 ‘{{int:prefs-editing}}’란에서 이 경고창을 띄우지 않도록 설정할 수 있습니다.',
+'editwarning-warning' => '이 페이지에서 벗어나면 저장하지 않은 바뀜이 모두 사라집니다.
+로그인을 했다면, 환경 설정의 "편집 상자"에서 이 경고를 띄우지 않도록 설정할 수 있습니다.',
 
 # Content models
 'content-model-wikitext' => '위키텍스트',
@@ -1191,7 +1232,7 @@ $2개 보다 적게 {{PLURAL:$2|써야}} 하지만 {{PLURAL:$1|지금은 $1개
 편집 되돌리기를 완료하려면 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 저장해주세요.',
 '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' => '계정을 만들 수 없음',
@@ -1400,7 +1441,6 @@ $1",
 'searchmenu-legend' => '찾기 설정',
 'searchmenu-exists' => "'''이 위키에 \"[[:\$1]]\"의 이름을 가진 문서가 있습니다.'''",
 'searchmenu-new' => "'''이 위키에 \"[[:\$1]]\" 문서를 만드세요!'''",
-'searchhelp-url' => 'Help:목차',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|이 접두어로 시작하는 문서 찾기]]',
 'searchprofile-articles' => '일반 문서',
 'searchprofile-project' => '도움말 및 프로젝트 문서',
@@ -1544,8 +1584,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' => '자신의 문서나 토론 문서에 있는 이메일 보내기 링크로 다른 사용자가 연락할 수 있게 할 수도 있습니다.
 이 경우에도 이메일 주소는 다른 사용자가 연락할 때 공개되지 않습니다.',
@@ -1567,7 +1607,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' => '사용자 권한 관리',
@@ -1590,6 +1630,8 @@ HTML 태그를 확인하세요.',
 'userrights-notallowed' => '다른 사용자의 권한을 조정할 권한이 없습니다.',
 'userrights-changeable-col' => '바꿀 수 있는 권한',
 'userrights-unchangeable-col' => '바꿀 수 없는 권한',
+'userrights-conflict' => '사용자 권한에 충돌이 있습니다! 바뀜을 다시 적용하세요.',
+'userrights-removed-self' => '자신의 권한을 성공적으로 제거했습니다. 따라서 더 이상 이 문서에 접근할 수 없습니다.',
 
 # Groups
 'group' => '그룹:',
@@ -1660,6 +1702,10 @@ HTML 태그를 확인하세요.',
 'right-editusercssjs' => '다른 사용자의 CSS와 자바스크립트 문서를 편집',
 'right-editusercss' => '다른 사용자의 CSS 문서를 편집',
 'right-edituserjs' => '다른 사용자의 자바스크립트 문서를 편집',
+'right-editmyusercss' => '자신의 사용자 CSS 파일 편집하기',
+'right-editmyuserjs' => '자신의 사용자 자바스크립트 파일 편집하기',
+'right-viewmywatchlist' => '자신의 주시문서 목록 보기',
+'right-editmywatchlist' => '자신의 주시문서 목록을 편집합니다. 이 권한이 없어도 문서를 추가할 수 있는 권한이 이외에도 있음을 참고하세요.',
 'right-rollback' => '특정 문서를 편집한 마지막 사용자의 편집을 신속하게 되돌리기',
 'right-markbotedits' => '되돌리기를 봇의 편집으로 취급 가능',
 'right-noratelimit' => '편집이나 다른 행동 속도의 제한을 받지 않음',
@@ -1705,7 +1751,7 @@ HTML 태그를 확인하세요.',
 'action-deleterevision' => '이 판을 삭제',
 'action-deletedhistory' => '이 문서의 삭제된 기여의 역사 보기',
 'action-browsearchive' => '삭제된 문서 찾기',
-'action-undelete' => '이 문서 되살리기',
+'action-undelete' => '이 문서 되살리기',
 'action-suppressrevision' => '이 숨겨진 판을 검토하고 되살릴',
 'action-suppressionlog' => '비공개 기록 보기',
 'action-block' => '이 사용자를 편집하지 못하도록 차단',
@@ -1721,6 +1767,8 @@ HTML 태그를 확인하세요.',
 'action-userrights-interwiki' => '다른 위키의 사용자 권한을 조정',
 'action-siteadmin' => '데이터베이스를 잠그거나 잠금 해제하기',
 'action-sendemail' => '이메일 보내기',
+'action-editmywatchlist' => '내 주시문서 목록 편집',
+'action-viewmywatchlist' => '내 주시문서 목록 보기',
 
 # Recent changes
 'nchanges' => '$1개 {{PLURAL:$1|바뀜}}',
@@ -1756,7 +1804,7 @@ HTML 태그를 확인하세요.',
 'newsectionsummary' => '새 주제: /* $1 */',
 'rc-enhanced-expand' => '자세한 기록 보기 (자바스크립트 필요)',
 'rc-enhanced-hide' => '자세한 기록 숨기기',
-'rc-old-title' => '처음에  "$1"라는 제목으로 만들어짐',
+'rc-old-title' => '처음에 "$1"라는 제목으로 만들어졌습니다',
 
 # Recent changes linked
 'recentchangeslinked' => '가리키는 글의 바뀜',
@@ -1775,7 +1823,7 @@ HTML 태그를 확인하세요.',
 'reuploaddesc' => '올리기를 취소하고 올리기 양식으로 돌아가기',
 'upload-tryagain' => '수정된 파일 설명을 저장',
 'uploadnologin' => '로그인하지 않음',
-'uploadnologintext' => '파일을 올리려면 [[Special:UserLogin|로그인]]해야 합니다.',
+'uploadnologintext' => '파일을 올리려면 $1해야 합니다.',
 'upload_directory_missing' => '파일 올리기용 디렉터리($1)가 없고 웹 서버가 만들지 못했습니다.',
 'upload_directory_read_only' => '파일 저장 디렉터리($1)에 쓰기 권한이 없습니다.',
 'uploaderror' => '올리기 오류',
@@ -1918,7 +1966,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' => '크기를 알 수 없음',
@@ -2020,8 +2068,8 @@ 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' => '라이선스',
@@ -2032,7 +2080,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 
 # Special:ListFiles
 'listfiles-summary' => '이 위키에 올라와 있는 모든 파일이 나열되어 있습니다.
-사용자별로 필터링했을 경우에는 사용자가 올린 가장 최신 버전만이 보여집니다.',
+사용자별로 필터링했을 경우에는 사용자가 올린 가장 최신 만이 보여집니다.',
 'listfiles_search_for' => '다음 이름을 가진 미디어 찾기:',
 'imgfile' => '파일',
 'listfiles' => '파일 목록',
@@ -2172,8 +2220,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' => '가기',
@@ -2218,7 +2266,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'uncategorizedtemplates' => '분류되지 않은 틀 목록',
 'unusedcategories' => '사용하지 않는 분류 목록',
 'unusedimages' => '사용하지 않는 파일 목록',
-'popularpages' => '인기있는 문서 목록',
+'popularpages' => '인기 있는 문서 목록',
 'wantedcategories' => '필요한 분류 목록',
 'wantedpages' => '필요한 문서 목록',
 'wantedpages-badtitle' => '문서 제목이 잘못되었습니다: $1',
@@ -2262,7 +2310,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'unusedcategoriestext' => '사용하지 않는 분류 문서의 목록입니다.',
 'notargettitle' => '해당하는 문서 없음',
 'notargettext' => '기능을 수행할 대상 문서나 사용자를 지정하지 않았습니다.',
-'nopagetitle' => '해당 문서 없음',
+'nopagetitle' => '해당하는 문서 없음',
 'nopagetext' => '찾는 문서가 존재하지 않습니다.',
 'pager-newer-n' => '{{PLURAL:$1|다음 1개|다음 $1개}}',
 'pager-older-n' => '{{PLURAL:$1|이전 1개|이전 $1개}}',
@@ -2302,7 +2350,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'allpagesnext' => '다음',
 'allpagessubmit' => '보기',
 'allpagesprefix' => '다음으로 시작하는 문서 보기:',
-'allpagesbadtitle' => '문서 제목이 잘못되었거나 다른 사이트로 연결되는 인터위키를 가지고 있습니다.
+'allpagesbadtitle' => '주어진 문서 제목이 잘못되었거나 다른 사이트로 연결되는 인터위키가 있습니다.
 문서 제목에 사용할 수 없는 문자를 사용했을 수 있습니다.',
 'allpages-bad-ns' => '{{SITENAME}}에서는 "$1" 이름공간을 사용하지 않습니다.',
 'allpages-hide-redirects' => '넘겨주기 숨기기',
@@ -2343,15 +2391,24 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'listusers-noresult' => '해당 사용자가 없습니다.',
 'listusers-blocked' => '(차단됨)',
 
+# Special:ActiveUsers
+'activeusers' => '활동적인 사용자 목록',
+'activeusers-intro' => '다음은 최근 $1{{PLURAL:$1|일}} 동안 활동한 사용자의 목록입니다.',
+'activeusers-count' => '최근 {{PLURAL:$3|$3일}} 사이의 {{PLURAL:$1|활동}} $1회',
+'activeusers-from' => '다음으로 시작하는 사용자를 보기:',
+'activeusers-hidebots' => '봇을 숨기기',
+'activeusers-hidesysops' => '관리자를 숨기기',
+'activeusers-noresult' => '사용자가 없습니다.',
+
 # 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',
@@ -2421,8 +2478,8 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'notvisiblerev' => '이 판은 삭제되었습니다.',
 'watchnochange' => '주어진 기간 중에 바뀐 주시문서가 없습니다.',
 'watchlist-details' => '토론을 제외하고 {{PLURAL:$1|문서 $1개}}를 주시하고 있습니다.',
-'wlheader-enotif' => '이메일 알림 기능이 활성화되었습니다.',
-'wlheader-showupdated' => "마지막으로 방문한 이후에 바뀐 문서는 '''굵은 글씨'''로 보여집니다.",
+'wlheader-enotif' => '이메일 알림 기능이 활성화되었습니다.',
+'wlheader-showupdated' => "마지막으로 방문한 이후에 바뀐 문서는 '''굵은 글씨'''로 보여집니다.",
 'watchmethod-recent' => '주시된 문서를 확인하고자 최근 편집을 확인',
 'watchmethod-list' => '최근 편집을 확인하고자 주시된 문서 확인',
 'watchlistcontains' => '{{PLURAL:$1|문서 $1개}}를 주시하고 있습니다.',
@@ -2523,7 +2580,7 @@ $UNWATCHURL
 'rollbacklinkcount-morethan' => '{{PLURAL:$1|편집}} $1회 이상 되돌리기',
 'rollbackfailed' => '되돌리기 실패',
 'cantrollback' => '편집을 되돌릴 수 없습니다.
-문서를 편집한 사용자가 한명뿐입니다.',
+문서를 편집한 사용자가 한 명뿐입니다.',
 'alreadyrolled' => '[[:$1]]에서 [[User:$2|$2]] ([[User talk:$2|토론]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])의 편집을 되돌릴 수 없습니다.
 누군가가 이미 문서를 고치거나 되돌렸습니다.
 
@@ -2534,7 +2591,7 @@ $UNWATCHURL
 'rollback-success' => '$1의 편집을 $2의 마지막 버전으로 되돌렸습니다.',
 
 # Edit tokens
-'sessionfailure-title' => 'ì\84¸ì\85\98 ì\86\90ì\8b¤',
+'sessionfailure-title' => 'ì\84¸ì\85\98 ì\8b¤í\8c¨',
 'sessionfailure' => '로그인 세션에 문제가 발생한 것 같습니다.
 세션 하이재킹을 막기 위해 동작이 취소되었습니다.
 브라우저의 뒤로 버튼을 누르고 문서를 새로 고침한 후에 다시 시도해 주세요.',
@@ -2826,7 +2883,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' => '이 사용자 이름이 숨겨져 있기 때문에 이 사용자를 차단 해제할 수 없습니다.',
@@ -2876,18 +2933,16 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 # Move page
 'move-page' => '$1 이동',
 'move-page-legend' => '문서 이동하기',
-'movepagetext' => "아래의 양식을 사용해 문서의 이름을 바꾸고 문서의 모든 역사를 새 이름으로 옮길 수 있습니다.
-이전의 제목은 새 제목으로 넘겨줄 것입니다.
-원래 이름을 가리키는 넘겨주기를 자동으로 새로 고칠 수 있습니다.
-만약 이 설정을 선택하지 않았다면 [[Special:DoubleRedirects|이중 넘겨주기]]와 [[Special:BrokenRedirects|끊긴 넘겨주기]]가 있는지 확인해주세요.
-넘겨주기 링크가 제대로 향하고 있는지 확인하여야 합니다.
+'movepagetext' => "아래 양식을 채워 문서의 이름을 바꾸고 모든 역사를 새 이름으로 된 문서로 옮길 수 있습니다.
+원래의 문서는 새 문서로 넘겨주는 링크로만 남게 되고, 원래 이름을 가리키는 넘겨주기는 자동으로 갱신됩니다.
+만약 이 설정을 선택하지 않았다면 [[Special:DoubleRedirects|이중 넘겨주기]]와 [[Special:BrokenRedirects|끊긴 넘겨주기]]를 확인해주세요.
+당신은 링크와 가리키는 대상이 서로 일치하도록 해야 하는 책임을 집니다.
 
-참고ë¡\9c ì\83\88 ì \9c목ì\9c¼ë¡\9c ë\90\9c ë¬¸ì\84\9cê°\80 ì\9d´ë¯¸ ì\9e\88ì\9d\84 ë\95\8c, ë\84\98겨주기 ë¬¸ì\84\9cì\9d´ê³  ë¬¸ì\84\9c ì\97­ì\82¬ê°\80 ì\97\86ì\9d\84 ë\95\8cì\97\90ë§\8c ì\9d´ë\8f\99í\95\98ë©° ê·¸ë \87ì§\80 ì\95\8aì\9d\84 ê²½ì\9a°ì\97\90ë\8a\94 ì\9d´ë\8f\99í\95\98ì§\80 '''ì\95\8aì\8aµë\8b\88ë\8b¤'''.
\8b¤ì\88\98ë¡\9c ë¬¸ì\84\9c를 ì\98®ê²¼ì\9d\84 ë\95\8c ë\90\98ë\8f\8c릴 ì\88\98ë\8a\94 ì\9e\88ì§\80ë§\8c ì\9d´ë¯¸ ì\9e\88ë\8a\94 ë¬¸ì\84\9c를 ë\8d®ì\96´ì\93¸ ì\88\98 ì\97\86ì\9d\8c을 의미합니다.
+ë§\8cì\95½ ì\9d´ë¯¸ ì\9e\88ë\8a\94 ë¬¸ì\84\9cì\9d\98 ì\9d´ë¦\84ì\9d\84 ì\83\88 ì\9d´ë¦\84ì\9c¼ë¡\9c ì\9e\85ë ¥í\96\88ì\9d\84 ë\95\8cë\8a\94 ê·¸ ë¬¸ì\84\9cê°\80 ë¹\84ì\97\88ê±°ë\82\98 ë\84\98겨주기 ë¬¸ì\84\9cì\9d´ê³  ë¬¸ì\84\9c ì\97­ì\82¬ê°\80 ì\97\86ì\96´ì\95¼ë§\8c ì\9d´ë\8f\99ì\9d´ ë\90©ë\8b\88ë\8b¤. ê·¸ë \87ì§\80 ì\95\8aì\9d\84 ê²½ì\9a°ì\97\90ë\8a\94 ì\9d´ë\8f\99ë\90\98ì§\80 '''ì\95\8aì\8aµë\8b\88ë\8b¤'''.
\9d´ê²\83ì\9d\80 ì\8b¤ì\88\98ë¡\9c ì\9d´ë\8f\99í\95\9c ë¬¸ì\84\9c를 ë\90\98ë\8f\8c릴 ì\88\98ë\8a\94 ì\9e\88ì§\80ë§\8c, ì\9d´ë¯¸ ì¡´ì\9e¬í\95\98ë\8a\94 ë¬¸ì\84\9c ì\9c\84ì\97\90 ë\8d®ì\96´ì\94\8cì\9a¸ ì\88\98ë\8a\94 ì\97\86ë\8b¤ë\8a\94 ê²\83을 의미합니다.
 
-'''경고!'''
-인기 있는 문서일 경우 심각하고 예상하지 못한 문제를 초래할 수 있습니다.
-문서를 이동하기 전에 이러한 행동이 초래할 수 있는 결과에 대해 숙지하시기 바랍니다.",
+'''주의!'''
+자주 사용하는 문서를 이동하면 해결하기 어려운 문제를 일으킬 수도 있습니다. 이동하기 전에 반드시 이 문서를 이동해도 문제가 없는지 확인해주세요.",
 'movepagetext-noredirectfixer' => "아래의 양식을 사용해 문서의 이름을 바꾸고 문서의 모든 역사를 새 이름으로 옮길 수 있습니다.
 이전의 제목은 새 제목으로 넘겨줄 것입니다.
 [[Special:DoubleRedirects|이중 넘겨주기]]나 [[Special:BrokenRedirects|끊긴 넘겨주기]]가 있는지 확인해주세요.
@@ -2905,13 +2960,13 @@ $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' => '이동',
@@ -2920,17 +2975,17 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 '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-exists' => '$1 문서가 이미 존재하므로 자동으로 덮어쓸 수 없습니다.',
 'movepage-page-moved' => '"$1" 문서를 "$2" 문서로 옮겼습니다.',
-'movepage-page-unmoved' => '"$1" 문서를 "$2" 문서로 이동할 수 없습니다.',
-'movepage-max-pages' => '{{PLURAL:$1|문ì\84\9c}}를 ìµ\9cë\8c\80 $1ê°\9c ì\9d´ë\8f\99í\96\88ì\8aµë\8b\88ë\8b¤. ë\82\98머ì§\80 ë¬¸ì\84\9cë\8a\94 ì\9e\90ë\8f\99 ì\9d´ë\8f\99í\95\98지 않습니다.',
+'movepage-page-unmoved' => '$1 문서를 $2 문서로 옮길 수 없습니다.',
+'movepage-max-pages' => '{{PLURAL:$1|문ì\84\9c}}를 ìµ\9cë\8c\80 $1ê°\9c ì\98®ê²¼ì\9c¼ë©° ë\82\98머ì§\80 ë¬¸ì\84\9cë\8a\94 ì\9e\90ë\8f\99ì\9c¼ë¡\9c ì\98®ê¸°지 않습니다.',
 'movelogpage' => '이동 기록',
 'movelogpagetext' => '아래는 이동한 문서의 목록입니다.',
 'movesubpage' => '{{PLURAL:$1|하위 문서}}',
@@ -2945,11 +3000,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' => '파일을 파일이 아닌 이름공간으로 옮길 수 없습니다.',
@@ -2991,7 +3046,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 # Namespace 8 related
 'allmessages' => '시스템 메시지 목록',
 'allmessagesname' => '이름',
-'allmessagesdefault' => '기본 ë\82´ì\9a©',
+'allmessagesdefault' => '기본 ë©\94ì\8b\9cì§\80 ê¸\80',
 'allmessagescurrent' => '현재 문자열',
 'allmessagestext' => '미디어위키 이름공간에 있는 모든 시스템 메시지의 목록입니다.
 미디어위키의 번역 작업에 관심이 있으면 [//www.mediawiki.org/wiki/Localisation 미디어위키 지역화]나 [//translatewiki.net translatewiki.net]에 참가해주세요.',
@@ -3009,6 +3064,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' => '임시 섬네일 파일을 만들 수 없습니다.',
@@ -3146,7 +3203,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,7 +3224,6 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'modern.css' => '/* 이 CSS 설정은 모던 스킨을 사용하는 사용자에게 적용됩니다 */',
 'vector.css' => '/* 이 CSS 설정은 벡터 스킨을 사용하는 사용자에게 적용됩니다 */',
 'print.css' => '/* 이 CSS 설정은 인쇄 출력 화면에 적용됩니다 */',
-'handheld.css' => '/* 이 CSS 설정은 $wgHandheldStyle에 설정한 스킨을 기반으로 한 휴대 기기에 적용됩니다 */',
 'noscript.css' => '/* 이 CSS 설정은 자바스크립트를 비활성화한 사용자에 적용됩니다 */',
 'group-autoconfirmed.css' => '/* 이 CSS 설정은 자동 인증된 사용자에만 적용됩니다 */',
 'group-bot.css' => '/* 이 CSS 설정은 봇에만 적용됩니다 */',
@@ -3206,7 +3262,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 바깥 사이트로 연결하는 링크 중에 블랙리스트에 포함된 사이트가 있을 것입니다.',
 'spamprotectionmatch' => '문제가 되는 부분은 다음과 같습니다: $1',
 'spambot_username' => 'MediaWiki 스팸 제거',
-'spam_reverting' => '$1 포함하지 않는 최신 버전으로 되돌림',
+'spam_reverting' => '$1(을)를 포함하지 않는 최신 버전으로 되돌림',
 'spam_blanking' => '모든 버전에 $1 링크를 포함하고 있어 차단함',
 'spam_deleting' => '모든 버전에 $1 링크를 포함하고 있어 삭제함',
 
@@ -3338,11 +3394,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' => '형식은 아래와 같습니다.
 
@@ -3352,8 +3422,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' => '간체',
@@ -3381,7 +3449,7 @@ Variants for Chinese language
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => '너비',
 'exif-imagelength' => '높이',
 'exif-bitspersample' => '픽셀당 비트 수',
@@ -3559,7 +3627,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 팩스 인코딩',
@@ -3597,7 +3665,7 @@ Variants for Chinese language
 'exif-exposureprogram-4' => '셔터 우선',
 'exif-exposureprogram-5' => '크리에이티브 프로그램 (피사계 심도 우선)',
 'exif-exposureprogram-6' => '액션 프로그램 (빠른 셔터 속도에 치중)',
-'exif-exposureprogram-7' => 'ì\9d¸ë¬¼ ì\82¬ì§\84 ëª¨ë\93\9c (ë°°ê²½ì\9d\84 ì´\88ì \90 ë°\96ì\9c¼ë¡\9c í\95\98ì\97¬ 대상을 강조)',
+'exif-exposureprogram-7' => 'ì\9d¸ë¬¼ ì\82¬ì§\84 ëª¨ë\93\9c (ë°°ê²½ì\9d\84 ì´\88ì \90 ë°\96ì\9c¼ë¡\9c í\95´ì\84\9c 대상을 강조)',
 'exif-exposureprogram-8' => '풍경 모드 (초점이 배경인 풍경 사진용)',
 
 'exif-subjectdistance-value' => '$1 미터',
@@ -3786,7 +3854,7 @@ Variants for Chinese language
 
 # Email address confirmation
 'confirmemail' => '이메일 주소 확인',
-'confirmemail_noemail' => '[[Special:Preferences|환경 설정]]에 이메일을 설정하지 않았습니다.',
+'confirmemail_noemail' => '[[Special:Preferences|사용자 환경 설정]]에 올바른 이메일주소를 설정하지 않았습니다.',
 'confirmemail_text' => '{{SITENAME}}에서는 이메일 기능을 사용하기 전에 이메일 인증을 받아야 합니다.
 아래의 버튼을 누르면 인증 메일을 보냅니다.
 메일에는 인증 코드가 들어있는 링크가 있습니다.
@@ -3984,12 +4052,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' => '중복된 파일 찾기',
@@ -4060,13 +4133,13 @@ $5
 'compare-revision-not-exists' => '지정한 판이 없습니다.',
 
 # Database error messages
-'dberr-header' => '이 위키에 문제가 있습니다.',
+'dberr-header' => '이 위키에 문제가 있습니다',
 'dberr-problems' => '죄송합니다!
 이 사이트는 기술적인 문제가 있습니다.',
-'dberr-again' => '잠시 후에 다시 시도해주세요.',
-'dberr-info' => '(데이터베이스에 접속할 수 없습니다: $1)',
-'dberr-usegoogle' => '그 동안 구글을 통해 검색할 수도 있습니다.',
-'dberr-outofdate' => '참고ë¡\9c êµ¬ê¸\80ì\9d\98 ë\82´ì\9a© ê°\9cì\9a\94ë\8a\94 ì\98¤ë\9e\98ë\90\9c ê²\83ì\9d¼ ì\88\98ë\8f\84 ì\9e\88ì\8aµë\8b\88ë\8b¤.',
+'dberr-again' => '잠시 기다리고 나서 다시 불러오세요.',
+'dberr-info' => '(데이터베이스 서버에 연결할 수 없습니다: $1)',
+'dberr-usegoogle' => '그 동안 Google을 통해 검색할 수도 있습니다.',
+'dberr-outofdate' => 'ì\88\98ì§\91ë\90\9c ë\82´ì\9a©ì\9d\80 ì\98¤ë\9e\98ë\90\9c ê²\83ì\9d¼ ì\88\98ë\8f\84 ì\9e\88ì\9d\8cì\9d\84 ì°¸ê³ í\95\98ì\84¸ì\9a\94.',
 'dberr-cachederror' => '다음은 요청한 문서의 캐시된 복사본이며, 최신이 아닐 수도 있습니다.',
 
 # HTML forms
@@ -4082,6 +4155,7 @@ $5
 'htmlform-selectorother-other' => '기타',
 'htmlform-no' => '아니오',
 'htmlform-yes' => '예',
+'htmlform-chosen-placeholder' => '선택하세요',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 (본문 전체 찾기)',
index 6dd4651..2f56bec 100644 (file)
@@ -155,7 +155,6 @@ $messages = array(
 'disclaimers' => 'Мийö сöстöмöсь йöз одзын',
 'disclaimerpage' => 'Project:Мийö сöстöмöсь йöз одзын',
 'edithelp' => 'Уджкерись понда отсöт',
-'edithelppage' => 'Help:Уджкерись понда отсöт',
 'helppage' => 'Help:Отсöт',
 'mainpage' => 'Пондöтчан листбок',
 'mainpage-description' => 'Пондöтчан листбок',
@@ -495,7 +494,7 @@ $messages = array(
 # Special:ListGroupRights
 'listgrouprights-members' => '(уджкериссезлöн нимлёдз)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Этiя ужкерисьлö гижöт',
 'emailfrom' => 'Кинсянь:',
 'emailto' => 'Кинлö:',
@@ -737,7 +736,7 @@ $messages = array(
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Пасьта',
 'exif-imagelength' => 'Вылына',
 
index 58716fb..d25aced 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' => 'Бирзаманда да',
@@ -176,6 +219,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|Категория|Категорияла}}',
@@ -310,7 +365,6 @@ $1',
 'disclaimers' => 'Джууаблылыкъны унамау',
 'disclaimerpage' => 'Project:Джууаблылыкъны унамау',
 'edithelp' => 'Тюрлендириуню юсюнден болушлукъ',
-'edithelppage' => 'Help:Тюрлендириу',
 'helppage' => 'Help:Болушлукъ',
 'mainpage' => 'Баш бет',
 'mainpage-description' => 'Баш бет',
@@ -443,7 +497,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 +534,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' => 'Бу викиде паролугъузну тюрлендиреллик тюлсюз.',
@@ -495,18 +558,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}} къошулуучуланы таныр ючюн «cookies»-ни хайырландырады. Сиз «cookies»-ни эркин этмегенсиз. «Cookies»-ни эркин этигиза да, андан сора джангы атыгъыз эм паролюгъуз бла киригиз.',
 'nocookieslogin' => '{{SITENAME}} къошулуучуланы таныр ючюн «cookies»-ни хаырландырады. Сиз аны джукълатыб турасыз. «Cookies»-ни эркин этигизда джангыдан кёрюгюз.',
@@ -538,8 +621,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.',
@@ -566,14 +649,15 @@ $2',
 # Email sending
 'php-mail-error-unknown' => "PHP's mail() функцияда белгили болмагъан халат",
 'user-mail-no-addy' => 'Бир e-mail адрес болмагъанлай e-mail иерге кюрешди',
+'user-mail-no-body' => 'Бош неда магъанасыз къысха джазыу бла билдириу иерге изледи.',
 
 # Change password dialog
 'resetpass' => 'Паролну тюрлендириу',
 'resetpass_announce' => 'Сиз, электрон почта бла ийилген, болджаллы пароль бла киргенсиз. Системагъа кириуню тамамларча, джангы пароль къурагъыз.',
-'resetpass_header' => 'ТеÑ\80геÑ\83 Ð´Ð¶Ð°Ð·Ñ\8bÑ\83нÑ\83 (аккаÑ\83нÑ\82нÑ\83) Ð¿Ð°Ñ\80олÑ\8eн тюрлендириу',
+'resetpass_header' => 'ТеÑ\80геÑ\83 Ð´Ð¶Ð°Ð·Ñ\8bÑ\83нÑ\83 (аккаÑ\83нÑ\82нÑ\83) Ð¿Ð°Ñ\80олÑ\83н тюрлендириу',
 'oldpassword' => 'Эски пароль:',
 'newpassword' => 'Джангы пароль:',
-'retypenew' => 'Ð\94жангÑ\8b Ð¿Ð°Ñ\80олнÑ\8e къайтарыгъыз:',
+'retypenew' => 'Ð\94жангÑ\8b Ð¿Ð°Ñ\80олнÑ\83 къайтарыгъыз:',
 'resetpass_submit' => 'Паролну бегит эм кир',
 'resetpass_success' => 'Сизни паролюгъуз тыйыншлы тюрлендирилди! Системагъа кириу барады…',
 'resetpass_forbidden' => 'Пароль тюрленирге болмайды',
@@ -583,13 +667,15 @@ $2',
 'resetpass-wrong-oldpass' => 'Терс пароль.
 Сиз энди паролну тюрлендирген неда джангы болджаллы пароль соргъан болурсуз.',
 'resetpass-temp-password' => 'Болджаллы пароль:',
+'resetpass-abort-generic' => 'Пароль тюрлендириуню кенгертиу тыйды.',
 
 # Special:PasswordReset
-'passwordreset' => 'Паролну атыу',
-'passwordreset-text' => 'Электрон джазма бла тергеу джазыуугъузну (аккаунтугъузну) параметрлерини юсюнден билдириу алыр ючюн бу форманы толтуругъуз.',
+'passwordreset' => 'Паролну джибериу',
+'passwordreset-text-one' => 'Паролугъуз джиберилир ючюн бу форманы толтуругъуз.',
+'passwordreset-text-many' => '{{PLURAL:$1|Пароль ийилир ючюн билгилени бир бёлюмюн джазыгъыз.}}',
 'passwordreset-legend' => 'Паролну атыу',
 'passwordreset-disabled' => 'Бу викиде паролла атыу амал джукъланыбды.',
-'passwordreset-pretext' => '{{PLURAL:$1||Тюбюрекде берилген билгиледен бирин джазыгъыз}}',
+'passwordreset-emaildisabled' => 'Бу викиде электрон почтаны функциялары джукъланыбдыла.',
 'passwordreset-username' => 'Къошулуучуну аты:',
 'passwordreset-domain' => 'Домен:',
 'passwordreset-capture' => 'Джазылгъан билдириуню эсебине къара?',
@@ -600,7 +686,7 @@ $2',
 Болджаллы пароль: $2',
 'passwordreset-emailsent' => 'Пароль бла e-mail ийилди.',
 'passwordreset-emailsent-capture' => 'Ийилген пароль эсгертиу e-mail тюбюрекде берилибди.',
-'passwordreset-emailerror-capture' => 'Ð\98йилген Ð¿Ð°Ñ\80олÑ\8c Ñ\8dÑ\81геÑ\80Ñ\82иÑ\83 e-mail Ñ\82Ñ\8eбÑ\8eÑ\80екде Ð±ÐµÑ\80илибди, Ð°Ð½Ñ\8b Ð°Ñ\88Ñ\8bÑ\80Ñ\8bÑ\83у джетишимсиз болду, чурум: $1',
+'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 +696,7 @@ $2',
 'changeemail-oldemail' => 'Почтаны бусагъатдагъы адреси:',
 'changeemail-newemail' => 'Электрон почтаны джангы адреси:',
 'changeemail-none' => '(джокъ)',
+'changeemail-password' => '«{{SITENAME}}» проектде паролугъуз:',
 'changeemail-submit' => 'Адресни тюрлендир',
 'changeemail-cancel' => 'Ызына алыу',
 
@@ -635,7 +722,7 @@ $2',
 'summary' => 'Тюрлениулени къысха ачыкълау:',
 'subject' => 'Тема/башлыкъ:',
 'minoredit' => 'Бу гитче тюрлениудю',
-'watchthis' => 'Бу бетни кёзде тургъан тизмеге къош',
+'watchthis' => 'Бу бетни кёздеги тизмеме къош',
 'savearticle' => 'Бетни сакъла',
 'preview' => 'Ал къарау',
 'showpreview' => 'Ал къарау',
@@ -762,9 +849,7 @@ $2',
 Сиз дагъыда этген къошакъларыгъызны автору болгъаныгъызны неда информацияны чыкъгъан джери эркин джаяргъа эм тюрлендирирге къойгъанын аны бегитесиз (къарагъыз: $1).
 '''ЭРКИНЛИКСИЗ АВТОР ХАКЪ БЛА ДЖАКЪЛАННГАН МАТЕРИАЛЛА САЛМАГЪЫЗ БЫЛАЙГЪА!'''",
 'longpageerror' => "'''ХАЛАТ: сиз сакълатхан текстни  {{PLURAL:$1|бир килобайт|$1 килобайт}} ёлчеми барды, ол {{PLURAL:$2|бир килобайт|$2 килобайт}} чекден кёбдю. Бет сакъланныкъ тюлдю.'''",
-'readonlywarning' => "'''Эс бёлюгюз: Билгилени базасы бусагъатда киритленибди. Ол себебден тюрлениулеригиз къошулаллыкъ тюлдю. Джазгъанларыгъызны башха бир файлда сакълаб, кечирек къошаргъа боллукъсуз'''
-
-Киритлеген администратор бу билдириуню къойгъанды: $1",
+'readonlywarning' => "'''Эсгертиу. Кереклилерин тындырыу ишле себебли, билгилени базасы бусагъатда киритленибди. Ол себебден тюрлениулеригизни бусагъатда сакълаталлыкъ тюлсюз.''' Джазгъанларыгъызны башха бир текст файлда сакълаб, кечирек къошаргъа боллукъсуз. Киритлеген администратор бу билдириуню къойгъанды: $1",
 'protectedpagewarning' => "'''Эсгертиу: бу бет тюрлениуледен джакъланыбды, къуру администарторла тюрлендирелликдиле'''
 Тюбюнде, билги ючюн  журналдагъы ахыр джазыу берилгенди:",
 'semiprotectedpagewarning' => "'''Эсгертиу:''' бу бетни джангыз регистрация этген къошулуучула тюрлендирелликдиле.
@@ -800,12 +885,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' => '[[$2]] бетни ичинде "$1" контент джарамайды',
+'editwarning-warning' => 'Башха бетге кёчсегиз, этген тюрлениулеригиз тас болургъа боллукъдула.
+Системада регистрацияны ётген эсегиз, бу билдириуню джарашдырыуларыгъызны «Тюрлендириу» деген бёлюмюнде джукълатыргъа боллукъсуз.',
 
 # Content models
 'content-model-wikitext' => 'вики-текст',
@@ -1047,7 +1135,6 @@ $1",
 'searchmenu-legend' => 'Излеуню джарашдырыулары',
 'searchmenu-exists' => "'''Бу викиде «[[:$1]]» бет барды'''",
 'searchmenu-new' => "'''Бу вики-проектде «[[:$1]]» бетни къура!'''",
-'searchhelp-url' => 'Help:Ичиндегиле',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Бу префикс бла бетни кёргюз]]',
 'searchprofile-articles' => 'Баш бетле',
 'searchprofile-project' => 'Болушлукъ эм проект бетле',
@@ -1069,7 +1156,7 @@ $1",
 'search-interwiki-default' => '$1 эсеблери:',
 'search-interwiki-more' => '(дагъыда)',
 'search-relatedarticle' => 'Байламлы',
-'mwsuggest-disable' => 'AJAX юретиулени джукълатыгъыз',
+'mwsuggest-disable' => 'Излеуде юретиулени джукълат',
 'searcheverything-enable' => 'Атланы бютеу аламларында изле',
 'searchrelated' => 'бейламлы',
 'searchall' => 'бютеу',
@@ -1088,15 +1175,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' => 'Джарашдырыула',
@@ -1119,8 +1198,8 @@ $1",
 'prefs-watchlist-days-max' => 'Максимум $1 {{PLURAL:$1|кюн|кюн}}',
 'prefs-watchlist-edits' => 'Кёзде тургъан тизмени кенглешдирилген вариантында кёргюзюллюк тюрлениулени саны:',
 'prefs-watchlist-edits-max' => 'Максимум саны:1000',
-'prefs-watchlist-token' => 'Ð\9aÑ\91зде Ñ\82Ñ\8bргъан тизмени токени:',
-'prefs-misc' => 'Башха джарашдыдырыула',
+'prefs-watchlist-token' => 'Ð\9aÑ\91зде Ñ\82Ñ\83ргъан тизмени токени:',
+'prefs-misc' => 'Башха джарашдырыула',
 'prefs-resetpass' => 'Паролну тюрлендир',
 'prefs-changeemail' => 'Электрон почтаны адресин ауушдур',
 'prefs-setemail' => 'Лл. почтаны адресин айырыу',
@@ -1176,9 +1255,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',
@@ -1245,6 +1324,7 @@ $1 {{PLURAL:$1|символдан|символладан}} кеб болургъ
 'userrights-changeable-col' => 'Сиз тюрлендиреллик къауумла',
 'userrights-unchangeable-col' => 'Сиз тюрлендирелмезлик къауумла',
 'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => 'Къошулуучу хакъланы конфликти! Тюрлендириуню джангыдан сакълатыб кёрюгюз.',
 
 # Groups
 'group' => 'Группа:',
@@ -1525,6 +1605,8 @@ $1 {{PLURAL:$1|символдан|символладан}} кеб болургъ
 file_uploads джарашдырыулагъа бир къарагъыз.',
 'uploadscripted' => 'Бу файл, браузер бла халатлы таныргъа боллукъ, HTML-код неда скрипт джюрютеди.',
 'uploadvirus' => 'Файл вируслуду! $1 къара.',
+'uploadjava' => 'Файл, Java .class файлы болгъан ZIP-архивди.
+Къоркъуусузлукъ бла байламлы, Java-файлла джюклеген джарамайды.',
 'upload-source' => 'Къайнакъ файл',
 'sourcefilename' => 'Къайнакъ аты файлны:',
 'sourceurl' => 'Къайнакъны URL-адреси:',
@@ -1573,9 +1655,20 @@ URL-адрес тюз болгъанын осмакълагъыз эмда дж
 'upload-http-error' => 'HTTP хата болду: $1',
 
 # File backend
+'backend-fail-stream' => '«$1» файл окъулмады.',
+'backend-fail-backup' => '«$1» файлны резерв копиясын этерге болмайды.',
+'backend-fail-notexists' => '$1 файл джокъду.',
 'backend-fail-delete' => '«$1» файл кетерилмеди.',
+'backend-fail-alreadyexists' => '«$1» файл алгъадан барды.',
 'backend-fail-store' => '$1 файл $2 ичинде сакъланылынмады.',
+'backend-fail-copy' => '«$2» файл «$1» файлгъа копия этилмеди.',
+'backend-fail-move' => '«$1» файлны «$2» файлгъа кёчюрюлмеди.',
+'backend-fail-opentemp' => 'Болджаллы файлны ачалмайды.',
+'backend-fail-writetemp' => 'Болджаллы файлгъа джазалмады.',
+'backend-fail-closetemp' => 'Болджаллы файлны джабалмайды.',
 'backend-fail-read' => '«$1» файлны окъуялмады.',
+'backend-fail-create' => '«$1» файлны джазалмады.',
+'backend-fail-maxsize' => 'Ёлчеми {{PLURAL:$2|бир байт|$2 байт}}дан кёб болгъаны себебли «$1» файл джазылмады.',
 
 # Special:UploadStash
 'uploadstash' => 'Джашыртын джюклеу',
@@ -1609,7 +1702,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 +1853,8 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 Аны орнуна ала белгили бир статьягъа джибериу этерге керек болурла.<br />
 [[MediaWiki:Disambiguationspage]] бетде аты салыннган шаблон бар эсе, ол бет кёб магъаналы бетге саналады.",
 
+'pageswithprop-submit' => 'Таб',
+
 'doubleredirects' => 'Джибериу болгъан джибериуле',
 'doubleredirectstext' => 'Бу бетде башхы джибериулеге этилген джибериулени тизмеси барды.
 Хар тизгин биринчи неда экинчи джибериуню эмда асламысында бетни аты джазылгъан, биринчи джибериу кёргюзген, экинчи джибериуню нюзюр бети джазылады.
@@ -1914,6 +2008,15 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'listusers-noresult' => 'Къошулуучула табылмадыла.',
 'listusers-blocked' => '(блокга салыныбды)',
 
+# Special:ActiveUsers
+'activeusers' => 'Актив къошулуучуланы тизмеси',
+'activeusers-intro' => 'Бу, ахыр $1 {{PLURAL:$1|кюнде|кюнде}} къаллайда болсун ишлетме кёргюзген къошлуучуланы тизмесиди.',
+'activeusers-count' => 'Ахыр {{PLURAL:$3|кюнде|$3 кюнде}} $1 {{PLURAL:$1|тюрлендириу|тюрлендириу}}',
+'activeusers-from' => 'Бу бла башланнган къошлуучуланы кёргюз:',
+'activeusers-hidebots' => 'Ботланы джашыр',
+'activeusers-hidesysops' => 'Администраторланы джашыр',
+'activeusers-noresult' => 'Къошлуучу табылмады.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Къошулуучуланы къауумуну хакълары',
 'listgrouprights-summary' => 'Тюбюндеги бу викиде танылгъан къошулуучу къауумланы эмда аланы хакъларыны тизмеси.
@@ -1976,7 +2079,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'mywatchlist' => 'Кёздеги тизме',
 'watchlistfor2' => '$1 ючюн $2',
 'nowatchlist' => 'Кёзюгюзде тургъан тизмегиз бошду.',
-'watchlistanontext' => 'Кёзюгюзде тургъан тизмегизни статьяланы кёрюр неда тюрлендирир ючюн $1.',
+'watchlistanontext' => 'Кёзюгюзде тургъан тизмегизни статьяларын кёрюр неда тюрлендирир ючюн бери ётюгюз: $1.',
 'watchnologin' => 'Системагъа кирирге керекди.',
 'watchnologintext' => 'Кёзюгюзде тургъан тизмегизни тюрлендирир ючюн [[Special:UserLogin|системагъа кирирге керексиз]].',
 'addwatch' => 'Кёзде тургъан тизмеге къош',
@@ -1992,8 +2095,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|бет|бет}} барды.',
@@ -2045,7 +2148,7 @@ $UNWATCHURL
 'deletepage' => 'Бетни кетер',
 'confirm' => 'Къабыл эт',
 'excontent' => 'ичиндеги: $1',
-'excontentauthor' => "ичиндеги: '$1' ('[[Special:Contributions/$2|$2]] юлюш къошхан джангыз къошулуучу болгъанды)",
+'excontentauthor' => 'ичиндеги: «$1» (юлюш къошхан джангыз къошулуучу [[Special:Contributions/$2|$2]] эди)',
 'exbeforeblank' => "Кетериуню алындагъы ичи: '$1'",
 'exblank' => 'бет бош эди',
 'delete-confirm' => '«$1» — кетериу',
@@ -2290,6 +2393,7 @@ $1',
 'ipbhidename' => 'Къошулуучуну атын тюрлендириуле бла спиоскладан джашыр',
 'ipbwatchuser' => 'Бу къошулуучуну, къошулуучу эмда сюзюу бетлерин кёзде тургъан тизмеге къош',
 'ipb-change-block' => 'Бу джарашдырыула бла къошулуучуну джангыдан тый',
+'ipb-confirm' => 'Блок салыуну бегит',
 'badipaddress' => 'Терс IP-адрес',
 'blockipsuccesssub' => 'Тыйыу джетишимли болду',
 'blockipsuccesstext' => '[[Special:Contributions/$1|«$1»]] блокланды.<br />
@@ -2335,12 +2439,12 @@ $1',
 Тыйылыуну журналы тюбюрек кёргюзюлгенди:',
 'blocklog-showsuppresslog' => 'Бу къошулуучу мындан алгъа тыйылгъанды эмда джашырылгъанды.
 Джашырыу журналны кёрюр ючюн тюбюрек къарагъыз:',
-'blocklogentry' => '[[$1]] Ð±Ð»Ð¾Ðº Ñ\8dÑ\82илингенди $2 Ð·Ð°Ð¼Ð°Ð½Ð½Ð³Ð° $3',
+'blocklogentry' => '[[$1]] ÐºÑ\8aоÑ\88Ñ\83лÑ\83Ñ\83Ñ\87Ñ\83гÑ\8aа $2 Ð±Ð¾Ð»Ð´Ð¶Ð°Ð»Ð³Ñ\8aа Ñ\82Ñ\8bйгÑ\8aÑ\8bÑ\87 Ñ\81алдÑ\8b $3',
 'reblock-logentry' => '[[$1]] ючюн бошалыу заманын $2 $3 этиб тыйыу джарашдырыуларын тюрлендирди',
 'blocklogtext' => 'Къошулуучуланы тыйылыу бла тыйылыудан чыгъарыуну журналы.
 Автомат халда тыйылгъан IP-адресле былайда кёргюзюлмейдиле.
 Банла бла блокланы кёрюр ючюн [[Special:BlockList|блок тизмесине]] къарагъыз.',
-'unblocklogentry' => '$1 ÐºÑ\8aоÑ\88Ñ\83лÑ\83Ñ\83Ñ\87Ñ\83дан Ð±Ð»Ð¾Ðº Ð°Ð»Ñ\8bндÑ\8b',
+'unblocklogentry' => '$1 ÐºÑ\8aоÑ\88Ñ\83лÑ\83Ñ\83Ñ\87Ñ\83нÑ\83 Ñ\82Ñ\8bйгÑ\8aÑ\8bÑ\87Ñ\8bн ÐºÐµÑ\82еÑ\80ди',
 'block-log-flags-anononly' => 'джангыз аноним къошулуучула',
 'block-log-flags-nocreate' => 'Тергеу джазыуланы (аккаунтланы) регистрациялары тыйылыбды',
 'block-log-flags-noautoblock' => 'автоблок джукъланыбды',
@@ -2705,13 +2809,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' => 'Вектор',
 
@@ -2784,7 +2883,24 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 минут|$1 минут}}',
 'hours' => '{{PLURAL:$1|$1 сагъат|$1 сагъат}}',
 'days' => '{{PLURAL:$1|$1 кюн|$1 кюн}}',
+'weeks' => '{{PLURAL:$1|ыйыкъ}}',
+'months' => '{{PLURAL:$1|ай}}',
+'years' => '{{PLURAL:$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' => 'Формат былай болургъа керекди:
@@ -2813,7 +2929,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Кенглик',
 'exif-imagelength' => 'Мийиклик',
 'exif-bitspersample' => 'Бояуну теренлиги',
@@ -2929,6 +3045,8 @@ $1',
 'exif-gpsdifferential' => 'GPS дифференциялы тюзетиу',
 'exif-jpegfilecomment' => 'JPEG-файлны белгиси',
 'exif-keywords' => 'Ачхыч сёзле',
+'exif-worldregioncreated' => 'Бу сурат этилген дуния регион',
+'exif-countrycreated' => 'Бу сурат этилген кърал',
 'exif-countrydest' => 'Суратланнган кърал',
 'exif-provinceorstatedest' => 'Суратланнган провинция, территория неда штат',
 'exif-citydest' => 'Суратланнган шахар',
@@ -2973,7 +3091,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, факс кодлау',
@@ -3433,13 +3551,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' => 'Хэш-кодлары бла дубликат файланны изле.',
@@ -3526,13 +3637,17 @@ 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-delete' => '$3 бетни $1 {{GENDER:$2|кетерди}}',
+'logentry-delete-restore' => '$3 бетни $1 {{GENDER:$2|ызына салды}}',
 'revdelete-content-hid' => 'ичиндегиси джашырылыбды',
 'revdelete-summary-hid' => 'тюрлендириуню ачыкълауу джашырылыбды',
 'revdelete-uname-hid' => 'къошулуучуну аты джашырылыбды',
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 50bfb7e..7023209 100644 (file)
@@ -8,6 +8,9 @@
  * @file
  *
  * @author Caesius noh en Idee vum Manes
+ * @author Geitost
+ * @author Matma Rex
+ * @author Nemo bis
  * @author Purodha
  * @author Reedy
  * @author Rentenirer
@@ -230,7 +233,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',
@@ -252,7 +255,7 @@ $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.',
 
@@ -318,6 +321,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}}',
@@ -380,7 +395,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 +422,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,21 +458,20 @@ $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',
 'helppage' => 'Help:Hölp',
 '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 +503,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 +528,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 +654,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 +678,38 @@ Wann De wells, künnts De Ding [[Special:Preferences|Enschtällonge aanpaße]].'
 'logout' => 'Ußlogge',
 'userlogout' => 'Ußlogge',
 'notloggedin' => 'Nit enjelogg',
-'nologin' => "Wann De Dich noch nit aanjemeldt häs, dann dun Dich '''$1'''.",
+'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 enem neu ußjedachte Passwood op Zick',
+'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 +752,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,7 +774,7 @@ 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.',
+'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>
@@ -743,7 +786,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.',
@@ -785,17 +828,17 @@ 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 e neu Paßwoot faßzelääje.',
 '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?',
@@ -830,7 +873,7 @@ moß De jäz jaa nix donn, un kanns Ding Paßwoot wigger bruche.',
 Eijmohl-Paßwoot: $2',
 '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 hät nit jeflup: $1',
+'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',
@@ -887,9 +930,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:
@@ -910,10 +953,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
@@ -965,8 +1008,7 @@ Mieh doh drövver fengk mer em [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAG
 'userpage-userdoesnotexist-view' => 'Ene Metmaacher mem Naame „$1“ hät sesch noch nih aanjemeldt',
 'blocked-notice-logextract' => 'Dä Metmaacher es jraad jesperrt.
 Heh kütt der neuste Enndraach drövver uss_em Logbooch övver et Metmaacher_Sperre:',
-'clearyourcache' => '<br style="clear: both" />
-\'\'\'Opjepass:\'\'\'
+'clearyourcache' => '\'\'\'Opjepass:\'\'\'
 Noh em Speichere künnd et sin, datt De Dingem Brauser singe Cache Speicher
 övverlisste muss, ih datt De de Änderunge och ze sinn kreß.
 * Beim \'\'\'<i lang="en">Mozilla</i>\'\'\' un \'\'\'<i lang="en">Firefox</i>\'\'\' un \'\'\'<i lang="en">Safari</i>\'\'\', dröck dä Jrußschreffknopp eronger un kleck dann op <i lang="en">Reload</i> / <i lang="de">Aktualisieren</i>, udder dröck <i lang="de">Ctrl+F5</i> / <i lang="de">Strg+F5</i>, udder dröck <i lang="en">Ctrl+R</i> / <i lang="de">Strg+R</i>, obb enem <i lang="en">Macintosh</i> dröck <i lang="de">⌘+R</i>.
@@ -1150,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,
@@ -1203,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',
@@ -1228,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ß)',
@@ -1335,7 +1377,6 @@ Mieh doh drövver fengk mer em [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAG
 'searchmenu-legend' => 'Enschtällonge för et Söhke',
 'searchmenu-exists' => "*Sigg '''[[$1]]'''",
 'searchmenu-new' => "'''Donn de Sigg „[[:$1|$1]]“ hee em Wiki aanlääje'''",
-'searchhelp-url' => 'Help:Hölp',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Zeich all Sigge, di met däm Tex aanfange]]',
 'searchprofile-articles' => 'Sigge vum Enhalt',
 'searchprofile-project' => 'Hülp- ov Projäk-Sigge',
@@ -1361,8 +1402,8 @@ Mieh doh drövver fengk mer em [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAG
 '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.
@@ -1379,15 +1420,15 @@ 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.',
+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
@@ -1443,7 +1484,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',
@@ -1510,7 +1551,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',
@@ -1531,6 +1572,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:',
@@ -1624,7 +1666,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',
@@ -1685,7 +1727,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',
@@ -1800,7 +1842,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
@@ -1989,18 +2031,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',
@@ -2075,7 +2117,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>
@@ -2105,12 +2147,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' => '
@@ -2214,7 +2256,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 +2307,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',
 
@@ -2324,6 +2366,15 @@ eins vun all däm op eimol.',
 'listusers-noresult' => 'Keine Metmaacher jefonge.',
 'listusers-blocked' => '(jespert)',
 
+# 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 Ä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',
+'activeusers-noresult' => 'Kein Metmaacher jefonge.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Metmaacher-Jruppe-Rääschte',
 'listgrouprights-summary' => 'Hee kütt de Liss met dä Medmaacher-Jruppe, di dat Wiki hee kennt, un denne ier Rääschte.
@@ -2408,8 +2459,8 @@ Wann di Sigg udder ier Klaafsigg verändert weed, kütt dat af jäz heh en di Op
 '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}}.',
@@ -2904,7 +2955,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',
@@ -2952,14 +3003,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' => '----
@@ -2996,6 +3047,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.',
@@ -3018,7 +3071,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 …',
@@ -3112,7 +3165,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',
@@ -3123,7 +3176,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',
@@ -3141,7 +3194,7 @@ 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',
 
@@ -3152,7 +3205,6 @@ Esu kam_mer noch en Aanmerkung en „{{int:summary}}“ maache.',
 '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 */',
@@ -3182,7 +3234,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
@@ -3283,6 +3335,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>',
@@ -3316,18 +3369,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.
@@ -3354,7 +3423,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',
@@ -3533,7 +3602,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',
@@ -3762,7 +3831,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',
@@ -3908,10 +3977,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',
@@ -3949,13 +4023,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:',
@@ -3992,7 +4066,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',
@@ -4008,7 +4082,7 @@ 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-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ää',
@@ -4020,17 +4094,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',
@@ -4059,7 +4138,7 @@ Die Datei weed jlich aanjezeig, odder med däm paßende Projramm op jemaat.",
 'specialpages-group-pages' => 'Siggeliste',
 'specialpages-group-pagetools' => 'Werrekzüch för Sigge',
 'specialpages-group-wiki' => 'Werrekzüch un Daate vum Syßteem',
-'specialpages-group-redirects' => '{{int:nstab-special}}e, die ömleite, söke, un finge',
+'specialpages-group-redirects' => '{{int:nstab-special}}e, die ömleide, söhke, un fenge',
 'specialpages-group-spam' => 'Werrekzüch jäje SPÄM',
 
 # Special:BlankPage
@@ -4068,7 +4147,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.
@@ -4125,6 +4204,7 @@ die De häs han welle. Se künnt jet ällder un nit mieh aktoäll sin.',
 '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)',
@@ -4170,7 +4250,7 @@ die De häs han welle. Se künnt jet ällder un nit mieh aktoäll sin.',
 |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}} aanjelaat.',
+'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.',
index fb2c736..b6ddd9a 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',
@@ -327,7 +325,6 @@ $messages = array(
 'disclaimers' => 'Ferexetname',
 'disclaimerpage' => 'Project:Ferexetname',
 'edithelp' => 'Alîkariya guherandinê',
-'edithelppage' => 'Help:Çawa rûpelekê biguherînim',
 'helppage' => 'Help:Alîkarî',
 'mainpage' => 'Destpêk',
 'mainpage-description' => 'Destpêk',
@@ -457,10 +454,17 @@ $2',
 
 Tu dikarî {{SITENAME}} niha weke bikarhênerekî nediyarkirî bikarbînî, yan jî tu dikarî dîsa bi vî navê xwe yan navekî din wek bikarhêner <span class='plainlinks'>[$1 dîsa têkevî]</span>.
 Bila di bîra te de be ku gengaz e hin rûpel mîna ku tu hîn bi navê xwe qeyd kiriyî werin nîşandan, heta ku tu nîşanên çavlêgerandina (browser) xwe jênebî.",
+'welcomeuser' => 'Xêr hatî, $1!',
 'yourname' => 'Navê bikarhêner:',
+'userlogin-yourname' => 'Navê bikarhêner',
+'userlogin-yourname-ph' => 'Navê xwe yê bikarhêneriyê binivîse',
 'yourpassword' => 'Şîfre:',
+'userlogin-yourpassword' => 'Şîfre',
+'userlogin-yourpassword-ph' => 'Şîfreya xwe binivîse',
 'yourpasswordagain' => 'Şîfreyê dîsa binivîse:',
 'remembermypassword' => 'Şifreya min di her têketina min de bîne bîra xwe (herî zêde $1 {{PLURAL:$1|rojekê|rojan}})',
+'userlogin-remembermypassword' => 'Min têketî bihêle',
+'userlogin-signwithsecure' => 'Girêdana parastî bikarbîne',
 'yourdomainname' => 'Domaînê te',
 'externaldberror' => 'Çewtiyeke bingeha daneyan heye, an jî destûra te ya rojanekirina hesabê xweyê navxweyî nîne.',
 'login' => 'Têkeve',
@@ -471,14 +475,22 @@ Bila di bîra te de be ku gengaz e hin rûpel mîna ku tu hîn bi navê xwe qeyd
 'logout' => 'Derkeve',
 'userlogout' => 'Derkeve',
 'notloggedin' => 'Xwe tomar nekir',
+'userlogin-noaccount' => 'Hesabekî te nîne?',
+'userlogin-joinproject' => 'Tevlî {{SITENAME}} bibe',
 'nologin' => 'Hesabê te nîne? $1.',
 'nologinlink' => 'Bibe endam',
 'createaccount' => 'Hesabê nû çêke',
 'gotaccount' => 'Hesabê te heye? $1.',
 'gotaccountlink' => 'Têkeve',
 'userlogin-resetlink' => 'Te agahiyên hesabê xwe ji bîr kirin?',
-'createaccountmail' => 'bi e-name',
+'userlogin-resetpassword-link' => 'Şîfreyê ji nû ve çêke',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Alîkariya têketinê]]',
+'createacct-emailrequired' => 'E-name',
+'createaccountmail' => 'Use a temporary random password and send it to the email address specified below',
 'createaccountreason' => 'Sedem:',
+'createacct-reason' => 'Sedem',
+'createacct-submit' => 'Hesabê xwe biafirîne',
+'createacct-benefit-body2' => '{{PLURAL:$1|rûpel}}',
 'badretype' => 'Her du şîfreyên ku te nivîsîn li hevdu nayên.',
 'userexists' => 'Ev navî bikarhênerî berê tê bikaranîn. Xêra xwe navekî din bibe.',
 'loginerror' => 'Çewtiya têketinê',
@@ -708,9 +720,13 @@ Sedema jêbirina rûpelê bi referansa li jêr hatiye piştrastkirin.',
 'log-fulllog' => 'Tevahiya wê bibîne',
 'edit-conflict' => 'Têkçûna guherandinan.',
 'edit-no-change' => 'Guherandina te nehate hesibandin, ji ber ku guherandinên nivîsê tune bûn.',
+'postedit-confirmation' => 'Guhertina te hate tomarkirin.',
 'edit-already-exists' => 'Nikarî rûpeleka nuh çêke.
 Ew berê heye.',
 
+# Content models
+'content-model-css' => 'CSS',
+
 # "Undo" feature
 'undo-success' => 'Ev guherandin dikare were şûndekirin. Ji kerema xwe ferqa piştî tomarkirinê bibîne, bê ka tu dixwazî vê guhertoyê tomar bikî an na. Ger te şaşîtiyek kir, ji kerema xwe derkeve.',
 'undo-failure' => 'Ev guhertin ji ber guherandinên piştî wê re nikare were şûndekirin.',
@@ -822,7 +838,6 @@ Sedema qedexekirina $3 ev e: ''$2''",
 '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]]" çêke!',
-'searchhelp-url' => 'Help:Alîkarî',
 'searchprofile-articles' => 'Rûpelên naverokê',
 'searchprofile-project' => 'Rûpelên alîkariyê û projeyê',
 'searchprofile-images' => 'Multîmedya',
@@ -858,9 +873,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',
@@ -887,6 +899,7 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'prefs-rendering' => 'Rû',
 'saveprefs' => 'Tercîhan tomar bike',
 'resetprefs' => 'Guhertinên netomarkirî şûnde vegerîne',
+'restoreprefs' => 'Hemû eyarên berê ji nû ve ava bike',
 'prefs-editing' => 'Guherandin',
 'rows' => 'Rêz',
 'columns' => 'Stûn:',
@@ -915,7 +928,7 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'prefs-files' => 'Dosya',
 'prefs-emailconfirm-label' => 'Piştrastkirina E-nameyê:',
 'youremail' => 'E-nameya te:',
-'username' => 'Navê bikarhêner:',
+'username' => '{{GENDER:$1|Navê bikarhêner}}:',
 'uid' => 'Nasnameya bikarhêner:',
 'prefs-memberingroups' => 'Endamê/a {{PLURAL:$1|komê|koman}}:',
 'prefs-registration' => 'Dema xweqeydkirinê:',
@@ -926,13 +939,15 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'badsig' => 'Îmzeya ne derbasdar! Li HTML binêre ka sedema şaşbûnê çiye.',
 'badsiglength' => 'Navê te zêde dirêj e; pêwîst e di bin {{PLURAL:$1|nîşanekê|nîşanan}} de be.',
 'yourgender' => 'Zayend:',
+'gender-unknown' => 'Veşartî',
 'gender-male' => 'Nêr',
 'gender-female' => 'Mê',
 'email' => 'E-name',
 'prefs-help-realname' => 'Navê rastî ne pêwîst e. Heke tu navê xwe binivisî, ewê ji bo karê te were bikaranîn.',
-'prefs-help-email' => 'Adrêsa te yê e-nameyan ne gereke were nivîsandin, lê ew qebûldike, ku bikarhênerên din vê naskirinê te kanibin e-nameyan ji te ra bişînin.',
+'prefs-help-email' => 'Email address is optional, but is needed for password resets, should you forget your password.',
 'prefs-help-email-required' => 'Navnîşana e-nameyê hewce ye.',
 'prefs-info' => 'Agahiyên sereke',
+'prefs-i18n' => 'Navneteweyîkirin',
 'prefs-signature' => 'Îmze',
 'prefs-dateformat' => 'Formata dîrokê',
 'prefs-advancedediting' => 'Vebijarkên berfireh',
@@ -996,18 +1011,20 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'right-minoredit' => 'Guhertina biçûk e',
 'right-move' => 'Rûpelan bigerîne',
 'right-upload' => 'Dosyeyan lê bar bike',
+'right-autoconfirmed' => 'Rûpelên nîv-parastî biguherîne',
 'right-delete' => 'Rûpelan jê bibe',
 'right-browsearchive' => 'Li rûpelên jêbirî bigerre',
 'right-undelete' => 'Jêbirinê betal bike',
 'right-import' => 'Rûpelan ji wikiyên din împort bike',
 'right-userrights' => 'Hemû mafên bikarhêner biguherîne',
+'right-userrights-interwiki' => 'Mafên bikarhênerên li ser wîkiyên din biguherîne',
 '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"
@@ -1027,6 +1044,7 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'action-browsearchive' => 'li rûpelên jêbirî bigere',
 'action-undelete' => 'vê rûpelê dîsa çêke',
 'action-userrights' => 'hemû mafên bikarhêneran biguherîne',
+'action-userrights-interwiki' => 'mafê bikarhênerên li ser wîkiyên din biguherîne',
 'action-sendemail' => 'e-nameyan bişîne',
 
 # Recent changes
@@ -1082,7 +1100,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:',
@@ -1172,7 +1190,7 @@ Xêra xwe navekî din bibîne.',
 'filehist-filesize' => 'Mezinahiya pelê',
 'filehist-comment' => 'Şîrove',
 'filehist-missing' => 'Pel nîne',
-'imagelinks' => 'Girêdanên vî wêneyî',
+'imagelinks' => 'File usage',
 'linkstoimage' => 'Di van rûpelan de lînkek ji vî wêneyî re heye:',
 'nolinkstoimage' => 'Rûpelekî ku ji vî wêneyî re girêdankê çêdike nîne.',
 'linkstoimage-redirect' => '$1 (beralîkirina pelê) $2',
@@ -1262,7 +1280,7 @@ Agahdariya li ser [$2 rûpela danasîna pelê] li jêr tê nîşandan.',
 'nrevisions' => '$1 {{PLURAL:$1|guherandin|guherandin}}',
 'nviews' => '$1 {{PLURAL:$1|dîtin|dîtin}}',
 'lonelypages' => 'Rûpelên sêwî',
-'uncategorizedpages' => 'Rûpelên bê kategorî',
+'uncategorizedpages' => 'Rûpelên bêkategorî',
 'uncategorizedcategories' => 'Kategoriyên bê kategorî',
 'uncategorizedimages' => 'Wêneyên bê kategorî',
 'uncategorizedtemplates' => 'Şablonên bê kategorî',
@@ -1351,6 +1369,12 @@ Li [[Special:WantedCategories|kategoriyên xwestî]] binêre.',
 'listusers-noresult' => 'Bikarhêner nehate dîtin.',
 'listusers-blocked' => '(hate astengkirin)',
 
+# Special:ActiveUsers
+'activeusers' => 'Lîsteya bikarhênerên çalak',
+'activeusers-hidebots' => "Bot'an veşêre",
+'activeusers-hidesysops' => 'Rêveberan veşêre',
+'activeusers-noresult' => 'Tu bikarhêner nehate dîtin.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Mafên koma bikarhêner',
 'listgrouprights-group' => 'Kom',
@@ -1404,8 +1428,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',
@@ -1456,7 +1480,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ê',
@@ -1472,7 +1496,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.',
@@ -1574,7 +1598,7 @@ Ji bo jêbirinan û çêkirinên nû, ji kerema xwe li [[{{ns:special}}:Log/dele
 'sp-contributions-uploads' => 'yên barkirî',
 'sp-contributions-logs' => 'têketin',
 'sp-contributions-talk' => 'gotûbêj',
-'sp-contributions-userrights' => 'Ã\8edarekirina mafên bikarhêneran',
+'sp-contributions-userrights' => 'îdarekirina mafên bikarhêneran',
 'sp-contributions-search' => 'Li beşdariyan bigere',
 'sp-contributions-username' => "Adresa IP'yê yan navê bikarhêner:",
 'sp-contributions-submit' => 'Lêgerîn',
@@ -1735,7 +1759,7 @@ 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',
@@ -1747,6 +1771,7 @@ Rûpela "[[:$1]]" berê heye. Tu rast dixazê wê jêbibê ji bo navguherandinê
 'delete_and_move_confirm' => 'Erê, rûpelê jê bibe',
 'delete_and_move_reason' => 'Jêbir ji bo navguherandinê',
 'immobile-source-page' => 'Navê vê rûpelê nikare were guherandin.',
+'move-leave-redirect' => 'Beralîkirinekê bihêle',
 
 # Export
 'export' => 'Rûpelan eksport bike',
@@ -1862,8 +1887,10 @@ Ji ber ku girêdaneke derve di wê rûpelê de heye ev pirsgirêk pêk hat.',
 
 # Info page
 'pageinfo-header-edits' => 'Guherandin',
+'pageinfo-header-restrictions' => 'Parastina rûpelê',
 'pageinfo-views' => 'Hejmara dîtinê',
 'pageinfo-watchers' => 'Hejmara kesên dişopînin',
+'pageinfo-subpages-name' => 'Binrûpelên vê rûpelê',
 'pageinfo-edits' => 'Hejmara guherandinan',
 'pageinfo-toolboxlink' => 'Agahiya rûpelê',
 'pageinfo-redirectsto-info' => 'agahî',
@@ -1924,7 +1951,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",
@@ -1945,6 +1972,7 @@ Ji ber ku girêdaneke derve di wê rûpelê de heye ev pirsgirêk pêk hat.',
 'exif-languagecode' => 'Ziman',
 'exif-iimcategory' => 'Kategorî',
 'exif-label' => 'Etîket',
+'exif-copyrighted' => 'Rewşa telîfê',
 'exif-disclaimer' => 'Ferexetname',
 
 'exif-unknowndate' => 'Dîroka nayê zanîn',
@@ -2038,6 +2066,7 @@ Ji kerema xwe zanibe ku tu bi rastî dixwazî vê rûpelê dîsa çêkî.",
 
 # action=watch/unwatch
 'confirm-watch-button' => 'Temam',
+'confirm-unwatch-button' => 'Baş e',
 
 # Multipage image navigation
 'imgmultipageprev' => '← rûpela berî vê',
@@ -2092,10 +2121,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',
@@ -2156,6 +2181,7 @@ Ji kerema xwe zanibe ku tu bi rastî dixwazî vê rûpelê dîsa çêkî.",
 'feedback-subject' => 'Mijar:',
 'feedback-message' => 'Peyam:',
 'feedback-cancel' => 'Betal bike',
+'feedback-close' => 'Çêbû',
 
 # Search suggestions
 'searchsuggest-search' => 'Lêgerîn',
index 245c003..9847bcd 100644 (file)
@@ -20,7 +20,7 @@
 
 $namespaceNames = array(
        NS_MEDIA            => 'Media',
-       NS_SPECIAL          => 'Arbednek',
+       NS_SPECIAL          => 'Arbennek',
        NS_TALK             => 'Keskows',
        NS_USER             => 'Devnydhyer',
        NS_USER_TALK        => 'Keskows_Devnydhyer',
@@ -38,7 +38,7 @@ $namespaceNames = array(
 );
 
 $namespaceAliases = array(
-       'Arbennek'           => NS_SPECIAL,
+       'Arbednek'           => NS_SPECIAL,
        'Cows'               => NS_TALK,
        'Kescows'            => NS_TALK,
        'Cows_Devnydhyer'    => NS_USER_TALK,
@@ -209,23 +209,37 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Islinenna kevrennow:',
-'tog-hideminor' => 'Cudha chanjyow bian yn chanjyow a-dhiwedhes',
-'tog-showtoolbar' => 'Disqwedhes an toulvar chanjya (res yw JavaScript)',
-'tog-rememberpassword' => "Perthy cov a'm omgelmy war'n beurel-ma (rag $1 {{PLURAL:$1|dedh}} dhe'n moyha)",
+'tog-hideminor' => 'Kudha chanjyow byhan yn chanjyow a-dhiwedhes',
+'tog-hidepatrolled' => 'Kudha chanjyow patrolys yn chanjyow a-dhiwedhes',
+'tog-newpageshidepatrolled' => 'Kudha folennow patrolys dhyworth rol an folennow nowyth',
+'tog-extendwatchlist' => 'Efani an rol golya dhe dhiskwedhes pub chanj, a-dar an moyha a-dhiwedhes hepken',
+'tog-usenewrc' => "Bagasa chanjyow herwydh an folen yn chanjyow a-dhiwedhes hag y'n rol golya (res yw JavaScript)",
+'tog-numberheadings' => 'Awto-nivera pennlinennow',
+'tog-showtoolbar' => 'Diskwedhes an toulvar chanjya (res yw JavaScript)',
+'tog-editondblclick' => 'Chanjya folennow ow tobyl-glyckya (res yw JavaScript)',
+'tog-editsection' => 'Galosegi chanjya trehow der an kevrennow [chanjya]',
+'tog-editsectiononrightclick' => 'Galosegi chanjya trehow dre dhyhow-glyckya war ditlys an trehow (res yw JavaScript)',
+'tog-rememberpassword' => "Perthi kov a'm omgelmi war an beurel-ma (rag $1 {{PLURAL:$1|dydh}} dhe'n moyha)",
 'tog-watchcreations' => "Keworra folennow gwruthys genev ha restrennow ughkergys genev dhe'm rol golyas",
 'tog-watchdefault' => "Keworra folennow ha restrennow chanjys genev dhe'm rol golyas",
 'tog-watchmoves' => "Keworra folennow ha restrennow gwayys genev dhe'm rol golyas",
 'tog-watchdeletion' => "Keworra folennow ha restrennow dileys genev dhe'm rol golyas",
-'tog-minordefault' => 'Merkya pub chanj avel bian dre dhefowt',
-'tog-showjumplinks' => 'Galosegy kevrennow hedhadowder "lamma dhe"',
-'tog-watchlisthideown' => "Cudha ow chanjyow vy y'n rol golyas",
-'tog-watchlisthidebots' => "Cudha chanjyow gans bottow y'n rol golyas",
-'tog-watchlisthideminor' => "Cudha chanjyow bian y'n rol golyas",
-'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',
-
-'underline-always' => 'Puppres',
+'tog-minordefault' => 'Merkya pub chanj avel byhan dre dhefowt',
+'tog-enotifwatchlistpages' => 'Danvon ebost dhymm pan vo chanjyes folen po restren eus war ow rol golya',
+'tog-enotifusertalkpages' => 'Danvon ebost dhymm pan vo chanjyes ow folen geskows',
+'tog-oldsig' => 'Sinans a-lemmyn:',
+'tog-fancysig' => 'Dyghtya an sinans avel wikitekst (heb kevren awtomatek)',
+'tog-showjumplinks' => 'Galosegi kevrennow hedhadowder "lamma dhe"',
+'tog-watchlisthideown' => "Kudha ow chanjyow y'n rol golya",
+'tog-watchlisthidebots' => "Kudha chanjyow gans bottow y'n rol golya",
+'tog-watchlisthideminor' => "Kudha chanjyow byhian y'n rol golya",
+'tog-watchlisthideliu' => "Kudha chanjyow gans devnydhyoryon omgelmys y'n rol golya",
+'tog-watchlisthideanons' => "Kudha chanjyow gans devnydhyoryon heb hanow y'n rol golya",
+'tog-ccmeonemails' => 'Danvon dhymm dasskrif a ebostow a dhanvonav dhe dhevnydhyoryon erel',
+'tog-showhiddencats' => 'Diskwedhes klassys kudhys',
+'tog-useeditwarning' => 'Gul ow gwarnya pan gyssiv folen janjya gans chanjyow nag yw gwithys',
+
+'underline-always' => 'Pub prys',
 'underline-never' => 'Jammes',
 'underline-default' => 'Defowt an beurel po an grohen',
 
@@ -236,13 +250,13 @@ $messages = array(
 'editfont-serif' => 'Font serif',
 
 # Dates
-'sunday' => "De'Sul",
-'monday' => "De'Lun",
-'tuesday' => "De'Meurth",
-'wednesday' => "De'Merher",
-'thursday' => "De'Yow",
-'friday' => "De'Gwener",
-'saturday' => "De'Sadorn",
+'sunday' => "Dy'Sul",
+'monday' => "Dy'Lun",
+'tuesday' => "Dy'Meurth",
+'wednesday' => "Dy'Merher",
+'thursday' => "Dy'Yow",
+'friday' => "Dy'Gwener",
+'saturday' => "Dy'Sadorn",
 'sun' => 'Sul',
 'mon' => 'Lun',
 'tue' => 'Meu',
@@ -251,7 +265,7 @@ $messages = array(
 'fri' => 'Gwe',
 'sat' => 'Sad',
 'january' => 'Genver',
-'february' => 'Whevrel',
+'february' => 'Hwevrel',
 'march' => 'Meurth',
 'april' => 'Ebrel',
 'may_long' => 'Me',
@@ -263,7 +277,7 @@ $messages = array(
 'november' => 'Du',
 'december' => 'Kevardhu',
 'january-gen' => 'Genver',
-'february-gen' => 'Whevrel',
+'february-gen' => 'Hwevrel',
 'march-gen' => 'Meurth',
 'april-gen' => 'Ebrel',
 'may-gen' => 'Me',
@@ -275,7 +289,7 @@ $messages = array(
 'november-gen' => 'Du',
 'december-gen' => 'Kevardhu',
 'jan' => 'Gen',
-'feb' => 'Whe',
+'feb' => 'Hwe',
 'mar' => 'Meu',
 'apr' => 'Ebr',
 'may' => 'Me',
@@ -286,36 +300,49 @@ $messages = array(
 'oct' => 'Hed',
 'nov' => 'Du',
 'dec' => 'Kev',
+'january-date' => '$1 Genver',
+'february-date' => '$1 Hwevrel',
+'march-date' => '$1 Meurth',
+'april-date' => '$1 Ebrel',
+'may-date' => '$1 Me',
+'june-date' => '$1 Metheven',
+'july-date' => '$1 Gortheren',
+'august-date' => '$1 Est',
+'september-date' => '$1 Gwynngala',
+'october-date' => '$1 Hedra',
+'november-date' => '$1 Du',
+'december-date' => '$1 Kevardhu',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|Class|Classys}}',
-'category_header' => 'Folennow y\'n class "$1"',
+'pagecategories' => '{{PLURAL:$1|Klass|Klassys}}',
+'category_header' => 'Folennow y\'n klass "$1"',
 'subcategories' => 'Isglassys',
-'category-media-header' => 'Media y\'n class "$1"',
+'category-media-header' => 'Media y\'n klass "$1"',
 'category-empty' => "''Nyns eus na folennow na media y'n class-ma.''",
-'hidden-categories' => '{{PLURAL:$1|Class cudhys|Classys cudhys}}',
-'hidden-category-category' => 'Classys cudhys',
-'category-subcat-count' => "{{PLURAL:$2|Nyns eus dhe'n class-ma marnas an isglass a sew.|Yma dhe'n class-ma an {{PLURAL:$1|isglass|$1 isglass}} a sew, dhyworth somm a $2.}}",
-'category-subcat-count-limited' => "Yma dhe'n class-ma an {{PLURAL:$1|isglass|$1 isglass}} a sew.",
-'category-article-count' => "{{PLURAL:$2|Nyns eus dhe'n class-ma marnas an folen a sew.|Yma'n {{PLURAL:$1|folen|$1 folennow}} a sew y'n class-ma, dhyworth somm a $2.}}",
-'category-article-count-limited' => "Yma'n {{PLURAL:$1|folen|$1 folen}} a sew y'n class-ma.",
-'category-file-count' => "{{PLURAL:$2|Nyns eus dhe'n class-ma an folen a sew.|Yma'n {{PLURAL:$1|folen|$1 folen}} a sew y'n class-ma, dhyworth somm a $2.}}",
-'category-file-count-limited' => "Yma'n {{PLURAL:$1|folen|$1 folen}} a sew y'n class-ma.",
+'hidden-categories' => '{{PLURAL:$1|Klass kudhys|Klassys kudhys}}',
+'hidden-category-category' => 'Klassys kudhys',
+'category-subcat-count' => "{{PLURAL:$2|Ny'n jeves an klass-ma marnas an isglass a syw.|An klass-ma a'n jeves an {{PLURAL:$1|isglass|$1 isglass}} a syw, dhyworth somm a $2.}}",
+'category-subcat-count-limited' => "An klass-ma a'n jeves an {{PLURAL:$1|isglass|$1 isglass}} a syw.",
+'category-article-count' => "{{PLURAL:$2|Ny'n jeves an klass-ma marnas an folen a syw.|Yma an {{PLURAL:$1|folen|$1 folennow}} a syw y'n klass-ma, dhyworth somm a $2.}}",
+'category-article-count-limited' => "Yma an {{PLURAL:$1|folen|$1 folen}} a syw y'n klass-ma.",
+'category-file-count' => "{{PLURAL:$2|Ny'n jeves an klass-ma marnas an restren a syw.|Yma an {{PLURAL:$1|restren|$1 restren}} a syw y'n klass-ma, dhyworth somm a $2.}}",
+'category-file-count-limited' => "Yma an {{PLURAL:$1|folen|$1 folen}} a syw y'n klass-ma.",
 'listingcontinuesabbrev' => 'pes.',
 
 'about' => 'A-dro dhe',
-'newwindow' => '(y whra egery yn fenester noweth)',
-'cancel' => 'Hedhy',
+'article' => 'Folen dhalgh',
+'newwindow' => '(ygeri yn fenester nowyth)',
+'cancel' => 'Hedhi',
 'moredotdotdot' => 'Moy...',
 'mypage' => 'Folen',
-'mytalk' => 'Kescows',
-'anontalk' => 'Kescows rag an drigva IP-ma',
-'navigation' => 'Lewyans',
+'mytalk' => 'Keskows',
+'anontalk' => 'Keskows rag an drigva IP-ma',
+'navigation' => 'Kevrennow lewya',
 'and' => '&#32;ha(g)',
 
 # Cologne Blue skin
-'qbfind' => 'Cavos',
-'qbbrowse' => 'Peury',
+'qbfind' => 'Kavos',
+'qbbrowse' => 'Peuri',
 'qbedit' => 'Chanjya',
 'qbpageoptions' => 'An folen-ma',
 'qbmyoptions' => 'Ow folennow',
@@ -331,25 +358,25 @@ $messages = array(
 'vector-action-unprotect' => 'Chanjya difresans',
 'vector-view-create' => 'Gwruthyl',
 'vector-view-edit' => 'Chanjya',
-'vector-view-history' => 'Gweles an istory',
+'vector-view-history' => 'Gweles an istori',
 'vector-view-view' => 'Redya',
 'vector-view-viewsource' => 'Gweles an bennfenten',
 'actions' => 'Gwriansow',
 'namespaces' => 'Spasys hanow',
-'variants' => 'Dyffransow',
+'variants' => 'Variennow',
 
-'navigation-heading' => 'Rol lewyans',
+'navigation-heading' => 'Rol lewya',
 'errorpagetitle' => 'Gwall',
-'returnto' => 'Dewheles dhe $1.',
+'returnto' => 'Dehweles dhe $1.',
 'tagline' => 'Dhyworth {{SITENAME}}',
 'help' => 'Gweres',
-'search' => 'Whilas',
-'searchbutton' => 'Whilas',
-'go' => 'Ke',
+'search' => 'Hwilas',
+'searchbutton' => 'Hwilas',
+'go' => 'Mos',
 'searcharticle' => 'Mos',
-'history' => 'Istory an folen',
-'history_short' => 'Istory',
-'updatedmarker' => 'nowedhys a-ban ow vysytyans diwettha',
+'history' => 'Istori an folen',
+'history_short' => 'Istori',
+'updatedmarker' => 'nowedhys a-dhia ow vysytyans diwettha',
 'printableversion' => 'Versyon pryntyadow',
 'permalink' => 'Kevren fast',
 'print' => 'Pryntya',
@@ -360,6 +387,7 @@ $messages = array(
 'create-this-page' => 'Gwruthyl an folen-ma',
 'delete' => 'Dilea',
 'deletethispage' => 'Dilea an folen-ma',
+'undeletethispage' => 'Diswul dilea an folen-ma',
 'undelete_short' => 'Disdhilea {{PLURAL:$1|unn janj|$1 chanj}}',
 'viewdeleted_short' => 'Gweles {{PLURAL:$1|unn janj diles|$1 chanj diles}}',
 'protect' => 'Difres',
@@ -367,317 +395,368 @@ $messages = array(
 'protectthispage' => 'Difres an folen-ma',
 'unprotect' => 'Chanjya difresans',
 'unprotectthispage' => 'Chanjya difresans an folen-ma',
-'newpage' => 'Folen noweth',
-'talkpage' => "Dadhelva a-dro dhe'n folen-ma",
-'talkpagelinktext' => 'Kescows',
+'newpage' => 'Folen nowyth',
+'talkpage' => "Dadhlow a'n folen-ma",
+'talkpagelinktext' => 'Keskows',
 'specialpage' => 'Folen arbennek',
 'personaltools' => 'Toulys personel',
-'postcomment' => 'Rann noweth',
+'postcomment' => 'Tregh nowyth',
 'articlepage' => 'Gweles an folen',
-'talk' => 'Kescows',
-'views' => 'Gwelow',
-'toolbox' => 'Box toulys',
-'userpage' => 'Folen devnydhyer',
-'projectpage' => 'Folen meta',
+'talk' => 'Keskows',
+'views' => 'Gwelyansow',
+'toolbox' => 'Toulgist',
+'userpage' => 'Gweles an folen dhevnydhyer',
+'projectpage' => 'Gweles folen an ragdres',
 'imagepage' => 'Gweles folen an restren',
 'mediawikipage' => 'Gweles folen an messajys',
-'templatepage' => 'Gweles folen an scantlyn',
-'viewhelppage' => 'Gweles an folen gweres',
-'categorypage' => 'Gweles folen an class',
-'viewtalkpage' => 'Gweles an kescows',
+'templatepage' => 'Gweles folen an skantlyn',
+'viewhelppage' => 'Gweles an folen weres',
+'categorypage' => 'Gweles folen an klass',
+'viewtalkpage' => 'Gweles an dadhlow',
 'otherlanguages' => 'Yn yethow erel',
-'redirectedfrom' => '(Daswedyes dhyworth $1)',
-'redirectpagesub' => 'Folen daswedyans',
-'lastmodifiedat' => 'An folen-ma a veu chanjys an $1, dhe $2.',
+'redirectedfrom' => '(Daskedyes dhyworth $1)',
+'redirectpagesub' => 'Folen dhaskedya',
+'lastmodifiedat' => 'Diwettha chanj an folen-ma o an $1, dhe $2.',
 'protectedpage' => 'Folen dhifresys',
 'jumpto' => 'Lamma dhe:',
-'jumptonavigation' => 'lewyans',
-'jumptosearch' => 'whilas',
-'view-pool-error' => 'Drog yw genen, gorgargys yw an servyers orth an termyn-ma.
+'jumptonavigation' => 'kevrennow lewya',
+'jumptosearch' => 'hwilas',
+'view-pool-error' => 'Drog yw genen, gorgergys yw an servyers orth an termyn-ma.
 Yma re a dhevnydhyoryon owth assaya gweles an folen-ma.
-Gortowgh pols kens why dhe assaya hedhes an folen-ma arta, mar pleg.
+Gortewgh pols kyns hwi dhe assaya hedhas an folen-ma arta, mar pleg.
 
 $1',
-'pool-errorunknown' => 'Gwall ancoth',
+'pool-errorunknown' => 'Gwall ankoth',
 
 # 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' => 'A-dro dhe {{SITENAME}}',
 'aboutpage' => 'Project:Kedhlow',
-'copyright' => 'Cavadow yw an dalgh yn-dann $1.',
+'copyright' => 'Kavadow yw an dalgh yn-dann $1.',
 'copyrightpage' => '{{ns:project}}:Gwirbryntyansow',
-'currentevents' => 'Darvosow a-lemmyn',
-'currentevents-url' => 'Project:Darvosow a-lemmyn',
+'currentevents' => 'Hwarvosow a-lemmyn',
+'currentevents-url' => 'Project:Hwarvosow a-lemmyn',
 'disclaimers' => 'Avisyansow',
 'disclaimerpage' => 'Project:Avisyans ollgemmyn',
 'edithelp' => 'Gweres gans chanjya',
-'edithelppage' => 'Help:Chanjya',
 'helppage' => 'Help:Gweres',
-'mainpage' => 'Folen dre',
-'mainpage-description' => 'Folen dre',
-'policy-url' => 'Project:Policy',
+'mainpage' => 'Dynnargh',
+'mainpage-description' => 'Dynnargh',
+'policy-url' => 'Project:Polici',
 'portal' => 'Porth an gemeneth',
 'portal-url' => 'Project:Porth an gemeneth',
-'privacy' => 'Policy privetter',
-'privacypage' => 'Project:Policy privetter',
+'privacy' => 'Polici privetter',
+'privacypage' => 'Project:Polici privetter',
 
-'badaccess' => 'Gwall cummyes',
+'badaccess' => 'Gwall kummyes',
 
 'ok' => 'Sur',
 'retrievedfrom' => 'Daskevys dhyworth "$1"',
-'youhavenewmessages' => 'Yma $1 genowgh ($2).',
-'newmessageslink' => 'messajys noweth',
+'youhavenewmessages' => "$1 a'gas beus ($2).",
+'newmessageslink' => 'Messajys nowyth',
 'newmessagesdifflink' => 'chanj diwettha',
-'youhavenewmessagesfromusers' => 'Yma $1 dhywgh dhyworth {{PLURAL:$3|devnydhyer aral|$3 devnydhyer}} ($2).',
-'youhavenewmessagesmanyusers' => 'Yma $1 dhywgh dhyworth lies devnydhyer ($2).',
-'newmessageslinkplural' => '{{PLURAL:$1|messach noweth}}',
-'newmessagesdifflinkplural' => '{{PLURAL:$1|chanj diwettha}}',
-'youhavenewmessagesmulti' => 'Yma messajys noweth genowgh war $1',
+'youhavenewmessagesfromusers' => "Hwi a'gas beus $1 dhyworth {{PLURAL:$3|devnydhyer aral|$3 devnydhyer}} ($2).",
+'youhavenewmessagesmanyusers' => "Hwi a'gas beus $1 dhyworth lies devnydhyer ($2).",
+'newmessageslinkplural' => '{{PLURAL:$1|messach nowyth|messajys nowyth}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|chanj|chanjyow}} diwettha',
+'youhavenewmessagesmulti' => "Messajys nowyth a'gas beus war $1",
 'editsection' => 'chanjya',
 'editold' => 'chanjya',
 'viewsourceold' => 'gweles an bennfenten',
 'editlink' => 'chanjya',
 'viewsourcelink' => 'gweles an bennfenten',
-'editsectionhint' => 'Chanjya an rann: $1',
+'editsectionhint' => 'Chanjya an tregh: $1',
 'toc' => 'Rol an folen',
-'showtoc' => 'disqwedhes',
-'hidetoc' => 'cudha',
-'collapsible-expand' => 'Efany',
-'thisisdeleted' => 'Gweles po restorya $1?',
+'showtoc' => 'diskwedhes',
+'hidetoc' => 'kudha',
+'collapsible-expand' => 'Efani',
+'thisisdeleted' => 'Gweles po daskor $1?',
 'viewdeleted' => 'Gweles $1?',
 'restorelink' => '{{PLURAL:$1|unn janj diles|$1 chanj diles}}',
 'feedlinks' => 'Feed:',
-'site-rss-feed' => '$1 RSS feed',
-'site-atom-feed' => '$1 Atom feed',
-'page-rss-feed' => '"$1" feed RSS',
-'page-atom-feed' => '"$1" feed Atom',
+'site-rss-feed' => 'Feed RSS $1',
+'site-atom-feed' => 'Feed Atom $1',
+'page-rss-feed' => 'Feed RSS "$1"',
+'page-atom-feed' => 'Feed Atom "$1"',
 'red-link-title' => '$1 (nyns eus folen henwys yndelma)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'Erthygel',
-'nstab-user' => 'Folen devnydhyer',
+'nstab-main' => 'Folen',
+'nstab-user' => 'Folen dhevnydhyer',
 'nstab-media' => 'Folen media',
 'nstab-special' => 'Folen arbennek',
 'nstab-project' => 'Folen ragdres',
 'nstab-image' => 'Restren',
 'nstab-mediawiki' => 'Messach',
-'nstab-template' => 'Scantlyn',
+'nstab-template' => 'Skantlyn',
 'nstab-help' => 'Gweres',
-'nstab-category' => 'Class',
+'nstab-category' => 'Klass',
 
 # General errors
 'error' => 'Gwall',
 'databaseerror' => 'Gwall database',
-'readonly' => 'Alwhedhys yw an database',
+'readonly' => 'Alhwedhys yw an database',
 'missingarticle-rev' => '(amendyans#: $1)',
 'missingarticle-diff' => '(Dyffrans: $1, $2)',
 'internalerror' => 'Gwall a-bervedh',
 'internalerror_info' => 'Gwall a-bervedh: $1',
-'filecopyerror' => 'Ny veu possybyl copia an restren "$1" dhe "$2".',
-'filerenameerror' => 'Ny veu possybyl dashenwel an restren "$1" dhe "$2".',
-'filedeleteerror' => 'Ny veu possybyl dilea an restren "$1".',
-'filenotfound' => 'Ny veu kevys an restren "$1".',
+'filecopyerror' => 'Ny allas kopia an restren "$1" dhe "$2".',
+'filerenameerror' => 'Ny allas dashenwel an restren "$1" dhe "$2".',
+'filedeleteerror' => 'Ny allas dilea an restren "$1".',
+'filenotfound' => 'Ny allas kavos an restren "$1".',
 'cannotdelete-title' => 'Ny yllir dilea an folen "$1"',
 'badtitle' => 'Titel drog',
 'viewsource' => 'Gweles an bennfenten',
+'viewsource-title' => 'Gweles an bennfenten rag $1',
+'protectedpagetext' => 'Difresys re beu an folen-ma rag gwitha rag chanjya po gwriansow erel.',
+'viewsourcetext' => 'Hwi a yll gweles ha kopia pennfenten an folen-ma:',
+'mycustomcssprotected' => "Ny'gas beus kummyes dhe janjya an folen CSS-ma.",
+'mycustomjsprotected' => "Ny'gas beus kummyes dhe janjya an folen JavaScript-ma.",
+'ns-specialprotected' => 'Ny yllir chanjya folennow arbennek.',
+'exception-nologin' => 'Nyns owgh omgelmys',
+'exception-nologin-text' => 'An folen-ma po an gwrians-ma a wovyn mayth omgelmowgh war an wiki-ma.',
 
 # Login and logout pages
-'logouttext' => "'''Digelmys owgh why lemmyn.'''
+'logouttext' => "'''Digelmys owgh lemmyn.'''
 
-Why a yll pesya usya {{SITENAME}} heb hanow, po why a yll <span class='plainlinks'>[$1 omgelmy arta]</span> avel an keth devnydhyer po avel devnydhyer aral.
-Notyowgh: Neb folennow a alsa bos disqwedhys kepar del owgh why omgelmys whath, erna wryllowgh why clerhe cache agas peurel.",
+Hwi a yll pesya devnydhya {{SITENAME}} yn tihanow, po hwi a yll <span class='plainlinks'>[$1 omgelmi arta]</span> avel an keth devnydhyer po avel devnydhyer aral.
+Notyewgh: Neb folennow a alsa bos diskwedhys kepar del owgh hwath omgelmys, erna glerhahowgh cache agas peurel.",
 'welcomeuser' => 'Dynnargh, $1!',
-'welcomecreation-msg' => 'Gwruthys yw agas acont.
-Na wrewgh ankevy dhe janjya agas [[Special:Preferences|dowisyansow {{SITENAME}}]].',
-'yourname' => 'Hanow usyer:',
+'welcomecreation-msg' => 'Gwruthys re beu agas akont.
+Na ankevewgh dhe janjya agas [[Special:Preferences|dewisyansow {{SITENAME}}]].',
+'yourname' => 'Hanow devnydhyer:',
+'userlogin-yourname' => 'Hanow devnydhyer',
+'userlogin-yourname-ph' => 'Entrewgh agas hanow devnydhyer',
 'yourpassword' => 'Ger tremena:',
-'yourpasswordagain' => 'Jynnscrifowgh agas ger tremena arta:',
-'remembermypassword' => "Perthy cov a'm omgelmy war'n jynn amontya-ma (rag $1 {{PLURAL:$1|dedh}} dhe'n moyha)",
-'securelogin-stick-https' => 'Gwitha junyes gans HTTPS wosa omgelmy',
+'userlogin-yourpassword' => 'Ger tremena',
+'userlogin-yourpassword-ph' => 'Entrewgh agas ger tremena',
+'createacct-yourpassword-ph' => 'Entrewgh ger tremena',
+'yourpasswordagain' => 'Jynnskrifewgh agas ger tremena arta:',
+'createacct-yourpasswordagain' => 'Afydhyewgh an ger tremena',
+'createacct-yourpasswordagain-ph' => 'Entrewgh an ger tremena arta',
+'remembermypassword' => "Perthi kov a'm omgelmi war an jynn amontya-ma (rag $1 {{PLURAL:$1|dydh}} dhe'n moyha)",
+'userlogin-remembermypassword' => "Perthi kov a'm omgelmi",
+'userlogin-signwithsecure' => 'Devnydhya junyans diogel',
+'securelogin-stick-https' => 'Gwitha junyes gans HTTPS wosa omgelmi',
 'yourdomainname' => 'Agas tiredh:',
-'login' => 'Omgelmy',
-'nav-login-createaccount' => 'Omgelmy / Formya acont noweth',
-'loginprompt' => 'Res yw dhywgh galosegy cookies rag omgelmy orth {{SITENAME}}.',
-'userlogin' => 'Omgelmy / formya acont noweth',
-'userloginnocreate' => 'Omgelmy',
-'logout' => 'Digelmy',
-'userlogout' => 'Digelmy',
+'password-change-forbidden' => 'Ny yllir chanjya geryow tremena war an wiki-ma.',
+'login' => 'Omgelmi',
+'nav-login-createaccount' => 'Omgelmi / Gwruthyl akont nowyth',
+'loginprompt' => 'Res yw dhywgh galosegi cookies rag omgelmi orth {{SITENAME}}.',
+'userlogin' => 'Omgelmi / gwruthyl akont nowyth',
+'userloginnocreate' => 'Omgelmi',
+'logout' => 'Digelmi',
+'userlogout' => 'Digelmi',
 'notloggedin' => 'Digelmys',
-'nologin' => "A nyns eus acont dhywgh? '''$1'''.",
-'nologinlink' => 'Formyowgh acont',
-'createaccount' => 'Formya acont noweth',
-'gotaccount' => "Eus acont dhis seulabres? '''$1'''.",
-'gotaccountlink' => 'Omgelmy',
-'userlogin-resetlink' => 'Eus ankevys genowgh agas manylyon omgelmy?',
-'createaccountmail' => 'der e-bost',
+'userlogin-noaccount' => "A ny'gas beus akont?",
+'userlogin-joinproject' => 'Junya {{SITENAME}}',
+'nologin' => "A ny'gas beus akont? '''$1'''.",
+'nologinlink' => 'Gwruthyl akont',
+'createaccount' => 'Gwruthyl akont nowyth',
+'gotaccount' => "Eus akont dhywgh seulabrys? '''$1'''.",
+'gotaccountlink' => 'Omgelmi',
+'userlogin-resetlink' => 'A ankevsowgh hwi agas manylyon omgelmi?',
+'userlogin-resetpassword-link' => 'Dassettya agas ger tremena',
+'helplogin-url' => 'Help:Omgelmi',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Gweres gans omgelmi]]',
+'createacct-join' => 'Entrewgh agas kedhlow a-woles.',
+'createacct-emailrequired' => 'Trigva ebost',
+'createacct-emailoptional' => 'Trigva ebost (a-dhewis)',
+'createacct-email-ph' => 'Entrewgh agas trigva ebost',
+'createaccountmail' => "Devnydhya ger tremena chonsus anbarthus hag y dhanvon dhe'n drigva ebost res a-woles",
+'createacct-realname' => 'Hanow gwir (a-dhewis)',
 'createaccountreason' => 'Acheson:',
-'badretype' => 'Ny wrug omdhesedhes an geryow tremena entrys genowgh.',
-'userexists' => "Yma'n hanow usyer entrys genowgh ow pos usys seulabres.
-Dowisowgh hanow aral mar pleg.",
-'loginerror' => 'Gwall omgelmy',
-'createaccounterror' => 'Ny veu possybyl formya an acont: $1',
-'nocookiesnew' => 'Formys yw an acont, mes nyns owgh why omgelmys.
-Yma {{SITENAME}} owth usya cookies rag omgelmy devnydhyoryon.
+'createacct-reason' => 'Acheson',
+'createacct-reason-ph' => 'Prag yth esowgh ow kwruthyl akont aral',
+'createacct-captcha' => 'Gwiryans sekerder',
+'createacct-imgcaptcha-ph' => 'Entrewgh an tekst a welowgh a-ugh',
+'createacct-submit' => 'Gwruthyl agas akont',
+'createacct-benefit-heading' => 'Gwrys yw {{SITENAME}} gans tus kepar ha hwi.',
+'createacct-benefit-body1' => '{{PLURAL:$1|janj|chanj}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|folen}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|gevriyas|kevriyas}} a-dhiwedhes',
+'badretype' => 'Ny omdhesedh an geryow tremena entrys genowgh.',
+'userexists' => 'Y tevnydhir an hanow devnydhyer entrys genowgh seulabrys.
+Dewisewgh ken hanow mar pleg.',
+'loginerror' => 'Gwall omgelmi',
+'createacct-error' => 'Gwall ow kwruthyl akont',
+'createaccounterror' => 'Ny allas gwruthyl an akont: $1',
+'nocookiesnew' => "Gwruthys veu an akont, mes nyns owgh omgelmys.
+{{SITENAME}} a dhevnydh cookies rag omgelmi devnydhyoryon.
 Dialosegys yw cookies war agas jynn amontya.
-Gwrewgh aga galosegy, hag omgelmowgh dre usya agas hanow usyer ha ger tremena noweth.',
-'nocookieslogin' => 'Yma {{SITENAME}} owth usya cookies rag omgelmi devnydhyoryon.
+Galosegewgh i, hag omgelmewgh der agas hanow devnydhyer ha'gas ger tremena nowyth.",
+'nocookieslogin' => '{{SITENAME}} a dhevnydh cookies rag omgelmi devnydhyoryon.
 Dialosegys yw cookies war agas jynn amontya.
-Gwrewgh aga galosegi hag assaya arta.',
-'noname' => 'Ny wrussowgh why ry hanow usyer da.',
-'loginsuccesstitle' => 'Omgelmy a sowenas',
-'loginsuccess' => "'''Omgelmys owgh why lemmyn orth {{SITENAME}} avel \"\$1\".'''",
-'nouserspecified' => 'Res yw dhywgh ry hanow usyer.',
-'wrongpassword' => 'Camm o an ger tremena.
-Assayowgh arta mar pleg.',
-'wrongpasswordempty' => 'Gwag o an ger-tremena res. Assayowgh arta mar pleg.',
+Galosegewgh i hag assayewgh arta.',
+'noname' => 'Ny resowgh hanow devnydhyer da.',
+'loginsuccesstitle' => 'Omgelmi a sewenis',
+'loginsuccess' => "'''Omgelmys owgh lemmyn orth {{SITENAME}} avel \"\$1\".'''",
+'nouserspecified' => 'Res yw dhywgh ri hanow devnydhyer.',
+'wrongpassword' => 'Kamm o an ger tremena.
+Assayewgh arta mar pleg.',
+'wrongpasswordempty' => 'Gwag o an ger tremena res.
+Assayewgh arta mar pleg.',
 'passwordtooshort' => "Res yw dhe eryow tremena bos {{PLURAL:$1|1 lytheren|$1 lytheren}} dhe'n lyha.",
-'password-name-match' => "Ny yll agas ger tremena bos an keth ha'gas hanow usyer.",
-'password-login-forbidden' => 'Difennys yw usya an hanow usyer-ma hag an ger tremena-ma.',
-'mailmypassword' => 'E-bostya ger tremena nowyth',
-'passwordremindertitle' => 'Ger tremena noweth rag {{SITENAME}}',
-'passwordremindertext' => 'Nebonen (why martesen, dhyworth an drigva IP $1) a wovynnas ger tremena noweth rag {{SITENAME}} ($4). Ger tremena termynyel rag an devnydhyer
-"$2" re beu gwruthys hag a veu settyes dhe "$3". Mars o henna agas bodh, y fedh res dhywgh omgelmy ha dowis ger tremena noweth lemmyn.
-Agas ger tremena termynyel a wra diwedha yn {{PLURAL:$5|unn jedh|$5 dedh}}.
-
-Mar qwrug nebonen aral govyn hemma, po yma cov dhywgh a\'gas ger tremena ha nyns yw whans dhywgh y janjya namoy, why a yll sconya aswon an messach-ma ha pesya usya agas ger tremena coth.',
-'noemail' => 'Nyns eus trigva ebost recordyes rag an devnydhyer "$1".',
-'noemailcreate' => 'Res yw dhewgh ry trigva ebost da',
-'passwordsent' => 'Ger tremena noweth re beu danvenys dhe\'n drigva ebost covscrifys rag "$1".
-Gwrewgh omgelmy arta mar pleg wosa why dh\'y receva.',
+'password-name-match' => "Ny yll agas ger tremena bos an keth ha'gas hanow devnydhyer.",
+'password-login-forbidden' => 'Difennys yw devnydhya an hanow devnydhyer-ma hag an ger tremena-ma.',
+'mailmypassword' => 'Ebostya ger tremena nowyth',
+'passwordremindertitle' => 'Ger tremena nowyth rag {{SITENAME}}',
+'passwordremindertext' => 'Nebonan (hwi martesen, dhyworth an drigva IP $1) a wovynnis ger tremena nowyth rag {{SITENAME}} ($4). Ger tremena anbarthus rag an devnydhyer
+"$2" re beu gwruthys hag a veu settyes dhe "$3". Mars o henna agas bodh, y fydh res dhywgh omgelmi ha dewis ger tremena nowyth lemmyn.
+Agas ger tremena anbarthus a dhiwedh yn {{PLURAL:$5|unn jydh|$5 dydh}}.
+
+Mar kovynnis nebonan aral hemma, po hwi a\'gas beus kov a\'gas ger tremena ha ny\'m beus hwans dh\'y janjya namoy, hwi a yll skonya aswon an messach-ma ha pesya devnydhya agas ger tremena koth.',
+'noemail' => 'Nyns eus trigva ebost rekordys rag an devnydhyer "$1".',
+'noemailcreate' => 'Res yw dhywgh ri trigva ebost da',
+'passwordsent' => 'Ger tremena nowyth re beu danvenys dhe\'n drigva ebost kovskrifys rag "$1".
+Omgelmewgh arta mar pleg wosa hwi dh\'y receva.',
 'emailauthenticated' => 'Afydhyes veu agas trigva ebost an $2 dhe $3.',
-'emailconfirmlink' => 'Afydhyowgh agas trigva ebost',
-'invalidemailaddress' => 'Ny yllir alowa an drigva ebost drefen bos furv drog dhedhy.
-Entrowgh trigva da y furv po gwakhowgh an furvlen-na.',
-'accountcreated' => 'Acont formys',
-'accountcreatedtext' => 'Formys re beu an acont rag $1.',
-'createaccount-title' => 'Formya acont war {{SITENAME}}',
-'createaccount-text' => 'Nebonan a wrug gwruthyl acont rag agas trigva ebost war {{SITENAME}} ($4) henwys "$2", "$3" y er tremena.
-Why a dalvia omgelmy ha chanjya agas ger tremena lemmyn.
-
-Why a yll sconya aswon an messach-ma, mar peu an acont-ma formyes yn gwall.',
-'usernamehasherror' => "Ny yllowgh why usya lytherennow hash y'gas ger tremena",
+'emailconfirmlink' => 'Afydhyewgh agas trigva ebost',
+'invalidemailaddress' => 'Ny yllir alowa an drigva ebost drefen bos furvyans drog dhedhi.
+Entrewgh trigva da y furvyans po gwakhewgh an furvlen-na.',
+'accountcreated' => 'Akont gwruthys',
+'accountcreatedtext' => 'Gwruthys re beu an akont rag $1.',
+'createaccount-title' => 'Gwruthyl akont rag {{SITENAME}}',
+'createaccount-text' => 'Nebonan a wrug akont rag agas trigva ebost war {{SITENAME}} ($4) henwys "$2", "$3" y er tremena.
+Y talvia dhywgh omgelmi ha chanjya agas ger tremena lemmyn.
+
+Hwi a yll skonya aswon an messach-ma mar peu an akont-ma gwruthys yn gwall.',
+'usernamehasherror' => 'Ny yllir bos lytherennow hash yn henwyn devnydhyer',
 'loginlanguagelabel' => 'Yeth: $1',
 
 # Change password dialog
-'resetpass' => 'Chanjya ger-tremena',
-'resetpass_announce' => 'Why a wrug omgelmy yn unn usya coden ebostyes termynyel.
-Rag gorfenna omgelmy, res yw dhywgh settya ger tremena noweth omma:',
-'resetpass_header' => 'Chanjya ger tremena an acont',
-'oldpassword' => 'Ger tremena coth:',
-'newpassword' => 'Ger tremena noweth:',
-'retypenew' => 'Jynnscrifowgh an ger tremena noweth arta:',
-'resetpass_submit' => 'Settya an ger tremena hag omgelmy',
-'resetpass_success' => 'Chanjyes re beu agas ger tremena yn soweny!
-Orth agas omgelmy lemmyn...',
+'resetpass' => 'Chanjya ger tremena',
+'resetpass_announce' => 'Hwi a omgelmis dre goden ebostyes anbarthus.
+Rag gorfenna omgelmi, res yw dhywgh settya ger tremena nowyth omma:',
+'resetpass_header' => 'Chanjya ger tremena an akont',
+'oldpassword' => 'Ger tremena koth:',
+'newpassword' => 'Ger tremena nowyth:',
+'retypenew' => 'Jynnscrifewgh an ger tremena nowyth arta:',
+'resetpass_submit' => 'Settya an ger tremena hag omgelmi',
+'resetpass_success' => 'Chanjyes re beu agas ger tremena yn sewen!
+Orth agas omgelmi lemmyn...',
 'resetpass_forbidden' => 'Ny yllir chanjya geryow tremena',
-'resetpass-submit-loggedin' => 'Chanjya an ger-tremena',
+'resetpass-submit-loggedin' => 'Chanjya an ger tremena',
 'resetpass-submit-cancel' => 'Hedhi',
-'resetpass-temp-password' => 'Ger tremena termynyel:',
+'resetpass-temp-password' => 'Ger tremena anbarthus:',
 
 # Special:PasswordReset
-'passwordreset' => 'Dassettya ger tremena',
-'passwordreset-text' => 'Gwrewgh lenwel an furvlen-ma rag receva ebost ynno manylyon agas acont.',
-'passwordreset-legend' => 'Dassettya ger tremena',
-'passwordreset-disabled' => "Dialosegys yw dassettya geryow tremena war'n wiki ma.",
-'passwordreset-pretext' => "{{PLURAL:$1||Entrowgh onen a'n tymmyn a dhata a-woles}}",
-'passwordreset-username' => 'Hanow usyer:',
+'passwordreset' => 'Dassettya an ger tremena',
+'passwordreset-text-one' => 'Lenwewgh an furvlen-ma rag dassettya agas ger tremena.',
+'passwordreset-text-many' => "{{PLURAL:$1|Entrewgh onan a'n tymmyn a dhata a-woles rag dassettya agas ger tremena.}}",
+'passwordreset-legend' => 'Dassettya an ger tremena',
+'passwordreset-disabled' => 'Dialosegys yw dassettya geryow tremena war an wiki-ma.',
+'passwordreset-username' => 'Hanow devnydhyer:',
 'passwordreset-domain' => 'Tiredh:',
 'passwordreset-email' => 'Trigva ebost:',
-'passwordreset-emailtitle' => 'Manylyon agas acont war {{SITENAME}}',
+'passwordreset-emailtitle' => 'Manylyon agas akont war {{SITENAME}}',
+'passwordreset-emailsent' => 'Ebost dassettya ger tremena re beu danvenys.',
+'passwordreset-emailsent-capture' => 'Ebost dassettya ger tremena re beu danvenys, hag y hyllir y weles a-woles.',
 
 # Special:ChangeEmail
 'changeemail' => 'Chanjya trigva ebost',
-'changeemail-header' => 'Chanjya trigva ebost an acont',
-'changeemail-text' => 'Grewgh lenwel an furvlen-ma rag chanjya agas trigva ebost. Y fedh res dhywgh entra agas ger tremena rag afydhya an chanj-ma.',
+'changeemail-header' => 'Chanjya trigva ebost an akont',
+'changeemail-text' => 'Lenwewgh an furvlen-ma rag chanjya agas trigva ebost. Y fydh res dhywgh entra agas ger tremena rag afydhya an chanj-ma.',
+'changeemail-oldemail' => 'Agas trigva ebost a-lemmyn:',
+'changeemail-newemail' => 'Agas trigva ebost nowyth:',
+'changeemail-none' => '(nagonan)',
+'changeemail-password' => 'Agas ger tremena war {{SITENAME}}:',
+'changeemail-submit' => 'Chanjya an trigva ebost',
+'changeemail-cancel' => 'Hedhi',
 
 # Edit page toolbar
-'bold_sample' => 'Text tew',
-'bold_tip' => 'Text tew',
-'italic_sample' => 'Text italek',
-'italic_tip' => 'Text italek',
+'bold_sample' => 'Tekst tew',
+'bold_tip' => 'Tekst tew',
+'italic_sample' => 'Tekst italek',
+'italic_tip' => 'Tekst italek',
 'link_sample' => 'Titel an gevren',
 'link_tip' => 'Kevren bervedhel',
 'extlink_sample' => 'http://www.example.com titel an gevren',
-'extlink_tip' => 'Kevren a-ves (na ankevowgh an rager http://)',
-'headline_sample' => 'Text an titel',
+'extlink_tip' => 'Kevren a-ves (na ankevewgh an rager http://)',
+'headline_sample' => 'Tekst an bennlinen',
 'headline_tip' => 'Pennlinen nivel 2',
-'nowiki_sample' => 'Keworrowgh text heb furvyans omma',
-'nowiki_tip' => 'Sconya aswon furvyans wiki',
+'nowiki_sample' => 'Keworrewgh tekst heb furvyans omma',
+'nowiki_tip' => 'Skonya aswon furvyans wiki',
 'image_tip' => 'Restren neythys',
 'media_tip' => 'Kevren restren',
 'sig_tip' => 'Agas sinans gans stampa-termyn',
 
 # Edit pages
-'summary' => 'Derivas cot:',
+'summary' => 'Berrskrif:',
 'subject' => 'Testen/Pennlinen:',
-'minoredit' => 'Chanj bian yw hemma',
-'watchthis' => 'Golyas an folen-ma',
-'savearticle' => 'Gwitha',
+'minoredit' => 'Chanj byhan yw hemma',
+'watchthis' => 'Golya an folen-ma',
+'savearticle' => 'Gwitha an folen',
 'preview' => 'Ragwel',
-'showpreview' => 'Ragweles',
-'showdiff' => 'Disqwedhes an chanjyow',
-'anoneditwarning' => "'''Gwarnyans:''' Nyns owgh why omgelmys.
-Recordys a vedh agas trigva IP yn istory an folen-ma.",
-'anonpreviewwarning' => "''Nyns owgh why omgelmys. Dre witha, agas trigva IP a vedh recordyes yn istory chanjya an folen-ma.''",
-'summary-preview' => "Ragwel a'n derivas kot:",
-'loginreqtitle' => 'Res yw omgelmy',
-'loginreqlink' => 'omgelmy',
-'accmailtitle' => 'Danvenys yw an ger-tremena.',
-'newarticle' => '(Noweth)',
-'newarticletext' => "Why a wrug sewya kevren dhe folen nag yw gwruthys whath.
-Rag gwruthyl an folen, dalethowgh jynnscrifa y'n gist a-woles (gwelowgh an [[{{MediaWiki:Helppage}}|folen weres]] rag moy kedhlow).
-Mar qwrussowgh why dos omma yn camm, clyckyowgh boton '''war-dhelergh''' agas peurel.",
-'noarticletext' => 'Nyns eus text y\'n folen-ma.
-Why a yll [[Special:Search/{{PAGENAME}}|whilas titel an folen-ma]] yn folennow erel,
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} whilas y\'n covnotennow kelmys],
+'showpreview' => 'Diskwedhes ragwel',
+'showlivepreview' => 'Ragwel byw',
+'showdiff' => 'Diskwedhes an chanjyow',
+'anoneditwarning' => "'''Gwarnyans:''' Nyns owgh omgelmys.
+Rekordys vydh agas trigva IP yn istori an folen-ma.",
+'anonpreviewwarning' => "''Nyns owgh omgelmys. Dre witha, agas trigva IP a vydh rekordyes istori chanjya an folen-ma.''",
+'summary-preview' => "Ragwel a'n berrskrif:",
+'loginreqtitle' => 'Res yw omgelmi',
+'loginreqlink' => 'omgelmi',
+'accmailtitle' => 'Ger-tremena danvenys.',
+'newarticle' => '(Nowyth)',
+'newarticletext' => "Hwi re holyas kevren dhe folen nag yw gwruthys hwath.
+Rag gwruthyl an folen, dalethewgh jynnskrifa y'n gist a-woles (gwelewgh an [[{{MediaWiki:Helppage}}|folen weres]] rag moy kedhlow).
+Mar teuthowgh omma yn kamm, klyckyewgh boton '''war-dhelergh''' agas peurel.",
+'noarticletext' => 'Nyns eus tekst y\'n folen-ma a-lemmyn.
+Hwi a yll [[Special:Search/{{PAGENAME}}|hwilas titel an folen-ma]] yn folennow erel,
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hwilas y\'n kovnotennow kelmys],
 po [{{fullurl:{{FULLPAGENAME}}|action=edit}} chanjya an folen-ma]</span>.',
-'noarticletext-nopermission' => 'Nyns eus text y\'n folen-ma a-lemmyn.
-Why a yll [[Special:Search/{{PAGENAME}}|whilas titel an folen-ma]] yn folennow erel, po <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} whilas y\'n covnotennow kelmys]</span>, mes nyns eus cummyes dhywgh a wruthyl an folen-ma.',
-'userpage-userdoesnotexist' => 'Nyns yw covscrifys an acont devnydhyer "$1".
-Gwrewgh checkya mars yw whans dhywgh gwruthyl/chanjya an folen-ma.',
-'userpage-userdoesnotexist-view' => 'Nyns yw covscrifys an acont devnydher "$1".',
+'noarticletext-nopermission' => "Nyns eus tekst y'n folen-ma a-lemmyn.
+Hwi a yll [[Special:Search/{{PAGENAME}}|hwilas titel an folen-ma]] yn folennow erel, po <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hwilas y'n kovnotennow kelmys]</span>, mes ny'gas beus kummyes dhe wruthyl an folen-ma.",
+'userpage-userdoesnotexist' => 'Nyns yw kovskrifys an akont devnydhyer "$1".
+Checkyewgh mar pleg mara\'gas beus hwans dhe wruthyl/dhe janjya an folen-ma.',
+'userpage-userdoesnotexist-view' => 'Nyns yw kovskrifys an akont devnydhyer "$1".',
 'updated' => '(Nowedhys)',
 'note' => "'''Noten:'''",
-'previewnote' => "Gwrewgh perthy cov, nyns yw hemma marnas ragwel.''' Nyns yw gwithys agas chanjyow whath!",
-'continue-editing' => "Mos dhe'n teller chanjya",
+'previewnote' => "Perthewgh kov, nyns yw hemma marnas ragwel.''' Nyns yw gwithys agas chanjyow hwath!",
+'continue-editing' => "Mos dhe'n tyller chanjya",
 'editing' => 'Ow chanjya $1',
-'creating' => 'Ow qwruthyl $1',
-'editingsection' => 'Ow chanjya $1 (rann)',
-'editingcomment' => 'Ow chanjya $1 (rann noweth)',
-'yourtext' => 'Agas text',
+'creating' => 'Ow kwruthyl $1',
+'editingsection' => 'Ow chanjya $1 (tregh)',
+'editingcomment' => 'Ow chanjya $1 (tregh nowyth)',
+'yourtext' => 'Agas tekst',
 'yourdiff' => 'Dyffransow',
-'templatesused' => '{{PLURAL:$1|Scantlyn|Scantlyns}} usys war an folen-ma:',
-'templatesusedpreview' => "{{PLURAL:$1|Scantlyn|Scantlyns}} usys y'n ragwel-ma:",
-'template-protected' => '(gwithys)',
+'templatesused' => '{{PLURAL:$1|An skantlyn|Skantlyns}} devnydhys war an folen-ma:',
+'templatesusedpreview' => "{{PLURAL:$1|An skantlyn|Skantlyns}} devnydhys y'n ragwel-ma:",
+'template-protected' => '(difresys)',
 'template-semiprotected' => '(hanter-difresys)',
-'hiddencategories' => 'Esel a {{PLURAL:$1|1 glass cudhys|$1 class cudhys}} yw an folen-ma:',
-'permissionserrorstext-withaction' => 'Nyns eus cummyes dhywgh dhe $2, rag an {{PLURAL:$1|acheson|achesonys}} a sew:',
-'moveddeleted-notice' => 'Diles yw an folen-ma.
-Yma covnoten dhileans ha gwayans an folen a-woles.',
+'hiddencategories' => 'Esel a {{PLURAL:$1|1 glass kudhys|$1 klass kudhys}} yw an folen-ma:',
+'permissionserrorstext-withaction' => "Ny'gas beus kummyes dhe $2, rag an {{PLURAL:$1|acheson|achesonys}} a syw:",
+'moveddeleted-notice' => 'An folen-ma re beu diles.
+Yma kovnoten dhilea ha gwaya an folen res a-woles.',
 'log-fulllog' => 'Gweles an govnoten dien',
+'editwarning-warning' => 'Mar kasowgh an folen-ma, y halser kelli chanjyow gwrys genowgh.
+Mars owgh omgelmys, hwi a yll dialosegi an gwarnyans-ma yn tregh "Chanjya" agas dewisyansow.',
 
 # "Undo" feature
-'undo-summary' => 'Diswul amendyans $1 gans [[Special:Contributions/$2|$2]] ([[User talk:$2|kescows]])',
+'undo-success' => 'Y hyllir diswul an chanj-ma.
+Checkyewgh mar pleg an kehevelyans a-woles rag gwirya bos hemma an pyth a vynnowgh, hag ena gwithewgh an chanjyow a-woles rag gorfenna diswul an chanj.',
+'undo-summary' => 'Amendyans $1 gans [[Special:Contributions/$2|$2]] ([[User talk:$2|keskows]]) diswrys',
 
 # Account creation failure
-'cantcreateaccounttitle' => 'Nyns yw possybyl formya an acont',
+'cantcreateaccounttitle' => 'Ny yllir gwruthyl an akont',
 
 # History pages
-'viewpagelogs' => 'Gweles covnotennow an folen-ma',
+'viewpagelogs' => 'Gweles kovnotennow an folen-ma',
 'currentrev' => 'Amendyans diwettha',
-'currentrev-asof' => 'An chanj diwettha a-ban $1',
-'revisionasof' => 'Versyon an folen a-ban $1',
-'revision-info' => 'Amendyans a-ban $1 gans $2',
-'previousrevision' => '← Amendyans cottha',
-'nextrevision' => 'Amendyans nowettha →',
+'currentrev-asof' => 'An amendyans diwettha a-dhia $1',
+'revisionasof' => 'Versyon an folen a-dhia $1',
+'revision-info' => 'Amendyans a-dhia $1 gans $2',
+'previousrevision' => '← Amendyans kottha',
+'nextrevision' => 'Amendyans nowyttha →',
 'currentrevisionlink' => 'An amendyans diwettha',
 'cur' => 'lemmyn',
 'next' => 'nessa',
-'last' => 'kens',
-'page_first' => 'kensa',
-'page_last' => 'kens',
-'histlegend' => "Dowis dyffransow: Merkyowgh kistennow radyo a'n amendyansow dhe gehevely, ha gwascowgh 'entra' po an boton orth goles an folen.<br />
-Alwhedh: '''({{int:cur}})''' = an dyffrans dhyworth an amendyans diwettha, '''({{int:last}})''' = an dyffrans dhyworth an amendyans kens, '''{{int:minoreditletter}}''' = chanj bian.",
-'history-fieldset-title' => 'Peury an istory',
+'last' => 'kyns',
+'page_first' => 'kynsa',
+'page_last' => 'diwettha',
+'histlegend' => "Dewis dyffransow: Merkyewgh kistennow radyo a'n amendyansow dhe geheveli, ha gweskewgh 'entra' po an boton orth goles an folen.<br />
+Alhwedh: '''({{int:cur}})''' = an dyffrans dhyworth an amendyans diwettha, '''({{int:last}})''' = an dyffrans dhyworth an amendyans kyns, '''{{int:minoreditletter}}''' = chanj byhan.",
+'history-fieldset-title' => 'Peuri an istori',
 'history-show-deleted' => 'Diles hepken',
 'histfirst' => 'An moyha a-varr',
 'histlast' => 'An diwettha',
@@ -685,159 +764,168 @@ Alwhedh: '''({{int:cur}})''' = an dyffrans dhyworth an amendyans diwettha, '''({
 'historyempty' => '(gwag)',
 
 # Revision feed
-'history-feed-title' => 'Istory chanjya',
-'history-feed-description' => 'Istory chanjya rag an folen-ma war an wiki',
+'history-feed-title' => 'Istori amendya',
+'history-feed-description' => 'Istori amendya rag an folen-ma war an wiki',
 'history-feed-item-nocomment' => '$1 dhe $2',
 
 # Revision deletion
-'rev-delundel' => 'disqwedhes/cudha',
-'rev-showdeleted' => 'disqwedhes',
+'rev-delundel' => 'diskwedhes/kudha',
+'rev-showdeleted' => 'diskwedhes',
 'revdel-restore' => 'chanjya an hewelder',
 'revdel-restore-deleted' => 'amendyansow diles',
 'revdel-restore-visible' => 'amendyansow gweladow',
-'pagehist' => 'Istory an folen',
+'pagehist' => 'Istori an folen',
 
 # History merging
 'mergehistory-reason' => 'Acheson:',
 
 # Merge log
-'revertmerge' => 'Disworunya',
+'revertmerge' => 'Diswul an kesunya',
 
 # Diffs
-'history-title' => 'Istory an folen "$1"',
+'history-title' => 'Istori an folen "$1"',
 'difference-title' => 'Dyffransow ynter amendyansow a "$1"',
 'difference-multipage' => '(Dyffrans ynter an folennow)',
 'lineno' => 'Linen $1:',
-'compareselectedversions' => 'Kehevely an amendyansow dowisyes',
-'showhideselectedversions' => 'Disqwedhes/cudha amendyansow dowisyes',
+'compareselectedversions' => 'Keheveli an amendyansow dewisyes',
+'showhideselectedversions' => 'Diskwedhes/kudha amendyansow dewisyes',
 'editundo' => 'diswul',
 
 # Search results
-'searchresults' => 'Sewyansow whilas',
-'searchresults-title' => 'Sewyansow whilas rag "$1"',
-'searchresulttext' => 'Rag moy kedhlow a-dro dhe whilas yn {{SITENAME}}, gwelowgh [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitle' => 'Why a wrug whilas \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|keniver folen ow talleth gans "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|keniver folen ow kevrenna dhe "$1"]])',
-'searchsubtitleinvalid' => "Why a wrug whilas '''$1'''",
-'notitlematches' => 'Nyns eus titel folen ow machya',
-'notextmatches' => 'Nyns eus text folen ow machya',
-'prevn' => 'kens {{PLURAL:$1|$1}}',
+'searchresults' => 'Sewyansow an hwilans',
+'searchresults-title' => 'Sewyansow an hwilans rag "$1"',
+'searchresulttext' => 'Rag moy kedhlow a-dro dhe hwilas yn {{SITENAME}}, gwelewgh [[{{MediaWiki:Helppage}}|{{int:help}}]].',
+'searchsubtitle' => 'Hwi a hwilas \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|keniver folen ow talleth gans "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|keniver folen ow kevrenna dhe "$1"]])',
+'searchsubtitleinvalid' => "Hwi a hwilas '''$1'''",
+'notitlematches' => 'Nyns eus titel folen vyth owth omdhesedha',
+'notextmatches' => 'Nyns eus tekst folen vyth owth omdhesedha',
+'prevn' => '{{PLURAL:$1|$1}} kyns',
 'nextn' => 'nessa {{PLURAL:$1|$1}}',
-'prevn-title' => '$1 {{PLURAL:$1|sewyans|sewyans}} kens',
-'nextn-title' => '$1 {{PLURAL:$1|sewyans|sewyans}} nessa',
+'prevn-title' => '$1 {{PLURAL:$1|sewyans}} kyns',
+'nextn-title' => '$1 {{PLURAL:$1|sewyans}} nessa',
+'shown-title' => 'Diskwedhes $1 {{PLURAL:$1|sewyans}} yn folen',
 'viewprevnext' => 'Gweles ($1 {{int:pipe-separator}} $2) ($3)',
-'searchmenu-legend' => 'Etholyow whilans',
+'searchmenu-legend' => 'Etholyow hwilas',
 'searchmenu-exists' => "''Yma folen henwys \"[[:\$1]]\" war an wiki-ma'''",
 'searchmenu-new' => "'''Gwruthyl an folen \"[[:\$1]]\" war an wiki-ma!'''",
-'searchhelp-url' => 'Help:Gweres',
-'searchprofile-articles' => 'Folennow dhalhen',
+'searchprofile-articles' => 'Folennow dalgh',
 'searchprofile-project' => 'Folennow gweres ha ragdres',
 'searchprofile-images' => 'Liesmedia',
 'searchprofile-everything' => 'Puptra',
 'searchprofile-advanced' => 'Avonsys',
-'searchprofile-articles-tooltip' => 'Whilas yn $1',
-'searchprofile-project-tooltip' => 'Whilas yn $1',
-'searchprofile-images-tooltip' => 'Whilas restrennow',
-'searchprofile-everything-tooltip' => 'Whilas yn pub teller (yn folennow kescows ynwedh)',
-'searchprofile-advanced-tooltip' => 'Whilas yn spassow hanow personelhes',
+'searchprofile-articles-tooltip' => 'Hwilas yn $1',
+'searchprofile-project-tooltip' => 'Hwilas yn $1',
+'searchprofile-images-tooltip' => 'Hwilas restrennow',
+'searchprofile-everything-tooltip' => 'Hwilas pub le (yn folennow keskows ynwedh)',
+'searchprofile-advanced-tooltip' => 'Hwilas yn spasys hanow personelhes',
 'search-result-size' => '$1 ({{PLURAL:$2|1 ger|$2 ger}})',
 'search-result-category-size' => '{{PLURAL:$1|1 esel|$1 esel}} ({{PLURAL:$2|1 isglass|$2 isglass}}, {{PLURAL:$3|1 restren|$3 restren}})',
-'search-redirect' => '(daswedyans $1)',
-'search-section' => '(rann $1)',
-'search-suggest' => 'A wrussowgh why menya: $1',
-'search-interwiki-caption' => 'Ragdresow whor',
+'search-redirect' => '(daskedyans $1)',
+'search-section' => '(tregh $1)',
+'search-suggest' => 'A styrsowgh hwi: $1',
+'search-interwiki-caption' => 'Ragdresow hwor',
 'search-interwiki-default' => '$1 sewyansow:',
 'search-interwiki-more' => '(moy)',
 'search-relatedarticle' => 'Kelmys',
-'mwsuggest-disable' => 'Dialosegy profyansow AJAX',
-'searcheverything-enable' => 'Whilas yn keniver spas-hanow',
+'mwsuggest-disable' => 'Dialosegi profyansow hwilas',
+'searcheverything-enable' => 'Hwilas yn pub spas-hanow',
 'searchrelated' => 'kelmys',
 'searchall' => 'oll',
-'showingresultsheader' => "{{PLURAL:$5|Sewyans '''$1''' dhyworth '''$3'''|Sewyansow '''$1 - $2''' dhyworth '''$3'''}} rag '''$4'''",
-'nonefound' => "'''Noten''': Nyns yw marnas rann a'n spasys-hanow whilys dre dhefowt.
-Gwrewgh assaya rag-gorra agas govyn gans ''all:'' rag whilas yn pub teller (ynnans an folennow kescows, scantlyns, etc), po usyowgh an spas-hanow whensys avel rag-gorrans.",
-'search-nonefound' => 'Nyns esa sewyansow ow machya an govyn.',
-'powersearch' => 'Whilans avonsys',
-'powersearch-legend' => 'Whilans avonsys',
-'powersearch-ns' => 'Whilas yn spasys-hanow:',
-'powersearch-redir' => 'Gorra an daswedyansow yn rol',
-'powersearch-field' => 'Whilas',
-'powersearch-togglelabel' => 'Dowis:',
+'showingresultsheader' => "{{PLURAL:$5|Sewyans '''$1''' a '''$3'''|Sewyansow '''$1 - $2''' a '''$3'''}} rag '''$4'''",
+'nonefound' => "'''Noten''': Ny hwilir marnas yn rann a'n spasys-hanow dre dhefowt.
+Assayewgh rag-gorra agas govyn gans ''all:'' rag hwilas yn pub tyller (ynna an folennow keskows, skantlyns, etc), po devnydhyewgh an spas-hanow hwensys avel rag-gorrans.",
+'search-nonefound' => 'Nyns esa sewyans vyth owth omdhesedha orth an govyn.',
+'powersearch' => 'Hwilans avonsys',
+'powersearch-legend' => 'Hwilans avonsys',
+'powersearch-ns' => 'Hwilas yn spasys-hanow:',
+'powersearch-redir' => 'Rolya daskedyansow',
+'powersearch-field' => 'Hwilas',
+'powersearch-togglelabel' => 'Dewis:',
 'powersearch-toggleall' => 'Oll',
-'powersearch-togglenone' => 'Nagonen',
-'search-external' => 'Whilans a-ves',
+'powersearch-togglenone' => 'Nagonan',
+'search-external' => 'Hwilans a-ves',
 
 # Preferences page
-'preferences' => 'Dowisyansow',
-'mypreferences' => 'Dowisyansow',
+'preferences' => 'Dewisyansow',
+'mypreferences' => 'Dewisyansow',
+'prefs-edits' => 'Niver a janjyow:',
 'changepassword' => 'Chanjya an ger-tremena',
-'prefs-skin' => 'Crohen',
+'prefs-skin' => 'Krohen',
 'skin-preview' => 'Ragweles',
 'prefs-datetime' => 'Dedhyans hag eur',
 'prefs-user-pages' => 'Folennow devnydhyer',
 'prefs-personal' => 'Profil devnydhyer',
 'prefs-rc' => 'Chanjyow a-dhiwedhes',
-'prefs-watchlist' => 'Rol golyas',
-'prefs-watchlist-days' => "Niver a dhedhyow dhe dhisqwedhes y'n rol golyas:",
-'prefs-resetpass' => 'Chanjya ger-tremena',
+'prefs-watchlist' => 'Rol golya',
+'prefs-watchlist-days' => "Niver a dhedhyow dhe dhiskwedhes y'n rol golya:",
+'prefs-resetpass' => 'Chanjya an ger tremena',
 'prefs-changeemail' => 'Chanjya an drigva ebost',
 'prefs-setemail' => 'Settya trigva ebost',
-'prefs-email' => 'Etholyow e-bost',
+'prefs-email' => 'Etholyow ebostya',
 'saveprefs' => 'Gwitha',
-'resetprefs' => 'Clerhe chanjyow nag yw gwithys',
+'resetprefs' => 'Klerhe chanjyow nag yw gwithys',
 'restoreprefs' => 'Restorya pub settyans defowt',
 'prefs-editing' => 'Chanjya',
-'prefs-edit-boxsize' => 'Mens an fenester chanjya.',
+'prefs-edit-boxsize' => 'Myns an fenester janjya.',
 'rows' => 'Rewyow:',
-'columns' => 'Colovennow:',
-'searchresultshead' => 'Whilas',
-'savedprefs' => 'Gwithys re beu agas dowisyansow.',
+'columns' => 'Kolovennow:',
+'searchresultshead' => 'Hwilas',
+'savedprefs' => 'Gwithys re beu agas dewisyansow.',
 'servertime' => 'Eur an servyer:',
 'guesstimezone' => 'Lenwel dhyworth an beurel',
-'timezoneregion-africa' => 'Africa',
-'timezoneregion-america' => 'America',
-'timezoneregion-antarctica' => 'Antarctica',
-'timezoneregion-arctic' => 'Arctek',
-'timezoneregion-asia' => 'Asya',
-'timezoneregion-atlantic' => 'Mor Atlantek',
-'timezoneregion-australia' => 'Awstralya',
+'timezoneregion-africa' => 'Afrika',
+'timezoneregion-america' => 'Amerika',
+'timezoneregion-antarctica' => 'Antarktika',
+'timezoneregion-arctic' => 'Arktek',
+'timezoneregion-asia' => 'Asi',
+'timezoneregion-atlantic' => 'Keynvor Atlantek',
+'timezoneregion-australia' => 'Ostrali',
 'timezoneregion-europe' => 'Europa',
-'timezoneregion-indian' => 'Mor Eyndek',
-'timezoneregion-pacific' => 'Mor Cosel',
-'prefs-searchoptions' => 'Whilas',
-'prefs-files' => 'Restrednow',
-'youremail' => 'E-bost:',
-'username' => 'Hanow-usyer:',
-'uid' => 'ID devnydhyer:',
-'prefs-memberingroups' => "Esel a'n {{PLURAL:$1|bagas|bagasow}}:",
+'timezoneregion-indian' => 'Keynvor Eyndek',
+'timezoneregion-pacific' => 'Keynvor Hebask',
+'allowemail' => 'Galosegi ebost dhyworth devnydhyoryon erel',
+'prefs-searchoptions' => 'Hwilas',
+'prefs-files' => 'Restrennow',
+'prefs-emailconfirm-label' => 'Afydhyans an ebost:',
+'youremail' => 'Ebost:',
+'username' => '{{GENDER:$1|Hanow devnydhyer}}:',
+'uid' => '{{GENDER:$1|ID an devnydhyer}}:',
+'prefs-memberingroups' => "{{GENDER:$2|Esel}} a'n {{PLURAL:$1|bagas|bagasow}}:",
+'prefs-registration' => 'Termyn kovskrifa:',
 'yourrealname' => 'Hanow gwir:',
 'yourlanguage' => 'Yeth:',
-'yournick' => 'Sinans noweth:',
-'yourgender' => 'Reyth:',
+'yournick' => 'Sinans nowyth:',
+'prefs-help-signature' => 'Y tal sina kampolansow war folennow keskows gans "<nowiki>~~~~</nowiki>", a dreylir dhe\'gas sinans ha dhe stamp-termyn.',
+'yourgender' => 'Reydh:',
+'gender-unknown' => 'Heb hy disklosya',
 'gender-male' => 'Gorow',
 'gender-female' => 'Benow',
-'email' => 'E-bost',
-'prefs-help-email' => 'A-dhowis yw ry trigva ebost, mes res yw y sensy rag dassettya agas ger tremena mars yw ankevys.',
-'prefs-help-email-others' => 'Why a yll dowis gasa dhe re erel kestava dhywgh der ebost yn unn glyckya kevren war agas folen devnydhyer po kescows.
-Nyns yw disqwedhys agas trigva ebost pan wrella devnydhyoryon erel kestava dhywgh.',
+'email' => 'Ebost',
+'prefs-help-email' => 'A-dhewis yw ri trigva ebost, mes res yw  rag dassettya agas ger tremena mar po ankevys.',
+'prefs-help-email-others' => 'Hwi a yll dewis gasa dhe re erel kestava dhywgh der ebost dre glyckya kevren war agas folen dhevnydhyer po folen geskows.
+Ny dhiskwedhir agas trigva ebost pan gestaffo devnydhyoryon erel dhywgh.',
 'prefs-help-email-required' => 'Res yw trigva ebost.',
+'prefs-info' => 'Kedhlow selvenel',
+'prefs-i18n' => 'Keswlasegyans',
 'prefs-signature' => 'Sinans',
 'prefs-advancedediting' => 'Etholyow avonsys',
 'prefs-advancedrc' => 'Etholyow avonsys',
 'prefs-advancedrendering' => 'Etholyow avonsys',
 'prefs-advancedsearchoptions' => 'Etholyow avonsys',
 'prefs-advancedwatchlist' => 'Etholyow avonsys',
-'prefs-displayrc' => 'Etholyow disqwedhes',
-'prefs-displaysearchoptions' => 'Etholyow disqwedhes',
-'prefs-displaywatchlist' => 'Etholyow disqwedhes',
+'prefs-displayrc' => 'Etholyow diskwedhes',
+'prefs-displaysearchoptions' => 'Etholyow diskwedhes',
+'prefs-displaywatchlist' => 'Etholyow diskwedhes',
 
 # User rights
-'userrights-user-editname' => 'Entrowgh hanow usyer:',
+'userrights-user-editname' => 'Entrewgh hanow devnydhyer:',
 'userrights-groupsmember' => 'Esel a:',
 'userrights-reason' => 'Acheson:',
 
 # Groups
 'group' => 'Bagas:',
 'group-user' => 'Devnydhyoryon',
+'group-autoconfirmed' => 'Devnydhyoryon awto-afydhyes',
 'group-bot' => 'Bottow',
 'group-sysop' => 'Menystroryon',
 'group-all' => '(oll)',
@@ -853,76 +941,77 @@ Nyns yw disqwedhys agas trigva ebost pan wrella devnydhyoryon erel kestava dhywg
 # Rights
 'right-read' => 'Redya folennow',
 'right-edit' => 'Chanjya folennow',
-'right-createtalk' => 'Gwruthyl folennow kescows',
-'right-createaccount' => 'Formya acontow devnydhyer noweth',
+'right-createtalk' => 'Gwruthyl folennow keskows',
+'right-createaccount' => 'Gwruthyl akontow devnydhyer nowyth',
 'right-move' => 'Gwaya folennow',
 'right-movefile' => 'Gwaya restrennow',
-'right-upload' => 'Ughcarga restrennow',
+'right-upload' => 'Ughkarga restrennow',
 'right-delete' => 'Dilea folennow',
 
 # Special:Log/newusers
-'newuserlogpage' => 'Covnoten formya acontow devnydhyer',
+'newuserlogpage' => 'Kovnoten gwruthyl akontow devnydhyer',
 
 # User rights log
-'rightslog' => 'Covnoten wiryow an devnydhyer',
+'rightslog' => 'Kovnoten wiryow an devnydhyer',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-edit' => 'chanjya an folen-ma',
 'action-move' => 'gwaya an folen-ma',
 'action-movefile' => 'gwaya an restren-ma',
-'action-upload' => 'ughcarga an restren-ma',
+'action-upload' => 'ughkarga an restren-ma',
 'action-delete' => 'dilea an folen-ma',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|chanj|chanj}}',
 'recentchanges' => 'Chanjyow a-dhiwedhes',
 'recentchanges-legend' => 'Etholyow an chanjyow a-dhiwedhes',
-'recentchanges-summary' => "Sewya an chanjyow diwettha eus dhe'n wiki war'n folen-ma.",
-'recentchanges-feed-description' => "Helerhy an chanjyow diwettha dhe'n wiki y'n feed-ma.",
-'recentchanges-label-newpage' => 'Y feu gwres folen noweth gans an chanj-ma',
-'recentchanges-label-minor' => 'Chanj bian yw hemma',
-'recentchanges-label-bot' => 'An chanj-ma a veu gwres gans bott',
-'rcnote' => "A-woles yma'n {{PLURAL:$1|'''1''' chanj}} y'n {{PLURAL:$2|jedh|'''$2''' dedh}} diwettha, a-ban $5, $4.",
-'rclistfrom' => 'Disqwedhes chanjyow noweth ow talleth a-ban $1.',
-'rcshowhideminor' => '$1 chanjyow bian',
-'rcshowhidebots' => '$1 botow',
+'recentchanges-summary' => "Y hyllir helerhi an chanjyow diwettha gwrys dhe'n wiki war an folen-ma.",
+'recentchanges-feed-description' => "Y hyllir helerhi an chanjyow diwettha gwrys dhe'n wiki y'n feed-ma.",
+'recentchanges-label-newpage' => 'Y feu gwruthys folen nowyth gans an chanj-ma',
+'recentchanges-label-minor' => 'Chanj byhan yw hemma',
+'recentchanges-label-bot' => 'Gwrys veu an chanj-ma gans bott',
+'recentchanges-label-unpatrolled' => 'Ny veu an chanj-ma patrolyes hwath',
+'rcnote' => "A-woles yma {{PLURAL:$1|'''1''' janj|an '''$1''' chanjyow diwettha}} y'n {{PLURAL:$2|dydh|'''$2''' dydh}} diwettha, a-dhia $5, $4.",
+'rclistfrom' => 'Diskwedhes chanjyow nowyth yn unn dhalleth dhyworth $1.',
+'rcshowhideminor' => '$1 chanjyow byhan',
+'rcshowhidebots' => '$1 bottow',
 'rcshowhideliu' => '$1 devnydhoryon omgelmys',
 'rcshowhideanons' => '$1 devnydhyoryon dihanow',
 'rcshowhidemine' => '$1 ow chanjyow',
-'rclinks' => "Disqwedhes an $1 chanj diwettha gwres y'n $2 dedh diwettha<br />$3",
+'rclinks' => "Diskwedhes an $1 chanj diwettha gwrys y'n $2 dydh diwettha<br />$3",
 'diff' => 'dyffrans',
-'hist' => 'istory',
-'hide' => 'Cudha',
-'show' => 'Disqwedhes',
+'hist' => 'istori',
+'hide' => 'Kudha',
+'show' => 'Diskwedhes',
 'minoreditletter' => 'B',
 'newpageletter' => 'N',
 'boteditletter' => 'bott',
-'newsectionsummary' => '/* $1 */ rann noweth',
-'rc-enhanced-expand' => 'Disqwedhes an manylyon (res yw JavaScript)',
-'rc-enhanced-hide' => 'Cudha manylyon',
+'newsectionsummary' => '/* $1 */ tregh nowyth',
+'rc-enhanced-expand' => 'Diskwedhes an manylyon (res yw JavaScript)',
+'rc-enhanced-hide' => 'Kudha an manylyon',
 
 # Recent changes linked
 'recentchangeslinked' => 'Chanjyow kelmys',
 'recentchangeslinked-feed' => 'Chanjyow kelmys',
 'recentchangeslinked-toolbox' => 'Chanjyow kelmys',
 'recentchangeslinked-title' => 'Chanjyow kelmys dhe "$1"',
-'recentchangeslinked-noresult' => 'Nyns esa chanj veth war folennow kevrennys dres an termyn res.',
-'recentchangeslinked-summary' => "Hemm yw rol a janjyow a-dhiwedhes gwres dhe folennow yw kevrennys dhyworth folen res (po dhe esely a glass res).
-'''Tew''' yw folennow eus war agas [[Special:Watchlist|rol golyas]].",
+'recentchangeslinked-noresult' => 'Nyns esa chanj vyth war folennow kevrennys dres an termyn res.',
+'recentchangeslinked-summary' => "Homm yw rol a janjyow gwrys a-dhiwedhes dhe folennow yw kevrennys dhyworth folen res (po dhe eseli a glass res).
+'''Tew''' yw folennow eus war agas [[Special:Watchlist|rol golya]].",
 'recentchangeslinked-page' => 'Hanow an folen:',
-'recentchangeslinked-to' => "Disqwedhes chanjyow dhe folennow kevennys dhe'n folen res yn le",
+'recentchangeslinked-to' => "Diskwedhes chanjyow dhe folennow kevrennys dhe'n folen res yn le",
 
 # Upload
-'upload' => 'Ughcarga restren',
-'uploadbtn' => 'Ughcarga restren',
-'reuploaddesc' => "Hedhy ughcarga ha dewheles dhe'n furvlen ughcarga",
+'upload' => 'Ughkarga restren',
+'uploadbtn' => 'Ughkarga restren',
+'reuploaddesc' => "Hedhi ughkarga ha dehweles dhe'n furvlen ughkarga",
 'uploadnologin' => 'Digelmys',
-'uploadnologintext' => 'Res yw bos [[Special:UserLogin|omgelmys]] rag ughcarga restrennow.',
-'uploaderror' => 'Gwall ughcarga',
-'uploadlogpage' => 'Covnoten ughcarga',
+'uploadnologintext' => 'Res yw bos [[Special:UserLogin|omgelmys]] rag ughkarga restrennow.',
+'uploaderror' => 'Gwall ughkarga',
+'uploadlogpage' => 'Kovnoten ughkarga',
 'filename' => 'Hanow an restren',
-'filedesc' => 'Derivas cot',
-'fileuploadsummary' => 'Derivas cot:',
+'filedesc' => 'Berrskrif',
+'fileuploadsummary' => 'Berrskrif:',
 'filesource' => 'Pennfenten:',
 'savefile' => 'Gwitha restren',
 'uploadedimage' => '"[[$1]]" ughkergys',
@@ -933,37 +1022,37 @@ Nyns yw disqwedhys agas trigva ebost pan wrella devnydhyoryon erel kestava dhywg
 'listfiles_date' => 'Dedhyans',
 'listfiles_name' => 'Hanow',
 'listfiles_user' => 'Devnydhyer',
-'listfiles_size' => 'Mens',
-'listfiles_description' => 'Descrifans',
+'listfiles_size' => 'Myns',
+'listfiles_description' => 'Deskrifans',
 'listfiles_count' => 'Versyons',
 
 # File description page
 'file-anchor-link' => 'Restren',
-'filehist' => 'Istory an restren',
-'filehist-help' => 'Clyckyowgh war dedhyans/eur rag gweles an folen del veu nena.',
+'filehist' => 'Istori an restren',
+'filehist-help' => 'Klyckyewgh war dhedhyans/eur rag gweles an folen del omdhiskwedhas nena.',
 'filehist-deleteall' => 'dilea oll',
 'filehist-deleteone' => 'dilea',
-'filehist-revert' => 'trebuchya',
+'filehist-revert' => 'gorthtreylya',
 'filehist-current' => 'a-lemmyn',
 'filehist-datetime' => 'Dedhyans/Eur',
 'filehist-thumb' => 'Skeusennik',
-'filehist-thumbtext' => 'Skeusennik rag an versyon a-ban $1',
-'filehist-nothumb' => 'Nyns eus skeudennik',
+'filehist-thumbtext' => 'Skeusennik rag an versyon a-dhia $1',
+'filehist-nothumb' => 'Nyns eus skeusennik',
 'filehist-user' => 'Devnydhyer',
-'filehist-dimensions' => 'Mensow',
+'filehist-dimensions' => 'Mynsow',
 'filehist-filesize' => 'Mens an restren',
-'filehist-comment' => 'Ger',
+'filehist-comment' => 'Kampol',
 'imagelinks' => 'Devnydh an restren',
-'linkstoimage' => "Yma'n {{PLURAL:$1|folen|$1 folen}} a sew ow kevrenna dhe'n restren-ma:",
+'linkstoimage' => "Yma an {{PLURAL:$1|folen|$1 folen}} a syw ow kevrenna dhe'n restren-ma:",
 'linkstoimage-more' => "Yma moy es $1 {{PLURAL:$1|folen}} ow kevrenna dhe'n restren-ma.
-Yma an rol a sew ow tisqwedhes an {{PLURAL:$1|an kensa kevren folen|kensa $1 kevren folen}} dhe'n restren-ma hepken.
-Yma [[Special:WhatLinksHere/$2|rol leun]] cavadow.",
-'nolinkstoimage' => "Nyns eus folen ow kevrenna dhe'n restren-ma.",
+Ny dhiskwa an rol a syw marnas an {{PLURAL:$1|kynsa kevren folen|kynsa $1 kevren folen}} dhe'n restren-ma.
+Yma [[Special:WhatLinksHere/$2|rol leun]] kavadow.",
+'nolinkstoimage' => "Nyns eus folen vyth ow kevrenna dhe'n restren-ma.",
 'morelinkstoimage' => "Gweles [[Special:WhatLinksHere/$1|moy kevrennow]] dhe'n restren-ma.",
 'sharedupload' => 'Yma an folen-ma ow tos dhyworth $1 ha hy a alsa bos yn-dann devnydh gans ragdresow erel.',
-'sharedupload-desc-here' => "Yma'n restren-ma ow tos dhyworth $1 ha hy a alsa bos yn-dann devnydh gans ragdresow erel.
-Yma'n descrifans war y [$2 folen dhescrifans] disqwedhys a-woles.",
-'uploadnewversion-linktext' => "Ughcarga versyon noweth a'n restren-ma",
+'sharedupload-desc-here' => 'Yma an restren-ma dhe $1 ha ragdresow erel a alsa bos orth hy devnydhya.
+Diskwedhys a-woles yw an deskrifans war hy [$2 folen dheskrifans] ena.',
+'uploadnewversion-linktext' => "Ughkarga versyon nowyth a'n restren-ma",
 
 # File deletion
 'filedelete' => 'Dilea $1',
@@ -971,20 +1060,20 @@ Yma'n descrifans war y [$2 folen dhescrifans] disqwedhys a-woles.",
 'filedelete-submit' => 'Dilea',
 
 # MIME search
-'download' => 'iscarga',
+'download' => 'iskarga',
 
 # Unwatched pages
-'unwatchedpages' => 'Folennow nag eus den veth ow colyas',
+'unwatchedpages' => 'Folennow heb aga golya',
 
 # List redirects
 'listredirects' => 'Rol an daswedyansow',
 
 # Unused templates
-'unusedtemplates' => 'Scantlyns heb devnydh',
+'unusedtemplates' => 'Skantlyns heb devnydh',
 'unusedtemplateswlh' => 'kevrennow erel',
 
 # Random page
-'randompage' => 'Folen dre jons',
+'randompage' => 'Folen jonsus',
 
 # Statistics
 'statistics' => 'Statystygyon',
@@ -994,73 +1083,74 @@ Yma'n descrifans war y [$2 folen dhescrifans] disqwedhys a-woles.",
 'brokenredirects-delete' => 'dilea',
 
 'withoutinterwiki' => 'Folennow heb kevrennow yeth',
-'withoutinterwiki-submit' => 'Disqwedhes',
+'withoutinterwiki-submit' => 'Diskwedhes',
 
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|bayt|bayt}}',
 'nmembers' => '$1 {{PLURAL:$1|esel|esel}}',
-'uncategorizedpages' => 'Folennow heb class',
-'uncategorizedcategories' => 'Classys heb class',
-'uncategorizedimages' => 'Restrennow heb class',
-'uncategorizedtemplates' => 'Scantlyns heb class',
-'unusedcategories' => 'Classys gwag',
+'uncategorizedpages' => 'Folennow heb klass',
+'uncategorizedcategories' => 'Klassys heb klass',
+'uncategorizedimages' => 'Restrennow heb klass',
+'uncategorizedtemplates' => 'Skantlyns heb klass',
+'unusedcategories' => 'Klassys heb devnydh',
 'unusedimages' => 'Restrennow heb devnydh',
 'prefixindex' => 'Keniver folen gans an rager',
-'shortpages' => 'Folennow cot',
+'shortpages' => 'Folennow berr',
 'longpages' => 'Folennow hir',
 'protectedpages' => 'Folennow difresys',
 'protectedtitles' => 'Titlys difresys',
-'usercreated' => '{{GENDER:$3|Formyes}} an $1 dhe $2',
-'newpages' => 'Folennow noweth',
+'usercreated' => '{{GENDER:$3|Gwruthys}} an $1 dhe $2',
+'newpages' => 'Folennow nowyth',
 'newpages-username' => 'Hanow-usyer:',
-'ancientpages' => 'An cottha folennow',
+'ancientpages' => 'An kottha folennow',
 'move' => 'Gwaya',
 'movethispage' => 'Gwaya an folen-ma',
-'pager-newer-n' => '{{PLURAL:$1|1 nowettha|$1 nowettha}}',
-'pager-older-n' => '{{PLURAL:$1|1 cottha|$1 cottha}}',
+'pager-newer-n' => '{{PLURAL:$1|1 nowyttha|$1 nowyttha}}',
+'pager-older-n' => '{{PLURAL:$1|1 kottha|$1 kottha}}',
 
 # Book sources
 'booksources' => 'Pennfentynyow lyver',
-'booksources-search-legend' => 'Whilas pennfentynyow lyver',
+'booksources-search-legend' => 'Hwilas pennfentynyow lyver',
 'booksources-go' => 'Mos',
 
 # Special:Log
 'specialloguserlabel' => 'Awtour:',
-'speciallogtitlelabel' => 'Titel:',
-'log' => 'Covnotennow',
+'speciallogtitlelabel' => 'Kosten (titel po devnydhyer):',
+'log' => 'Kovnotennow',
+'logempty' => "Nyns eus tra vyth owth omdhesedha y'n govnoten.",
 
 # Special:AllPages
 'allpages' => 'Keniver folen',
 'alphaindexline' => '$1 dhe $2',
-'prevpage' => 'Folen gens ($1)',
-'allpagesfrom' => 'Disqwedhes folennow ow talleth orth:',
-'allpagesto' => 'Disqwedhes folennow ow tiwedha orth:',
+'prevpage' => 'Folen gyns ($1)',
+'allpagesfrom' => 'Diskwedhes folennow yn unn dhalleth orth:',
+'allpagesto' => 'Diskwedhes folennow yn unn dhiwedha orth:',
 'allarticles' => 'Keniver folen',
-'allpagesprev' => 'Kens',
+'allpagesprev' => 'Kyns',
 'allpagesnext' => 'Nessa',
 'allpagessubmit' => 'Mos',
-'allpages-hide-redirects' => 'Cudha daswedyansow',
+'allpages-hide-redirects' => 'Kudha daskedyansow',
 
 # Special:Categories
-'categories' => 'Classys',
+'categories' => 'Klassys',
 
 # Special:DeletedContributions
 'sp-deletedcontributions-contribs' => 'kevrohow',
 
 # Special:LinkSearch
-'linksearch' => 'Whilas kevrennow a-ves',
-'linksearch-ok' => 'Whilas',
-'linksearch-line' => 'Kevrennys yw $1 dhyworth $2',
+'linksearch' => 'Hwilas kevrennow a-ves',
+'linksearch-ok' => 'Hwilas',
+'linksearch-line' => 'Y kevrennir $1 dhyworth $2',
 
 # Special:ListUsers
-'listusers-submit' => 'Disqwedhes',
+'listusers-submit' => 'Diskwedhes',
 
 # Special:ListGroupRights
-'listgrouprights-members' => '(rol esely)',
+'listgrouprights-members' => '(rol eseli)',
 
 # Email user
-'emailuser' => 'E-bostya an devnydhyer-ma',
-'emailpage' => 'E-bostya devnydhyer',
+'emailuser' => 'Ebostya an devnydhyer-ma',
+'emailpage' => 'Ebostya devnydhyer',
 'defemailsubject' => 'Ebost danvenys dre {{SITENAME}} gans an devnydhyer "$1"',
 'emailfrom' => 'Dhyworth:',
 'emailto' => 'Dhe:',
@@ -1068,73 +1158,73 @@ Yma'n descrifans war y [$2 folen dhescrifans] disqwedhys a-woles.",
 'emailsend' => 'Danvon',
 
 # Watchlist
-'watchlist' => 'Ow rol golyas',
-'mywatchlist' => 'Ow rol golyas',
+'watchlist' => 'Rol golya',
+'mywatchlist' => 'Rol golya',
 'watchlistfor2' => 'Rag $1 ($2)',
-'watch' => 'Golyas',
-'watchthispage' => 'Golyas an folen-ma',
-'unwatch' => 'Diswolyas',
-'watchlist-details' => 'Yma {{PLURAL:$1|$1 folen}} war agas rol golyas, marnas folennow kescows.',
-'wlshowlast' => 'Disqwedhes an $1 our $2 dedh $3 diwettha',
-'watchlist-options' => 'Etholyow an rol golyas',
+'watch' => 'Golya',
+'watchthispage' => 'Golya an folen-ma',
+'unwatch' => 'Diswolya',
+'watchlist-details' => 'Yma {{PLURAL:$1|$1 folen}} war agas rol golya, marnas folennow keskows.',
+'wlshowlast' => 'Diskwedhes an $1 our $2 dydh $3 diwettha',
+'watchlist-options' => 'Etholyow an rol golya',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching' => 'Ow colyas...',
-'unwatching' => 'Ow tisgolyas...',
+'watching' => 'Ow kolya...',
+'unwatching' => 'Ow tisgolya...',
 
 # Delete
 'deletepage' => 'Dilea an folen',
 'confirm' => 'Afydhya',
-'excontent' => 'yth esa ynny: "$1"',
+'excontent' => 'yth esa ynni: "$1"',
 'delete-confirm' => 'Dilea "$1"',
 'delete-legend' => 'Dilea',
-'actioncomplete' => 'Cowlwres yw an gwrians',
-'actionfailed' => 'An gwrians a fyllas',
-'deletedtext' => '"$1" yw dileys.
-Gwelowgh $2 rag covadh a dhileansow a-dhiwedhes.',
-'dellogpage' => 'Covnoten dhilea',
-'deletionlog' => 'covnoten dhilea',
+'actioncomplete' => 'Kowlwrys yw an gwrians',
+'actionfailed' => 'An gwrians a fyllis',
+'deletedtext' => '"$1" re beu diles.
+Gwelewgh $2 rag kovadh a dhileansow a-dhiwedhes.',
+'dellogpage' => 'Kovnoten dhilea',
+'deletionlog' => 'kovnoten dhilea',
 'deletecomment' => 'Acheson:',
 'deleteotherreason' => 'Acheson aral/keworansel:',
 'deletereasonotherlist' => 'Acheson aral',
 
 # Rollback
-'rollbacklink' => 'restorya',
+'rollbacklink' => 'revya war-dhelergh',
 
 # Protect
-'protectlogpage' => 'Covnoten dhifres',
-'protectedarticle' => 'a dhifresas "[[$1]]"',
+'protectlogpage' => 'Kovnoten dhifres',
+'protectedarticle' => '"[[$1]]" difresys',
 'prot_1movedto2' => '[[$1]] gwayys dhe [[$2]]',
 'protectcomment' => 'Acheson:',
 'protectexpiry' => 'Ow tiwedha:',
 'protect_expiry_invalid' => 'Drog yw an termyn diwedha.',
-'protect_expiry_old' => "Yma'n termyn diwedha y'n termyn eus passyes.",
-'protect-level-sysop' => 'Menystroryon hepken',
+'protect_expiry_old' => "Yma an termyn diwedha y'n termyn eus passyes.",
+'protect-level-sysop' => 'Alowa menystroryon hepken',
 'protect-summary-cascade' => 'ow froslamma',
-'protect-expiring' => 'y whra diwedha $1 (UTC)',
-'restriction-type' => 'Cummyas:',
+'protect-expiring' => 'diwedhans $1 (UTC)',
+'restriction-type' => 'Kummyas:',
 'pagesize' => '(bayt)',
 
 # Restrictions (nouns)
 'restriction-edit' => 'Chanjya',
 'restriction-move' => 'Gwaya',
 'restriction-create' => 'Gwruthyl',
-'restriction-upload' => 'Ughcarga',
+'restriction-upload' => 'Ughkarga',
 
 # Undelete
-'undeletelink' => 'gweles/restorya',
+'undeletelink' => 'gweles/gorthtreylya',
 'undeleteviewlink' => 'gweles',
-'undelete-search-submit' => 'Whilas',
+'undelete-search-submit' => 'Hwilas',
 'undelete-show-file-submit' => 'Ya',
 
 # Namespace form on various pages
 'namespace' => 'Spas hanow:',
-'invert' => 'Trebuchya an dowisyans',
+'invert' => 'Trebuchya an dewisyans',
 'namespace_association' => 'Spas hanow kelmys',
 'blanknamespace' => '(Penn)',
 
 # Contributions
-'contributions' => 'Kevrohow an devnydhyer',
+'contributions' => 'Kevrohow an {{GENDER:$1|devnydhyer}}',
 'contributions-title' => 'Kevrohow $1',
 'mycontris' => 'Kevrohow',
 'contribsub2' => 'Rag $1 ($2)',
@@ -1142,30 +1232,30 @@ Gwelowgh $2 rag covadh a dhileansow a-dhiwedhes.',
 'month' => 'Dhyworth an mis (ha moy a-varr):',
 'year' => 'Dhyworth an vledhen (ha moy a-varr):',
 
-'sp-contributions-newbies' => 'Disqwedhes yn unnik kevrohow acontow noweth',
-'sp-contributions-blocklog' => 'covnoten lettya',
-'sp-contributions-uploads' => 'ughcargansow',
-'sp-contributions-logs' => 'covnotennow',
-'sp-contributions-talk' => 'kescows',
-'sp-contributions-search' => 'Whilas kevrohow',
-'sp-contributions-username' => 'Trigva IP po hanow-usyer:',
-'sp-contributions-toponly' => 'Disqwedhes yn unnik chanjyow yw amendyansow diwettha',
-'sp-contributions-submit' => 'Whilas',
+'sp-contributions-newbies' => 'Diskwedhes yn unnik kevrohow akontow nowyth',
+'sp-contributions-blocklog' => 'kovnoten lettya',
+'sp-contributions-uploads' => 'ughkargansow',
+'sp-contributions-logs' => 'kovnotennow',
+'sp-contributions-talk' => 'keskows',
+'sp-contributions-search' => 'Hwilas kevrohow',
+'sp-contributions-username' => 'Trigva IP po hanow devnydhyer:',
+'sp-contributions-toponly' => 'Diskwedhes yn unnik chanjyow yw amendyansow diwettha',
+'sp-contributions-submit' => 'Hwilas',
 
 # What links here
-'whatlinkshere' => "Pandr'eus ow kevrenna omma",
+'whatlinkshere' => 'Pyth a gevren dhe omma',
 'whatlinkshere-title' => 'Folennow ow kevrenna dhe "$1"',
 'whatlinkshere-page' => 'Folen:',
-'linkshere' => "Yma'n folennow a sew ow kevrenna dhe '''[[:$1]]''':",
-'nolinkshere' => "Nyns eus folen ow kevrenna dhe '''[[:$1]]'''.",
-'isredirect' => 'folen daswedyans',
-'istemplate' => 'treuscludyans',
+'linkshere' => "Yma an folennow a syw ow kevrenna dhe '''[[:$1]]''':",
+'nolinkshere' => "Nyns eus folen vyth ow kevrenna dhe '''[[:$1]]'''.",
+'isredirect' => 'folen daskedyans',
+'istemplate' => 'treuskludyans',
 'isimage' => 'kevren an restren',
-'whatlinkshere-prev' => '{{PLURAL:$1|kens|kens $1}}',
+'whatlinkshere-prev' => '{{PLURAL:$1|kyns|$1 kyns}}',
 'whatlinkshere-next' => '{{PLURAL:$1|nessa|nessa $1}}',
 'whatlinkshere-links' => '← kevrennow',
-'whatlinkshere-hideredirs' => '$1 daswedyansow',
-'whatlinkshere-hidetrans' => '$1 treuscludyans',
+'whatlinkshere-hideredirs' => '$1 daskedyansow',
+'whatlinkshere-hidetrans' => '$1 treuskludyans',
 'whatlinkshere-hidelinks' => '$1 kevrennow',
 'whatlinkshere-hideimages' => '$1 kevrennow restren',
 'whatlinkshere-filters' => 'Sidhlow',
@@ -1175,140 +1265,154 @@ Gwelowgh $2 rag covadh a dhileansow a-dhiwedhes.',
 'ipadressorusername' => 'Trigva IP po hanow-usyer:',
 'ipbreason' => 'Acheson:',
 'ipbreasonotherlist' => 'Acheson aral',
-'ipboptions' => '2 our:2 hours,1 dhedh:1 day,3 dedh:3 days,1 seythen:1 week,2 seythen:2 weeks,1 vis:1 month,3 mis:3 months,6 mis:6 months,1 vledhen:1 year,heb diwedh:infinite',
+'ipboptions' => '2 our:2 hours,1 jydh:1 day,3 dydh:3 days,1 seythen:1 week,2 seythen:2 weeks,1 vis:1 month,3 mis:3 months,6 mis:6 months,1 vledhen:1 year,heb diwedh:infinite',
 'ipb-blocklist-contribs' => 'Kevrohow rag $1',
 'ipblocklist' => 'Devnydhyoryon lettyes',
-'ipblocklist-submit' => 'Whilas',
+'ipblocklist-submit' => 'Hwilas',
 'blocklink' => 'lettya',
 'unblocklink' => 'dislettya',
 'change-blocklink' => 'chanjya an lettyans',
 'contribslink' => 'kevrohow',
-'blocklogpage' => 'Covnoten lettya',
-'blocklogentry' => 'a lettyas [[$1]], bys dhe $2 $3',
-'unblocklogentry' => 'dislettyas $1',
+'blocklogpage' => 'Kovnoten lettya',
+'blocklogentry' => '[[$1]] lettyes, bys dhe $2 $3',
+'unblocklogentry' => '$1 dislettyes',
 'block-log-flags-anononly' => 'devnydhyoryon dihanow hepken',
-'block-log-flags-nocreate' => 'dialosegys yw formya acontow',
-'block-log-flags-hiddenname' => 'hanow usyer cudhys',
+'block-log-flags-nocreate' => 'dialosegys yw gwruthyl akontow',
+'block-log-flags-hiddenname' => 'hanow devnydhyer kudhys',
 
 # Move page
 'move-page' => 'Gwaya $1',
 'move-page-legend' => 'Gwaya folen',
+'movepagetext' => "Devnydhya an furvlen a-woles a dhashenow folen, yn unn waya oll y istori dhe'n hanow nowyth.
+An titel koth a vydh folen dhaskedyans dhe'n titel nowyth.
+Hwi a yll nowedhi daskedyansow a boynt dhe'n titel derowel yn awtomatek.
+Mar ny wrewgh, surhewgh hwi dhe jeckya rag [[Special:DoubleRedirects|daskedyansow dobyl]] po [[Special:BrokenRedirects|terrys]].
+Omgemeryansek owgh rag surhe y pes kevrennow poyntya dhe'n tyller ewn.
+
+Notyewgh '''na wayir''' an folen mars eus folen orth an titel nowyth seulabrys, marnas bos an pyth kampollys diwettha daskedyans ha ny'n jeves istori chanjya kyns vyth.
+Hemm a styr y hyllowgh diswul dashenwel folen mar kwrewgh kammwrians, ha ny yllowgh gorskrifa folen eus ena seulabrys.
+
+'''Gwarnyans!'''
+Hemm a yll bos chanj tromm ha bras dres ehen rag folen gerys-da;
+Surhewgh mar pleg hwi dhe gonvedhes sewyansow an gwrians-ma kyns mos yn-rag.",
 'movearticle' => 'Gwaya an folen:',
-'newtitle' => 'Dhe ditel noweth:',
+'moveuserpage-warning' => "'''Gwarnyans''': Yth esowgh ow mos dhe waya folen dhevnydhyer. Notyewgh mar pleg ny vydh marnas an folen gwayys ha ''ny vydh'' an devnydhyer dashenwys.",
+'newtitle' => 'Dhe ditel nowyth:',
 'move-watch' => 'Golya an folen-ma',
 'movepagebtn' => 'Gwaya an folen',
-'pagemovedsub' => 'An gwarnyans a sowenas',
+'pagemovedsub' => 'Gwaya a sewenis',
 'movepage-moved' => '\'\'\'Gwayys re beu "$1" dhe "$2"\'\'\'',
 'movedto' => 'gwayys dhe',
-'movelogpage' => 'Covnoten waya',
+'movelogpage' => 'Kovnoten waya',
+'movenosubpage' => "Ny's teves an folen-ma isfolen vyth.",
 'movereason' => 'Acheson:',
-'revertmove' => 'trebuchya',
+'revertmove' => 'gorthtreylya',
 
 # Export
-'export' => 'Esperthy folennow',
+'export' => 'Esperthi folennow',
 'export-addcat' => 'Keworra',
 'export-addns' => 'Keworra',
 
 # Namespace 8 related
 'allmessagesname' => 'Hanow',
-'allmessagesdefault' => 'Text messach defowt',
+'allmessagesdefault' => 'Tekst messach defowt',
 
 # Thumbnails
 'thumbnail-more' => 'Brashe',
-'thumbnail_error' => 'Gwall ow formya skeusennik: $1',
+'thumbnail_error' => 'Gwall ow kwruthyl skeusennik: $1',
 
 # Special:Import
-'import' => 'Ymperthy folennow',
-'import-interwiki-submit' => 'Ymperthy',
-'import-upload-filename' => 'Hanow-restren:',
-'importstart' => 'Owth ymperthy folennow...',
-'import-noarticle' => 'Nyns eus folen veth dhe ymperthy!',
+'import' => 'Ymperthi folennow',
+'import-interwiki-submit' => 'Ymperthi',
+'import-upload-filename' => 'Hanow an restren:',
+'importstart' => 'Owth ymperthi folennow...',
+'import-noarticle' => 'Nyns eus folen vyth dhe ymperthi!',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Agas folen dhevnydhyer',
 'tooltip-pt-mytalk' => 'Agas folen gows',
-'tooltip-pt-preferences' => 'Agas dowisyansow',
-'tooltip-pt-watchlist' => 'Rol a folennow esowgh why ow colyas rag chanjyow',
+'tooltip-pt-preferences' => 'Agas dewisyansow',
+'tooltip-pt-watchlist' => 'Rol a folennow esowgh ow kolya rag chanjyow',
 'tooltip-pt-mycontris' => "Rol a'gas kevrohow",
-'tooltip-pt-login' => 'Gwell via dhywgh mar tewgh why hag omgelmy, mes nyns yw besy',
-'tooltip-pt-logout' => 'Digelmy',
-'tooltip-ca-talk' => "Dadhel a-dro dhe'n folen",
-'tooltip-ca-edit' => "Why a yll chanjya an folen-ma. Gwrewgh usya an boton 'ragweles' kens gwitha mar pleg.",
-'tooltip-ca-addsection' => 'Dalleth rann noweth',
-'tooltip-ca-viewsource' => 'Alwhedhys yw an folen-ma.
-Why a yll gweles hy fennfenten.',
-'tooltip-ca-history' => "Amendyansow coth a'n folen-ma",
+'tooltip-pt-login' => 'Ni a gomend mayth omgelmowgh, mes nyns yw besi',
+'tooltip-pt-logout' => 'Digelmi',
+'tooltip-ca-talk' => "Dadhlow a-dro dhe'n folen",
+'tooltip-ca-edit' => "Hwi a yll chanjya an folen-ma. Devnydhyewgh an boton 'ragweles' kyns gwitha mar pleg.",
+'tooltip-ca-addsection' => 'Dalleth tregh nowyth',
+'tooltip-ca-viewsource' => 'Difresys yw an folen-ma.
+Hwi a yll gweles hy fennfenten.',
+'tooltip-ca-history' => "Amendyansow koth a'n folen-ma",
 'tooltip-ca-protect' => 'Difres an folen-ma',
 'tooltip-ca-delete' => 'Dilea an folen-ma',
 'tooltip-ca-move' => 'Gwaya an folen-ma',
-'tooltip-ca-watch' => "Keworra an folen-ma dhe'gas rol golyas",
-'tooltip-ca-unwatch' => 'Dilea an folen-ma dhyworth agas rol golyas',
-'tooltip-search' => 'Whilas yn {{SITENAME}}',
+'tooltip-ca-watch' => "Keworra an folen-ma dhe'gas rol golya",
+'tooltip-ca-unwatch' => 'Dilea an folen-ma dhyworth agas rol golya',
+'tooltip-search' => 'Hwilas yn {{SITENAME}}',
 'tooltip-search-go' => 'Mos dhe folen gans an keth hanow-ma, mars eus',
-'tooltip-search-fulltext' => "Whilas an text-ma y'n folennow",
-'tooltip-p-logo' => "Mos dhe'n folen dre",
-'tooltip-n-mainpage' => "Mos dhe'n folen dre",
-'tooltip-n-mainpage-description' => "Mos dhe'n folen dre",
-'tooltip-n-portal' => "A-dro dhe'n ragdres, an peth a yllowgh why gwul, ple dhe gavos taclow",
-'tooltip-n-currentevents' => 'Cavos kedhlow a-dro dhe dharvosow a-lemmyn',
+'tooltip-search-fulltext' => "Hwilas an tekst-ma y'n folennow",
+'tooltip-p-logo' => "Mos dhe'n folen dynnargh",
+'tooltip-n-mainpage' => "Mos dhe'n folen dynnargh",
+'tooltip-n-mainpage-description' => "Mos dhe'n folen dynnargh",
+'tooltip-n-portal' => "A-dro dhe'n ragdres, an pyth a yllowgh gul, ple hyllir kavos taklow",
+'tooltip-n-currentevents' => 'Kavos kedhlow a-dro dhe hwarvosow a-lemmyn',
 'tooltip-n-recentchanges' => "Rol a janjyow a-dhiwedhes y'n wiki",
-'tooltip-n-randompage' => 'Carga folen dre jons',
+'tooltip-n-randompage' => 'Karga folen jonsus',
 'tooltip-n-help' => 'Gweres',
-'tooltip-t-whatlinkshere' => 'Rol a bub folen wiki ow kevrenna dhe omma',
-'tooltip-t-recentchangeslinked' => 'Chanjyow a-dhiwedhes yn folennow eus kevrennys dhyworth an folen-ma',
+'tooltip-t-whatlinkshere' => 'Rol a bub folen wiki a gevren dhe omma',
+'tooltip-t-recentchangeslinked' => 'Chanjyow a-dhiwedhes yn folennow a gevrennir dhyworth an folen-ma',
 'tooltip-feed-rss' => 'Feed RSS rag an folen-ma',
 'tooltip-feed-atom' => 'Feed Atom rag an folen-ma',
 'tooltip-t-contributions' => 'Gweles rol a gevrohow an devnydhyer-ma',
-'tooltip-t-emailuser' => "Danvon e-bost dhe'n devnydhyer-ma",
-'tooltip-t-upload' => 'Ughcarga restrennow',
+'tooltip-t-emailuser' => "Danvon ebost dhe'n devnydhyer-ma",
+'tooltip-t-upload' => 'Ughkarga restrennow',
 'tooltip-t-specialpages' => 'Rol a geniver folen arbennek',
 'tooltip-t-print' => "Versyon pryntyadow a'n folen-ma",
 'tooltip-t-permalink' => "Kevren fast dhe'n amendyans-ma a'n folen",
 'tooltip-ca-nstab-main' => 'Gweles an folen',
-'tooltip-ca-nstab-user' => 'Gweles an folen devnydhyer',
-'tooltip-ca-nstab-special' => 'Folen arbennek yw hemma; ny yllowgh why chanjya an folen hy honen.',
+'tooltip-ca-nstab-user' => 'Gweles an folen dhevnydhyer',
+'tooltip-ca-nstab-special' => 'Folen arbennek yw homma; ny yllowgh chanjya an folen hy honen.',
 'tooltip-ca-nstab-project' => 'Gweles folen an wiki',
 'tooltip-ca-nstab-image' => 'Gweles folen an restren',
-'tooltip-ca-nstab-template' => 'Gweles an scantlyn',
-'tooltip-ca-nstab-category' => 'Gweles folen an class',
-'tooltip-minoredit' => 'Merkya hemma avel chanj bian',
+'tooltip-ca-nstab-template' => 'Gweles an skantlyn',
+'tooltip-ca-nstab-category' => 'Gweles folen an klass',
+'tooltip-minoredit' => 'Merkya hemma avel chanj byhan',
 'tooltip-save' => 'Gwitha agas chanjyow',
-'tooltip-preview' => 'Ragweles agas chanjyow; gwrewgh usya hemma kens gwitha mar pleg!',
-'tooltip-diff' => "Disqwedhes an chanjyow eus gwres genowgh dhe'n text",
-'tooltip-compareselectedversions' => "Gweles an dyffransow ynter an dhew janjyow dowisyes a'n folen-ma",
-'tooltip-watch' => "Keworra an folen-ma dhe'gas rol golyas",
-'tooltip-rollback' => '"Restorya" a wra trebuchya chanjyow gwres dhe\'n folen-ma gans an diwettha devnydhyer yn unn glyck',
-'tooltip-undo' => '"Diswul" a wra trebuchya an chanj-ma hag egery an furvlen janjya y\'n modh ragweles. Y hyllir keworra acheson y\'n derivas cot.',
-'tooltip-summary' => 'Entrowgh derivas cot',
+'tooltip-preview' => 'Ragweles agas chanjyow; devnydhyewgh hemma kyns gwitha mar pleg!',
+'tooltip-diff' => "Diskwedhes an chanjyow a wrussowgh dhe'n tekst",
+'tooltip-compareselectedversions' => 'Gweles an dyffransow ynter dew amendyansow dewisyes an folen-ma',
+'tooltip-watch' => "Keworra an folen-ma dhe'gas rol golya",
+'tooltip-rollback' => '"Revya war-dhelergh" a worthtreyl chanjyow an diwettha devnydhyer yn unn glyck',
+'tooltip-undo' => '"Diswul" a worthtreyl an chanj-ma hag ygeri an furvlen janjya y\'n modh ragweles. Y hyllir keworra acheson y\'n berrskrif.',
+'tooltip-summary' => 'Entrewgh berrskrif',
 
 # Attribution
 'siteuser' => 'devnydhyer {{SITENAME}} $1',
-'lastmodifiedatby' => 'An folen-ma a veu kens chanjys dhe $2, $1 gans $3.',
+'lastmodifiedatby' => 'Chanj diwettha an folen-ma o dhe $2, $1 gans $3.',
 'siteusers' => '{{PLURAL:$2|devnydhyer|devnydhyoryon}} {{SITENAME}} $1',
 
 # Info page
 'pageinfo-toolboxlink' => 'Kedhlow an folen',
 
 # Browsing diffs
-'previousdiff' => '← Chanj cottha',
-'nextdiff' => 'Chanj nowettha →',
+'previousdiff' => '← Chanj kottha',
+'nextdiff' => 'Chanj nowyttha →',
 
 # Media information
-'file-info-size' => '$1 × $2 pixel, mens an restren: $3, sort MIME: $4',
-'file-nohires' => 'Nyns eus clerder uhella cavadow.',
-'svg-long-desc' => 'Restren SVG, $1 × $2 pixel yn hanow, mens an restren: $3',
-'show-big-image' => 'Clerder leun',
+'file-info-size' => '$1 × $2 piksel, myns an restren: $3, ehen MIME: $4',
+'file-nohires' => 'Nyns eus klerder uhella kavadow.',
+'svg-long-desc' => 'Restren SVG, $1 × $2 piksel yn hanow, myns an restren: $3',
+'show-big-image' => 'Klerder leun',
 
 # Special:NewFiles
-'ilsubmit' => 'Whilas',
+'ilsubmit' => 'Hwilas',
 
 # Metadata
 'metadata' => 'Metadata',
-'metadata-help' => "Yma dhe'n restren-ma kedhlow keworansel, dres lycklod keworrys dhyworth an camera besyel po an scanyer usys rag hy gwruthyl po hy besya. Mars yw chanjys an restren dhyworth hy studh gwredhek, possybyl yw na veu nebes manylyon nowedhys.",
-'metadata-expand' => 'Disqwedhes manylyon ystynnys',
-'metadata-collapse' => 'Cudha manylyon ystynnys',
+'metadata-help' => "An restren-ma a's teves kedhlow keworansel, dres lycklod keworrys dhyworth an kamera bysyel po an skanyer devnydhys rag hy gwruthyl po hy bysya. Mars yw chanjys an restren dhyworth hy studh gwredhek, possybyl yw na veu nebes manylyon nowedhys.",
+'metadata-expand' => 'Diskwedhes manylyon ystynnys',
+'metadata-collapse' => 'Kudha manylyon ystynnys',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Les',
 'exif-imagelength' => 'Uhelder',
 'exif-artist' => 'Awtour',
@@ -1317,15 +1421,15 @@ Why a yll gweles hy fennfenten.',
 
 'exif-contrast-0' => 'Usadow',
 'exif-contrast-1' => 'Medhel',
-'exif-contrast-2' => 'Cales',
+'exif-contrast-2' => 'Kales',
 
 'exif-saturation-0' => 'Usadow',
 
 'exif-sharpness-0' => 'Usadow',
 'exif-sharpness-1' => 'Medhes',
-'exif-sharpness-2' => 'Cales',
+'exif-sharpness-2' => 'Kales',
 
-'exif-subjectdistancerange-0' => 'Ancoth',
+'exif-subjectdistancerange-0' => 'Ankoth',
 
 # External editor support
 'edit-externally' => 'Chanjya an restren-ma dre dowlen a-ves',
@@ -1338,89 +1442,90 @@ Why a yll gweles hy fennfenten.',
 
 # Email address confirmation
 'confirmemail' => 'Afydhya an drigva ebost',
-'confirmemail_noemail' => "Nyns eus trigva ebost da settyes y'gas [[Special:Preferences|dowisyansow devnydhyer]].",
+'confirmemail_noemail' => "Nyns eus trigva ebost da settyes y'gas [[Special:Preferences|dewisyansow devnydhyer]].",
 
 # Multipage image navigation
-'imgmultipageprev' => '← folen kens',
+'imgmultipageprev' => '← folen gyns',
 'imgmultipagenext' => 'folen nessa →',
-'imgmultigo' => 'Mos!',
+'imgmultigo' => 'Mos',
 
 # Table pager
 'table_pager_limit_submit' => 'Mos',
 
 # Auto-summaries
-'autosumm-blank' => 'Gwakhes an folen',
-'autoredircomment' => 'Daswedyas an folen war-tu [[$1]]',
-'autosumm-new' => "Folen formyes gans: '$1'",
+'autosumm-blank' => 'Gwakhes veu an folen',
+'autoredircomment' => 'Folen daswedyes war-tu ha [[$1]]',
+'autosumm-new' => "Folen gwruthys gans: '$1'",
 
 # Live preview
-'livepreview-loading' => 'Ow carga...',
-'livepreview-ready' => 'Ow carga... Parys!',
+'livepreview-loading' => 'Ow karga...',
+'livepreview-ready' => 'Ow karga... Parys!',
 
 # Watchlist editor
-'watchlistedit-noitems' => "Nyns eus titel veth y'gas rol golyas.",
-'watchlistedit-normal-title' => 'Chanjya an rol golyas',
-'watchlistedit-normal-legend' => 'Dilea titlys dhyworth agas rol golyas',
-'watchlistedit-normal-explain' => 'Yma disqwedhys a-woles titlys war agas rol golyas.
-Rag dilea titel, checkyowgh an gisten rebdho, ha clyckyowgh "{{int:Watchlistedit-normal-submit}}".
-Why a yll [[Special:EditWatchlist/raw|chanjya restren an rol golyas]] ynwedh.',
+'watchlistedit-noitems' => "Nyns eus titel vyth y'gas rol golya.",
+'watchlistedit-normal-title' => 'Chanjya an rol golya',
+'watchlistedit-normal-legend' => 'Dilea titlys dhyworth agas rol golya',
+'watchlistedit-normal-explain' => 'Yma diskwedhys a-woles titlys war agas rol golya.
+Rag dilea titel, checkyewgh an gisten rybdho, ha klyckyewgh "{{int:Watchlistedit-normal-submit}}".
+Hwi a yll [[Special:EditWatchlist/raw|chanjya restren an rol golya]] ynwedh.',
 'watchlistedit-normal-submit' => 'Dilea titlys',
 'watchlistedit-normal-done' => 'Diles veu {{PLURAL:$1|$1 titel}} dhyworth agas rol golyas',
-'watchlistedit-raw-title' => 'Chanjya restren an rol golyas',
-'watchlistedit-raw-legend' => 'Chanjya restren an rol golyas',
-'watchlistedit-raw-explain' => 'Yma disqwedhys a-woles titlys war agas rol golyas, hag y hyllir hy chanjya dre geworra dhedhy ha dilea dhyworty;
-unn ditel war linen.
-Pan vo diwedh dhywgh, clyckyowgh "{{int:Watchlistedit-raw-submit}}".
-Why a yll [[Special:EditWatchlist|usya an janjyel usadow]] ynwedh.',
+'watchlistedit-raw-title' => 'Chanjya restren an rol golya',
+'watchlistedit-raw-legend' => 'Chanjya restren an rol golya',
+'watchlistedit-raw-explain' => 'Yma diskwedhys a-woles titlys war agas rol golya, hag y hyllir hy chanjya dre geworra dhedhi ha dilea dhyworti;
+unn ditel war unn linen.
+Pan vo diwedh dhywgh, klyckyewgh "{{int:Watchlistedit-raw-submit}}".
+Hwi a yll [[Special:EditWatchlist|devnydhya an janjyel usadow]] ynwedh.',
 'watchlistedit-raw-titles' => 'Titlys:',
-'watchlistedit-raw-submit' => 'Nowedhy an rol golyas',
-'watchlistedit-raw-done' => 'Nowedhys re beu agas rol golyas.',
+'watchlistedit-raw-submit' => 'Nowedhi an rol golya',
+'watchlistedit-raw-done' => 'Nowedhys re beu agas rol golya.',
 'watchlistedit-raw-added' => 'Keworrys veu {{PLURAL:$1|$1 titel}}:',
 'watchlistedit-raw-removed' => 'Diles veu {{PLURAL:$1|$1 titel}}:',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'Gweles chanjyow longus',
-'watchlisttools-edit' => 'Gweles ha chanjya an rol golyas',
-'watchlisttools-raw' => 'Chanjya restren an rol golyas',
+'watchlisttools-edit' => 'Gweles ha chanjya an rol golya',
+'watchlisttools-raw' => 'Chanjya restren an rol golya',
 
 # Signatures
-'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|kescows]])',
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|keskows]])',
 
 # Special:Version
 'version' => 'Versyon',
 'version-other' => 'Aral',
 'version-version' => '(Versyon $1)',
 
-# Special:FilePath
-'filepath-page' => 'Restren:',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Hanow an restren:',
-'fileduplicatesearch-submit' => 'Whilas',
+'fileduplicatesearch-submit' => 'Hwilas',
 
 # Special:SpecialPages
 'specialpages' => 'Folennow arbennek',
-'specialpages-group-login' => 'Omgelmy / formya acont',
+'specialpages-group-login' => 'Omgelmi / gwruthyl akont',
 
 # Special:BlankPage
 'blankpage' => 'Folen wag',
 
 # Special:Tags
+'tag-filter' => 'Sidhel [[Special:Tags|tagyow]]:',
 'tags-edit' => 'chanjya',
 
 # Database error messages
-'dberr-header' => "Yma cudyn dhe'n wiki-ma",
+'dberr-header' => "An wiki-ma a'n jeves kudyn",
 'dberr-problems' => "Drog yw genen!
-Yma caletter teknogel dhe'n wiasva-ma.",
-'dberr-again' => 'Assayowgh gortos pols ha dascarga.',
+An wiasva-ma a's teves kaletter teknogel.",
+'dberr-again' => 'Assayewgh gortos pols ha daskarga.',
 'dberr-info' => '(Ny yllir kestava orth servyer an database: $1)',
-'dberr-usegoogle' => 'Why a yll assaya whilas dre Google.',
+'dberr-usegoogle' => 'Hwi a yll assaya hwilas dre Google.',
 
 # New logging system
-'logentry-delete-delete' => '$1 a dhileas an folen $3',
+'logentry-delete-delete' => '$1 a {{GENDER:$2|dhileas}} an folen $3',
+'logentry-move-move' => '$1 {{GENDER:$2|a wayas}} an folen $3 dhe $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|a wayas}} an folen $3 dhe $4 heb gasa daskedyans',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|a wayas}} an folen $3 dhe $4 dres daskedyans',
 
 # Search suggestions
-'searchsuggest-search' => 'Whilas',
-'searchsuggest-containing' => 'ynno...',
+'searchsuggest-search' => 'Hwilas',
+'searchsuggest-containing' => 'ynni...',
 
 );
index 356b857..14dcd55 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' => 'Оңдоо баяндоосунун талаасы бош болгон кезинде мага алдын ала эскертүү',
@@ -139,6 +137,7 @@ $messages = array(
 'oct' => 'Окт',
 'nov' => 'Ноя',
 'dec' => 'Дек',
+'january-date' => 'Январь (Үчтүн айы)',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Категория|Категориялар}}',
@@ -164,6 +163,7 @@ $messages = array(
 'newwindow' => '(жаңы терезеде ачылат)',
 'cancel' => 'Жокко чыгаруу',
 'moredotdotdot' => 'Көбүрөөк...',
+'morenotlisted' => 'Бөлөк эч нерсе жок...',
 'mypage' => 'Барак',
 'mytalk' => 'Талкуулоо',
 'anontalk' => 'Бул IP-дарек үчүн талкуулоо',
@@ -181,9 +181,9 @@ $messages = array(
 'faqpage' => 'Project:КБС',
 
 # Vector skin
-'vector-action-addsection' => 'Тема кошумчалоо',
+'vector-action-addsection' => 'Тема кошуу',
 'vector-action-delete' => 'Өчүрүү',
-'vector-action-move' => 'Атын өзгөртүү',
+'vector-action-move' => 'Аталышын өзгөртүү',
 'vector-action-protect' => 'Коргоо',
 'vector-action-undelete' => 'Калыбына келтирүү',
 'vector-action-unprotect' => 'Коргоону өзгөртүү',
@@ -219,6 +219,7 @@ $messages = array(
 'create-this-page' => 'Бул баракты түзүү',
 'delete' => 'Өчүрүү',
 'deletethispage' => 'Бул баракты өчүрүү',
+'undeletethispage' => 'Баракты калыбына келтир',
 'undelete_short' => '$1 {{PLURAL:$1|оңдоону}} калыбына келтирүү',
 'viewdeleted_short' => '{{PLURAL:$1|өчүрүлгөн оңдоону}} көрүү',
 'protect' => 'Коргоо',
@@ -228,12 +229,12 @@ $messages = array(
 'unprotectthispage' => 'Бул барактын коргоосун өзгөртүү',
 'newpage' => 'Жаңы барак',
 'talkpage' => 'Бул баракты талкууга алуу',
-'talkpagelinktext' => 'талкуулоо',
+'talkpagelinktext' => 'Талкуулоо',
 'specialpage' => 'Кызмат барагы',
 'personaltools' => 'Жеке аспаптар',
 'postcomment' => 'Жаңы бөлүм',
 'articlepage' => 'Макаланы кароо',
-'talk' => 'Талкуулоо',
+'talk' => 'Талкуу',
 'views' => 'Көрсөтүүлөр',
 'toolbox' => 'Аспаптар',
 'userpage' => 'Катышуучунун барагын кароо',
@@ -271,36 +272,37 @@ $1',
 'currentevents-url' => 'Project:Учурдагы окуялар',
 'disclaimers' => 'Жоопкерчиликтен баш тартуу',
 'disclaimerpage' => 'Project:Жоопкерчиликтен баш тартуу',
-'edithelp' => 'Өзгөртүү боюнча жардам',
-'edithelppage' => 'Help:Редакторлоо',
+'edithelp' => 'Өзгөртүүгө жардам',
 'helppage' => 'Help:Мазмуну',
 'mainpage' => 'Башбарак',
 'mainpage-description' => 'Башбарак',
 'policy-url' => 'Project:Эрежелер',
 'portal' => 'Жамаат порталы',
 'portal-url' => 'Project:Жамаат порталы',
-'privacy' => 'Ð\96аÑ\88Ñ\8bÑ\80Ñ\8bндуулук саясаты',
-'privacypage' => 'Project:Ð\96аÑ\88Ñ\8bÑ\80Ñ\8bндуулук саясаты',
+'privacy' => 'Ð\9aÑ\83пÑ\83Ñ\8fлуулук саясаты',
+'privacypage' => 'Project:Ð\9aÑ\83пÑ\83Ñ\8fлуулук саясаты',
 
 'badaccess' => 'Кирүү катасы',
 'badaccess-group0' => 'Сиз сураган аракетти аткарала албайсыз.',
 
 'versionrequired' => "MediaWiki'нин $1 версиясы керек",
+'versionrequiredtext' => 'Бул барак менен иштеш үчүн MediaWiki $1 версиясы талап кылынат. Кара.[[Special:Version|version page]].',
 
 'ok' => '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' => 'баÑ\88Ñ\82апкÑ\8b ÐºÐ¾Ð´Ñ\83н ÐºÓ©Ñ\80Ò¯Ò¯',
+'viewsourceold' => 'кайнаÑ\80Ñ\8bн ÐºÐ°Ñ\80оо',
 'editlink' => 'оңдоо',
-'viewsourcelink' => 'Ð\9aайнарды кара',
+'viewsourcelink' => 'кайнарды кара',
 'editsectionhint' => '$1 бөлүмүн оңдоо',
 'toc' => 'Мазмуну',
 'showtoc' => 'көрсөтүү',
@@ -368,19 +370,21 @@ $1',
 'formerror' => 'Ката: Форманы жөнөтүүгө болбоду.',
 'badarticleerror' => 'Бул аракетти бул баракта аткарууга болбой.',
 'cannotdelete-title' => '"$1" барагын өчүрүүгө болбойт',
-'badtitle' => 'ЫкÑ\81Ñ\8bз аталыш',
+'badtitle' => 'ТÑ\83Ñ\83Ñ\80а Ñ\8dмеÑ\81 аталыш',
 'badtitletext' => 'Талап кылынган барак аталышы туура эмес, бош, же тилдер-аралык же уики-аралык аталышы туура эмес шилтемеленген.
 Балким аталышта колдонулбай турган бир же андан көп белги камтылган.',
 'wrong_wfQuery_params' => 'wfQuery() функциясы үчүн жарабай турган параметрлер<br />
 Функция: $1<br />
 Суроо: $2',
-'viewsource' => 'Кароо',
+'viewsource' => 'Кайнарын кароо',
 'viewsource-title' => '$1 барагынын баштапкы кодун көрүү',
 'actionthrottled' => 'Аралык боюнча чектөө',
 'viewsourcetext' => 'Сиз бул барактын баштапкы кодун көрүп жана көчүрүп алсаңыз болот:',
 'sqlhidden' => '(SQL суроо жашырылган)',
 'ns-specialprotected' => 'Кызмат барактарын оңдоого мүмкүн эмес.',
+'invalidtitle-unknownnamespace' => 'Туура эмес баш сөз',
 'exception-nologin' => 'Сиз система кирген жоксуз',
+'exception-nologin-text' => 'Бул барак же аракет сиздин бул уикиге катышуучу атыңыз менен киришти талап кылат.',
 
 # Virus scanner
 'virus-badscanner' => "Ырастоо катасы. Белгисиз вирус сканери: ''$1''",
@@ -388,43 +392,84 @@ $1',
 'virus-unknownscanner' => 'белгисиз антивирус:',
 
 # Login and logout pages
+'logouttext' => "'''Азыр сиз эсебиңизден тышкарысыз. '''
+Сиз {{SITENAME}} аноним катары иштей берсеңиз болот,же ошол же башка ат менен <span class='plainlinks'>[$1 кайра кириңиз]</span>. Кээ бир барактар интернет серепчинин кешин жаңыртмайын системага киргендей эле көрүнө берээрин эске алыңыз.",
 'welcomeuser' => 'Кош келиңиз, $1!',
 'welcomecreation-msg' => 'Сиздин эсеп жазууңуз жаратылды.
 {{SITENAME}} сайтынын [[Special:Preferences|ырастоолорун]] өзгөртүүнү унутпаңыз.',
-'yourname' => 'Эсеп жазуусунун аты:',
+'yourname' => 'Катышуучунун аты:',
+'userlogin-yourname' => 'Катышуучунун аты',
+'userlogin-yourname-ph' => 'Өзүңүздүн колдонуучу атыңызды киргизиңиз',
 'yourpassword' => 'Сырсөз:',
+'userlogin-yourpassword' => 'Сырсөз',
+'userlogin-yourpassword-ph' => 'Сырсөзүңүздү киргизиңиз',
+'createacct-yourpassword-ph' => 'Сырсөздү киргизиңиз',
 'yourpasswordagain' => 'Сырсөздү кайта терүү:',
-'remembermypassword' => 'Бул браузерде менин эсеп жазуумду ($1 {{PLURAL:$1|күнгө}} чейин сактоо)',
+'createacct-yourpasswordagain' => 'Сырсөздү тастыктаңыз',
+'createacct-yourpasswordagain-ph' => 'Сырсөздү кайра киргизиңиз',
+'remembermypassword' => 'Бул браузерде менин катышуучу атымды ($1 {{PLURAL:$1|күнгө}} чейин сактоо)',
+'userlogin-remembermypassword' => 'Мени система кирген боюнча калтыр',
+'userlogin-signwithsecure' => 'Коопсуз байланышты колдонуу',
 'securelogin-stick-https' => 'Киргенден кийин HTTPS аркылуу туташтырууну улантуу',
 'yourdomainname' => 'Сиздин домен',
 'password-change-forbidden' => 'Сиз бул уикиден сырсөзүңүздү өзгөртө албайсыз.',
+'externaldberror' => 'Маалымат базасында ката кетти же сизге сырткы эсебиңизди жаңыртууга уруксат берилген эмес.',
 'login' => 'Кирүү',
 'nav-login-createaccount' => 'Кирүү / Каттоо',
 'loginprompt' => '{{SITENAME}} сайтына кириш үчүн сиз «кукилерге» уруксат беришиңиз керек.',
-'userlogin' => 'Ð\9aиÑ\80Ò¯Ò¯ / Ð\9aаÑ\82Ñ\82оо',
+'userlogin' => 'Ð\9aиÑ\80Ò¯Ò¯ / Ð\9aаÑ\82Ñ\82алÑ\83Ñ\83',
 'userloginnocreate' => 'Кирүү',
 'logout' => 'Сеансты аяктоо',
 'userlogout' => 'Сеансты аяктоо',
 'notloggedin' => 'Сиз системага кире элексиз',
-'nologin' => 'Эсеп жазууңуз жокпу? $1.',
-'nologinlink' => 'Эсеп жазуусун жаратуу',
-'createaccount' => 'Эсеп жазуусун жаратуу',
+'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' => 'Сиз тандаган катышуучунун аты бош эмес.
 Башка атты тандаңыз.',
 'loginerror' => 'Кирүү катасы',
+'createacct-error' => 'Эсеп түзүүдө ката кетти',
 'createaccounterror' => '$1 эсеп жазуусун жаратууга мүмкүн эмес',
+'nocookiesnew' => 'Катышуучунун эсеби түзүлдү, бирок сиз аны менен кире элексиз. {{SITENAME}} катышуучуну киргизүү үчүн куки колдонот. Сиздин кукилер өчүрүлгөн.
+Аларды жандырып, анан жаңы катышуучу атыңыз жана сырсөзүңүз менен кириңиз.',
 'nocookieslogin' => '{{SITENAME}} сайты катышуучуларды киргизүү үчүн кукилерди колдонот.
 Алар сизде өчүрүлүп турат.
 Аларды күйгүзүп анан кайта аракет кылып көрүңүз.',
+'nocookiesfornew' => 'Биз кайрылуунун кайнарын тактай албагандыктан катышуучунун эсебин түзүлгөн жок.
+Кукилериңиз жандырылгандыгын текшериңиз, баракты жаңыртып туруп, кайрадан аракет кылыңыз.',
 'noname' => 'Сиз анык катышуучунун атын көрсөткөн жоксуз.',
 'loginsuccesstitle' => 'Сиз ийгиликтүү кирдиңиз',
 'loginsuccess' => "'''Сиз эми {{SITENAME}} сайтына \"\$1\" болуп кирдиңиз.'''",
+'nosuchuser' => '"$1" атту катышуучу катталган эмес.
+Катышуучун аты регистирди айырмалайт.
+Катага текшериңиз же [[Special:UserLogin/signup|жаңы эсеп түзүү]]',
+'nosuchusershort' => '"$1" аттуу катышуучу жок.
+Жазылышын текшериңиз.',
 'nouserspecified' => 'Сиз катышуучу атын көрсөтүшүңүз керек.',
 'login-userblocked' => 'Бул катышуучу бөгөттөлгөн. Системага кирүүгө уруксат жок.',
 'wrongpassword' => 'Ката сырсөз киргизилди. Кайтадан аракет кылып көрүңүз.',
@@ -434,15 +479,27 @@ $1',
 'password-login-forbidden' => 'Бул катышуучунун атын жана сырсөзүн колдонууга тыюу салынган.',
 'mailmypassword' => 'Жаңы сырсөздү эл. почта аркылуу жөнөтүү',
 'passwordremindertitle' => '{{SITENAME}} үчүн жаңы убактылуу сырсөз',
+'passwordremindertext' => 'Бирөө (балким сиз, $1 IP адресинен) {{SITENAME}}($4) жаңы сырсөз талап кылды. "$2" катышуучу үчүн убактылуу сырсөз түзүлдү жана "$3" үчүн коюлду. Эгер бул сиздин максат болсо, анда системге кирип жаңы сырсөз тандап алышыңыз шарт. Сиздин убактылуу сырсөз {{PLURAL:$5|бир күн|$5 күн}} жарактуу. 
+
+Эгер муну башка киши кылса, же сиз сырсөзүңүздү эстесеңиз жана аны алмаштырууну каалабасыңыз, бул билдирүүгө көңүл бурбай, эски сырсөзүңүздү колдоно берсеңиз болот.',
+'noemail' => '"$1" катышуучу үчүн эмейл дареги катталган эмес.',
 'noemailcreate' => 'Эл. почтанын анык дарегин көрсөтүшүңүз керек',
+'passwordsent' => '"$1" үчүн катталган эмейлге жаңы сырсөз жөнөтүлдү.
+Аны алгандан кийин системге кайра кириңиз.',
+'blocked-mailpassword' => 'Сиздин IP даректен оңдоого бөгөт коюлган, ошондуктан чырдын алдын алуу максатында сырсөздү калыбына келтирүү функциясына дагы тыюу салынган.',
+'eauthentsent' => 'Аныктоочу эмейлге кат жөнөтүлдү. Эмейлдин сиздики экендигин далилдөө үчүн андагы жетектемелерди аткарыңыз.',
+'throttled-mailpassword' => 'Бул эмейл сырсөздү алмаштырууну функциясын акыры {{PLURAL:$1|саат|$1 саат}} ичинде колдонгон.
+Кыянаттуулуктун алдын алуу максатында  бир эмейлге {{PLURAL:$1|саат|$1 саат}} ичинде бир эстетүү суроого гана уруксат берилген.',
 'mailerror' => 'Почтаны жөнөтүү кезиндеги ката: $1',
 'emailauthenticated' => 'Сиздин почта дарегиңиз аныкталды $2/$3.',
 'emailconfirmlink' => 'Электрондук дарегиңизди ырастаңыз',
 'emaildisabled' => 'Бул сайт эл. почтанын билдирүүлөрүн жөнөтө албайт.',
 'accountcreated' => 'Эсеп жазуусу жаратылды',
 'createaccount-title' => '{{SITENAME}} үчүн эсеп жазуусун жаратуу',
+'usernamehasherror' => 'Катышуучунун атында торчо (#) белгисине жол берилбейт',
+'login-throttled' => 'Сиз системге кирүүгө өтө көп аракет кылдыңыз. Дагыңкы аракеттен мурун кичине тыныгуу алыңыз.',
 'login-abort-generic' => 'Сиздин кирүүңүз ийгиликтүү эмес болду - Үзүлдү',
-'loginlanguagelabel' => 'Тил: $1',
+'loginlanguagelabel' => 'Тили: $1',
 
 # Email sending
 'php-mail-error-unknown' => "PHP'нин mail() функциясындагы белгисиз ката.",
@@ -464,6 +521,7 @@ $1',
 
 # Special:PasswordReset
 'passwordreset' => 'Сырсөздү түшүрүү',
+'passwordreset-text-one' => 'Сырсөздү алмаштыруу үчүн бул үлгүнү толтуруңуз.',
 'passwordreset-legend' => 'Сырсөздү түшүрүү',
 'passwordreset-disabled' => 'Бул уикиде сырсөздү түшүрүү мүмкүнчүлүгү өчүрүлгөн.',
 'passwordreset-username' => 'Катышуучу аты:',
@@ -473,13 +531,14 @@ $1',
 'passwordreset-emailtitle' => '{{SITENAME}} сайтындагы эсеп жазуусу жөнүндөгү маалымат',
 'passwordreset-emailelement' => 'Катышуучу аты: $1
 Убактылуу сырсөз: $2',
-'passwordreset-emailsent' => 'Эл. Ð¿Ð¾Ñ\87Ñ\82а Ð°Ñ\80кÑ\8bлÑ\83Ñ\83 Ñ\8dÑ\81ке Ñ\81алÑ\83Ñ\83 жөнөтүлдү.',
-'passwordreset-emailsent-capture' => 'Төмөн жакта жөнөтүлгөн эске салуу кат келтирилди.',
-'passwordreset-emailerror-capture' => 'Ð\96аÑ\80аÑ\82Ñ\8bлган Ñ\8dÑ\81ке Ñ\81алÑ\83Ñ\83 ÐºÐ°Ñ\82Ñ\8b Ð°Ñ\81Ñ\82Ñ\8bнда ÐºÓ©Ñ\80Ñ\81Ó©Ñ\82үлүп Ñ\82Ñ\83Ñ\80аÑ\82, Ð±Ð¸Ñ\80ок Ð°Ð½Ñ\8b ÐºÐ°Ñ\82Ñ\8bÑ\88Ñ\83Ñ\83Ñ\87Ñ\83га жөнөтүү оңунан чыккан жок: $1',
+'passwordreset-emailsent' => 'СÑ\8bÑ\80Ñ\81өздү Ð°Ð»Ð¼Ð°Ñ\88Ñ\82Ñ\8bÑ\80Ñ\83Ñ\83 Ñ\8dмейлге жөнөтүлдү.',
+'passwordreset-emailsent-capture' => 'Төмөндө көрсөтүлгөн эмейлге сырсөздү алмаштыруучу кат жөнөтүлдү.',
+'passwordreset-emailerror-capture' => 'Төмөндө ÐºÓ©Ñ\80Ñ\81Ó©Ñ\82үлгөн Ð´Ð°Ñ\80екке Ñ\81Ñ\8bÑ\80Ñ\81өздү Ð°Ð»Ð¼Ð°Ñ\88Ñ\82Ñ\8bÑ\80Ñ\83Ñ\83 ÐºÐ°Ñ\82 Ñ\82үзүлдү,биÑ\80ок Ð°Ð½Ñ\8b  {{GENDER:$2|каÑ\82Ñ\8bÑ\88Ñ\83Ñ\83Ñ\87Ñ\83га}} жөнөтүү оңунан чыккан жок: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'E-mail даректи өзгөртүү',
 'changeemail-header' => 'Эл. почтанын дарегин өзгөртүү',
+'changeemail-text' => 'Эмейл дарегиңизди алмаштыруу үчүн ушул үлгүнү толтуруңуз. Өзгөрүүнү аныктоо үчүн сырсөздү киргизүү талап кылынат.',
 'changeemail-no-info' => 'Бул баракка түз кайрылыш үчүн, сиз системага киришиңиз керек.',
 'changeemail-oldemail' => 'Кезектеги e-mail дарек:',
 'changeemail-newemail' => 'Жаңы e-mail дарек:',
@@ -489,16 +548,16 @@ $1',
 'changeemail-cancel' => 'Жокко чыгаруу',
 
 # Edit page toolbar
-'bold_sample' => 'Кара текст',
-'bold_tip' => 'Кара текст',
-'italic_sample' => 'Ð\9aÑ\83Ñ\80Ñ\81ив текст',
+'bold_sample' => 'Калың текст',
+'bold_tip' => 'Калың текст',
+'italic_sample' => 'жанÑ\82Ñ\8bк текст',
 'italic_tip' => 'жантык текст',
-'link_sample' => 'Шилтеме аты',
+'link_sample' => 'Шилтеменин аты',
 'link_tip' => 'Ички шилтеме',
 'extlink_sample' => 'http://www.example.com шилтеме аталышы',
 'extlink_tip' => 'Сырткы шилтемелерге (http:// префиксин койгонду унутпаңыз)',
 'headline_sample' => 'Ат тексти',
-'headline_tip' => '2-деңгээлдеги баш аты',
+'headline_tip' => '2-деңгээлдеги баш сөз',
 'nowiki_sample' => 'Форматталбаган текстти бул жерге киргизиңиз',
 'nowiki_tip' => 'Уики-форматтоого көңүл бурбоо',
 'image_tip' => 'Кыстарылган файл',
@@ -507,7 +566,7 @@ $1',
 'hr_tip' => 'Туурасынын сызык (жыш колдонбоңуз)',
 
 # Edit pages
-'summary' => 'Ð\9aÑ\8bÑ\81ка Ñ\82Ò¯Ñ\88үндүÑ\80Ò¯Ò¯:',
+'summary' => 'Ð\96Ñ\8bйÑ\8bнÑ\82Ñ\8bгÑ\8b:',
 'subject' => 'Тема/баш аты:',
 'minoredit' => 'Майда оңдоо',
 'watchthis' => 'Бул баракты көзөмөлдөө',
@@ -518,6 +577,7 @@ $1',
 'showdiff' => 'Өзгөртүүлөрдү көрсөтүү',
 'anoneditwarning' => "'''Эскертүү:''' Сиз каттоодон өткөн жоксуз.
 IP дарегиңиз бул барактын оңдоо тарыхына жазылат.",
+'anonpreviewwarning' => '"Сиз системге кирген жоксуз. Барактын тарыхында сиздин IP дарегиңиз жазылып калат."',
 'missingcommenttext' => 'Төмөн жакка комментарийиңизди киргизиңиз.',
 'blockedtitle' => 'Катышуучу тосмолонгон',
 'blockedtext' => 'Сиздин колдонуучу атыңыз же IP дарегиңиз тосмолонгон',
@@ -602,7 +662,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'currentrevisionlink' => 'Соңку версиясы',
 'cur' => 'учрдг.',
 'next' => 'кийинки',
-'last' => 'соңку',
+'last' => 'мурнку',
 'page_first' => 'биринчи',
 'page_last' => 'акыркы',
 'histlegend' => "Айырмаларды тандоо: Салыштырыла турган версияларлын тушундагы тегеректерди белгилеп туруп \"Enter\"-ди же астындагы баскычты бас.<br />
@@ -684,7 +744,6 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'searchmenu-legend' => 'Издөө опциялары',
 'searchmenu-exists' => "'''Бул Уикиде \"[[:\$1]]\" деп аталган барак бар.'''",
 'searchmenu-new' => "'''Бул Уикиде \"[[:\$1]]\" барагын түз!'''",
-'searchhelp-url' => 'Help:Мазмун',
 'searchprofile-articles' => 'Негизги барактар',
 'searchprofile-project' => 'Жардам жана долбоор барактары',
 'searchprofile-images' => 'Мултимедиа',
@@ -721,14 +780,6 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'powersearch-togglenone' => 'Эчтеке',
 'search-external' => 'Тышкы издөө',
 
-# Quickbar
-'qbsettings' => 'Навигация панели',
-'qbsettings-none' => 'Көрсөтпөө',
-'qbsettings-fixedleft' => 'Жылбаган сол',
-'qbsettings-fixedright' => 'Жылбаган оң',
-'qbsettings-floatingleft' => 'Оома сол',
-'qbsettings-floatingright' => 'Оома оң',
-
 # Preferences page
 'preferences' => 'Ырастоолор',
 'mypreferences' => 'Ырастоолор',
@@ -791,7 +842,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'uid' => '{{GENDER:$1|Катышуучунун}} коду:',
 'prefs-memberingroups' => '{{GENDER:$2|Мүчөсү}} болгон {{PLURAL:$1|топ|топтор}}:',
 'prefs-registration' => 'Каттоо убагы:',
-'yourrealname' => 'Анык атыңыз:',
+'yourrealname' => 'Өз атыңыз:',
 'yourlanguage' => 'Тил:',
 'yourvariant' => 'Мазмундун тил варианты:',
 'yournick' => 'Жаңы колуңуз:',
@@ -873,7 +924,7 @@ HTML-тегдеринин тууралыгын текшериңиз.',
 'right-userrights' => 'Бүт катышуучулардын укуктарын оңдоо',
 
 # Special:Log/newusers
-'newuserlogpage' => 'Катышуучулардын каттоо журналы',
+'newuserlogpage' => 'Катышуучуларды каттоо журналы',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'бул баракты окуу',
@@ -919,7 +970,7 @@ HTML-тегдеринин тууралыгын текшериңиз.',
 'rc-enhanced-hide' => 'Кошумча маалыматтарды жашыруу',
 
 # Recent changes linked
-'recentchangeslinked' => 'ТиеÑ\88елүү өзгөрүүлөр',
+'recentchangeslinked' => 'Ð\91айланÑ\8bÑ\88Ñ\82Ñ\83Ñ\83 өзгөрүүлөр',
 'recentchangeslinked-feed' => 'Тиешелүү өзгөрүүлөр',
 'recentchangeslinked-toolbox' => 'Байланыштуу өзгөрүүлөр',
 'recentchangeslinked-title' => '"$1" үчүн тийиштүү өзгөртүүлөр',
@@ -936,7 +987,7 @@ HTML-тегдеринин тууралыгын текшериңиз.',
 'uploadlog' => 'жүктөө журналы',
 'uploadlogpage' => 'Жүктөөлөрдүн тизмеси',
 'filename' => 'Файл аты',
-'filedesc' => 'Ð\9aÑ\8bÑ\81ка Ñ\82Ò¯Ñ\88үндүÑ\80мө',
+'filedesc' => 'Ð\96Ñ\8bйÑ\8bнÑ\82Ñ\8bгÑ\8b',
 'fileuploadsummary' => 'Кыскача баяндама:',
 'filereuploadsummary' => 'Файлдагы өзгөрүүлөр:',
 'filesource' => 'Булак:',
@@ -977,11 +1028,11 @@ HTML-тегдеринин тууралыгын текшериңиз.',
 # File description page
 'file-anchor-link' => 'Файл',
 'filehist' => 'Файлдын тарыхы',
-'filehist-help' => 'Файлдын ошол учурдагы көрүнүшүн кароо үчүн күнү/сааты бөлүмүнө басыңыз',
+'filehist-help' => 'Файлдын ошол учурдагы көрүнүшүн көрүү үчүн күнү/сааты бөлүмүнө басыңыз',
 'filehist-deleteall' => 'баарын өчүрүү',
 'filehist-deleteone' => 'өчүрүү',
 'filehist-revert' => 'кайтаруу',
-'filehist-current' => 'кезектеги',
+'filehist-current' => 'учурдагы',
 'filehist-datetime' => 'Дата/Убакыт',
 'filehist-thumb' => 'Миниатюра',
 'filehist-thumbtext' => '$1 -дагы версиясы үчүн кичирейтилген сүрөтү',
@@ -989,7 +1040,7 @@ HTML-тегдеринин тууралыгын текшериңиз.',
 'filehist-user' => 'Катышуучу',
 'filehist-dimensions' => 'Өлчөмдөр',
 'filehist-filesize' => 'Файл өлчөмү',
-'filehist-comment' => 'ЭÑ\81кеÑ\80Ñ\82Ò¯Ò¯',
+'filehist-comment' => 'Ð\9aомменÑ\82аÑ\80ий',
 'filehist-missing' => 'Файл жок болот',
 'imagelinks' => 'Файлды колдонуу',
 'linkstoimage' => 'Бул файлга болгон {{PLURAL:$1|шилтеме|$1 шилтеме}} :',
@@ -1066,7 +1117,7 @@ HTML-тегдеринин тууралыгын текшериңиз.',
 # Book sources
 'booksources' => 'Китеп тууралуу маалыматтар',
 'booksources-search-legend' => 'Китеп тууралуу маалыматтарды издөө',
-'booksources-go' => 'ТабÑ\83Ñ\83',
+'booksources-go' => 'Ð\90лга',
 
 # Special:Log
 'specialloguserlabel' => 'Аткаруучу:',
@@ -1171,7 +1222,7 @@ HTML-тегдеринин тууралыгын текшериңиз.',
 # Undelete
 'undeletebtn' => 'Калыбына келтирүү',
 'undeletelink' => 'кароо/калыбына келтирүү',
-'undeleteviewlink' => 'кароо',
+'undeleteviewlink' => 'көрүнүш',
 'undeletereset' => 'Түшүрүү',
 'undeletecomment' => 'Себеп:',
 'undelete-search-submit' => 'Издөө',
@@ -1187,12 +1238,12 @@ HTML-тегдеринин тууралыгын текшериңиз.',
 'contributions-title' => '$1 үчүн катышуучунун салымдары',
 'mycontris' => 'Салымдар',
 'contribsub2' => '$1 үчүн ($2)',
-'uctop' => '(Ñ\81оңкÑ\83)',
+'uctop' => '(Ñ\83Ñ\87Ñ\83Ñ\80дагÑ\8b)',
 'month' => 'Айынан (же андан мурун):',
 'year' => 'Жылынан (жана андан мурун):',
 
-'sp-contributions-newbies' => 'Жаңы эсеп жазуулардын гана салымдарын көрсөтүү',
-'sp-contributions-blocklog' => 'тосмолоолордун журналы',
+'sp-contributions-newbies' => 'Жаңы эсептерден кылынган салымдарды көрсөтүү',
+'sp-contributions-blocklog' => 'бөгөтөөлөрдүн журналы',
 'sp-contributions-uploads' => 'жүктөөлөр',
 'sp-contributions-logs' => 'журналдар',
 'sp-contributions-talk' => 'талкуулоо',
@@ -1208,16 +1259,16 @@ HTML-тегдеринин тууралыгын текшериңиз.',
 'linkshere' => "'''[[:$1]]''' барагына шилтеме берген барактар:",
 'nolinkshere' => "'''[[:$1]]''' барагына шилтеме берген барак жок.",
 'isredirect' => 'кайра багыттоо барагы',
-'istemplate' => 'коÑ\88Ñ\83Ñ\83',
+'istemplate' => 'биÑ\80икÑ\82иÑ\80Ò¯Ò¯',
 'isimage' => 'файл шилтемеси',
 'whatlinkshere-prev' => '{{PLURAL:$1|мурунку}}',
 'whatlinkshere-next' => '{{PLURAL:$1|кийинки}}',
 'whatlinkshere-links' => '← шилтемелер',
 'whatlinkshere-hideredirs' => 'Багыттоолорду $1',
-'whatlinkshere-hidetrans' => '$1 ÐºÐ¾Ñ\88Ñ\83Ñ\83лаÑ\80Ñ\8b',
+'whatlinkshere-hidetrans' => '$1 Ð±Ð¸Ñ\80икÑ\82иÑ\80үүлөÑ\80',
 'whatlinkshere-hidelinks' => 'Шилтемелерди $1',
 'whatlinkshere-hideimages' => '$1 файл шилтемелери',
-'whatlinkshere-filters' => 'ФилÑ\8cÑ\82Ñ\80лер',
+'whatlinkshere-filters' => 'ЭлекÑ\82ер',
 
 # Block/unblock
 'block' => 'Катышуучуну блокировкалоо',
@@ -1231,7 +1282,7 @@ HTML-тегдеринин тууралыгын текшериңиз.',
 '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' => 'башка',
-'ipblocklist' => 'ТоÑ\81молонгон катышуучулар',
+'ipblocklist' => 'Ð\91өгөÑ\82Ñ\82өлгөн катышуучулар',
 'blocklist-target' => 'Максат',
 'blocklist-reason' => 'Себеп',
 'ipblocklist-submit' => 'Издөө',
@@ -1243,7 +1294,7 @@ HTML-тегдеринин тууралыгын текшериңиз.',
 'change-blocklink' => 'бөгөттү өзгөрт',
 'contribslink' => 'салымдары',
 'emaillink' => 'кат жиберүү',
-'blocklogpage' => 'ТоÑ\81молоолоÑ\80дÑ\83н журналы',
+'blocklogpage' => 'Ð\91өгөÑ\82өөлөÑ\80дүн журналы',
 'blocklogentry' => '[[$1]] тосмолонду, тосмолоо мөөнөтү: $2 $3',
 'block-log-flags-anononly' => 'анонимдик катышуучулар гана',
 'block-log-flags-nocreate' => 'эсеп жазуусун жаратуу өчүрүлгөн',
@@ -1287,7 +1338,7 @@ HTML-тегдеринин тууралыгын текшериңиз.',
 
 # Namespace 8 related
 'allmessages' => 'Системалык билдирүүлөр',
-'allmessagesname' => 'Ат',
+'allmessagesname' => 'Аталышы',
 'allmessagesdefault' => 'Белгиленген билдирүүнүн тексти',
 'allmessagescurrent' => 'Учурдагы текст',
 'allmessages-filter-legend' => 'Фильтр',
@@ -1348,7 +1399,7 @@ HTML-тегдеринин тууралыгын текшериңиз.',
 'javascripttest-title' => '$1 үчүн текшерүү жүргүзүлүп жатат',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'Катышуучу барагыңыз',
+'tooltip-pt-userpage' => 'Ð\9aаÑ\82Ñ\8bÑ\88Ñ\83Ñ\83Ñ\87Ñ\83 ÐºÐ°Ñ\82аÑ\80Ñ\8b Ð±Ð°Ñ\80агÑ\8bÒ£Ñ\8bз',
 'tooltip-pt-mytalk' => 'Талкуулоо барагыңыз',
 'tooltip-pt-anontalk' => 'Бул IP дарекке арналган талкуулоо барагы',
 'tooltip-pt-preferences' => 'Ырастоолоруңуз',
@@ -1369,13 +1420,13 @@ HTML-тегдеринин тууралыгын текшериңиз.',
 'tooltip-ca-unwatch' => 'Бул баракты көзөмөл тизмеңизден алып салыңыз',
 'tooltip-search' => '{{SITENAME}} издөө',
 'tooltip-search-go' => 'Так ушундай аталыштагы баракты көрсөтүү',
-'tooltip-search-fulltext' => 'УÑ\88Ñ\83л Ñ\82екÑ\81Ñ\82 Ð¼ÐµÐ½ÐµÐ½ барактарды издөө',
+'tooltip-search-fulltext' => 'УÑ\88Ñ\83л Ñ\82екÑ\81Ñ\82 Ð±Ð°Ñ\80 барактарды издөө',
 'tooltip-p-logo' => 'Башбаракка өтүү',
 'tooltip-n-mainpage' => 'Башбаракка өтүү',
 'tooltip-n-mainpage-description' => 'Башбаракка өтүү',
-'tooltip-n-portal' => 'Долбоор тууралуу, эмне жасай аласыз, кайсы жерде эмне бар жөнүндө',
+'tooltip-n-portal' => 'Долбоор тууралуу, эмне жасай аласыз, кайдан тапса болот',
 'tooltip-n-currentevents' => 'Учурдагы окуялар тууралуу кошумча маалымат табуу',
-'tooltip-n-recentchanges' => 'Уикидеги соңку өзгөртүүлөрдүн тизмеси',
+'tooltip-n-recentchanges' => 'уикидеги соңку өзгөртүүлөрдүн тизмеси',
 'tooltip-n-randompage' => 'Тушкелди баракты ачып кара',
 'tooltip-n-help' => 'Маалымат алуу үчүн',
 'tooltip-t-whatlinkshere' => 'Ушул жерге шилтемеси бар бардык уики барактардын тизмеси',
@@ -1384,14 +1435,14 @@ HTML-тегдеринин тууралыгын текшериңиз.',
 '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' => 'Барактын мазмунун кароо',
 'tooltip-ca-nstab-user' => 'Катышуучунун барагын көрсөтүү',
 'tooltip-ca-nstab-media' => 'Медиа барагын көрүү',
 'tooltip-ca-nstab-special' => 'Бул кызмат барагы, аны оңдой албайсыз',
-'tooltip-ca-nstab-project' => 'Долбоор барагын көрүү',
+'tooltip-ca-nstab-project' => 'Долбоордун барагы',
 'tooltip-ca-nstab-image' => 'Файл барагын көрүү',
 'tooltip-ca-nstab-mediawiki' => 'Системалык билдирүүсүн көрүү',
 'tooltip-ca-nstab-template' => 'Калыпты көрүү',
@@ -1399,7 +1450,7 @@ HTML-тегдеринин тууралыгын текшериңиз.',
 'tooltip-ca-nstab-category' => 'Категория барагын көрүү',
 'tooltip-minoredit' => 'Муну майда оңдоо деп белгилөө',
 'tooltip-save' => 'Өзгөртүүлөрүңүздү сактоо',
-'tooltip-preview' => 'Кичи пейлдикке, өзгөртүүлөрдү алдын ала көрсөтүүнү сактоодон мурун колдонуңуз!',
+'tooltip-preview' => 'Кичи пейлдикке, сактоодон мурун өзгөртүүлөрдү алдын ала көрсөтүүнү  колдонуңуз!',
 'tooltip-diff' => 'Тексттке киргизген өзгөртүүлөрдү көрсөтүү',
 'tooltip-compareselectedversions' => 'Бул барактын тандалган эки версиясынын айырмаларын кароо',
 'tooltip-watch' => 'Бул баракты көзөмөл тизмеңизге кошуңуз',
@@ -1488,7 +1539,7 @@ HTML-тегдеринин тууралыгын текшериңиз.',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Туурасы',
 'exif-imagelength' => 'Бийиктик',
 'exif-imagedescription' => 'Сүрөт аты',
@@ -1533,7 +1584,7 @@ HTML-тегдеринин тууралыгын текшериңиз.',
 'exif-intellectualgenre' => 'Объекттин түрү',
 'exif-subjectnewscode' => 'Теманын коду',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Кыстырылбаган',
 
 'exif-copyrighted-true' => 'Автордук укук менен корголгон',
@@ -1685,11 +1736,6 @@ HTML-тегдеринин тууралыгын текшериңиз.',
 'version-software-version' => 'Версия',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Файл жолу',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Өтүү',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Файл аты:',
 'fileduplicatesearch-submit' => 'Издөө',
@@ -1715,7 +1761,7 @@ HTML-тегдеринин тууралыгын текшериңиз.',
 #Туруктуу айтылыштардын бөлүмдөрүн ушул саптын үстүнө жайгаштыр. Бул сапты болгондой калтыруу.</pre>',
 
 # Special:Tags
-'tag-filter' => '[[Special:Tags|Ð\91елги]] Ñ\84илÑ\8cÑ\82Ñ\80и:',
+'tag-filter' => '[[Special:Tags|Ð\91елги]] Ñ\8dлеги:',
 'tag-filter-submit' => 'Фильтрдөө',
 'tags-title' => 'Белгилер',
 'tags-tag' => 'Белгинин аты',
index 2585393..9244d2f 100644 (file)
@@ -9,8 +9,10 @@
  *
  * @author Amahoney
  * @author Andrew Dalby
+ * @author Autokrator
  * @author Dferg
  * @author Esteban97
+ * @author Geitost
  * @author Kaganer
  * @author LeighvsOptimvsMaximvs
  * @author MF-Warburg
@@ -188,8 +190,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Numerum usorum custodientium monstrare',
 'tog-oldsig' => 'Subscriptio ad tempus adhibita:',
 'tog-fancysig' => 'Subscriptio vicitext (sine nexu automatico)',
-'tog-externaleditor' => 'Editore externo semper uti (periti tantum: necesse est organa propria in computatro habere. [//www.mediawiki.org/wiki/Manual:External_editors adiutatum (Anglice)])',
-'tog-externaldiff' => 'Editore dissimilitudinum externo semper uti (periti tantum: necesse est organa propria in computatro habere. [//www.mediawiki.org/wiki/Manual:External_editors adiutatum (Anglice)])',
 '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 +198,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',
@@ -380,7 +381,6 @@ $messages = array(
 'disclaimers' => 'Repudiationes',
 'disclaimerpage' => 'Project:Repudiationes',
 'edithelp' => 'Opes recensendi',
-'edithelppage' => 'Help:De recensendo',
 'helppage' => 'Help:Adiutatum',
 'mainpage' => 'Pagina prima',
 'mainpage-description' => 'Pagina prima',
@@ -503,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',
@@ -515,14 +522,23 @@ Noli oblivisci [[Special:Preferences|praeferentias]] tuas apud {{grammar:accusat
 'logout' => 'Conventum concludere',
 'userlogout' => 'Conventum concludere',
 'notloggedin' => 'Conventum non est apertum',
-'nologin' => "Num rationem non habes? '''$1'''.",
+'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.',
@@ -555,7 +571,7 @@ Plurimas non licet creare. Ergo, ex hoc loco IP rationes plurimas hodie creari n
 'emailauthenticated' => 'Tua inscriptio electronica recognita est $3, $2.',
 'emailconfirmlink' => 'Inscriptionem tuam electronicam adfirmare',
 'accountcreated' => 'Ratio creata',
-'accountcreatedtext' => 'Ratio pro usore $1 creata est.',
+'accountcreatedtext' => 'Ratio pro usore [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|disputatio]]) creata est.',
 'createaccount-title' => 'Ratio creata apud {{grammar:accusative|{{SITENAME}}}}',
 'createaccount-text' => 'Aliquis creavit rationem pro inscriptione electronica tua apud {{grammar:accusative|{{SITENAME}}}} ($4). Nomen usoris est "$2" et tessera est "$3". Conventum aperias et statim tesseram tuam mutes.
 
@@ -755,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}})',
@@ -784,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',
@@ -834,7 +853,6 @@ Titulus: '''({{int:cur}})''' = dissimilis ab emendatione novissima,
 'searchmenu-legend' => 'Optiones',
 'searchmenu-exists' => "'''Iam est pagina \"[[:\$1]]\"'''",
 'searchmenu-new' => "'''Creare paginam \"[[:\$1]]\"'''",
-'searchhelp-url' => 'Help:Adiutatum',
 'searchprofile-articles' => 'Paginae contentorum',
 'searchprofile-project' => 'Paginae adiutati et incepti',
 'searchprofile-images' => 'Multimedia',
@@ -843,6 +861,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)',
@@ -860,6 +879,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:',
@@ -1117,7 +1137,7 @@ Si vis id dare, opera tua tibi ascribentur.',
 'uploadbtn' => 'Fasciculum imponere',
 'reuploaddesc' => 'Siste imponere et ad imponendi formam redi',
 'uploadnologin' => 'Conventum non est apertum',
-'uploadnologintext' => 'Oportet [[Special:UserLogin|aperire conventum]] ut fasciculos imponas.',
+'uploadnologintext' => 'Necesse est tibi $1 priusquam fasciculos imponas.',
 'uploaderror' => 'Imponendi erratum',
 'uploadtext' => "Utere formam subter ad fasciculos imponendos.
 Ut fasciculos antea impositos videas aut quaeras, adi ad [[Special:FileList|indicem fasciculorum impositorum]]. Fasciculi impositi et deleti quoque in [[Special:Log/upload|notatione fasciculorum impositorum]] notantur.
@@ -1411,6 +1431,13 @@ Vide etiam [[Special:WantedCategories|categorias desideratas]].',
 'listusers-noresult' => 'Nullus usor inventus.',
 'listusers-blocked' => '(obstructus)',
 
+# Special:ActiveUsers
+'activeusers' => 'Index usorum activorum',
+'activeusers-count' => '{{PLURAL:$1|una recensio recens|$1 recensiones recentes}} {{PLURAL:$3|die proximo|in diebus $3 proximis}}',
+'activeusers-hidebots' => 'Celare automata',
+'activeusers-hidesysops' => 'Celare magistratus',
+'activeusers-noresult' => 'Nullus usor inventus.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Gregum usorum potestates',
 'listgrouprights-group' => 'Grex',
@@ -1654,6 +1681,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',
@@ -1949,6 +1977,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}}}}',
@@ -2020,7 +2049,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',
@@ -2093,7 +2122,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',
@@ -2323,11 +2352,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 a0825ec..765b047 100644 (file)
@@ -34,8 +34,8 @@ $namespaceNames = array(
        NS_TEMPLATE_TALK    => 'Diskusyón_de_Xablón',
        NS_HELP             => 'Ayudo',
        NS_HELP_TALK        => 'Diskusyón_de_Ayudo',
-       NS_CATEGORY         => 'Katēggoría',
-       NS_CATEGORY_TALK    => 'Diskusyón_de_Katēggoría',
+       NS_CATEGORY         => 'Kateggoría',
+       NS_CATEGORY_TALK    => 'Diskusyón_de_Kateggoría',
 );
 
 $namespaceAliases = array(
@@ -66,8 +66,8 @@ $namespaceAliases = array(
        'Xabblón'                  => NS_TEMPLATE,
        'Diskusyón_de_Xabblón'     => NS_TEMPLATE_TALK,
        'Diskussión_de_Ayudo'      => NS_HELP_TALK,
-       'Kateggoría'               => NS_CATEGORY,
-       'Diskussión_de_Kateggoría' => NS_CATEGORY_TALK,
+       'Katēggoría'               => NS_CATEGORY,
+       'Diskusyón_de_Katēggoría'  => NS_CATEGORY_TALK,
 );
 
 // Remove Spanish gender aliases (bug 37090)
@@ -410,7 +410,6 @@ $messages = array(
 'disclaimers' => 'Refuso de responsabilitá',
 'disclaimerpage' => 'Project:Refuso de responsabilitá jeneral',
 'edithelp' => '¿Cómo se la troca?',
-'edithelppage' => 'Help:Una hoja, ¿cómodo se la troca?',
 'helppage' => 'Help:Contènidos',
 'mainpage' => 'La Primera Hoja',
 'mainpage-description' => 'La Primera Hoja',
@@ -670,7 +669,6 @@ Leyenda: (act) = diferencias con la versión actual,
 'viewprevnext' => 'Ver ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => 'Egziste una oja yamada "[[:$1]]" en esta viki',
 'searchmenu-new' => "'''Crîar la hoja «[[:$1]]» en esta viki!'''",
-'searchhelp-url' => 'Help:Ayudo',
 'searchprofile-articles' => 'Hojas de contènido',
 'searchprofile-project' => 'Hojas de ayudo y hojas de projeto',
 'searchprofile-images' => 'Multimedya',
@@ -1158,7 +1156,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',
@@ -1239,10 +1237,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 e84ecab..0554dfd 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Geitost
  * @author Hercule
  * @author Kaffi
  * @author Kaganer
@@ -211,8 +212,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 +226,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 +290,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}}',
@@ -371,8 +383,9 @@ $messages = array(
 'create-this-page' => 'Dës Säit uleeën',
 'delete' => 'Läschen',
 'deletethispage' => 'Dës Säit läschen',
+'undeletethispage' => 'Dës Säit restauréieren',
 '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',
@@ -424,7 +437,6 @@ $1",
 'disclaimers' => 'Impressum',
 'disclaimerpage' => 'Project:Impressum',
 'edithelp' => 'Hëllef beim Änneren',
-'edithelppage' => 'Help:Wéi änneren ech eng Säit',
 'helppage' => 'Help:Hëllef',
 'mainpage' => 'Haaptsäit',
 'mainpage-description' => 'Haaptsäit',
@@ -497,7 +509,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,13 +578,15 @@ 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',
 'namespaceprotected' => "Dir hutt net déi néideg Rechter fir d'Säiten am Nummraum '''$1''' ze änneren.",
 'customcssprotected' => "Dir hutt net d'Recht dës CSS-Säit z'änneren, well dorop déi perséinlech Astellunge vun engem anere Benotzer gespäichert sinn.",
 'customjsprotected' => "Dir hutt net d'Recht dës JavaScript-Säit z'änneren, well dorop déi perséinlech Astellunge vun engem anere Benotzer gespäichert sinn.",
+'mycustomcssprotected' => "Dir hutt net déi néideg Rechter fir dës CSS-Säit z'änneren.",
+'mycustomjsprotected' => "Dir hutt net déi néideg Rechter fir dës JavaScript-Säit z'änneren.",
 'ns-specialprotected' => 'Spezialsäite kënnen net verännert ginn.',
 'titleprotected' => "Eng Säit mat dësem Numm kann net ugeluecht ginn. Dës Spär gouf vum [[User:$1|$1]] gemaach deen als Grond ''$2'' uginn huet.",
 'filereadonlyerror' => 'De Fichier "$1" konnt net geännert ginn well de Repertoire vun de Fichieren "$2" nëmme geliest däerf ginn.
@@ -598,9 +612,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 +636,38 @@ Vergiesst net fir Är [[Special:Preferences|{{SITENAME}} Astellungen]] z'ännere
 'logout' => 'Ofmellen',
 'userlogout' => 'Ausloggen',
 'notloggedin' => 'Net ageloggt',
-'nologin' => "Hutt Dir kee Benotzerkont? '''$1'''.",
+'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.
@@ -678,7 +721,7 @@ Gitt eng valabel E-Mailadress an oder loosst dëst Feld eidel.',
 'cannotchangeemail' => 'Mailadresse vu Benotzerkonte kënnen op dëser Wiki net geännert ginn.',
 'emaildisabled' => 'Dëse Site ka keng Maile schécken.',
 'accountcreated' => 'De Kont gouf geschaf',
-'accountcreatedtext' => 'De Benotzerkont fir $1 gouf geschaf.',
+'accountcreatedtext' => 'De Benotzerkont fir [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|Diskussioun]]) gouf geschaf.',
 'createaccount-title' => 'Opmaache vun engem Benotzerkont op {{SITENAME}}',
 'createaccount-text' => 'Et gouf e Benotzerkont "$2" fir Iech op {{SITENAME}} ($4) ugeluecht mat dem Passwuert "$3".
 Dir sollt Iech aloggen an Äert Passwuert elo änneren.
@@ -715,13 +758,15 @@ 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 Äert Passwuert zréckzesetzen.',
+'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?",
@@ -732,13 +777,21 @@ Vläicht hutt Dir Äert Passwuert scho geännert oder en neit temporäert Passwu
 
 $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 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 Benotzer konnt se net kréien: $1",
+'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 +895,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 +1002,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: $3',
 '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 +1149,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.
@@ -1162,7 +1219,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)',
@@ -1191,7 +1248,6 @@ Detailer fannt Dir am [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'searchmenu-legend' => 'Sichoptiounen',
 'searchmenu-exists' => "* Säit '''[[$1]]'''",
 'searchmenu-new' => "'''Opmaache vun der Säit ''[[:$1|$1]]'' op dëser Wiki!'''",
-'searchhelp-url' => 'Help:Inhalter',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|All Säite weisen, déi mat dem Begrëff ufänken nodeem Dir sicht]]',
 'searchprofile-articles' => 'Säite mat Inhalt',
 'searchprofile-project' => 'Hëllef a Projetssäiten',
@@ -1232,15 +1288,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 +1431,8 @@ 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.',
+'userrights-removed-self' => 'Dir hutt Är eege Rechter ewechgeholl. Dofir kënnt Dir net méi op dës Säit zougräifen.',
 
 # Groups
 'group' => 'Grupp:',
@@ -1433,10 +1483,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',
@@ -1452,6 +1503,10 @@ Si muss manner wéi $1 {{PLURAL:$1|Zeechen|Zeechen}} hunn.',
 'right-editusercssjs' => 'Anere Benotzer hir CSS a JS Fichieren änneren',
 'right-editusercss' => 'Anere Benotzer hir CSS Fichieren änneren',
 'right-edituserjs' => 'Anere Benotzer hir JavaScript Fichieren änneren',
+'right-editmyusercss' => 'Är eegen CSS-Fichieren änneren',
+'right-editmyuserjs' => 'Är eege JavaScript-Fichieren änneren',
+'right-viewmywatchlist' => 'Kuckt Är eegen Iwwerwaachungslëscht',
+'right-editmywatchlist' => "Ännert Är eegen Iwwerwaachungslëscht. Dekt drun dach och aner Aktioune Säiten op d'Iwwerwaachungslëscht derbäisetzen.",
 'right-rollback' => "Ännerunge vum läschte Benotzer vun enger spezieller Säit séier z'récksetzen ''(rollback)''",
 'right-markbotedits' => 'Annuléiert Ännerungen als Botännerunge weisen',
 'right-noratelimit' => 'Net limitéiert duerch Zäitlimitatiounen um Server',
@@ -1495,7 +1550,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',
@@ -1513,6 +1568,8 @@ Si muss manner wéi $1 {{PLURAL:$1|Zeechen|Zeechen}} hunn.',
 'action-userrights-interwiki' => "d'Rechter vu Benotzer vun anere Wikien z'änneren",
 'action-siteadmin' => "d'Datebank ze spären oder d'Spär opzehiewen",
 'action-sendemail' => 'Maile schécken',
+'action-editmywatchlist' => 'ännert Är Iwwerwaachungslëscht',
+'action-viewmywatchlist' => 'kuckt Är Iwwerwaachungslëscht',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|Ännerung|Ännerungen}}',
@@ -1568,7 +1625,7 @@ Säite vun [[Special:Watchlist|Ärer Iwwerwaachungslëscht]] si '''fett''' gesch
 'reuploaddesc' => 'Eroplueden ofbriechen an zréck op de Formulaire fir Eropzelueden',
 'upload-tryagain' => 'Déi geännert Beschreiwung vum Fichier schécken',
 'uploadnologin' => 'Net ageloggt',
-'uploadnologintext' => 'Dir musst [[Special:UserLogin|ageloggt sinn]], fir Fichieren eroplueden zu kënnen.',
+'uploadnologintext' => 'Dir musst Iech $1, fir Fichieren eroplueden zu kënnen.',
 'upload_directory_missing' => 'De Repertoire an deen Dir eropluede wollt ($1) feelt a konnt net vum Webserver ugeluecht ginn.',
 'upload_directory_read_only' => 'De Webserver kann net an den Upload-Repertoire ($1) schreiwen.',
 'uploaderror' => 'Feeler bäim Eroplueden',
@@ -1700,6 +1757,7 @@ Wann de Problem weider besteet, dann un de [[Special:ListUsers/sysop|Administrat
 'backend-fail-stream' => 'De Fichier $1 konnt net iwwerdroe ginn.',
 'backend-fail-backup' => 'De Fichier $1 konnt net geséchert ginn.',
 'backend-fail-notexists' => 'De Fichier $1 gëtt et net.',
+'backend-fail-hashes' => "Et konnt net all 'hash' fonnt gi fir ze vergläichen.",
 'backend-fail-notsame' => 'Et gëtt schonn en net-identesche Fichier op $1.',
 'backend-fail-invalidpath' => '$1 ass keng valabel Plaz fir ze späicheren.',
 'backend-fail-delete' => 'De Fichier $1 konnt net geläscht ginn.',
@@ -1715,6 +1773,7 @@ Wann de Problem weider besteet, dann un de [[Special:ListUsers/sysop|Administrat
 'backend-fail-create' => 'De Fichier $1 konnt net geschriwwe ginn.',
 'backend-fail-maxsize' => 'De Fichier $1 konnt net geschriwwe gi well e méi grouss ass wéi {{PLURAL:$2|ee Byte|$2 Byten}}.',
 'backend-fail-readonly' => 'De Späicher-Backend "$1" kann elo nëmme geliest ginn (read-only). De Grond deen ugi gouf war: "$2"',
+'backend-fail-synced' => 'De Fichier "$1" ass an den internen Späichersystemer am Hannergrond an engem net konsistenten Zoustand',
 'backend-fail-connect' => 'Keng Verbindung mam Backend vum Späicher "$1".',
 'backend-fail-internal' => 'Onbekannte Feeler am Backend vum Späicher: "$1"',
 
@@ -1931,6 +1990,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',
 
@@ -1975,12 +2035,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',
@@ -2009,7 +2069,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.
@@ -2075,8 +2135,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
@@ -2096,6 +2156,15 @@ Et muss mindestens en Top-Level-Domaine ugi ginn, wéi z. Bsp. ".org".<br />
 'listusers-noresult' => 'Kee Benotzer fonnt.',
 'listusers-blocked' => '(gespaart)',
 
+# Special:ActiveUsers
+'activeusers' => 'Lëscht vun den aktive Benotzer',
+'activeusers-intro' => 'Dëst ass eng Lëscht vun de Benotzer déi op iergend eng Manéier an de leschten $1 {{PLURAL:$1|Dag|Deeg}} aktiv waren.',
+'activeusers-count' => '$1 {{PLURAL:$1|Aktioun|Aktiounen}} {{PLURAL:$3|gëschter|an de leschten $3 Deeg}}',
+'activeusers-from' => 'Benotzer weisen, ugefaang bäi:',
+'activeusers-hidebots' => 'Botte verstoppen',
+'activeusers-hidesysops' => 'Administrateure verstoppen',
+'activeusers-noresult' => 'Keng Benotzer fonnt.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Rechter vun de Benotzergruppen',
 'listgrouprights-summary' => 'Dëst ass eng Lëscht vun den op dëser Wiki definéierte Benotzergruppen an den domat verbonnene Rechter.
@@ -2173,8 +2242,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}}.',
@@ -2197,6 +2266,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',
@@ -2304,6 +2377,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:',
@@ -2359,10 +2433,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}}'''''.
@@ -2390,8 +2464,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',
@@ -2430,7 +2504,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',
@@ -2582,6 +2656,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',
@@ -2744,6 +2819,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",
@@ -2816,7 +2893,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',
@@ -3029,6 +3108,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',
@@ -3047,11 +3127,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:
 
@@ -3079,7 +3173,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',
@@ -3238,6 +3332,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',
@@ -3248,12 +3343,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',
@@ -3649,12 +3745,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',
@@ -3745,6 +3846,9 @@ 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",
@@ -3754,9 +3858,12 @@ Den ugefrote Fichier gëtt direkt gewise respektiv mat enger verbonner Applikati
 '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',
@@ -3778,6 +3885,8 @@ Den ugefrote Fichier gëtt direkt gewise respektiv mat enger verbonner Applikati
 '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)',
 
index 56545c9..d6b788f 100644 (file)
 
 $fallback = 'ru';
 
+$namespaceNames = array(
+       NS_MEDIA            => 'Медиа',
+       NS_TALK             => 'веревирд_авун',
+       NS_USER             => 'Уртах',
+       NS_USER_TALK        => 'Уртахдин_веревирд_авун',
+       NS_PROJECT_TALK     => '$1_веревирд_авун',
+       NS_FILE             => 'Файл',
+       NS_FILE_TALK        => 'Файл_веревирд_авун',
+       NS_MEDIAWIKI        => 'MediaWiki',
+       NS_MEDIAWIKI_TALK   => 'MediaWiki_веревирд_авун',
+       NS_TEMPLATE         => 'Шаблон',
+       NS_TEMPLATE_TALK    => 'Шаблон_веревирд_авун',
+       NS_CATEGORY         => 'Категория',
+       NS_CATEGORY_TALK    => 'Категория_веревирд_авун',
+);
+
+$namespaceAliases = array(
+       # Russian namespaces
+       'Обсуждение'                         => NS_TALK,
+       'Участник'                           => NS_USER,
+       'Обсуждение_участника'               => NS_USER_TALK,
+       'Обсуждение_{{GRAMMAR:genitive|$1}}' => NS_PROJECT_TALK,
+       'Обсуждение_файла'                   => NS_FILE_TALK,
+       'Обсуждение_MediaWiki'               => NS_MEDIAWIKI_TALK,
+       'Обсуждение_шаблона'                 => NS_TEMPLATE_TALK,
+       'Справка'                            => NS_HELP,
+       'Обсуждение_справки'                 => NS_HELP_TALK,
+       'Категория'                          => NS_CATEGORY,
+       'Обсуждение_категории'               => NS_CATEGORY_TALK,
+);
+
+// Remove Russian gender aliases
+$namespaceGenderAliases = array();
+
 $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 +93,8 @@ $messages = array(
 'editfont-style' => 'Дуьзар хъувунин чкадин шрифтдин жуьре',
 'editfont-default' => 'Браузердин низамарунрикай шрифт',
 'editfont-monospace' => 'Моногьяркьуьвилер авай шрифт',
-'editfont-sansserif' => 'КЬацI авачир шрифт',
-'editfont-serif' => 'КьацI авай кхьин',
+'editfont-sansserif' => 'КьацӀ авачир шрифт',
+'editfont-serif' => 'КьацӀ авай кхьин',
 
 # Dates
 'sunday' => 'Гьяд',
@@ -77,65 +111,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 +184,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-simplesearch-preference' => 'Гегьенш жагъурунин рикӀел гъун кутун (кьилди «Вектор» акунар патал)',
+'vector-view-create' => 'ТуькӀуьрун',
 'vector-view-edit' => 'Дуьзарин',
 '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,45 +251,44 @@ $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' => 'Жавабдарвал хивяй акъудун',
 'disclaimerpage' => 'Project:Жавабдарвал хивяй акъудун',
 'edithelp' => 'Дуьзар хъувун патал куьмек',
-'edithelppage' => 'Help:Дуьзар хъувун',
 'helppage' => 'Help:Къене авайбур',
 '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ийи чарар атанва.',
+'youhavenewmessages' => 'Квез $1 ($2) атанва.',
+'newmessageslink' => 'цӀийи чарар',
+'newmessagesdifflink' => 'Эхиримжи масакӀавилер',
+'youhavenewmessagesmulti' => '"$1"-да квез цӀийи чарар атанва.',
 'editsection' => 'Дуьзар хъувун',
 'editold' => 'Дуьзар хъувун',
 'viewsourceold' => 'сифте кьилин коддиз килига',
@@ -267,19 +300,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,8 +326,8 @@ $messages = array(
 'nosuchspecialpage' => 'Ихьтин куьмекчи ччин авайд ттуш',
 
 # General errors
-'error' => 'Гъалатl',
-'databaseerror' => 'Ганайбурун базадин гъалатI',
+'error' => 'ГъалатӀ',
+'databaseerror' => 'Ганайбурун базадин гъалатӀ',
 'missing-article' => 'Малуматрин базада, квез герек авай "$1" $2 тӀвар алай ччиндин текст жагъанвач
 
 Ихьтин гьал адет яз алуднавай ччинин масакӀавилерин тарихдиз цӀуру рекьяй элячӀайла арадал къвезва.
@@ -302,14 +335,14 @@ $messages = array(
 Себеб ам туштӀа, виридалайни мумкин тирди куьне программада гъалатӀ жугъурун я
 Тавакъу ийида, 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' => 'Фадвилин сергьятар',
@@ -319,43 +352,43 @@ $messages = array(
 '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анзава',
+'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' => 'Гьахьунин гъалатӀ',
-'createaccounterror' => 'И аккаунт туькIуьриз мумкин ттуш: $1',
+'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' => 'Парол дегишиз мумкин ттуш',
@@ -422,7 +455,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 +558,7 @@ $messages = array(
 'revertmerge' => 'Ччара авун',
 
 # Diffs
-'history-title' => '$1  -  масакӀавилерин тарих',
+'history-title' => '$1 - масакӀавилерин тарих',
 'lineno' => 'ЦIар $1:',
 'compareselectedversions' => 'Хкягъай жуьреяр гекъигун',
 'editundo' => 'гьич авун',
@@ -550,7 +583,6 @@ $messages = array(
 'searchmenu-legend' => 'Жагъурунин низамарунар',
 'searchmenu-exists' => "'''И вики-проектда \"[[:\$1]]\" тlвар алай ччин ава.'''",
 'searchmenu-new' => "'''И вики-проектда \"[[:\$1]]\" ччин туькlуьрун !'''",
-'searchhelp-url' => 'Help:КЪене авайбур',
 'searchprofile-articles' => 'Асул ччинар',
 'searchprofile-project' => 'Куьмек гунин ва проектдин ччинар',
 'searchprofile-images' => 'Мультимедиа',
@@ -585,14 +617,6 @@ $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' => 'Зи низамарунар',
@@ -938,7 +962,7 @@ $messages = array(
 
 # Watchlist
 'watchlist' => 'Зи вилив хуьнин сиягь',
-'mywatchlist' => 'Ð\97и Ð²илив хуьнин сиягь',
+'mywatchlist' => 'Ð\92илив хуьнин сиягь',
 '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 +1049,7 @@ $messages = array(
 # Contributions
 'contributions' => 'Уртахди кутур крар',
 'contributions-title' => '$1 уртахди кутур крар',
-'mycontris' => 'Ð\97а Ðºутур кар',
+'mycontris' => 'Ð\9aутур кар',
 'contribsub2' => '($1)-ин кутур пай  ($2)',
 'uctop' => '(вини кьил)',
 'month' => ' Вацралай (ва адалай вилик)',
@@ -1182,7 +1206,7 @@ $messages = array(
 'tooltip-diff' => 'Сифте кьилин текстдиз талукь тир куьне авунвай масакIавилер къалурун',
 'tooltip-compareselectedversions' => 'И ччинин кьве хкягъай жуьрейрин арада авай тафаватдиз килигун',
 'tooltip-watch' => 'И ччин куь вилив хуьнин сиягьдиз алава авун',
-'tooltip-rollback' => '« КЬулухъди чIугун »  и ччиндиз эхиримжи кар кутазвайди патай  авунвай дуьзар хъувунар са т!ампуналди  paxкурзава',
+'tooltip-rollback' => '«Кьулухъди чӀугун» и ччиндиз эхиримжи кар кутазвайди патай авунвай дуьзар хъувунар са тӀампуналди paxкурзава',
 'tooltip-undo' => '«Гьич авун»  авунвай дуьзар хъувун paxкурзава ва сифтедин килигунин режимда  дуьзар хъувундин форма ахъа йийзва. Им нетижадиз себеб алава йийз мумкинвал гузва',
 'tooltip-summary' => 'Куьруь нетижа гьадрун',
 
@@ -1228,7 +1252,7 @@ Cиягьда авай анжах (* лишандихъ галаз эгечIза
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Гьяркьуь',
 'exif-planarconfiguration' => 'Ганайбур тешкил авун',
 'exif-ycbcrsubsampling' => ' Y  ва C компонентрин кьадаррин нисбет',
index 4e0d64b..0ee6c11 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',
@@ -217,7 +216,6 @@ $messages = array(
 'disclaimers' => 'Negas de respondablia',
 'disclaimerpage' => 'Project:Nega jeneral de respondablia',
 'edithelp' => 'Aida con edita',
-'edithelppage' => 'Help:Edita',
 'helppage' => 'Help:Contenis',
 'mainpage' => 'Paje Prima',
 'mainpage-description' => 'Paje Prima',
@@ -437,7 +435,6 @@ La arcivo de sutraes per esta paje es asi per conveni:",
 'prevn' => '{{PLURAL:$1|$1}} presedente',
 'nextn' => '{{PLURAL:$1|$1}} seguente',
 'viewprevnext' => 'Vide ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:Contenis',
 'search-result-size' => '$1 ({{PLURAL:$2|1 parola|$2 parolas}})',
 'search-section' => '(sesion $1)',
 'search-interwiki-default' => 'Resultas de $1:',
@@ -662,7 +659,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 +927,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 +951,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..672e129 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',
@@ -249,7 +247,6 @@ $1",
 'disclaimers' => "Okutangaaza ku kkomo ery'obuvunaaniro bwaffe obw'omu mateeka",
 'disclaimerpage' => "Project:Okutangaaza ku kkomo ery'obuvunaaniro bwaffe obw'omu mateeka",
 'edithelp' => 'Nyamba',
-'edithelppage' => "Help:Obuyambi ku by'okukyusakyusa",
 'helppage' => 'Help:Endagiriro',
 'mainpage' => 'Olupapula Olusooka',
 'mainpage-description' => 'Olupapula Olusooka',
@@ -523,10 +520,8 @@ Oyinz'okuba nga wamaze okutegeka ekya ddala ekipya oba nga wakasabayo eky'ekisee
 
 # Special:PasswordReset
 'passwordreset' => 'Damu okutegeka ekyama',
-'passwordreset-text' => "Oba oyagala okufuna 'email' ekujjukiza ebikwata ku akawunti yo, jjuza foomu eno.",
 'passwordreset-legend' => 'Damu okutegeka ekyama',
 'passwordreset-disabled' => "Eby'okuddamu okutegeka ebyama biymirizidwa ku wiki eno.",
-'passwordreset-pretext' => '{{PLURAL:$1||Wandika wo kimu ku ebiri mu lukalala}}',
 'passwordreset-username' => "Ery'obwa memba:",
 'passwordreset-email' => "Endagiriro eya 'email':",
 'passwordreset-emailtitle' => "Ebya akawunti ey'oku {{SITENAME}}",
@@ -750,6 +745,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 />
@@ -824,7 +822,6 @@ oba ku gano agali ku lupapula luno.<br />
 'searchmenu-legend' => 'Kyusamu ennoonya',
 'searchmenu-exists' => "'''Olupapula \"[[:\$1]]\" gyeruli ku wiki eno.'''",
 'searchmenu-new' => "'''Oba oyagala, olupapula \"[[:\$1]]\" gwe osobola okulukolawo ku wiki eno.'''",
-'searchhelp-url' => 'Help:Endagiriro',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Kebera mu mpapula eziriko akatandikwa kano]]',
 'searchprofile-articles' => "Empapula ez'ensonga",
 'searchprofile-project' => "Empapula eziriko obuyambi n'eza Kawefube",
index d7d50bb..6d892eb 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',
@@ -397,7 +396,6 @@ $1',
 'disclaimers' => 'Aafwiezinge aansjprakelikheid',
 'disclaimerpage' => 'Project:Algemein aafwiezing aansjprakelikheid',
 'edithelp' => 'Hulp bie bewirke',
-'edithelppage' => 'Help:Instructies',
 'helppage' => 'Help:Help',
 'mainpage' => 'Veurblaad',
 'mainpage-description' => 'Veurblaad',
@@ -574,7 +572,7 @@ Mäögelik waert nog 'n deil pagina's getuind esofs te nog aangemeld bis pès te
 'logout' => 'Aafmelde',
 'userlogout' => 'Aafmelde',
 'notloggedin' => 'Neet aangemeld',
-'nologin' => "Höbs te nog geine gebroekersnaam? '''$1'''.",
+'nologin' => 'Höbs te nog geine gebroekersnaam? $1.',
 'nologinlink' => "Maak 'ne gebroekersnaam aan",
 'createaccount' => 'Nuuj gebroekersprofiel aanmake.',
 'gotaccount' => "Höbs te al 'ne gebroekersnaam? '''$1'''.",
@@ -668,10 +666,8 @@ Meugelik höbs doe dien wachwaord al gewiezig of 'n nuuj tiedelik wachwaord aang
 
 # Special:PasswordReset
 'passwordreset' => 'Wachwaord obbenuuts insjtèlle',
-'passwordreset-text' => "Völ dit form aan zodet weer dich 'ne mail kinne sjikk mit dien gebroekersgegaeves.",
 'passwordreset-legend' => 'Wachwaord obbenuuts insjtèlle',
 'passwordreset-disabled' => "'t Is hie neet meugelik óm die wachwaord óbbenuits in te sjtelle.",
-'passwordreset-pretext' => '{{PLURAL:$1||Veur ei van de vèljer hieónger in}}',
 'passwordreset-username' => 'Gebroekersnaam:',
 'passwordreset-domain' => 'Domein:',
 'passwordreset-capture' => 'Bekiek de resulterenden e-mail?',
@@ -892,6 +888,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.
@@ -1121,7 +1119,6 @@ Wees zeker det deze wieziging de gesjiedenisdoorloupendheid van de pagina zal be
 'searchmenu-legend' => 'Zeukopties',
 'searchmenu-exists' => "* Pagina '''[[$1]]'''",
 'searchmenu-new' => "'''De pagina \"[[:\$1]]\" aanmake op deze wiki'''",
-'searchhelp-url' => 'Help:Help',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Paginanaome mit dit veurveugsel weergaeve]]',
 'searchprofile-articles' => "Inhaudelike pagina's",
 'searchprofile-project' => "Help- en projekpagina's",
@@ -1167,15 +1164,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',
@@ -1623,7 +1611,7 @@ Gank trök nao t [[Special:Upload/stash/$1|uploadformuleer]] om dit perbleem te
 'upload-file-error' => 'Interne fout',
 'upload-file-error-text' => "'n Intern fuitje vonj plaats wie 'n tiedelik besjtandj op de server woort aangemaak. Num aub contac op met 'ne [[Special:ListUsers/sysop|systeemwèrker]].",
 'upload-misc-error' => 'Onbekinde uploadfout',
-'upload-misc-error-text' => "d'r Is tiedes 't uploade 'ne onbekinde fout opgetraeje. Controleer of de URL correc en besjikbaar is en probeer 't opnuuj. Es 't probleem aanhaojt, nöm dan contac op met 'ne [[Special:ListUsers/sysop|systeembeheerder]].",
+'upload-misc-error-text' => "d'r Is tiedes 't uploade 'ne onbekinde fout opgetraeje. Controleer of de URL correc en besjikbaar is en probeer 't opnuuj. Es 't probleem aanhaojt, nöm dan contac op met 'ne [[Special:ListUsers/sysop|systeemwèrker]].",
 'upload-too-many-redirects' => 'De URL bevadde te väöl doorverwiezinge',
 'upload-unknown-size' => 'Ónbekèndje gruuedje',
 'upload-http-error' => 'dr Is n HTTP-fout opgetraoje: $1',
@@ -1715,7 +1703,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 +2099,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 +2817,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 +2915,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 +3093,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 +3501,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..e61c248 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,43 +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",
-'edithelppage' => 'Help:Modiffica',
+'edithelp' => 'Agiùtto',
 'helppage' => 'Help:Contegnûi',
 'mainpage' => 'Pàgina prinçipâ',
 'mainpage-description' => 'Pagina prinçipâ',
@@ -313,17 +362,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 +390,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 +443,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 +604,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 +621,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 +654,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 +663,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 +690,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,9 +703,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',
-'searchhelp-url' => 'Help:Contegnûi',
+'searchmenu-exists' => "'''Inte questa wiki gh'è za 'na pàgina co-o nómme \"[[:\$1]]\"'''",
+'searchmenu-new' => 'Crea a pagina "[[:$1]]" insce questo scito',
 'searchprofile-articles' => 'Pàgina di contegnûi',
 'searchprofile-project' => 'Pàgine de agiùtto e relative a-o progetto',
 'searchprofile-images' => 'Moltimedia',
@@ -614,15 +720,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 +749,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 +769,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 +794,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 +803,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 +821,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 +840,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 +882,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 +915,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 +931,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 +976,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 +991,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 +1020,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 +1038,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 +1088,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 +1104,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 +1137,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 +1185,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 +1198,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 +1218,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 +1244,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 +1258,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 +1283,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 +1294,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 +1317,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 +1363,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 +1372,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..5c60ce0 100644 (file)
@@ -147,7 +147,6 @@ $messages = array(
 'disclaimers' => 'Kūondõkst',
 'disclaimerpage' => 'Project:Kūondõkst',
 'edithelp' => 'Redigīerimiz opātõks',
-'edithelppage' => 'Help:Redigīerimiz_opātõks',
 'helppage' => 'Help:Sižāli',
 'mainpage' => 'Eḑḑilēḑ',
 'mainpage-description' => 'Eḑḑilēḑ',
@@ -495,7 +494,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..3d90651 100644 (file)
@@ -13,6 +13,7 @@
  * @author DracoRoboter
  * @author Flavio05
  * @author GatoSelvadego
+ * @author Geitost
  * @author Insübrich
  * @author Kemmótar
  * @author Malafaya
@@ -132,8 +133,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',
@@ -324,7 +323,6 @@ $1",
 'disclaimers' => 'Disclaimers',
 'disclaimerpage' => 'Project:Avertenz generaj',
 'edithelp' => 'Manual de spiegazión',
-'edithelppage' => 'Help:Scriv un articul',
 'helppage' => 'Help:Contegnüü',
 'mainpage' => 'Pagina principala',
 'mainpage-description' => 'Pagina principala',
@@ -433,7 +431,7 @@ Tegné cünt che certi paginn pödass che i seguiten a vedess tant 'me se a füd
 'logout' => 'Va fö',
 'userlogout' => 'Và fö',
 'notloggedin' => 'Te seet minga dent in del sistema',
-'nologin' => "Gh'avii anmò da registrav? '''$1'''.",
+'nologin' => "Gh'avii anmò da registrav? $1.",
 'nologinlink' => 'Creé un cünt!',
 'createaccount' => 'Creá un cünt',
 'gotaccount' => "Gh'hee-t giamò un cünt? '''$1'''.",
@@ -608,7 +606,6 @@ Per infurmazion, varda ind el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGE
 'viewprevnext' => 'Vidé ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-legend' => 'Upzión de ricerca',
 'searchmenu-new' => "'''Trà in pee la pagina \"[[:\$1]]\" ins quel sit chì!'''",
-'searchhelp-url' => 'Help:Contegnüü',
 'searchprofile-articles' => 'Paginn de cuntegnüü',
 'searchprofile-project' => 'Paginn de jüt e de pruget',
 'searchprofile-images' => 'Multimedia',
@@ -945,7 +942,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 +1335,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 +1359,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..d8740a6 100644 (file)
@@ -122,8 +122,6 @@ $messages = array(
 'tog-enotifminoredits' => 'ສົ່ງ ອີເມລ ໃຫ້ຂ້ອຍ ເວລາມີການດັດແກ້ເລັກນ້ອຍນຳ',
 'tog-enotifrevealaddr' => 'ສະແດງ ອີເມລ ຂອງຂ້ອຍ ໃນ ການແຈ້ງວ່າມີຂໍ້ຄວາມອີເມລ',
 'tog-shownumberswatching' => 'ສະແດງ ຈຳນວນຜູ້ໃຊ້ ຕິດຕາມໝ້ານີ້',
-'tog-externaleditor' => 'ໃຊ້ ເອດິດເຕີທາງນອກ ຖ້າບໍ່ມີການຕັ້ງ',
-'tog-externaldiff' => 'ໃຊ້ ສ່ວນຕ່າງທາງນອກ ຖ້າບໍ່ມີ ການກຳໜົດ',
 'tog-forceeditsummary' => 'ເຕື່ອນຂ້ອຍ ຖ້າບໍ່ໄດ້ຂຽນຫຍັງໃສ່ ຊ່ອງ ສະຫຼຸບການດັດແກ້',
 'tog-watchlisthideown' => 'ເຊື່ອງ ການດັດແກ້ໂດຍຂ້ອຍ ໃນ ລາຍການຕິດຕາມຂອງຂ້ອຍ',
 'tog-watchlisthidebots' => 'ເຊື່ອງ ການດັດແກ້ ໂດຍ ບອທ໌ ໃນລາຍການຕິດຕາມຂອງຂ້ອຍ',
@@ -279,7 +277,6 @@ $messages = array(
 'disclaimers' => 'ຂໍ້ປະຕິເສດຄວາມຮັບຜິດຊອບ',
 'disclaimerpage' => 'Project:ຂໍ້ປະຕິເສດຄວາມຮັບຜິດຊອບ',
 'edithelp' => 'ວິທີດັດແກ້ໜ້າ',
-'edithelppage' => 'Help:ການດັດແກ້',
 'helppage' => 'Help:ເນື້ອໃນ',
 'mainpage' => 'ໜ້າຫຼັກ',
 'mainpage-description' => 'ໜ້າຫຼັກ',
@@ -476,7 +473,6 @@ $messages = array(
 'prevn' => '{{PLURAL:$1|$1}} ກ່ອນໜ້າ',
 'nextn' => '{{PLURAL:$1|$1}} ຕໍ່ໄປ',
 'viewprevnext' => 'ເບິ່ງ ($1 {{int:pipe-separator}} $2) ($3).',
-'searchhelp-url' => 'Help:ເນື້ອໃນ',
 'search-result-size' => '$1 ({{PLURAL:$2|1 ຄຳ|$2 ຄຳ}})',
 'search-result-score' => 'ຄວາມກ່ຽວຂ້ອງ: $1%',
 'search-redirect' => '(ໂອນ $1)',
@@ -687,7 +683,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Special:ListUsers
 'listusers-submit' => 'ສະແດງ',
 
-# E-mail user
+# Email user
 'emailuser' => 'ສົ່ງອີເມລ ຫາ ຜູ້ໃຊ້ນີ້',
 'emailpage' => 'ສົ່ງອີເມລ ຫາ ຜູ້ໃຊ້',
 'emailpagetext' => 'ຖ້າຜູ້ໃຊ້ນີ້ ຂຽນທີ່ຢູ່ອີເມລຢ່າງຖືກຕ້ອງຢູ່ການຕັ້ງຄ່າຂອງລາວ, ຟອມທາງລຸ່ມນີ້​ ຈະສົ່ງຂໍ້ຄວາມໜຶ່ງຫາທີ່ຢູ່ອີເມລນັ້ນ.
@@ -714,7 +710,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 +897,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Metadata
 'metadata-expand' => 'ສະແດງລະອຽດຕື່ມ',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ຄວາມກ້ວາງ',
 'exif-imagelength' => 'ຄວາມສູງ',
 'exif-imagedescription' => 'ຫົວຂໍ້ຮູບ',
@@ -917,7 +913,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'namespacesall' => 'ທັງໝົດ',
 'monthsall' => 'ທັງໝົດ',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'ຢືນຢັນ ທີ່ຢູ່ ອີເມລ',
 'confirmemail_pending' => 'ລະຫັດຢືນຢັນ ໄດ້ຖືກສົ່ງໄປ ທີ່ຢູ່ ອີເມລ ຂອງ ທ່ານ; ຖ້າ ທ່ານ ຫາກໍ່ສ້າງບັນຊີ
 , ທ່ານ ຄວນຈະລໍຖ້າໜ້ອຍໜຶ່ງ ກ່ອນຈະ ພະຍາຍາມ
@@ -962,9 +958,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Special:Version
 'version' => 'ສະບັບ',
 
-# Special:FilePath
-'filepath' => 'ທາງໄປຫາໄຟລ໌',
-
 # Special:SpecialPages
 'specialpages' => 'ໜ້າພິເສດ',
 
index 6f66906..5b84b35 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',
@@ -191,7 +189,6 @@ $messages = array(
 'disclaimers' => 'Dikulemi',
 'disclaimerpage' => 'Project:Dikulemi generali',
 'edithelp' => "Hloli ye ng'i",
-'edithelppage' => "Help:Hloli ye ng'i",
 'helppage' => 'Help:Buinaneli di petulo',
 'mainpage' => 'Petulo yem efro',
 'mainpage-description' => 'Petulo yem efro',
@@ -455,15 +452,11 @@ Informasi: (bye) = petuho a nca selt,
 'prevn' => 'kona {{PLURAL:$1|$1}}',
 'nextn' => 'lila {{PLURAL:$1|$1}}',
 'viewprevnext' => 'Kamukile ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:Buinaneli di petulo',
 'searchall' => 'xete',
 'showingresults' => "Kamukile opi {{PLURAL:$1|'''1''' ekali|'''$1''' ekalina}} di #'''$2'''.",
 '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 +688,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 +1012,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 6f91fe0..1cefa93 100644 (file)
  * @author Dark Eagle
  * @author Eitvys200
  * @author Garas
+ * @author Geitost
  * @author Homo
  * @author Hugo.arg
  * @author Ignas693
  * @author Kaganer
+ * @author Mantak111
  * @author Matasg
  * @author Meno25
  * @author Ola
@@ -213,8 +215,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 +228,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',
@@ -291,6 +292,18 @@ $messages = array(
 'oct' => 'spa',
 'nov' => 'lap',
 'dec' => 'grd',
+'january-date' => 'Sausio $1',
+'february-date' => 'Vasario $1',
+'march-date' => 'Kovo $1',
+'april-date' => 'Balandžio $1',
+'may-date' => 'Gegužės $1',
+'june-date' => 'Birželio $1',
+'july-date' => 'Liepos $1',
+'august-date' => 'Rugpjūčio $1',
+'september-date' => 'Rugsėjo $1',
+'october-date' => 'Spalio $1',
+'november-date' => 'Lapkričio $1',
+'december-date' => 'Gruodžio $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorija|Kategorijos}}',
@@ -372,6 +385,7 @@ $messages = array(
 'create-this-page' => 'Sukurti šį puslapį',
 'delete' => 'Trinti',
 'deletethispage' => 'Ištrinti šį puslapį',
+'undeletethispage' => 'Attrinti šį puslapį',
 'undelete_short' => 'Atkurti $1 {{PLURAL:$1:redagavimą|redagavimus|redagavimų}}',
 'viewdeleted_short' => 'Peržiūrėti $1 {{PLURAL:$1|ištrintą keitimą|ištrintus keitimus|ištrintų keitimų}}',
 'protect' => 'Užrakinti',
@@ -425,7 +439,6 @@ $1',
 'disclaimers' => 'Atsakomybės apribojimas',
 'disclaimerpage' => 'Project:Atsakomybės apribojimas',
 'edithelp' => 'Kaip redaguoti',
-'edithelppage' => 'Help:Redagavimas',
 'helppage' => 'Help:Turinys',
 'mainpage' => 'Pagrindinis puslapis',
 'mainpage-description' => 'Pagrindinis puslapis',
@@ -564,13 +577,16 @@ Užklausa: $2',
 'viewsourcetext' => 'Jūs galite žiūrėti ir kopijuoti puslapio kodą:',
 'viewyourtext' => "Jūs galite matyti ir kopijuoti '''savo redagavimų''' tekstą į šį puslapį:",
 'protectedinterface' => 'Šiame puslapyje yra apsaugotas nuo piktnaudžiavimo programinės įrangos sąsajos tekstas.',
-'editinginterface' => "'''Dėmesio:''' Jūs redaguojate puslapį, kuris yra naudojamas programinės įrangos sąsajos tekste. Pakeitimai šiame puslapyje taip pat pakeis naudotojo sąsajos išvaizdą ir kitiems naudojams. Jei norite išversti, siūlome pasinaudoti [//translatewiki.net/wiki/Main_Page?setlang=lt „translatewiki.net“], „MediaWiki“ lokalizacijos projektu.",
+'editinginterface' => "'''Dėmesio:''' Jūs redaguojate puslapį, kuris yra naudojamas programinės įrangos sąsajos tekste. Pakeitimai šiame puslapyje taip pat pakeis naudotojo sąsajos išvaizdą ir kitiems naudotojams šiame wiki.
+Jei norite pridėti ir keisti vertimus, siūlome pasinaudoti [//translatewiki.net/wiki/Main_Page?setlang=lt „translatewiki.net“], „MediaWiki“ lokalizacijos projektu.",
 'sqlhidden' => '(SQL užklausa paslėpta)',
 'cascadeprotected' => 'Šis puslapis buvo apsaugotas nuo redagavimo, kadangi jis yra įtrauktas į {{PLURAL:$1|šį puslapį, apsaugotą|šiuos puslapius, apsaugotus}} „pakopinės apsaugos“ pasirinktimi:
 $2',
 'namespaceprotected' => "Jūs neturite teisės redaguoti puslapių '''$1''' srityje.",
 'customcssprotected' => 'Jūs neturite teisės keisti šį CSS puslapį, nes jame yra kito naudotojo asmeniniai nustatymai.',
 'customjsprotected' => 'Jūs neturite teisės keisti šį JavaScript puslapį, nes jame yra kito naudotojo asmeniniai nustatymai.',
+'mycustomcssprotected' => 'Jūs neturite teisės redaguoti šio CSS puslapio.',
+'mycustomjsprotected' => 'Jūs neturite teisės redaguoti šio JavaScript puslapio.',
 'ns-specialprotected' => 'Specialieji puslapiai negali būti redaguojami.',
 'titleprotected' => "[[User:$1|$1]] apsaugojo šį pavadinimą nuo sukūrimo.
 Nurodyta priežastis yra ''$2''.",
@@ -596,9 +612,18 @@ Pastaba: kai kuriuose puslapiuose ir toliau gali rodyti, kad esate prisijungęs
 'welcomecreation-msg' => 'Jūsų paskyra buvo sukurta.
 Nepamirškite pakeisti savo [[Special:Preferences|{{SITENAME}} nustatymų]].',
 'yourname' => 'Naudotojo vardas:',
+'userlogin-yourname' => 'Naudotojo vardas',
+'userlogin-yourname-ph' => 'Įveskite savo naudotojo vardą',
 'yourpassword' => 'Slaptažodis:',
+'userlogin-yourpassword' => 'Slaptažodis',
+'userlogin-yourpassword-ph' => 'Įveskite savo slaptažodį',
+'createacct-yourpassword-ph' => 'Įveskite slaptažodį',
 'yourpasswordagain' => 'Pakartokite slaptažodį:',
+'createacct-yourpasswordagain' => 'Patvirtinkite slaptažodį',
+'createacct-yourpasswordagain-ph' => 'Įveskite slaptažodį dar kartą',
 'remembermypassword' => 'Prisiminti prisijungimo duomenis šiame kompiuteryje (daugiausiai $1 {{PLURAL:$1|dieną|dienas|dienų}})',
+'userlogin-remembermypassword' => 'Įsiminti mane',
+'userlogin-signwithsecure' => 'Naudoti saugią jungtį',
 'securelogin-stick-https' => 'Likite prisijungę prie HTTPS po prisijungimo',
 'yourdomainname' => 'Jūsų domenas:',
 'password-change-forbidden' => 'Jus negalite keisti slaptažodžių šioje wiki.',
@@ -611,18 +636,38 @@ Nepamirškite pakeisti savo [[Special:Preferences|{{SITENAME}} nustatymų]].',
 'logout' => 'Atsijungti',
 'userlogout' => 'Atsijungti',
 'notloggedin' => 'Neprisijungęs',
+'userlogin-noaccount' => 'Neturite paskyros?',
+'userlogin-joinproject' => 'Prisijungti prie {{SITENAME}}',
 'nologin' => "Neturite prisijungimo vardo? '''$1'''.",
 'nologinlink' => 'Sukurkite paskyrą',
 'createaccount' => 'Sukurti paskyrą',
 'gotaccount' => "Jau turite paskyrą? '''$1'''.",
 'gotaccountlink' => 'Prisijunkite',
 'userlogin-resetlink' => 'Pamiršote savo prisijungimo duomenis?',
+'userlogin-resetpassword-link' => 'Nustatykite slaptažodį iš naujo',
+'helplogin-url' => 'Help:Prisijungimas',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Prisijungimo pagalba]]',
+'createacct-join' => 'Įveskite savo informaciją žemiau.',
+'createacct-emailrequired' => 'Elektroninio pašto adresas',
+'createacct-emailoptional' => 'Elektroninio pašto adresas (neprivaloma)',
+'createacct-email-ph' => 'Įveskite savo elektroninio pašto adresą',
 'createaccountmail' => 'Naudokite laikiną atsitiktinį slaptažodį ir nusiųskite jį į elektroninį paštą, nurodytą žemiau.',
+'createacct-realname' => 'Vardas (neprivaloma)',
 'createaccountreason' => 'Priežastis:',
+'createacct-reason' => 'Priežastis',
+'createacct-reason-ph' => 'Kodėl kuriate kitą paskyrą',
+'createacct-captcha' => 'Saugumo patikrinimas',
+'createacct-imgcaptcha-ph' => 'Įveskite tekstą, kurį matote aukščiau',
+'createacct-submit' => 'Sukurkite savo paskyrą',
+'createacct-benefit-heading' => '{{SITENAME}} sukurtas žmonių kaip jūs.',
+'createacct-benefit-body1' => '{{PLURAL:$1|keitimas|keitimai|keitimų}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|puslapis|puslapiai}}',
+'createacct-benefit-body3' => 'Neseni {{PLURAL:$1|autorius|autoriai|autorių}}',
 'badretype' => 'Įvesti slaptažodžiai nesutampa.',
 'userexists' => 'Įvestasis naudotojo vardas jau naudojamas.
 Prašome pasirinkti kitą vardą.',
 'loginerror' => 'Prisijungimo klaida',
+'createacct-error' => 'Paskyros kūrimo klaida',
 'createaccounterror' => 'Nepavyko sukurti paskyros: $1',
 'nocookiesnew' => 'Naudotojo paskyra buvo sukurta, bet jūs nesate prisijungęs. {{SITENAME}} naudoja slapukus, kad prijungtų naudotojus. Jūs esate išjungę slapukus. Prašome įjungti juos, tada prisijunkite su savo naujuoju naudotojo vardu ir slaptažodžiu.',
 'nocookieslogin' => '{{SITENAME}} naudoja slapukus, kad prijungtų naudotojus. Jūs esate išjungę slapukus. Prašome įjungti juos ir pamėginkite vėl.',
@@ -677,7 +722,7 @@ Prašome įvesti gerai suformuotą adresą arba palikite tą laukelį tuščią.
 'cannotchangeemail' => 'Paskyros e-mail adresas šiame viki negali būti keičiamas.',
 'emaildisabled' => 'Ši svetainė negali siųsti elektroninių laiškų.',
 'accountcreated' => 'Paskyra sukurta',
-'accountcreatedtext' => 'Naudotojo paskyra $1 buvo sukurta.',
+'accountcreatedtext' => 'Naudotojo paskyra [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) buvo sukurta.',
 'createaccount-title' => '{{SITENAME}} paskyros kūrimas',
 'createaccount-text' => 'Projekte {{SITENAME}} ($4) kažkas sukūrė paskyrą „$2“ su slaptažodžiu „$3“ panaudodamas jūsų el. pašto adresą.
 Jūs turėtumėte prisijungti ir pasikeisti savo slaptažodį.
@@ -712,13 +757,15 @@ Palaukite prieš bandant vėl.',
 'resetpass-wrong-oldpass' => 'Klaidingas laikinas ar esamas slaptažodis.
 Jūs galbūt jau sėkmingai pakeitėte savo slaptažodį ar gavote naują laikiną slaptažodį.',
 'resetpass-temp-password' => 'Laikinas slaptažodis:',
+'resetpass-abort-generic' => 'Slaptažodžio keitimas buvo nutrauktas nuo ekstenzijos.',
 
 # Special:PasswordReset
 'passwordreset' => 'Atstatyti slaptažodį',
-'passwordreset-text' => 'Užpildykite šią formą, norėdami atkurti savo slaptažodį.',
+'passwordreset-text-one' => 'Užpildykite šią formą, norėdami atkurti savo slaptažodį.',
+'passwordreset-text-many' => '{{PLURAL:$1|Įveskite vieną iš dalies duomenų, norėdami atkurti jūsų 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}}',
+'passwordreset-emaildisabled' => 'El. pašto funkcijos uždraustos šiame wiki.',
 'passwordreset-username' => 'Naudotojo vardas:',
 'passwordreset-domain' => 'Domenas:',
 'passwordreset-capture' => 'Peržiūrėti galutinį e-mail laišką?',
@@ -736,8 +783,8 @@ Jūs turėtumėte prisijungti ir pasirinkti naują slaptažodį. Jei kažkas kit
 {{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.',
-'passwordreset-emailsent-capture' => 'Priminimo e-mail laiškas bus pasiųstas, toks koks parodytas.',
+'passwordreset-emailsent' => 'Slaptažodžio priminimo laiškas buvo išsiųstas.',
+'passwordreset-emailsent-capture' => 'Slaptažodžio priminimo laiškas bus išsiųstas, toks koks parodytas.',
 'passwordreset-emailerror-capture' => 'Priminimo e-mail laiškas buvo sugeneruotas, toks koks parodytas, bet pasiuntimas naudotojui buvo nesėkmingas: $1',
 
 # Special:ChangeEmail
@@ -847,7 +894,7 @@ Jūs galite [[Special:Search/{{PAGENAME}}|ieškoti šio puslapio pavadinimo]] ki
 arba [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaguoti šį puslapį]</span>.',
 'noarticletext-nopermission' => 'Šiuo metu šiame puslapyje nėra jokio teksto.
 Jūs galite [[Special:Search/{{PAGENAME}}|ieškoti šio puslapio pavadinimo]] kituose puslapiuose,
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ieškoti susijusių įrašų]</span>.',
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ieškoti susijusių įrašų]</span>, bet jūs neturite teisės sukurti šį puslapį.',
 'userpage-userdoesnotexist' => 'Naudotojo paskyra „<nowiki>$1</nowiki>“ yra neužregistruota. Prašom patikrinti, ar jūs norite kurti/redaguoti šį puslapį.',
 'userpage-userdoesnotexist-view' => 'Naudotojo paskyra „$1“ neužregistruota.',
 'blocked-notice-logextract' => 'Šis naudotojas šiuo metu yra užblokuotas.
@@ -868,7 +915,7 @@ Jūs galite [[Special:Search/{{PAGENAME}}|ieškoti šio puslapio pavadinimo]] ki
 'updated' => '(Atnaujinta)',
 'note' => "'''Pastaba:'''",
 'previewnote' => "''Nepamirškite, kad tai tik peržiūra, pakeitimai dar nėra išsaugoti!'''",
-'continue-editing' => 'Tęsti redagavimą',
+'continue-editing' => 'Eiti į redagavimo sritį',
 'previewconflict' => 'Ši peržiūra parodo tekstą iš viršutiniojo teksto redagavimo lauko taip, kaip jis bus rodomas, jei pasirinksite išsaugoti.',
 'session_fail_preview' => "'''Atsiprašome! Mes negalime vykdyti jūsų keitimo dėl sesijos duomenų praradimo.
 Prašome pamėginti vėl. Jei tai nepadeda, pamėginkite atsijungti ir prisijungti atgal.'''",
@@ -903,7 +950,7 @@ Taip pat jūs pasižadate, kad tai jūsų pačių rašytas tekstas arba kopijuot
 iš viešų ar panašių nemokamų šaltinių (detaliau - $1).
 '''NEKOPIJUOKITE AUTORINĖMIS TEISĖMIS APSAUGOTŲ DARBŲ BE LEIDIMO!'''",
 'longpageerror' => "'''KLAIDA: Tekstas, kurį pateikėte, yra $1 {{PLURAL:$1|kilobaito|kilobaitų|kilobaitų}} ilgio, tai yra didesnis nei yra leistina. Yra leidžiami tiktai $2 {{PLURAL:$2|kilobaitas|kilobaitai|kilobaitų}}.''' Jis nebus išsaugotas.",
-'readonlywarning' => "'''DĖMESIO: Duomenų bazė buvo užrakinta techninei profilaktikai, todėl šiuo metu negalėsite išsaugoti savo pakeitimų. Siūlome nusikopijuoti tekstą į tekstinį failą ir vėliau jį čia išsaugoti.'''
+'readonlywarning' => "'''Įspėjimas: Duomenų bazė buvo užrakinta techninei profilaktikai, todėl šiuo metu negalėsite išsaugoti savo pakeitimų. Siūlome nusikopijuoti tekstą į tekstinį failą ir vėliau jį čia išsaugoti.'''
 
 Ją užrakinusio administratoriaus paaiškinimas: $1",
 'protectedpagewarning' => "'''Dėmesio: Šis puslapis yra užrakintas taip, kad jį redaguoti gali tik administratoriaus teises turintys naudotojai.'''
@@ -941,11 +988,13 @@ Tam nėra paaiškinimo.',
 Greičiausiai jis yra ištrintas.',
 'edit-conflict' => 'Redagavimo konfliktas.',
 'edit-no-change' => 'Jūsų keitimas buvo ignoruotas kadangi nebuvo atlikta jokių teksto pakeitimų.',
+'postedit-confirmation' => 'Jūsų pakeitimas išsaugotas.',
 'edit-already-exists' => 'Negalima sukurti naujo puslapio.
 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',
@@ -1177,7 +1226,6 @@ Prašome patikrinti sąrašus.',
 'searchmenu-legend' => 'Paieškos nustatymai',
 'searchmenu-exists' => "'''Puslapis pavadinimu „[[$1]]“ šioje wiki'''",
 'searchmenu-new' => "'''Sukurti puslapį „[[:$1]]“ šioje wiki!'''",
-'searchhelp-url' => 'Help:Turinys',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ieškoti puslapių su šiuo priešdėliu]]',
 'searchprofile-articles' => 'Turinio puslapiai',
 'searchprofile-project' => 'Pagalbos ir projekto puslapiai',
@@ -1219,18 +1267,9 @@ 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',
+'mypreferences' => 'Nustatymai',
 'prefs-edits' => 'Keitimų skaičius:',
 'prefsnologin' => 'Neprisijungęs',
 'prefsnologintext' => 'Jums reikia būti <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} prisijungusiam]</span>, kad galėtumėte keisti savo nustatymus.',
@@ -1293,7 +1332,7 @@ Galite panaudoti šią atsitiktinai sugeneruotą reikšmę: $1',
 'timezoneregion-indian' => 'Indijos vandenynas',
 'timezoneregion-pacific' => 'Ramusis vandenynas',
 'allowemail' => 'Leisti siųsti el. laiškus iš kitų naudotojų',
-'prefs-searchoptions' => 'Paieškos nuostatos',
+'prefs-searchoptions' => 'Paieška',
 'prefs-namespaces' => 'Vardų sritys',
 'defaultns' => 'Pagal nutylėjimą ieškoti šiose vardų srityse:',
 'default' => 'pagal nutylėjimą',
@@ -1306,8 +1345,8 @@ Tai nebeatšaukiama.',
 'prefs-emailconfirm-label' => 'El. pašto patvirtinimas:',
 'prefs-textboxsize' => 'Redagavimo lango dydis',
 'youremail' => 'El. paštas:',
-'username' => 'Naudotojo vardas:',
-'uid' => 'Naudotojo ID:',
+'username' => '{{GENDER:$1Naudotojo vardas}}:',
+'uid' => '{{GENDER:$1|Naudotojo}} ID:',
 'prefs-memberingroups' => '{{PLURAL:$1|Grupės|Grupių}} narys:',
 'prefs-registration' => 'Registravimosi laikas:',
 'yourrealname' => 'Tikrasis vardas:',
@@ -1372,6 +1411,7 @@ teisės",
 'userrights-notallowed' => 'Jūsų paskyra neturi teisių priskirti ar panaikinti naudotojų teises.',
 'userrights-changeable-col' => 'Grupės, kurias galite keisti',
 'userrights-unchangeable-col' => 'Grupės, kurių negalite keisti',
+'userrights-conflict' => 'Naudotojo teisių konfliktas! Prašome dar kartą taikyti savo keitimus.',
 
 # Groups
 'group' => 'Grupė:',
@@ -1442,6 +1482,7 @@ teisės",
 'right-editusercssjs' => 'Redaguoti kitų naudotojų CSS ir JS failus',
 'right-editusercss' => 'Redaguoti kitų naudotojų CSS failus',
 'right-edituserjs' => 'Redaguoti kitų naudotojų JS failus',
+'right-editmyuserjs' => 'Redaguokite savo naudotojo vartotojo JavaScript failus',
 'right-rollback' => 'Greitai atmesti paskutinio naudotojo tam tikro puslapio pakeitimus',
 'right-markbotedits' => 'Žymėti atmestus keitimus kaip atliktus boto',
 'right-noratelimit' => 'Netaikyti greičio apribojimų',
@@ -1673,9 +1714,9 @@ $1',
 'upload-proto-error-text' => 'Nuotoliniai įkėlimas reikalauja, kad URL prasidėtų <code>http://</code> arba <code>ftp://</code>.',
 'upload-file-error' => 'Vidinė klaida',
 'upload-file-error-text' => 'Įvyko vidinė klaida bandant sukurti laikinąjį failą serveryje.
-Prašome susisiekti su [[Special:ListUsers/sysop|sistemos administratoriumi]].',
+Prašome susisiekti su [[Special:ListUsers/sysop|administratoriumi]].',
 'upload-misc-error' => 'Nežinoma įkėlimo klaida',
-'upload-misc-error-text' => 'Įvyko nežinoma klaida vykstant įkėlimui. Prašome patikrinti, kad URL teisingas bei pasiekiamas ir pamėginkite vėl. Jei problema lieka, susisiekite su sistemos administratoriumi.',
+'upload-misc-error-text' => 'Įvyko nežinoma klaida vykstant įkėlimui. Prašome patikrinti, kad URL teisingas bei pasiekiamas ir pamėginkite vėl. Jei problema lieka, susisiekite su [[Special:ListUsers/sysop|administratoriumi]].',
 'upload-too-many-redirects' => 'URL yra per daug kartų peradresuotas',
 'upload-unknown-size' => 'Nežinomas dydis',
 'upload-http-error' => 'Įvyko HTTP klaida: $1',
@@ -1755,7 +1796,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>
@@ -1906,6 +1946,9 @@ Informacija iš [$2 failo aprašymo puslapio] yra pateikiama žemiau.',
 Nuorodos turėtų būti patikslintos, kad rodytų į konkretų puslapį.<br />
 Puslapis laikomas daugiaprasmiu puslapiu, jei jis naudoja šabloną, kuris yra nurodomas iš [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop-prop' => 'Ypatybės pavadinimas:',
+'pageswithprop-submit' => 'Eiti',
+
 'doubleredirects' => 'Dvigubi peradresavimai',
 'doubleredirectstext' => 'Šiame puslapyje yra puslapių, kurie nukreipia į kitus peradresavimo puslapius, sąrašas.
 Kiekvienoje eilutėje yra nuorodos į pirmąjį ir antrąjį peradresavimą, taip pat antrojo peradresavimo paskirtis, kuris paprastai yra „tikrasis“ paskirties puslapis, į kurį pirmasis peradresavimas ir turėtų rodyti.
@@ -2068,6 +2111,15 @@ Palaikomi protokolai: <code>$1</code> (nei vieno iš jų nenurodykite paieškoje
 'listusers-noresult' => 'Nerasta jokių naudotojų.',
 'listusers-blocked' => '(užblokuotas)',
 
+# Special:ActiveUsers
+'activeusers' => 'Aktyvių naudotojų sąrašas',
+'activeusers-intro' => 'Tai naudotojų sąrašas, kurie ką nors padarė per $1 {{PLURAL:$1|paskutinę dieną|paskutines dienas|paskutinių dienų}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|keitimas|keitimai|keitimų}} per $3 {{PLURAL:$3|paskutinę dieną|paskutines dienas|paskutinių dienų}}',
+'activeusers-from' => 'Rodyti naudotojus, pradedant:',
+'activeusers-hidebots' => 'Slėpti robotus',
+'activeusers-hidesysops' => 'Slėpti administratorius',
+'activeusers-noresult' => 'Nerasta jokių naudotojų.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Naudotojų grupių teisės',
 'listgrouprights-summary' => 'Žemiau pateiktas naudotojų grupių, apibrėžtų šioje wiki, ir su jomis susijusių teisių sąrašas.
@@ -2125,8 +2177,8 @@ El. pašto adresas, kurį įvedėte [[Special:Preferences|savo naudotojo nustaty
 'usermessage-editor' => 'Sistemos pranešėjas',
 
 # Watchlist
-'watchlist' => 'Stebimi puslapiai',
-'mywatchlist' => 'Stebimi puslapiai',
+'watchlist' => 'Stebimų sąrašas',
+'mywatchlist' => 'Stebimų sąrašas',
 'watchlistfor2' => 'Naudotojo $1 $2',
 'nowatchlist' => 'Neturite nei vieno stebimo puslapio.',
 'watchlistanontext' => 'Prašome $1, kad peržiūrėtumėte ar pakeistumėte elementus savo stebimųjų sąraše.',
@@ -2146,8 +2198,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 pranešimai 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ų}}.',
@@ -2296,7 +2348,7 @@ Dabar veikiančių puslapių apsaugų sąrašą rasite [[Special:ProtectedPages|
 'protect-default' => 'Leisti visiems naudotojams',
 'protect-fallback' => 'Reikalauti „$1“ teisės',
 'protect-level-autoconfirmed' => 'Blokuoti naujai prisiregistravusius ir neregistruotus naudotojus',
-'protect-level-sysop' => 'Tik administratoriai',
+'protect-level-sysop' => 'Leisti tik administratoriams',
 'protect-summary-cascade' => 'pakopinė apsauga',
 'protect-expiring' => 'baigia galioti $1 (UTC)',
 'protect-expiring-local' => 'baigia galioti $1',
@@ -2392,12 +2444,12 @@ $1',
 'blanknamespace' => '(Pagrindinė)',
 
 # Contributions
-'contributions' => 'Naudotojo indėlis',
+'contributions' => '{{GENDER:$1|Naudotojo}} įndėlis',
 'contributions-title' => '{{GENDER:$1|Naudotojo|Naudotojos}} $1 indėlis',
-'mycontris' => 'Mano įnašas',
+'mycontris' => 'Įnašai',
 'contribsub2' => 'Naudotojo $1 ($2)',
 'nocontribs' => 'Jokie keitimai neatitiko šių kriterijų.',
-'uctop' => ' (paskutinis)',
+'uctop' => '(dabartinis)',
 'month' => 'Nuo mėnesio (ir anksčiau):',
 'year' => 'Nuo metų (ir anksčiau):',
 
@@ -2435,7 +2487,7 @@ Paskutinis blokavimo įrašas pateikiamas žemiau:',
 'whatlinkshere-hideredirs' => '$1 nukreipimus',
 'whatlinkshere-hidetrans' => '$1 įtraukimus',
 'whatlinkshere-hidelinks' => '$1 nuorodas',
-'whatlinkshere-hideimages' => '$1 paveikslėlių nuorodos',
+'whatlinkshere-hideimages' => '$1 failų nuorodos',
 'whatlinkshere-filters' => 'Filtrai',
 
 # Block/unblock
@@ -2736,6 +2788,7 @@ Aplankykite [//www.mediawiki.org/wiki/Localisation „MediaWiki“ lokaliziciją
 'thumbnail-more' => 'Padidinti',
 'filemissing' => 'Dingęs failas',
 'thumbnail_error' => 'Klaida kuriant sumažintą paveikslėlį: $1',
+'thumbnail_error_remote' => 'Klaidos pranešimas iš $1: $2',
 'djvu_page_error' => 'DjVu puslapis nepasiekiamas',
 'djvu_no_xml' => 'Nepavyksta gauti XML DjVu failui',
 'thumbnail-temp-create' => 'Negalima sukurti laikinos failo miniatiūros',
@@ -2757,6 +2810,7 @@ Visi tarpprojektiniai importo veiksmai yra registruojami  [[Special:Log/import|i
 'import-interwiki-templates' => 'Įtraukti visus šablonus',
 'import-interwiki-submit' => 'Importuoti',
 'import-interwiki-namespace' => 'Paskirties vardų sritis:',
+'import-interwiki-rootpage' => 'Paskirties namų puslapis (pasirinktinai):',
 'import-upload-filename' => 'Failo pavadinimas:',
 'import-comment' => 'Komentaras:',
 'importtext' => 'Prašome eksportuoti iš projekto-šaltinio failo, naudojant [[Special:Export|eksportavimo pagalbininką.]]
@@ -2789,6 +2843,7 @@ Išsaugokite jį savo kompiuteryje ir įkelkite jį čia.',
 'import-error-interwiki' => 'Puslapis "$1" nebuvo įkeltas, kadangi jo pavadinimas yra rezervuotas išorinei nuorodai (interviki).',
 'import-error-special' => 'Puslapis "$1" nebuvo įkeltas, kadangi jis priklauso specialiai vardų sričiai, kurioje yra negalimi puslapiai.',
 'import-error-invalid' => 'Puslapis "$1" nebuvo įkeltas, kadangi jo vardas yra neteisingas.',
+'import-rootpage-invalid' => 'Duotas šaknų puslapis yra blogas pavadinimas.',
 
 # Import log
 'importlogpage' => 'Importavimų sąrašas',
@@ -2938,6 +2993,7 @@ Leidžia pridėti atmetimo priežastį komentaruose',
 'pageinfo-authors' => 'Skirtingų autorių skaičius',
 'pageinfo-recent-edits' => 'Paskutinųjų keitimų skaičius (per $1 laikotarpį)',
 'pageinfo-recent-authors' => 'Pastarųjų skirtingų redaguotojų skaičius',
+'pageinfo-magic-words' => 'Magiškas(-i) {{PLURAL:$1|žodis|žodžiai}} ($1)',
 'pageinfo-toolboxlink' => 'Puslapio informacija',
 'pageinfo-redirectsto' => 'Nukreipimai į',
 'pageinfo-redirectsto-info' => 'informacija',
@@ -2950,13 +3006,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ė',
 
@@ -3004,6 +3055,7 @@ Jį paleidus jūsų sistema gali būti pažeista.",
 'file-info-size-pages' => '$1 × $2 taškų, failo dydis: $3, MIME tipas: $4, $5 {{PLURAL:$5|page|pages}}',
 'file-nohires' => 'Geresnė raiška negalima.',
 'svg-long-desc' => 'SVG failas, formaliai $1 × $2 taškų, failo dydis: $3',
+'svg-long-desc-animated' => 'Animuotas SVG failas, formaliai $1 × $2 pikselių, failo dydis: $3',
 'svg-long-error' => 'Neleistinas SVG failas: $1',
 'show-big-image' => 'Pilna raiška',
 'show-big-image-preview' => 'Sumažintos iliustracijos dydis: $1 .',
@@ -3032,9 +3084,25 @@ Jį paleidus jūsų sistema gali būti pažeista.",
 'minutes' => '{{PLURAL:$1|$1 minutę|$1 minutes|$1 minučių}}',
 'hours' => '{{PLURAL:$1|$1 valandą|$1 valandas|$1 valandų}}',
 'days' => '{{PLURAL:$1|$1 dieną|$1 dienas|$1 dienų}}',
+'weeks' => '{{PLURAL:$1|$1 savaitė|$1 savaitės}}',
+'months' => '{{PLURAL:$1|$1 mėnuo|$1 mėnesiai}}',
+'years' => '{{PLURAL:$1|$1 metai}}',
 'ago' => 'prieš $1',
 'just-now' => 'tik dabar',
 
+# Human-readable timestamps
+'hours-ago' => 'prieš $1 {{PLURAL:$1|valandą|valandas|valandų}}',
+'minutes-ago' => 'prieš $1 {{PLURAL:$1|minutę|minutes|minučių}}',
+'seconds-ago' => 'prieš $1 {{PLURAL:$1|sekundę|sekundes|sekundžių}}',
+'monday-at' => 'Pirmadienį $1',
+'tuesday-at' => 'Antradienį $1',
+'wednesday-at' => 'Trečiadienį $1',
+'thursday-at' => 'Ketvirtadienį $1',
+'friday-at' => 'Penktadienį $1',
+'saturday-at' => 'Šeštadienį $1',
+'sunday-at' => 'Sekmadienį $1',
+'yesterday-at' => 'Vakar $1',
+
 # Bad image list
 'bad_image_list' => 'Formatas yra toks:
 
@@ -3062,7 +3130,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',
@@ -3240,7 +3308,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',
@@ -3659,12 +3727,14 @@ 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:Redirect
+'redirect-submit' => 'Eiti',
+'redirect-lookup' => 'Peržvalgos:',
+'redirect-value' => 'Vertė:',
+'redirect-user' => 'Naudotojo ID',
+'redirect-revision' => 'Puslapio peržiūra',
+'redirect-file' => 'Failo vardas',
+'redirect-not-exists' => 'Vertė nėra nustatyta',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Ieškoti dublikuotų failų',
@@ -3685,7 +3755,7 @@ Paveikslėliai yra rodomi pilna raiška, kiti failų tipai paleidžiami tiesiogi
  * <span class="mw-specialpagecached">Talpyklinių specialius puslapius (gali būti pasenusius).</span>',
 'specialpages-group-maintenance' => 'Sistemos palaikymo pranešimai',
 'specialpages-group-other' => 'Kiti specialieji puslapiai',
-'specialpages-group-login' => 'Prisijungimas / Registracija',
+'specialpages-group-login' => 'Prisijungti / sukurti paskyrą',
 'specialpages-group-changes' => 'Naujausi keitimai ir istorijos',
 'specialpages-group-media' => 'Informacija apie failus ir jų pakrovimas',
 'specialpages-group-users' => 'Naudotojai ir teisės',
@@ -3755,14 +3825,17 @@ Paveikslėliai yra rodomi pilna raiška, kiti failų tipai paleidžiami tiesiogi
 'htmlform-submit' => 'Siųsti',
 'htmlform-reset' => 'Atšaukti pakeitimus',
 'htmlform-selectorother-other' => 'Kita',
+'htmlform-no' => 'Ne',
+'htmlform-yes' => 'Taip',
+'htmlform-chosen-placeholder' => 'Pasirinkite parinktį',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 su visatekstės paieškos palaikymu',
 'sqlite-no-fts' => '$1 be visatekstės paieškos palaikymo',
 
 # New logging system
-'logentry-delete-delete' => '$1 ištrynė puslapį $3',
-'logentry-delete-restore' => '$1 atkūrė puslapį $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|ištrynė}} puslapį $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|atkūrė}} puslapį $3',
 'logentry-delete-event' => '$1 pakeistas  matomumas {{PLURAL:$5|žurnalo įvykio|$5 žurnalo įvykių}} tarp $3: $4',
 'logentry-delete-revision' => '$1 pakeitė puslapio „$3“ {{PLURAL:$5|versijos|$5 versijų}} matomumą: $4',
 'logentry-delete-event-legacy' => '$1 pakeistas matomumą žurnalo renginiams tarp $3',
@@ -3848,6 +3921,7 @@ Kitu atveju, galite naudotis žemiau esančia paprastesne forma. Jūsų komentar
 'api-error-ok-but-empty' => 'Vidinė klaida: nėra atsakymo iš serverio.',
 'api-error-overwrite' => 'Perrašymas esamą failą neleidžiamas.',
 'api-error-stashfailed' => 'Vidinė klaida: serveriui nepavyko išsaugoti laikinąjį failą.',
+'api-error-publishfailed' => 'Vidinė klaida: serveriui nepavyko paskelbti laikino failo.',
 'api-error-timeout' => 'Serveris neatsakė per numatytą laiką.',
 'api-error-unclassified' => 'Įvyko nežinoma klaida',
 'api-error-unknown-code' => 'Nežinoma klaida: " $1 "',
index d51483a..720f1d3 100644 (file)
@@ -192,7 +192,6 @@ $messages = array(
 'disclaimers' => 'Daīšmu nūstatejumi',
 'disclaimerpage' => 'Project:Dasaīšonu nūstateišona',
 'edithelp' => 'Paleigs',
-'edithelppage' => 'Help:Pataiseišona',
 'helppage' => 'Help:Turīņs',
 'mainpage' => 'Suoku puslopa',
 'mainpage-description' => 'Suoku puslopa',
@@ -386,7 +385,6 @@ n = nasvareigs lobuojums.',
 'prevn' => 'īprīškejuos {{PLURAL:$1|$1}}',
 'nextn' => 'nuokamuos {{PLURAL:$1|$1}}',
 'viewprevnext' => 'Apsavērt ($1 {{int:pipe-separator}} $2) ($3 vīnā lopā).',
-'searchhelp-url' => 'Help:Turīņs',
 'searchprofile-articles' => 'Rakstīņuos',
 'search-result-size' => '$1 ({{PLURAL:$2|$2 vuords|$2 vuordi|$2 vuordi}})',
 'search-redirect' => '(puoradresiešona nu $1)',
@@ -595,7 +593,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 +890,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 8f60e6c..51a0c9c 100644 (file)
@@ -19,11 +19,11 @@ $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}})',
@@ -42,8 +42,6 @@ $messages = array(
 '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,6 +55,7 @@ $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',
@@ -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',
@@ -254,7 +253,6 @@ $1',
 'disclaimers' => 'Intlawhkhalhna',
 'disclaimerpage' => 'Project: Intlawhkhalhna Dan',
 'edithelp' => 'Siamţhat zirna',
-'edithelppage' => 'Help: Siamţhat dàn',
 'helppage' => 'Help: A chhunga thu awmte',
 'mainpage' => 'Phekpui',
 'mainpage-description' => 'Phekpui',
@@ -504,7 +502,6 @@ 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:',
@@ -738,7 +735,6 @@ Lamtawi hmante: '''({{int:cur}})'''= ennawnna thar ber nena danglamna, '''({{int
 'searchmenu-legend' => 'Zawn duhthlanna',
 'searchmenu-exists' => "'''He wiki-ah hian \"[[:\$1]]\" tia koh phêk a awm.'''",
 'searchmenu-new' => "'''[[:$1]] phek hi he wiki-ah hian siam rawh le!'''",
-'searchhelp-url' => 'Help:A chhunga thu awmte',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|He thuhmabet nei phêkte hi zawng rawh]]',
 'searchprofile-articles' => 'A chhunga thu awm',
 'searchprofile-project' => 'Ţanpuina leh hna-hmachhawp phekte',
@@ -1375,6 +1371,12 @@ Hetah hian [[Special:UnusedCategories|pawl hman lohho]] pholan tel a ni lo.
 'listusers-noresult' => 'Hmangtu an awm lo.',
 'listusers-blocked' => '(danbeh)',
 
+# Special:ActiveUsers
+'activeusers' => 'Hmangtu hlun tlarna',
+'activeusers-hidebots' => 'Khawlmi thupna',
+'activeusers-hidesysops' => 'Roreltu thupna',
+'activeusers-noresult' => 'Hmangtu awm lo.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Hmangtu pawl dikna-chanvote',
 'listgrouprights-key' => '* <span class="listgrouprights-granted">Dikna-chanvo phalsak</span>
@@ -1823,7 +1825,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 441f112..eb352d6 100644 (file)
@@ -11,6 +11,7 @@
  * @author Dark Eagle
  * @author FnTmLV
  * @author Geimeris
+ * @author Geitost
  * @author Gleb Borisov
  * @author GreenZeb
  * @author Kaganer
@@ -289,7 +290,6 @@ $1',
 'disclaimers' => 'Saistību atrunas',
 'disclaimerpage' => 'Project:Saistību atrunas',
 'edithelp' => 'Rediģēšanas palīdzība',
-'edithelppage' => 'Help:Rediģēšana',
 'helppage' => 'Help:Saturs',
 'mainpage' => 'Sākumlapa',
 'mainpage-description' => 'Sākumlapa',
@@ -456,7 +456,7 @@ Vari turpināt to izmantot anonīmi, vari <span class='plainlinks'>[$1 atgriezti
 'userlogout' => 'Iziet',
 'notloggedin' => 'Neesi iegājis',
 'userlogin-joinproject' => 'Pievienojieties {{SITENAME}}',
-'nologin' => "Nav lietotājvārda? '''$1'''.",
+'nologin' => 'Nav lietotājvārda? $1.',
 'nologinlink' => 'Reģistrējies',
 'createaccount' => 'Izveidot jaunu lietotāju',
 'gotaccount' => "Tev jau ir lietotājvārds? '''$1'''!",
@@ -930,7 +930,6 @@ $1",
 'searchmenu-legend' => 'Meklēšanas iespējas',
 'searchmenu-exists' => "'''Šajā projektā ir raksts ar nosaukumu \"[[:\$1]]\"'''",
 'searchmenu-new' => "'''Izveido rakstu \"[[:\$1]]\" šajā projektā!'''",
-'searchhelp-url' => 'Help:Saturs',
 'searchprofile-articles' => 'Rakstos',
 'searchprofile-project' => 'Palīdzības un projektu lapās',
 'searchprofile-images' => 'Multivides failos',
@@ -1733,6 +1732,14 @@ Skatīt arī [[Special:WantedCategories|''sarkanās'' kategorijas]].",
 'listusers-noresult' => 'Neviens lietotājs nav atrasts.',
 'listusers-blocked' => '(bloķēts)',
 
+# Special:ActiveUsers
+'activeusers' => 'Aktīvo lietotāju saraksts',
+'activeusers-intro' => 'Šis ir lietotāju saraksts, kas veikuši kādu darbību {{PLURAL:daudzskaitlī:$1|pēdējā|pēdējās}} $1 {{PLURAL:daudzskaitlī:$1|dienā|dienās}}.',
+'activeusers-from' => 'Parādīt lietotājus sākot ar:',
+'activeusers-hidebots' => 'Paslēpt botus',
+'activeusers-hidesysops' => 'Paslēpt administratorus',
+'activeusers-noresult' => 'Neviens lietotājs nav atrasts.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Lietotāju grupu tiesības',
 'listgrouprights-summary' => 'Šis ir šajā wiki definēto lietotāju grupu uskaitījums, kopā ar tām atbilstošajām piekļuves tiesībām.
@@ -1805,7 +1812,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.',
@@ -2563,7 +2570,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ē',
@@ -2694,7 +2701,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',
@@ -3006,11 +3013,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..4da918d 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author C933103
  * @author Itsmine
  * @author Justincheng12345
  * @author Omnipaedista
@@ -177,8 +178,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' => '漏概醒之',
@@ -388,7 +387,6 @@ $1',
 'disclaimers' => '免責宣',
 'disclaimerpage' => 'Project:免責宣',
 'edithelp' => '助纂塾',
-'edithelppage' => 'Help:纂',
 'helppage' => 'Help:目錄',
 'mainpage' => '卷首',
 'mainpage-description' => '卷首',
@@ -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' => '變符',
@@ -724,7 +748,7 @@ $2',
 'editing' => '纂$1',
 'creating' => '撰$1',
 'editingsection' => '纂節$1',
-'editingcomment' => '$1',
+'editingcomment' => '$1',
 'editconflict' => '纂沖$1',
 'explainconflict' => "子纂與他人沖,上者時也,下者子也,望子合之。
 註,'''{{int:savearticle}}'''上文儲焉",
@@ -976,7 +1000,6 @@ $1",
 'searchmenu-legend' => '尋選',
 'searchmenu-exists' => "'''在此wiki中有頁為\"[[:\$1]]\"。'''",
 'searchmenu-new' => "'''在此wiki上建頁\"[[:\$1]]\"!'''",
-'searchhelp-url' => 'Help:目錄',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|查此首之頁]]',
 'searchprofile-articles' => '容',
 'searchprofile-project' => '助題',
@@ -1018,9 +1041,6 @@ $1",
 'search-external' => '外尋',
 'searchdisabled' => '{{SITENAME}}因性能而停用之。可Gooogle查之,乃之過時也。',
 
-# Quickbar
-'qbsettings-none' => '無',
-
 # Preferences page
 'preferences' => '簿註',
 'mypreferences' => '簿註',
@@ -1153,7 +1173,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 +1477,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 +2414,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 +2449,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 +2542,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => '寬',
 'exif-imagelength' => '長',
 'exif-photometricinterpretation' => '像素構成',
@@ -2751,12 +2754,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..069c987 100644 (file)
@@ -20,6 +20,7 @@
  * @author Priyanka.rachna.jha
  * @author Rajesh
  * @author Reedy
+ * @author Rillke
  * @author Umeshberma
  * @author Vinitutpal
  */
@@ -57,8 +58,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' => 'हमरा सचेत करू जखन हम खाली सम्पादम सारांशमे जाइ',
@@ -266,7 +265,6 @@ $1',
 'disclaimers' => 'अनाधिकार घोषणा',
 'disclaimerpage' => 'Project:अनाधिकार घोषणा',
 'edithelp' => 'संपादन सहयोग',
-'edithelppage' => 'Help:संपादन',
 'helppage' => 'Help: विषय सूची',
 'mainpage' => 'सम्मुख पन्ना',
 'mainpage-description' => 'सम्मुख पृष्ठ',
@@ -463,7 +461,7 @@ $2',
 ई दृढ़ करू जे ज्ञापक सक्रिय अछि, ऐ पन्नाकेँ फेरसँ भारित करू आ फेरसँ प्रयास करू।',
 'noname' => 'अहाँ वैध प्रयोक्तानाम नै देने छी।',
 'loginsuccesstitle' => 'सम्प्रवेश सफल',
-'loginsuccess' => "'''अहाँ सम्प्रवेश केलहुँ {{अन्तर्जाल-पता}} \"\$1\".'''क रूपमे।",
+'loginsuccess' => "'''अहाँ सम्प्रवेश केलहुँ {{SITENAME}} \"\$1\".'''क रूपमे।",
 'nosuchuser' => '"$1" नामसँ कोनो प्रयोक्ता नै अछि।
 प्रयोक्तानाम ब्रह्मक्षर-लघ्वक्षर भेद युक्त अछि।
 अपन ह्रिजै जाँचू, वा [[Special:UserLogin/signup|नव खाता बनाउ]] ।',
@@ -540,10 +538,8 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'कूटशब्द फेरसँ बनाउ',
-'passwordreset-text' => 'ई-पत्र द्वारा अपन खाता विवरणक स्मरण प्राप्त करबा लेल ऐ फॉर्मकेँ भरू।',
 'passwordreset-legend' => 'कूटशब्द फेरसँ बनाउ',
 'passwordreset-disabled' => 'कूटशब्द फेरसँ बनाएब ऐ विकीपर अक्षम कएल अछि।',
-'passwordreset-pretext' => '{{PLURAL:$1||नीचाँक दत्तांशक एकटा भागक प्रविष्टि करू}}',
 'passwordreset-username' => 'प्रयोक्तानाम',
 'passwordreset-domain' => 'क्षेत्र:',
 'passwordreset-capture' => 'परिणाम ई-पत्र देखू?',
@@ -993,7 +989,6 @@ $3 द्वारा देल कारण अछि ''$2''",
 'searchmenu-legend' => 'खोज विकल्प',
 'searchmenu-exists' => "'''ऐ विकीपर एकटा पन्ना अछि \"[[:\$1]]\" नामसँ।'''",
 'searchmenu-new' => "''' पन्ना निर्माण \"[[:\$1]]\" ऐ विकीपर !'''",
-'searchhelp-url' => 'Help: विषय सूची',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ऐ उपसर्गक पन्ना सभकेँ देखू]]',
 'searchprofile-articles' => 'अनुक्रम पन्ना सभ',
 'searchprofile-project' => 'सहायता आ परियोजना पन्ना सभ',
@@ -1038,15 +1033,6 @@ $3 द्वारा देल कारण अछि ''$2''",
 अहाँक गूगलक माध्यमसँ ऐ बीच ताकि सकै छी।
 मोन राखू जे तकर विवरणी {{अन्तर्जाल}} सामिग्री समयातीत भऽ सकैए।',
 
-# Quickbar
-'qbsettings' => 'त्वरित दृश्य',
-'qbsettings-none' => 'कोनो नै',
-'qbsettings-fixedleft' => 'वाम कात सटल',
-'qbsettings-fixedright' => 'दहिन दिस सटल',
-'qbsettings-floatingleft' => 'वाम कात घुमैत',
-'qbsettings-floatingright' => 'दहिन कात घुमैत',
-'qbsettings-directionality' => 'कीलित, अहाँक भाषाक लिपि दिशा-निर्देशपर आधारित',
-
 # Preferences page
 'preferences' => 'विकल्प',
 'mypreferences' => 'खासमखास',
@@ -1554,7 +1540,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 +1930,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 +2664,6 @@ $1 एकर प्रतिबन्धक कारण अछि : "$2"',
 'pageinfo-authors' => 'भिन्न लेखक संख्या',
 
 # Skin names
-'skinname-standard' => 'प्राचीन',
-'skinname-nostalgia' => 'गामसँ प्रेम',
-'skinname-simple' => 'साधारण',
 'skinname-modern' => 'आधुनिक',
 'skinname-vector' => 'सदिश',
 
@@ -2770,8 +2752,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 +2786,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 +2965,7 @@ Variants for Chinese language
 'exif-originalimageheight' => 'काटहि सें पहिने तस्वीरक ऊँचाई',
 'exif-originalimagewidth' => 'काटहि सें पहिने तस्वीरक चौड़ाई',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'असम्पीडित',
 'exif-compression-2' => 'सी.सी.आइ.टी.टी. वर्ग ३ १ - बीम संशोधित हफमैन कूट सोझ लम्बाइ',
 'exif-compression-3' => 'सी.सी.आइ.टी.टी. वर्ग ३ फैक्स संकूट',
@@ -3396,13 +3376,6 @@ $5
 'version-software-product' => 'उत्पाद',
 'version-software-version' => 'संस्करण',
 
-# Special:FilePath
-'filepath' => 'संचिकाक रस्ता',
-'filepath-page' => 'संचिका',
-'filepath-submit' => 'जाऊ',
-'filepath-summary' => 'ई विशेष पन्ना संचिकाक पूर्ण रस्ता देखबैत अछि।
-चित्र सभ पूर्ण आकारमे देखाएल जाइत अछि, दोसर संचिका प्रकार चालित होइए सोझे सम्बन्धित संविधि द्वारा।',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'द्वितीयक संचिका ताकू',
 'fileduplicatesearch-summary' => 'हैश मानक आधारपर द्वितीयक संचिका ताकू।',
index 2c3ca64..cc609e5 100644 (file)
@@ -255,7 +255,6 @@ $1',
 'disclaimers' => 'Pamaidonan',
 'disclaimerpage' => 'Project:Panyangkalan umum',
 'edithelp' => 'Pitulung panyuntingan',
-'edithelppage' => 'Help:Panyuntingan',
 'helppage' => 'Help:Isi',
 'mainpage' => 'Kaca Utama',
 'mainpage-description' => 'Kaca Utama',
@@ -538,10 +537,8 @@ Rika ndeyan  uwis kasil ngganti tembung sandhine Rika utawa wis njaluk tembung s
 
 # Special:PasswordReset
 'passwordreset' => "Tembung sandhi di-''reset''",
-'passwordreset-text' => 'Lengkapi formulir kiye ben nampa imel ngelingna detil akune Rika.',
 'passwordreset-legend' => "Tembung sandhi di-''reset''",
 'passwordreset-disabled' => "''Reset'' tembung sandhi wis dipateni nang wiki kiye.",
-'passwordreset-pretext' => '{{PLURAL:$1||Lebokna salah siji data nang ngisor kiye}}',
 'passwordreset-username' => 'Jeneng panganggo:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Deleng imel hasile?',
@@ -863,7 +860,6 @@ Gatèkna, angger nganggo pranala navigasi kuwe bakalan nge-reset kolom kiye.',
 'searchmenu-legend' => 'Pilihan panggoletan',
 'searchmenu-exists' => "''' Ana kaca nganggo jeneng \"[[:\$1]]\" nang wiki kiye.'''",
 'searchmenu-new' => "'''Gawe kaca \"[[:\$1]]\" nang wiki kiye!'''",
-'searchhelp-url' => 'Help:Isi',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Deleng daftar kaca sing nganggo tembung-wiwitan kiye]]',
 'searchprofile-articles' => 'Isine kaca',
 'searchprofile-project' => 'Kaca pitulung lan proyèk',
@@ -1744,7 +1740,7 @@ Sing liyane bakal diumpetna sacara ''default''.
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-lightsource' => 'Sumber cahya',
 
 'exif-meteringmode-6' => 'Sebagiyan',
@@ -1783,9 +1779,6 @@ Sing liyane bakal diumpetna sacara ''default''.
 # Core parser functions
 'duplicate-defaultsort' => "'''Pènget:''' Kunci baku sing nggo ngurutna (''Default sort key'') yakuwe \"\$2\" wis nggantèkna kunci baku sing nggo ngurutna sedurungé \"\$1\".",
 
-# Special:FilePath
-'filepath-submit' => 'Golèti',
-
 # Special:SpecialPages
 'specialpages' => 'Kaca-kaca khusus',
 
index e96b255..99c4cd9 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' => 'Няфтемс мондине мезе сёрмадомс шава петнема вальмас сувамста',
@@ -382,7 +380,6 @@ $1',
 'disclaimers' => 'Видешинь корхтаматне',
 'disclaimerpage' => 'Project:Пря видешинь корхнема',
 'edithelp' => 'Петнемань лезкс',
-'edithelppage' => 'Help:Петнема',
 'helppage' => 'Help:Лопань потмоц',
 'mainpage' => 'Пря лопа',
 'mainpage-description' => 'Пря лопа',
@@ -656,10 +653,8 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Полафтомс сувама валцень',
-'passwordreset-text' => 'Эряви пяшкодемс тя формать е-сёрма сёрматфтомацень колга сявоманди.',
 'passwordreset-legend' => 'Полафтомс сувама валцень',
 'passwordreset-disabled' => 'Сувама валсь аф полафтови тя викить эса.',
-'passwordreset-pretext' => '{{PLURAL:$1||Тяштьк содама пялькснень эзда фкя алу}}',
 'passwordreset-username' => 'Тиить лемоц',
 'passwordreset-domain' => 'Домен:',
 'passwordreset-capture' => 'Ваномс мекольце е-сёрма?',
@@ -1001,7 +996,6 @@ $3 макссь туфталсь - ''$2''",
 'searchmenu-legend' => 'Вешендема арафнематне',
 'searchmenu-exists' => "'''Тя Викиса ули лопась \"[[:\$1]]\" лем мархта'''",
 'searchmenu-new' => "'''Ушедомс лопась \"[[:\$1]]\" тя Викиса!'''",
-'searchhelp-url' => 'Help:Лопань потмоц',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Мумс лопат тя валынголькссь мархта]]',
 'searchprofile-articles' => 'Потмонь лопат',
 'searchprofile-project' => 'Лезкс эди проектонь лопат',
@@ -1042,14 +1036,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 +1718,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 +2412,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Келец',
 'exif-imagelength' => 'Серец',
 'exif-bitspersample' => 'Битт фкя компонентс',
@@ -2540,7 +2526,7 @@ $1',
 'exif-gpsdatestamp' => 'GPS ши',
 'exif-gpsdifferential' => 'GPS диференциень петнема',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Аф компрезияф',
 
 'exif-unknowndate' => 'Аф содаф шись',
@@ -2832,13 +2818,6 @@ $5
 'version-software-product' => 'Нолдафкс',
 'version-software-version' => 'Верзие',
 
-# Special:FilePath
-'filepath' => 'Файлти ян',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Ян',
-'filepath-summary' => 'Тя башка тевонь лопась няфнесы сембе янць файлти.
-Архтофксне няфневихть сембе синь кувалмосост, иля файлонь сортсна нолдавихть видеста програпнень вельде конат сотфт мархтост.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Вешендемс кафонзаф файлхне',
 'fileduplicatesearch-summary' => 'Вешендемс кафонзаф файлхнень хэш-кодонь лувкс коряс.',
index f43f755..07e8e78 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',
@@ -457,7 +468,6 @@ $1',
 'disclaimers' => 'Fampitandremana',
 'disclaimerpage' => 'Project:General disclaimer',
 'edithelp' => 'Fanoroana',
-'edithelppage' => 'Help:Endritsoratra',
 'helppage' => 'Help:Fanoroana',
 'mainpage' => 'Fandraisana',
 'mainpage-description' => 'Fandraisana',
@@ -469,7 +479,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 +585,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 +620,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 +638,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 +667,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 +740,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 +769,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 +787,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 +813,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 +825,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 +921,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 +1026,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 +1054,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 +1243,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',
@@ -1200,7 +1265,6 @@ $3 santiôna{{PLURAL:}} natsonika tamin'ny [[:$2]]",
 'searchmenu-legend' => 'Safidy mikasika ny fitadiavana',
 'searchmenu-exists' => "'''Misy pejy mitondra anarana « [[:$1]] » eto amin'ity wiki ity'''",
 'searchmenu-new' => "'''Hanamboatra ny pejy « [[:$1|$1]] » eto amin'ity wiki ity !'''",
-'searchhelp-url' => 'Help:Fanoroana',
 'searchmenu-prefix' => "[[Special:PrefixIndex/$1|Hitady pejy manomboka amin'io tovona io]]",
 'searchprofile-articles' => 'Pejy misy votoatiny',
 'searchprofile-project' => 'Pejy fanampiana sy pejy tetikasa',
@@ -1222,7 +1286,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 +1309,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 +1346,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 +1390,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 +1436,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 +1640,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 +1731,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 +1775,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 +1844,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 +1985,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 +2069,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 +2144,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 +2152,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 +2175,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 +2206,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 +2214,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 +2225,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 +2330,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 +2343,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 +2363,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 +2404,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 +2461,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 +2784,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 +2841,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 +2907,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 +2942,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 +3013,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 +3039,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 +3076,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 +3317,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 +3413,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..2c9c974 100644 (file)
@@ -13,6 +13,7 @@
  * @author Kaganer
  * @author Lifeway
  * @author Сай
+ * @author Санюн Вадик
  */
 
 $fallback = 'ru';
@@ -21,8 +22,8 @@ $namespaceNames = array(
        NS_SPECIAL          => 'Лӱмын_ыштыме',
        NS_TALK             => 'Каҥашымаш',
        NS_USER             => 'Пайдаланыше',
-       NS_USER_TALK        => 'Пайдаланышын_каҥашымаш',
-       NS_PROJECT_TALK     => '$1ын_каҥашымаш',
+       NS_USER_TALK        => 'Пайдаланышын_каҥашымашыже',
+       NS_PROJECT_TALK     => '$1ын_каҥашымашыже',
        NS_FILE             => 'Файл',
        NS_FILE_TALK        => 'Файл_шотышто_каҥашымаш',
        NS_TEMPLATE         => 'Кышкар',
@@ -52,6 +53,8 @@ $namespaceAliases = array(
        'Обсуждение_категории'               => NS_CATEGORY_TALK,
 
        // Namspace changes
+       'Пайдаланышын_каҥашымаш'    => NS_USER_TALK,
+       '$1ын_каҥашымаш'            => NS_PROJECT_TALK,
        'Файлын_каҥашымаш'          => NS_FILE_TALK,
        'Ямдылык'                   => NS_TEMPLATE,
        'Ямдылык_шотышто_каҥашымаш' => NS_TEMPLATE_TALK,
@@ -64,6 +67,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 +89,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 +115,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 +184,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 +210,7 @@ $messages = array(
 'qbpageoptions' => 'Тиде лаштык',
 'qbmyoptions' => 'Мыйын лаштык-влак',
 'qbspecialpages' => 'Лӱмын ыштыме лаштык-влак',
+'faq' => 'ЧӱВаЙо (Чӱчкыдын вашлиялтше йодыш-влак)',
 
 # Vector skin
 'vector-action-addsection' => 'У ӱжашым тӱҥалаш',
@@ -203,14 +218,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 +268,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 +282,15 @@ $messages = array(
 'copyright' => 'Лаштыкыште возымо $1 йӧн дене почмо.',
 'copyrightpage' => '{{ns:project}}:Автор кертыж',
 'currentevents' => 'Кызытсе событий',
+'currentevents-url' => 'Project:Мо кызыт лийын',
 'disclaimers' => 'Вуйшиймаш деч кораҥмаш',
 'disclaimerpage' => 'Project:Вуйшиймаш деч кораҥмаш',
-'edithelp' => 'Тӧрлатымаште полыш',
-'edithelppage' => 'Help:Тӧрлымаш',
+'edithelp' => 'Тӧрлатымаш полыш',
 'helppage' => 'Help:Полшык',
 'mainpage' => 'Тӱҥ лаштык',
 'mainpage-description' => 'Тӱҥ лаштык',
 'portal' => 'Тӱшка',
+'portal-url' => 'Project:Пашазе-влакын тӱшкашт',
 'privacy' => 'Конфиденциальность политике',
 'privacypage' => 'Project:Конфиденциальность политике',
 
@@ -282,7 +299,7 @@ $messages = array(
 'ok' => 'Йӧра',
 'retrievedfrom' => 'Налме вер — "$1"',
 'youhavenewmessages' => 'Тендан $1 уло ($2).',
-'newmessageslink' => 'у увертыш-влак',
+'newmessageslink' => 'У серыш',
 'newmessagesdifflink' => 'пытартыш тӧрлатымаш',
 'editsection' => 'тӧрлаташ',
 'editold' => 'тӧрлаташ',
@@ -313,7 +330,7 @@ $messages = array(
 'nstab-category' => 'Категорий',
 
 # Main script and global functions
-'nosuchspecialpage' => 'Тигай лӱмын-ыштыме лаштык уке',
+'nosuchspecialpage' => 'Тыгай спецлаштык уке.',
 
 # General errors
 'error' => 'Йоҥылыш',
@@ -326,12 +343,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 +359,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 +372,8 @@ $messages = array(
 'createaccount' => 'Регистрацийым эрте',
 'gotaccount' => "Тый регистрацийым эртенат? '''$1'''.",
 'gotaccountlink' => 'Шке денет палымым ыште',
-'createaccountmail' => 'e-mail дене',
+'userlogin-resetlink' => 'Лӱмдам але шолыпмутдам монденда?',
+'createaccountmail' => 'Кӱчык жаплан чокым ыштыме шолыпмутым мылам e-mail дене колташ',
 'nosuchuser' => '"$1" лӱман пайдаланыше уке.
 Пайдаланышын лӱмыштӧ йӱкпале-влакын кугытшо тӱрыс лийшаш.
 Лӱмым чын возымым терге але [[Special:UserLogin/signup|регистрацийым эрте]].',
@@ -369,7 +387,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 +421,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 +433,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 +454,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 +515,7 @@ $messages = array(
 'lineno' => '$1 корно:',
 'compareselectedversions' => 'Ойырымо версий-влакым таҥастараш',
 'editundo' => 'чараш',
+'diff-multi' => '({{PLURAL:$1|не показана $1 промежуточная версия|не показаны $1 промежуточные версии|не показаны $1 промежуточных версий}} {{PLURAL:$2|$2 участника|$2 участников}})',
 
 # Search results
 'searchresults' => 'Кычалын мумо',
@@ -499,29 +527,35 @@ $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' => 'Кидпале',
 
@@ -601,21 +636,23 @@ $messages = array(
 'action-edit' => 'тиде лаштыкым тӧрлаташ',
 
 # Recent changes
-'nchanges' => '$1 {{PLURAL:$1|тӧрлатымаш|тӧрлатымаш-влак}}',
+'nchanges' => '$1 {{PLURAL:$1|тӧрлатымаш}}',
 'recentchanges' => 'Пытартыш тӧрлатымаш-влак',
 '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,17 +662,17 @@ $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
 'recentchangeslinked' => 'Ваш кылдалтше тӧрлатымаш-влак',
 'recentchangeslinked-feed' => 'Ваш кылдалтше тӧрлатымаш-влак',
 'recentchangeslinked-toolbox' => 'Ваш кылдалтше тӧрлатымаш-влак',
-'recentchangeslinked-title' => '"$1" лаштыклан кылдалтше тӧрлатымаш-влак',
+'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,18 +732,18 @@ $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' => 'Ик тӧрлатымашлан ончымо',
 'statistics-users' => 'Регистрацийым эртыше [[Special:ListUsers|пайдаланыше-влак]]',
 'statistics-users-active' => 'Чӱчкыдын пайдаланыше-влак',
-'statistics-users-active-desc' => 'Пытартыш {{PLURAL:$1|кечыште|$1 кечыште}} иктаж-мом ыштыше пайаланыше-влак',
+'statistics-users-active-desc' => 'Ð\9fÑ\8bÑ\82аÑ\80Ñ\82Ñ\8bÑ\88 {{PLURAL:$1|кеÑ\87Ñ\8bÑ\88Ñ\82е|$1 ÐºÐµÑ\87Ñ\8bÑ\88Ñ\82е}} Ð¸ÐºÑ\82аж-мом Ñ\8bÑ\88Ñ\82Ñ\8bÑ\88е Ð¿Ð°Ð¹Ð´Ð°Ð»Ð°Ð½Ñ\8bÑ\88е-влак',
 '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' => 'Эскерыме лӱмерын келыштарымаш',
@@ -800,7 +841,7 @@ $messages = array(
 Пеҥгыдемде тидым [[{{MediaWiki:Policy-url}}|правил]] почеш ыштыметым да, мо тидын деч вара лиймым, умылыметым.',
 'actioncomplete' => 'Ыштыме',
 'deletedtext' => '«$1» шӧрымӧ.
\9eнÑ\87о $2 Ð¿Ñ\8bÑ\82аÑ\80Ñ\82Ñ\8bÑ\88 Ñ\88Ó§Ñ\80Ñ\8bмӧ-влак Ð»Ó±Ð¼ÐµÑ\80 Ð³Ñ\8bÑ\87.',
¨Ó§Ñ\80Ñ\8bмаÑ\88 Ð»Ó±Ð¼ÐµÑ\80 Ð³Ñ\8bÑ\87 $2лан Ð¾Ð½Ñ\87о.',
 'dellogpage' => 'Шӧрымӧ нерген журнал',
 'deletionlog' => 'шӧрымӧ нерген журнал',
 'deletecomment' => 'Амал:',
@@ -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..c7790fd 100644 (file)
 $fallback = 'id';
 
 $namespaceNames = array(
+       NS_MEDIA            => 'Media',
+       NS_SPECIAL          => 'Istimewa',
+       NS_TALK             => 'Maota',
+       NS_USER             => 'Pangguno',
+       NS_USER_TALK        => 'Rundiang_Pangguno',
+       NS_PROJECT_TALK     => 'Rundiang_$1',
        NS_FILE             => 'Berkas',
+       NS_FILE_TALK        => 'Rundiang_Berkas',
+       NS_MEDIAWIKI        => 'MediaWiki',
+       NS_MEDIAWIKI_TALK   => 'Rundiang_MediaWiki',
        NS_TEMPLATE         => 'Templat',
+       NS_TEMPLATE_TALK    => 'Rundiang_Templat',
+       NS_HELP             => 'Bantuan',
+       NS_HELP_TALK        => 'Rundiang_Bantuan',
+       NS_CATEGORY         => 'Kategori',
+       NS_CATEGORY_TALK    => 'Rundiang_Kategori',
+);
+
+$namespaceAliases = array(
+       # Indonesian namespaces
+       'Istimewa'              => NS_SPECIAL,
+       'Pembicaraan'           => NS_TALK,
+       'Pengguna'              => NS_USER,
+       'Pembicaraan_Pengguna'  => NS_USER_TALK,
+       'Pembicaraan_$1'        => NS_PROJECT_TALK,
+       'Berkas'                => NS_FILE,
+       'Pembicaraan_Berkas'    => NS_FILE_TALK,
+       'Pembicaraan_MediaWiki' => NS_MEDIAWIKI_TALK,
+       'Templat'               => NS_TEMPLATE,
+       'Pembicaraan_Templat'   => NS_TEMPLATE_TALK,
+       'Bantuan'               => NS_HELP,
+       'Pembicaraan_Bantuan'   => NS_HELP_TALK,
+       'Kategori'              => NS_CATEGORY,
+       'Pembicaraan_Kategori'  => NS_CATEGORY_TALK,
+);
+
+$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 +219,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 +238,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 +253,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',
+'anontalk' => 'Rundiang IP ko',
+'navigation' => 'Navigasi',
 'and' => '&#32;jo',
 
 # Cologne Blue skin
-'qbfind' => 'Pancarian',
+'qbfind' => 'Cari',
 'qbbrowse' => 'Jalajah',
 'qbedit' => 'Suntiang',
 'qbpageoptions' => 'Laman ko',
@@ -179,9 +278,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 +288,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 +309,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 +325,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 +340,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 +353,40 @@ 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 ka Sanak buek babateh hanyo 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 +400,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 +411,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 +433,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 +475,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 +486,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 +530,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 +625,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 +640,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 +673,44 @@ 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' => 'Setel ulang kato sandi',
+'passwordreset-text-one' => 'Lengkapkan formulir ko untuak manuka baliak kato sandi Sanak.',
+'passwordreset-text-many' => '{{PLURAL:$1|Masuakan data di bawah ko untuak manuka baliak kato sandi Sanak.}}',
 'passwordreset-legend' => 'Tuka baliak kato sandi',
-'passwordreset-disabled' => '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 +800,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 +838,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 +865,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 +883,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:",
@@ -772,13 +901,13 @@ Sanak dapek baliak dan manyuntiang laman nan alah ado, atau [[Special:UserLogin|
 'sectioneditnotsupported-text' => 'Panyuntiangan bagian indak didukuang di laman suntiang iko.',
 'permissionserrors' => 'Kasalahan Hak Akses',
 'permissionserrorstext' => 'Sanak indak ado hak untuak malakuannyo dek {{PLURAL:$1|alasan}} barikuik:',
-'permissionserrorstext-withaction' => 'Awak indak punyo hak akses untuak $2, karano {{PLURAL:$1|alasan}} barikuik:',
+'permissionserrorstext-withaction' => 'Sanak indak punyo hak akses untuak $2, dek {{PLURAL:$1|alasan}} barikuik:',
 '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 +921,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 +969,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 +1000,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 +1100,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,11 +1119,10 @@ 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!'''",
-'searchhelp-url' => 'Help:Isi',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Cari laman jo awalan ko]]',
 'searchprofile-articles' => 'Laman isi',
 'searchprofile-project' => 'Laman Bantuan jo Proyek',
@@ -966,7 +1132,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 +1145,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 +1157,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 +1167,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 +1177,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 +1201,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 +1219,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 +1232,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 +1248,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 +1299,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 +1342,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 +1372,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 +1381,36 @@ 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-summary' => "Caliak parubahan tabaru pado wiki di laman ko.<br />
+;Patunjuak:(<span style=\"color:blue;\">bedo</span>) parubahan, (<span style=\"color:blue;\">sijarah</span>) riwayaik parubahan, '''B''' laman baru, '''b''' suntiangan bot, '''k''' suntiangan ketek, <span class=\"unpatrolled\">!</span> parubahan alun dipatroli,<br /><span style=\"color:green;\">'''(+ ''bita'')'''</span> isi laman batambah, <span style=\"color:red;\">(- ''bita'')</span> isi laman bakurang, (← Ikhtisar otomatih), (→ <span style=\"color:grey;\">Suntiangan bagian</span>)",
+'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 +1426,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 +1435,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 +1480,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 +1492,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 +1502,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 +1567,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 +1604,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 +1645,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 +1703,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 +1733,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 +1757,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 +1804,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 +1855,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 +1868,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 +1896,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 +1917,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 +1945,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 +1982,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 +2003,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 +2022,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 +2042,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 +2054,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,36 +2090,47 @@ 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',
-'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.
-Kok indak dipabarui sacaro otomatis, pastikan lah dipareso laman ko dari [[Special:DoubleRedirects|paraliahan ganda]] atau [[Special:BrokenRedirects|paralihan rusak]]. Awak batanggung-jawak untuak mamastian bahaso pautan tu taruih manyambuang ka laman nan saaruihnyo.
+'move-page-legend' => 'Pindahkan laman',
+'movepagetext' => "Formulir di bawah ko digunoan untuak maubah namo suatu laman dan mamindahan kasado data riwayaiknyo ka namo baru. 
+Judua lamo tu ka manjadi laman pangaliahan manuju judua nan baru. 
+Sanak dapek mampabarui pangaliahan-pangaliahan nan manuju ka judua lamo sacaro otomatih.
+Kok indak dipabarui sacaro otomatih, pastikan lah dipareso laman ko dari [[Special:DoubleRedirects|pangaliahan ganda]] atau [[Special:BrokenRedirects|pangaliahan rusak]]. Sanak batangguang jawek untuak mamastian baso pautan tu taruih manyambuang ka laman nan saharuihnyo.
 
-Ingeklah bahaso laman ko '''indak''' ka bapindah apobilo lah ado laman nan manggunoan judua nan baru, kacuali bilo laman tu kosong atau marupoan laman paraliahan dan indak punyo riwayaik suntiangan. Aratinyo awak dapek maubah baliak namo laman ka namo samulo apobilo ado kasalahan, dan bahaso awak indak dapek manimpo laman nan lah ado.
+Ingek baso laman ko '''indak''' ka bapindah apobilo lah ado laman nan manggunoan judua nan baru, kacuali bilo laman tu kosong atau marupoan laman pangaliahan dan indak adoi riwayaik suntiangan. Aratinyo Sanak dapek maubah baliak namo laman tu ka namo lamo apobilo ado kasalahan, dan baso awak indak dapek maimpok laman nan alah ado.
 
 '''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:'''
+Iko dapek maakibaikan parubahan nan indak dipakiroan pado laman nan populer; jadi pastian Sanak paham bana akibaik dari tindakan ko sabalun malanjuikannyo.",
+'movepagetext-noredirectfixer' => "Formulir di bawah ko digunoan untuak maubah namo suatu laman dan mamindahan sado data riwayaiknyo ka namo baru. 
+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 +2139,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 +2200,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 +2214,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 +2225,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 +2244,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 +2276,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 +2336,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 +2358,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 +2371,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 +2387,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 +2448,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 +2467,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 +2493,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 +2502,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 +2531,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 +2554,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 +2567,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' => '{{PLURAL: $1|}}$1 pakan',
+'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 f91abd3..13c42c9 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' ),
@@ -454,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|Категорија|Категории}}',
@@ -465,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' => 'Индексирани страници',
@@ -476,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;и',
@@ -537,6 +552,7 @@ $messages = array(
 'create-this-page' => 'Создај ја оваа страница',
 'delete' => 'Избриши',
 'deletethispage' => 'Избриши ја оваа страница',
+'undeletethispage' => 'обнови ја оваа страница',
 'undelete_short' => 'Врати {{PLURAL:$1|едно уредување|$1 уредувања}}',
 'viewdeleted_short' => 'Преглед на {{PLURAL:$1|едно избришано уредување|$1 избришани уредувања}}',
 'protect' => 'Заштити',
@@ -562,10 +578,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' => 'Прејди на:',
@@ -590,7 +606,6 @@ $1',
 'disclaimers' => 'Услови на употреба',
 'disclaimerpage' => 'Project:Услови на употреба',
 'edithelp' => 'Помош за уредување',
-'edithelppage' => 'Help:Како се уредуваат страници',
 'helppage' => 'Help:Содржина',
 'mainpage' => 'Главна страница',
 'mainpage-description' => 'Главна страница',
@@ -609,7 +624,7 @@ $1',
 Видете [[Special:Version|страница за верзија]].',
 
 'ok' => 'ОК',
-'pagetitle' => '$1 - {{SITENAME}}',
+'pagetitle' => '$1  {{SITENAME}}',
 'pagetitle-view-mainpage' => '{{SITENAME}}',
 'retrievedfrom' => 'Преземено од „$1“',
 'youhavenewmessages' => 'Имате $1 ($2).',
@@ -630,7 +645,7 @@ $1',
 'toc' => 'Содржина',
 'showtoc' => 'прикажи',
 'hidetoc' => 'скриј',
-'collapsible-collapse' => 'скриј',
+'collapsible-collapse' => 'Собери',
 'collapsible-expand' => 'прикажи',
 'thisisdeleted' => 'Да прикажам или вратам $1?',
 'viewdeleted' => 'Да погледате $1?',
@@ -733,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 е скриено)',
@@ -744,6 +759,8 @@ $2',
 'namespaceprotected' => "Немате дозвола за уредување страници во именскиот простор '''$1'''.",
 'customcssprotected' => 'Немате дозвола да ја менувате оваа страница со CSS бидејќи содржи туѓи лични нагодувања.',
 'customjsprotected' => 'Немате дозвола да ја менувате оваа страница со JavaScript  бидејќи содржи туѓи лични нагодувања.',
+'mycustomcssprotected' => 'Немате дозвола да ја уредувате оваа каскадна стилска страница (CSS).',
+'mycustomjsprotected' => 'Немате дозвола да ја уредувате оваа страница со JavaScript.',
 'ns-specialprotected' => 'Специјални страници не може да се уредуваат.',
 'titleprotected' => "Овој наслов од страна на [[User:$1|$1]] е заштитен и не може да се создаде.
 Причината за тоа е: ''$2''.",
@@ -769,9 +786,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' => 'Не можете да ја менувате лозинката на ова вики.',
@@ -784,18 +810,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}} користи колачиња за најавување на корисници.
@@ -808,7 +854,7 @@ $2',
 За оваа цел ќе ви требаат колачиња. Проверете дали се овозможени, превчитајте ја страницава и обидете се повторно.',
 'nocookiesforlogin' => '{{int:nocookieslogin}}',
 'noname' => 'Внесовте погрешно корисничко име.',
-'loginsuccesstitle' => 'Најавувањето е успешно',
+'loginsuccesstitle' => 'Најавата е успешна',
 'loginsuccess' => 'Сега сте најавени на {{SITENAME}} како „$1“.',
 'nosuchuser' => 'Нема корисник со името „$1“.
 Корисничките имиња разликуваат мали и големи букви.
@@ -852,7 +898,7 @@ $2',
 'cannotchangeemail' => 'На ова вики не може да се менува е-пошта на сметките.',
 'emaildisabled' => 'Ова мреж. место не може да праќа е-пошта.',
 'accountcreated' => 'Корисничката сметка е направена',
-'accountcreatedtext' => 'Корисничката сметка за $1 беше направена.',
+'accountcreatedtext' => 'Корисничкта сметка за [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|разговор]]) е направена.',
 'createaccount-title' => 'Создавање на сметка за {{SITENAME}}',
 'createaccount-text' => 'Некој направил сметка со вашата е-поштенска адреса на {{SITENAME}} ($4) со име „$2“ и  лозинка „$3“.
 Би требало сега да се пријавите и да ја промените вашата лозинка.
@@ -888,13 +934,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 +972,7 @@ $2
 Привремена лозинка: $2',
 'passwordreset-emailsent' => 'Испратено е писмо за измена на лозинката.',
 'passwordreset-emailsent-capture' => 'Испратено е писмо за измена на лозинката (прикажано подолу).',
-'passwordreset-emailerror-capture' => 'Создадено е писмо за измена на лозинката (прикажано подолу), но не успеав да го испратам на корисникот: $1',
+'passwordreset-emailerror-capture' => 'Создадено е писмо за измена на лозинката (прикажано подолу), но не успеав да го испратам на {{GENDER:$2|корисникот}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Смени е-пошта',
@@ -946,7 +994,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' => 'Овде внесете неформатиран текст',
@@ -1014,8 +1062,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.
 
@@ -1042,7 +1090,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''.
@@ -1143,6 +1191,7 @@ $2
 Веројатно е избришана.',
 'edit-conflict' => 'Спротиставеност во уредувањето.',
 'edit-no-change' => 'Вашите уредувања беа игнорирани, бидејќи не се направени промени врз текстот.',
+'postedit-confirmation' => 'Вашето уредување е зачувано.',
 'edit-already-exists' => 'Не може да се создаде нова страница.
 Истата веќе постои.',
 'defaultmessagetext' => 'Текст на пораката по основно',
@@ -1150,7 +1199,7 @@ $2
 'invalid-content-data' => 'Неважечки податоци од содржината',
 'content-not-allowed-here' => 'Содржините од моделот „$1“ не се допуштени на страницата [[$2]]',
 'editwarning-warning' => 'Ако ја напуштите страницата ќе ги изгубите сите промени кои сте ги направиле.
-Ако сте најавени, можете да го исклучите ова предупредување во одделот „{{int:prefs-editing}}“ во вашите нагодувања.',
+Ако сте најавени, можете да го исклучите ова предупредување во одделот „Уредување“ во вашите нагодувања.',
 
 # Content models
 'content-model-wikitext' => 'викитекст',
@@ -1376,7 +1425,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,8 +1438,7 @@ $1",
 'searchmenu-legend' => 'Нагодувања на пребарувањето',
 'searchmenu-exists' => "'''На ова вики има страница со наслов „[[:$1]]“'''",
 'searchmenu-new' => "Создајте ја страницата „[[:$1]]“ на ова вики!'''",
-'searchhelp-url' => 'Help:Содржина',
-'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Прелистување на страници со овој префикс]]',
+'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Прелистување на страници со оваа претставка]]',
 'searchprofile-articles' => 'Статии',
 'searchprofile-project' => 'Помош и проектни страници',
 'searchprofile-images' => 'Податотеки',
@@ -1419,12 +1467,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' => 'Сè',
@@ -1579,6 +1627,8 @@ $1",
 'userrights-changeable-col' => 'Групи кои може да ги промените',
 'userrights-unchangeable-col' => 'Групи кои не може да ги промените',
 'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => 'Спротиставеност во корисничките права. Применете ги промените повторно.',
+'userrights-removed-self' => 'Успешно ги отстранивте вашите права. Затоа, повеќе немате пристап на страницава.',
 
 # Groups
 'group' => 'Група:',
@@ -1587,7 +1637,7 @@ $1",
 'group-bot' => 'Ботови',
 'group-sysop' => 'Администратори',
 'group-bureaucrat' => 'Бирократи',
-'group-suppress' => 'Ð\9dадгледÑ\83вачи',
+'group-suppress' => 'СкÑ\80ивачи',
 'group-all' => '(сите)',
 
 'group-user-member' => 'корисник',
@@ -1595,14 +1645,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' => 'Читање страници',
@@ -1649,6 +1699,10 @@ $1",
 'right-editusercssjs' => 'Уредување на CSS и JS податотеки на други корисници',
 'right-editusercss' => 'Уредување на CSS податотеки на други корисници',
 'right-edituserjs' => 'Уредување на JS податотеки на други корисници',
+'right-editmyusercss' => 'Уредување на сопствени кориснички каскадни стилски податотеки (CSS)',
+'right-editmyuserjs' => 'Уредување на сопствени кориснички податотеки со JavaScript',
+'right-viewmywatchlist' => 'Преглед на вашиот список на набљудувања',
+'right-editmywatchlist' => 'Уредување на вашиот список на набљудувања. Извесни дејства сепак ќе ставаат страници во списокот и без да го имате ова право.',
 'right-rollback' => 'Брзо отповикување на уредувањата на последниот корисник што уредувал одредена страница',
 'right-markbotedits' => 'Означување на вратени уредувања како ботовски уредувања',
 'right-noratelimit' => 'Без временски ограничувања на уредување',
@@ -1671,7 +1725,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"
@@ -1710,6 +1764,8 @@ $1",
 'action-userrights-interwiki' => 'уредување на кориснички права на корисници на други викија',
 'action-siteadmin' => 'заклучување или отклучување на базата на податоци',
 'action-sendemail' => 'испраќање на е-пошта',
+'action-editmywatchlist' => 'уредување на вашиот список на набљудувања',
+'action-viewmywatchlist' => 'преглед на вашиот список на набљудувања',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|промена|промени}}',
@@ -1765,7 +1821,7 @@ $1",
 'reuploaddesc' => 'Прекини и назад кон образецот за подигање',
 'upload-tryagain' => 'Поднеси изменет опис на податотеката',
 'uploadnologin' => 'Не сте најавени',
-'uploadnologintext' => 'Морате да [[Special:UserLogin|се најавите]] за да можете да подигате податотеки.',
+'uploadnologintext' => 'Мора да сте $1 за да можете да подигате.',
 'upload_directory_missing' => 'Папката за подигање на слики ($1) не постои и не може да биде создадена од опслужувачот.',
 'upload_directory_read_only' => 'Опслужувачот не може да запишува во именикот за подигање ($1).',
 'uploaderror' => 'Грешка во подигањето',
@@ -1858,7 +1914,7 @@ $1",
 'uploaddisabledtext' => 'Подигањето на податотеки е оневозможено.',
 'php-uploaddisabledtext' => 'Подигањето на податотеки е оневозможено во PHP. 
 Проверете го нагодувањето file_uploads.',
-'uploadscripted' => 'Податотеката содржи HTML или скриптен код што може да биде погрешно протолкуван од прелистувач.',
+'uploadscripted' => 'Податотеката содржи HTML-код или сценарио што може погрешно да се протолкува во прелистувачот.',
 'uploadvirus' => 'Оваа податотека содржи вирус! Повеќе подробности: $1',
 'uploadjava' => 'Податотеката е од типот ZIP што содржи податотека со наставка .class за Java.
 Подигањето на податотеки за Java не е дозволено, бидејќи со нив можат да се заобиколуваат безбедносните ограничувања.',
@@ -1877,7 +1933,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
@@ -2152,11 +2208,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' => 'Страници со својство',
@@ -2180,7 +2236,7 @@ $1',
 
 'withoutinterwiki' => 'Страници без меѓујазични врски',
 'withoutinterwiki-summary' => 'Следните страници немаат врски до други јазични верзии.',
-'withoutinterwiki-legend' => 'Ð\9fÑ\80еÑ\84икÑ\81',
+'withoutinterwiki-legend' => 'Ð\9fÑ\80еÑ\82Ñ\81Ñ\82авка',
 'withoutinterwiki-submit' => 'Прикажи',
 
 'fewestrevisions' => 'Статии со најмалку ревизии',
@@ -2219,7 +2275,7 @@ $1',
 'mostimages' => 'Најмногу врски до податотеки',
 'mostinterwikis' => 'Страници со најмногу меѓувики',
 'mostrevisions' => 'Статии со најмногу верзии',
-'prefixindex' => 'Страници со префикс',
+'prefixindex' => 'Сите страници (со претставка)',
 'prefixindex-namespace' => 'Сите страници со префикс (именски простор $1)',
 'shortpages' => 'Кратки страници',
 'longpages' => 'Долги страници',
@@ -2252,7 +2308,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
@@ -2271,7 +2327,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' => 'Прикажи/скриј одбрани записи',
 
@@ -2288,8 +2344,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' => 'Скриј пренасочувања',
 
@@ -2329,6 +2385,15 @@ $1',
 'listusers-noresult' => 'Не е пронајден корисник.',
 'listusers-blocked' => '(блокиран)',
 
+# Special:ActiveUsers
+'activeusers' => 'Список на активни корисници',
+'activeusers-intro' => 'Ова е список на корисници кои биле на некој начин активни во последните $1 {{PLURAL:$1|ден|дена}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|дејство|дејства}} {{PLURAL:$3|денес|во последните $3 дена}}',
+'activeusers-from' => 'Прикажи корисници почнувајќи од:',
+'activeusers-hidebots' => 'Скриј ботови',
+'activeusers-hidesysops' => 'Скриј администратори',
+'activeusers-noresult' => 'Нема пронајдено корисници.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Права на кориснички групи',
 'listgrouprights-summary' => 'Следи список на кориснички групи утврдени на ова вики, заедно со нивните придружни права на пристап.
@@ -2386,11 +2451,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' => 'Додај во списокот на набљудувања',
@@ -2406,8 +2471,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|страница|страници}}.',
@@ -2480,7 +2545,7 @@ $UNWATCHURL
 'delete-legend' => 'Бришење',
 'historywarning' => "'''Предупредување:''' Страницата што сакате да ја избришете има историја со околу $1 {{PLURAL:$1|ревизија|ревизии}}:",
 'confirmdeletetext' => 'На пат сте трајно да избришете страница заедно со нејзината историја.
-Потврдете дека имате намера да го направите ова, дека ги разбирате последиците од тоа, дека го правите ова во согласност со [[{{MediaWiki:Policy-url}}|политиката]].',
+Потврдете дека имате намера да го направите ова, дека ги разбирате последиците од тоа и дека го правите во согласност со [[{{MediaWiki:Policy-url}}|правилата]].',
 'actioncomplete' => 'Дејството е извршено',
 'actionfailed' => 'Неуспешно дејство',
 'deletedtext' => '„$1“ е избришана. Евиденција на скорешните бришења ќе најдете на $2.',
@@ -2495,7 +2560,7 @@ $UNWATCHURL
 ** На барање на авторот
 ** Прекршување на авторски права
 ** Вандализам',
-'delete-edit-reasonlist' => 'Уредување на причини за бришење',
+'delete-edit-reasonlist' => 'Уреди причини за бришење',
 'delete-toobig' => 'Оваа страница има долга историја на уредување, преку $1 {{PLURAL:$1|ревизија|ревизии}}.
 Бришењето на ваквии страници е забрането со цел {{SITENAME}} да се заштити од оштетувања.',
 'delete-warning-toobig' => 'Оваа страница има долга историја на уредување, преку $1 {{PLURAL:$1|ревизија|ревизии}}.
@@ -2561,7 +2626,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' => 'Заштити страници вклучени во оваа страница (каскадна заштита)',
@@ -2665,7 +2730,7 @@ $1',
 'mycontris' => 'придонеси',
 'contribsub2' => 'За $1 ($2)',
 'nocontribs' => 'Не се пронајдени промени што одговараат на овој критериум.',
-'uctop' => ' (врв)',
+'uctop' => '(тековно)',
 'month' => 'Од месец (и порано):',
 'year' => 'Од година (и порано):',
 
@@ -2714,7 +2779,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' => 'Причина:',
@@ -2997,6 +3062,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' => 'Не можам да создадам привремена податотека на минијатурата',
@@ -3153,7 +3220,6 @@ $1',
 '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 ќе се применува само врз ботовите */',
@@ -3178,7 +3244,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',
@@ -3330,11 +3396,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' => 'Форматот е следниот:
 
@@ -3344,8 +3424,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',
@@ -3408,7 +3486,7 @@ Variants for Chinese language
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Ширина',
 'exif-imagelength' => 'Висина',
 'exif-bitspersample' => 'Длабочина на бојата',
@@ -3588,7 +3666,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 — Факс-шифрирање',
@@ -3842,7 +3920,7 @@ Variants for Chinese language
 Вратена е следнава грешка: $1',
 'confirmemail_invalid' => 'Неточен потврден код. 
 Кодот можеби е истечен.',
-'confirmemail_needlogin' => 'Морате да $1 за да ја потврдите вашата е-поштенска адреса.',
+'confirmemail_needlogin' => 'Мора да сте $1 за да ја потврдите е-поштата.',
 'confirmemail_success' => 'Вашата е-поштенска адреса е потврдена.
 Сега можете да се [[Special:UserLogin|најавите]]. Ви посакуваме пријатни мигови на викито!',
 'confirmemail_loggedin' => 'Вашата е-поштенска адреса сега е потврдена.',
@@ -4110,12 +4188,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' => 'Барање на дуплирани податотеки',
@@ -4205,6 +4288,9 @@ $5
 'htmlform-submit' => 'Поднеси',
 'htmlform-reset' => 'Откажи промени',
 'htmlform-selectorother-other' => 'Друго',
+'htmlform-no' => 'Не',
+'htmlform-yes' => 'Да',
+'htmlform-chosen-placeholder' => 'Одберете можност',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 со поддршка за пребарување по цели текстови',
@@ -4212,11 +4298,11 @@ $5
 
 # New logging system
 'logentry-delete-delete' => '$1 {{GENDER:$2|ја избриша}} страницата $3',
-'logentry-delete-restore' => '$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-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',
index da6e81d..f2d410f 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' ),
@@ -340,14 +343,14 @@ $messages = array(
 'tog-justify' => 'ഖണ്ഡികകളുടെ അരികുകൾ നേരെയാക്കുക',
 'tog-hideminor' => 'പുതിയ മാറ്റങ്ങളുടെ പട്ടികയിൽ ചെറിയ തിരുത്തലുകൾ പ്രദർശിപ്പിക്കാതിരിക്കുക',
 'tog-hidepatrolled' => 'റോന്തുചുറ്റിയ തിരുത്തുകൾ പുതിയമാറ്റങ്ങളിൽ പ്രദർശിപ്പിക്കാതിരിക്കുക',
-'tog-newpageshidepatrolled' => 'à´±àµ\8bà´¨àµ\8dà´¤àµ\81à´\9aàµ\81à´±àµ\8dറിയ താളുകൾ പുതിയതാളുകളുടെ പട്ടികയിൽ പ്രദർശിപ്പിക്കാതിരിക്കുക',
+'tog-newpageshidepatrolled' => 'à´±àµ\8bà´¨àµ\8dà´¤àµ\81à´\9aàµ\81à´±àµ\8dറപàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9f താളുകൾ പുതിയതാളുകളുടെ പട്ടികയിൽ പ്രദർശിപ്പിക്കാതിരിക്കുക',
 'tog-extendwatchlist' => 'ഏറ്റവും പുതിയവ മാത്രമല്ല, എല്ലാ മാറ്റങ്ങളും ദൃശ്യമാകുന്ന വിധത്തിൽ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടിക വികസിപ്പിക്കുക.',
 'tog-usenewrc' => 'സമീപകാല മാറ്റങ്ങൾ, ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക എന്നീ താളുകളിലെ വിവരങ്ങൾ താളുകൾക്കനുസരിച്ചുള്ള കൂട്ടങ്ങളായി ഒതുക്കി പ്രദർശിപ്പിക്കുക (ജാവാസ്ക്രിപ്റ്റ് ആവശ്യമാണ്)',
 'tog-numberheadings' => 'ഉപവിഭാഗങ്ങൾക്ക് ക്രമസംഖ്യ കൊടുക്കുക',
-'tog-showtoolbar' => 'തിരുത്തൽ റ്റൂൾബാർ  പ്രദർശിപ്പിക്കുക (ജാവാസ്ക്രിപ്റ്റ്)',
-'tog-editondblclick' => 'താളുകളിൽ ഇരട്ട ക്ലിക്ക് ചെയ്യുമ്പോൾ തിരുത്താനനുവദിക്കുക (ജാവാസ്ക്രിപ്റ്റ്)',
+'tog-showtoolbar' => 'തിരുത്തൽ റ്റൂൾബാർ  പ്രദർശിപ്പിക്കുക (ജാവാസ്ക്രിപ്റ്റ് ആവശ്യമാണ്)',
+'tog-editondblclick' => 'താളുകളിൽ ഇരട്ട ക്ലിക്ക് ചെയ്യുമ്പോൾ തിരുത്താനനുവദിക്കുക (ജാവാസ്ക്രിപ്റ്റ് ആവശ്യമാണ്)',
 'tog-editsection' => '[തിരുത്തുക] എന്ന കണ്ണിയുപയോഗിച്ച് ഉപവിഭാഗങ്ങൾ തിരുത്താൻ അനുവദിക്കുക',
-'tog-editsectiononrightclick' => 'ഉപവിഭാഗങ്ങളുടെ തലക്കെട്ടിൽ റൈറ്റ് ക്ലിക്ക് ചെയ്യുന്നതു വഴി തിരുത്താനനുവദിക്കുക (ജാവാസ്ക്രിപ്റ്റ്)',
+'tog-editsectiononrightclick' => 'ഉപവിഭാഗങ്ങളുടെ തലക്കെട്ടിൽ റൈറ്റ് ക്ലിക്ക് ചെയ്യുന്നതു വഴി തിരുത്താനനുവദിക്കുക (ജാവാസ്ക്രിപ്റ്റ് ആവശ്യമാണ്)',
 'tog-showtoc' => 'ഉള്ളടക്കപ്പട്ടിക പ്രദർശിപ്പിക്കുക (മൂന്നിൽ കൂടുതൽ ഉപശീർഷകങ്ങളുള്ള താളുകൾക്കു മാത്രം)',
 'tog-rememberpassword' => 'എന്റെ പ്രവേശനം ഈ ബ്രൗസറിൽ ({{PLURAL:$1|ഒരു ദിവസം|$1 ദിവസം}}) ഓർത്തുവെക്കുക',
 'tog-watchcreations' => 'ഞാൻ സൃഷ്ടിക്കുന്ന താളുകളും ഞാൻ അപ്‌ലോഡ് ചെയ്യുന്ന പ്രമാണങ്ങളും ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽ ചേർക്കുക',
@@ -442,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|വർഗ്ഗം|വർഗ്ഗങ്ങൾ}}',
@@ -451,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 താളുകൾ ഉണ്ട്}}.',
@@ -523,6 +538,7 @@ $messages = array(
 'create-this-page' => 'ഈ താൾ സൃഷ്ടിക്കുക',
 'delete' => 'മായ്ക്കുക',
 'deletethispage' => 'ഈ താൾ നീക്കം ചെയ്യുക',
+'undeletethispage' => 'ഈ താൾ പുനഃസ്ഥാപിക്കുക',
 'undelete_short' => '{{PLURAL:$1|ഒരു തിരുത്തൽ|$1 തിരുത്തലുകൾ}} പുനഃസ്ഥാപിക്കുക',
 'viewdeleted_short' => '{{PLURAL:$1|മായ്ക്കപ്പെട്ട ഒരു തിരുത്തൽ|മായ്ക്കപ്പെട്ട $1 തിരുത്തലുകൾ}} കാണുക',
 'protect' => 'സം‌രക്ഷിക്കുക',
@@ -576,7 +592,6 @@ $1',
 'disclaimers' => 'നിരാകരണങ്ങൾ',
 'disclaimerpage' => 'Project:പൊതുനിരാകരണം',
 'edithelp' => 'തിരുത്തൽ സഹായി',
-'edithelppage' => 'Help:തിരുത്തൽ വഴികാട്ടി',
 'helppage' => 'Help:ഉള്ളടക്കം',
 'mainpage' => 'പ്രധാന താൾ',
 'mainpage-description' => 'പ്രധാന താൾ',
@@ -723,6 +738,8 @@ $2',
 'namespaceprotected' => "'''$1''' നാമമേഖലയിലുള്ള താളുകൾ തിരുത്താൻ താങ്കൾക്ക് അനുവാദമില്ല.",
 'customcssprotected' => 'ഈ സി.എസ്.എസ്. താളിൽ മറ്റൊരു ഉപയോക്താവിന്റെ സ്വകാര്യസജ്ജീകരണങ്ങൾ ഉൾക്കൊള്ളുന്നു, അതിനാൽ താങ്കൾക്ക് ഈ താൾ തിരുത്താൻ അനുവാദമില്ല.',
 'customjsprotected' => 'ഈ ജാവാസ്ക്രിപ്റ്റ് താളിൽ മറ്റൊരു ഉപയോക്താവിന്റെ സ്വകാര്യസജ്ജീകരണങ്ങൾ ഉൾക്കൊള്ളുന്നു, അതിനാൽ താങ്കൾക്ക് ഈ താൾ തിരുത്താൻ അനുവാദമില്ല.',
+'mycustomcssprotected' => 'ഈ സി.എസ്.എസ്.  താൾ തിരുത്താനുള്ള അനുമതി താങ്കൾക്കില്ല.',
+'mycustomjsprotected' => 'ഈ ജാവാസ്ക്രിപ്റ്റ് താൾ തിരുത്താനുള്ള അനുമതി താങ്കൾക്കില്ല.',
 'ns-specialprotected' => 'പ്രത്യേകം എന്ന നാമമേഖലയിൽ വരുന്ന താളുകൾ തിരുത്താനാവുന്നവയല്ല.',
 'titleprotected' => "[[User:$1|$1]] എന്ന ഉപയോക്താവ് ഈ താൾ ഉണ്ടാക്കുന്നതു നിരോധിച്ചിരിക്കുന്നു.
 ''$2'' എന്നതാണു അതിനു കാണിച്ചിട്ടുള്ള കാരണം.",
@@ -749,9 +766,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' => 'ഈ വിക്കിയിൽ രഹസ്യവാക്കുകൾ മാറ്റാനാവില്ല.',
@@ -764,18 +790,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' => 'നൽകിയ ഉപയോക്തൃനാമം മുമ്പേ നിലവിലുണ്ട്.
 ദയവായി മറ്റൊരു ഉപയോക്തൃനാമം തിരഞ്ഞെടുക്കുക.',
 'loginerror' => 'പ്രവേശനം സാധിച്ചില്ല',
+'createacct-error' => 'അംഗത്വസൃഷ്ടിക്കിടെ പിഴവുണ്ടായി',
 'createaccounterror' => 'അംഗത്വമെടുക്കാൻ കഴിഞ്ഞില്ല:$1',
 'nocookiesnew' => 'ഉപയോക്തൃഅംഗത്വം ഉണ്ടാക്കിയിരിക്കുന്നു. പക്ഷെ താങ്കൾ ലോഗിൻ ചെയ്തിട്ടില്ല. {{SITENAME}} സംരംഭത്തിൽ ലോഗിൻ ചെയ്യുവാൻ കുക്കികൾ സജ്ജമാക്കിയിരിക്കണം. താങ്കളുടെ കമ്പ്യൂട്ടറിൽ നിലവിൽ കുക്കികൾ ഡിസേബിൾ ചെയ്തിരിക്കുന്നു. അതു എനേബിൾ ചെയ്തു താങ്കളുടെ ഉപയോക്തൃനാമവും രഹസ്യവാക്കും ഉപയോഗിച്ച് ലോഗിൻ ചെയ്യൂ.',
 'nocookieslogin' => '{{SITENAME}} സംരംഭത്തിൽ ലോഗിൻ ചെയ്യുവാൻ കുക്കികൾ സജ്ജമാക്കിയിരിക്കണം. പക്ഷെ താങ്കൾ കുക്കികൾ സജ്ജമാക്കിയിട്ടില്ല. കുക്കികൾ സജ്ജമാക്കിയതിനു ശേഷം വീണ്ടും ലോഗിൻ ചെയ്യാൻ ശ്രമിക്കൂ.',
@@ -791,8 +837,8 @@ $2',
 'nosuchusershort' => '"$1" എന്ന പേരിൽ ഒരു ഉപയോക്താവ് ഇല്ല. അക്ഷരങ്ങൾ ഒന്നു കൂടി പരിശോധിക്കുക.',
 'nouserspecified' => 'ഉപയോക്തൃനാമം നിർബന്ധമായും ചേർക്കണം.',
 'login-userblocked' => 'ഈ ഉപയോക്താവ് തടയപ്പെട്ടിരിക്കുന്നു. പ്രവേശനം അനുവദിക്കുന്നില്ല.',
-'wrongpassword' => 'താà´\99àµ\8dà´\95ൾ à´¨àµ½à´\95à´¿à´¯ à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´¤àµ\86à´±àµ\8dറാണàµ\8d, à´µàµ\80à´£àµ\8dà´\9fàµ\81à´\82 à´¶àµ\8dരമിà´\95àµ\8dà´\95àµ\81à´\95.',
-'wrongpasswordempty' => 'താà´\99àµ\8dà´\95ൾ à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´¨àµ½à´\95ിയിരàµ\81à´¨àµ\8dനിലàµ\8dà´². à´µàµ\80à´£àµ\8dà´\9fàµ\81à´\82 à´¶àµ\8dരമിà´\95àµ\8dà´\95àµ\81à´\95.',
+'wrongpassword' => 'രഹസ്യവാക്ക് തെറ്റാണ്, വീണ്ടും ശ്രമിക്കുക.',
+'wrongpasswordempty' => 'രഹസ്യവാക്ക് നൽകിയിരുന്നില്ല. വീണ്ടും ശ്രമിക്കുക.',
 'passwordtooshort' => 'രഹസ്യവാക്കിൽ കുറഞ്ഞതു {{PLURAL:$1|ഒരു അക്ഷരം|$1 അക്ഷരങ്ങൾ}} ഉണ്ടായിരിക്കണം.',
 'password-name-match' => 'താങ്കളുടെ രഹസ്യവാക്ക് ഉപയോക്തൃനാമത്തിൽ നിന്നും വ്യത്യസ്തമായിരിക്കണം.',
 'password-login-forbidden' => 'ഈ ഉപയോക്തൃനാമത്തിന്റെയും രഹസ്യവാക്കിന്റെയും ഉപയോഗം നിരോധിച്ചിരിക്കുന്നു.',
@@ -819,7 +865,7 @@ $2',
 'cannotchangeemail' => 'അംഗത്വത്തിന്റെ ഇമെയിൽ വിലാസങ്ങൾ ഈ വിക്കിയിൽ മാറ്റാനാവില്ല.',
 'emaildisabled' => 'ഈ സൈറ്റിൽ നിന്ന് ഇമെയിലുകൾ അയയ്ക്കാനാവില്ല.',
 'accountcreated' => 'അംഗത്വം സൃഷ്ടിച്ചിരിക്കുന്നു',
-'accountcreatedtext' => '$1 എന്ന ഉപയോക്താവിനായി അംഗത്വം സൃഷ്ടിക്കപ്പെട്ടിരിക്കുന്നു.',
+'accountcreatedtext' => '[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) എന്ന ഉപയോക്താവിനായി അംഗത്വം സൃഷ്ടിക്കപ്പെട്ടിരിക്കുന്നു.',
 'createaccount-title' => '{{SITENAME}} സംരംഭത്തിൽ അംഗത്വം സൃഷ്ടിക്കൽ',
 'createaccount-text' => '{{SITENAME}} സംരംഭത്തിൽ ($4) താങ്കളുടെ ഇമെയിൽ വിലാസത്തിൽ ആരോ ഒരു അംഗത്വം "$2" എന്ന ഉപയോക്തൃനാമത്തിൽ ഉണ്ടാക്കിയിരിക്കുന്നു (രഹസ്യവാക്ക്: "$3").  താങ്കൾ ഇപ്പോൾ ലോഗിൻ ചെയ്തു രഹസ്യവാക്ക് മാറ്റേണ്ടതാകുന്നു.
 
@@ -853,13 +899,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' => 'ഫലമായുണ്ടാകുന്ന ഇമെയിൽ കാണണോ?',
@@ -884,7 +932,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' => 'ഇമെയിൽ വിലാസത്തിൽ മാറ്റംവരുത്തുക',
@@ -1081,14 +1129,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' => 'ഈ താളിൽ നിന്നു പോകുന്നത് താങ്കൾ വരുത്തിയ മാറ്റങ്ങൾ നഷ്ടപ്പെടാൻ ഇടയാക്കുന്നതാണ്.
-താങ്കൾ ലോഗിൻ ചെയ്തിട്ടുണ്ടെങ്കിൽ, താങ്കളുടെ ക്രമീകരണങ്ങളിൽ "{{int:prefs-editing}}" ഭാഗത്ത് ചെന്ന് ഈ അറിയിപ്പ് ഒഴിവാക്കാവുന്നതാണ്.',
+'editwarning-warning' => 'ഈ താളിൽ നിന്നും പോകുന്നത് താങ്കൾ വരുത്തിയ മാറ്റങ്ങൾ നഷ്ടപ്പെടാൻ ഇടയാക്കും.
+താങ്കൾ ലോഗിൻ ചെയ്തിട്ടുണ്ടെങ്കിൽ, താങ്കളുടെ ക്രമീകരണങ്ങളിൽ "തിരുത്തൽ" എന്ന ഭാഗത്ത് ചെന്ന് ഈ അറിയിപ്പ് പ്രദർശിപ്പിക്കുന്നത് ഒഴിവാക്കാവുന്നതാണ്.',
 
 # Content models
 'content-model-wikitext' => 'വിക്കിഎഴുത്ത്',
@@ -1330,7 +1379,6 @@ $1",
 'searchmenu-legend' => 'തിരച്ചിൽ ഉപാധികൾ',
 'searchmenu-exists' => "'''\"[[:\$1]]\" എന്ന തലക്കെട്ടിൽ ഒരു താൾ ഈ വിക്കിയിൽ നിലവിലുണ്ട്'''",
 'searchmenu-new' => "'''ഈ വിക്കിയിൽ \"[[:\$1]]\" താൾ നിർമ്മിക്കുക!'''",
-'searchhelp-url' => 'Help:ഉള്ളടക്കം',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ഈ പൂർവ്വപദങ്ങളുള്ള താളുകൾ ബ്രൗസ് ചെയ്യുക]]',
 'searchprofile-articles' => 'ലേഖനങ്ങളിൽ',
 'searchprofile-project' => 'സഹായം, പദ്ധതി താളുകളിൽ',
@@ -1371,6 +1419,7 @@ $1",
 'powersearch-togglenone' => 'ഒന്നുംവേണ്ട',
 'search-external' => 'ബാഹ്യ അന്വേഷണം',
 'searchdisabled' => '{{SITENAME}} സം‌രംഭത്തിൽ തിരച്ചിൽ ദുർബലപ്പെടുത്തിയിരിക്കുന്നു. താങ്കൾക്ക് ഗൂഗിൾ ഉപയോഗിച്ച് തത്കാലം തിരച്ചിൽ നടത്താവുന്നതാണ്‌. പക്ഷെ ഗൂഗിളിൽ {{SITENAME}} സം‌രംഭത്തിന്റെ സൂചിക കാലഹരണപ്പെട്ടതായിരിക്കാൻ സാദ്ധ്യതയുണ്ട്.',
+'search-error' => 'തിരയുന്നതിനിടെ ഒരു പിഴവുണ്ടായി: $1',
 
 # Preferences page
 'preferences' => 'ക്രമീകരണങ്ങൾ',
@@ -1386,7 +1435,7 @@ $1",
 'prefs-datetime' => 'ദിവസവും സമയവും',
 'prefs-labs' => 'പരീക്ഷണശാലയിൽ തയ്യാറാകുന്ന സൗകര്യങ്ങൾ',
 'prefs-user-pages' => 'ഉപയോക്തൃതാളുകൾ',
-'prefs-personal' => 'à´\85à´¹à´\82',
+'prefs-personal' => 'à´\8eà´¨àµ\8dà´¨àµ\86à´ªàµ\8dപറàµ\8dറി',
 'prefs-rc' => 'സമീപകാല മാറ്റങ്ങൾ',
 'prefs-watchlist' => 'ശ്രദ്ധിക്കുന്നവ',
 'prefs-watchlist-days' => 'ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽ പ്രദർശിപ്പിക്കേണ്ട പരമാവധി ദിവസങ്ങൾ:',
@@ -1514,6 +1563,8 @@ $1",
 'userrights-notallowed' => 'ഉപയോക്താക്കൾക്ക് അവകാശങ്ങൾ കൊടുക്കാനും എടുത്തുകളയാനുമുള്ള അനുമതി താങ്കളുടെ അംഗത്വത്തിനില്ല.',
 'userrights-changeable-col' => 'താങ്കൾക്ക് മാറ്റാവുന്ന സംഘങ്ങൾ',
 'userrights-unchangeable-col' => 'താങ്കൾക്ക് മാറ്റാനാവാത്ത സംഘങ്ങൾ',
+'userrights-conflict' => 'ഉപയോക്തൃ അവകാശങ്ങൾ സമരസപ്പെടായ്കയുണ്ടായി! ദയവായി താങ്കളുടെ മാറ്റങ്ങൾ വീണ്ടും നടപ്പിലാക്കുക.',
+'userrights-removed-self' => 'താങ്കൾ സ്വന്തം അവകാശങ്ങൾ സ്വയം ഒഴിവാക്കിയിരിക്കുന്നു. അതിനാൽ ഈ താൾ ഇനി താങ്കൾക്ക് ലഭ്യമായിരിക്കില്ല.',
 
 # Groups
 'group' => 'സംഘം:',
@@ -1585,6 +1636,10 @@ $1",
 'right-editusercssjs' => 'മറ്റ് ഉപയോക്താക്കളുടെ CSS, JS പ്രമാണങ്ങൾ തിരുത്തുക',
 'right-editusercss' => 'മറ്റ് ഉപയോക്താക്കളുടെ CSS പ്രമാണങ്ങൾ തിരുത്തുക',
 'right-edituserjs' => 'മറ്റ് ഉപയോക്താക്കളുടെ JS പ്രമാണങ്ങൾ തിരുത്തുക',
+'right-editmyusercss' => 'താങ്കളുടെ സ്വന്തം ഉപയോക്തൃ സി.എസ്.എസ്. പ്രമാണങ്ങൾ തിരുത്തുക',
+'right-editmyuserjs' => 'താങ്കളുടെ സ്വന്തം ഉപയോക്തൃ ജാവാസ്ക്രിപ്റ്റ് പ്രമാണങ്ങൾ തിരുത്തുക',
+'right-viewmywatchlist' => 'താങ്കളുടെ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക സ്വയം കാണുക',
+'right-editmywatchlist' => 'താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക സ്വയം തിരുത്തുക. ഈ അവകാശമില്ലാതെതന്നെ ചില പ്രവൃത്തികൾ താളുകൾ കൂട്ടിച്ചേർക്കുമെന്ന് അറിഞ്ഞിരിക്കുക.',
 'right-rollback' => 'ഒരു പ്രത്യേക താളിൽ അവസാനം തിരുത്തൽ നടത്തിയ ഉപയോക്താവിന്റെ തിരുത്തൽ പെട്ടെന്ന് ഒഴിവാക്കുക',
 'right-markbotedits' => 'മുൻപ്രാപനം നടത്തിയ തിരുത്തലുകൾ യാന്ത്രിക തിരുത്തലുകളായി അടയാളപ്പെടുത്തുക',
 'right-noratelimit' => 'പ്രവർത്തനങ്ങൾക്ക് പരിധികൾ ബാധകമല്ല',
@@ -1646,6 +1701,8 @@ $1",
 'action-userrights-interwiki' => 'മറ്റു വിക്കികളിൽ നിന്നുള്ള ഉപയോക്താക്കളുടെ ഉപയോക്തൃ അവകാശങ്ങൾ തിരുത്തുക',
 'action-siteadmin' => 'ഡേറ്റാബേസ് തുറക്കുക അല്ലെങ്കിൽ പൂട്ടുക',
 'action-sendemail' => 'ഇമെയിലുകൾ അയയ്ക്കുക',
+'action-editmywatchlist' => 'താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക തിരുത്തുക',
+'action-viewmywatchlist' => 'താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക കാണുക',
 
 # Recent changes
 'nchanges' => '{{PLURAL:$1|ഒരു മാറ്റം|$1 മാറ്റങ്ങൾ}}',
@@ -1699,7 +1756,7 @@ $1",
 'reuploaddesc' => 'വീണ്ടും അപ്‌ലോഡ് ചെയ്ത് നോക്കാനായി തിരിച്ചു പോവുക.',
 'upload-tryagain' => 'പുതുക്കിയ പ്രമാണ വിവരണങ്ങൾ സമർപ്പിക്കുക',
 'uploadnologin' => 'ലോഗിൻ ചെയ്തിട്ടില്ല',
-'uploadnologintext' => 'à´ªàµ\8dരമാണà´\99àµ\8dà´\99ൾ à´\85à´ªàµ\8dâ\80\8cà´²àµ\8bà´¡àµ\8d à´\9aàµ\86à´¯àµ\8dയാൻ à´¤à´¾à´\99àµ\8dà´\95ൾ [[Special:UserLogin|à´²àµ\8bà´\97ിൻ]] à´\9aàµ\86à´¯àµ\8dതിരിà´\95àµ\8dà´\95à´£à´\82',
+'uploadnologintext' => 'à´ªàµ\8dരമാണà´\99àµ\8dà´\99ൾ à´\85à´ªàµ\8dâ\80\8cà´²àµ\8bà´¡àµ\8d à´\9aàµ\86à´¯àµ\8dà´¯àµ\81à´¨àµ\8dനതിനàµ\81 à´®àµ\81à´®àµ\8dà´ªàµ\8d, à´¤à´¾à´\99àµ\8dà´\95ൾ $1.',
 'upload_directory_missing' => 'അപ്‌‌ലോഡ് ഡയറക്ടറി ($1) ലഭ്യമല്ല, അത് സൃഷ്ടിക്കാൻ വെബ്‌‌സെർവറിനു സാധിക്കില്ല.',
 'upload_directory_read_only' => 'വെബ് സെർവറിനു അപ്‌ലോഡ് ഡയറക്ടറിയിലേക്ക് ($1) എഴുതാൻ കഴിഞ്ഞില്ല.',
 'uploaderror' => 'അപ്‌ലോഡ് പിഴവ്',
@@ -1951,7 +2008,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'filehist-help' => 'ഏതെങ്കിലും തീയതി/സമയ കണ്ണിയിൽ ഞെക്കിയാൽ പ്രസ്തുതസമയത്ത് ഈ പ്രമാണം എങ്ങനെയായിരുന്നു എന്നു കാണാം.',
 'filehist-deleteall' => 'എല്ലാം മായ്ക്കുക',
 'filehist-deleteone' => 'ഇതു മായ്ക്കുക',
-'filehist-revert' => 'à´ªàµ\82ർവàµ\8dവസàµ\8dഥിതിയിലാക്കുക',
+'filehist-revert' => 'à´ªàµ\81à´¨à´\83à´¸àµ\8dഥാപിക്കുക',
 'filehist-current' => 'നിലവിലുള്ളത്',
 'filehist-datetime' => 'തീയതി/സമയം',
 'filehist-thumb' => 'ലഘുചിത്രം',
@@ -1995,7 +2052,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'filerevert-intro' => "താങ്കൾ '''[[Media:$1|$1]]''' യെ, [$3, $2 ഉണ്ടായിരുന്ന $4 പതിപ്പിലേക്കു സേവ് ചെയ്യുകയാണ്‌].",
 'filerevert-comment' => 'കാരണം:',
 'filerevert-defaultcomment' => '$2 ൽ ഉണ്ടായിരുന്ന $1 പതിപ്പിലേക്കു സേവ് ചെയ്തിരിക്കുന്നു',
-'filerevert-submit' => 'à´ªàµ\82ർവàµ\8dവസàµ\8dഥിതിയിലാക്കുക',
+'filerevert-submit' => 'à´ªàµ\81à´¨à´\83à´¸àµ\8dഥാപിക്കുക',
 'filerevert-success' => "'''[[Media:$1|$1]]''' യെ,  [$3, $2 ഉണ്ടായിരുന്ന $4] പതിപ്പിലേക്കു സേവ് ചെയ്തിരിക്കുന്നു.",
 'filerevert-badversion' => 'താങ്കൾ തന്ന സമയവുമായി യോജിക്കുന്ന മുൻ പതിപ്പുകൾ ഒന്നും തന്നെ ഈ പ്രമാണത്തിനില്ല.',
 
@@ -2072,6 +2129,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'disambiguations-text' => "താഴെക്കൊടുത്തിരിക്കുന്ന താളുകളിൽ '''വിവക്ഷിതങ്ങൾ താളിലേയ്ക്ക്''' കുറഞ്ഞത് ഒരു കണ്ണിയുണ്ട്. അവ അനുയോജ്യമായ താളിലേയ്ക്ക് കണ്ണിചേർക്കപ്പെടേണ്ടതാവാം. <br />
 [[MediaWiki:Disambiguationspage]] എന്ന താളിൽ കണ്ണി ചേർത്തിട്ടുള്ള ഫലകം ഉപയോഗിക്കുന്ന താളുകളെ വിവക്ഷിതങ്ങൾ താളായി കണക്കാക്കുന്നു.",
 
+'pageswithprop' => 'താളിന്റെ സവിശേഷതകളുള്ള താളുകൾ',
+'pageswithprop-legend' => 'ഒരു താൾ സവിശേഷതയുള്ള താളുകൾ',
 'pageswithprop-submit' => 'പോകൂ',
 
 'doubleredirects' => 'ഇരട്ട തിരിച്ചുവിടലുകൾ',
@@ -2237,6 +2296,15 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'listusers-noresult' => 'ഈ സംഘത്തിൽ ഉൾപ്പെടുന്ന ഉപയോക്താക്കൾ ആരും ഇല്ല.',
 'listusers-blocked' => '(തടയപ്പെട്ടു)',
 
+# Special:ActiveUsers
+'activeusers' => 'സജീവ ഉപയോക്താക്കളുടെ പട്ടിക',
+'activeusers-intro' => 'ഇത് കഴിഞ്ഞ {{PLURAL:$1|ദിവസം|$1 ദിവസങ്ങളിൽ}} ഏതെങ്കിലും വിധത്തിലുള്ള പ്രവർത്തനങ്ങൾ ചെയ്ത ഉപയോക്താക്കളുടെ പട്ടികയാണ്.',
+'activeusers-count' => 'കഴിഞ്ഞ {{PLURAL:$3|ഒരു ദിവസം|$3 ദിവസങ്ങളിൽ}} {{PLURAL:$1|ഒരു പ്രവൃത്തി|$1 പ്രവൃത്തികൾ}}',
+'activeusers-from' => 'ഇങ്ങനെ തുടങ്ങുന്ന ഉപയോക്താക്കളെ കാട്ടുക:',
+'activeusers-hidebots' => 'യന്ത്രങ്ങളെ മറയ്ക്കുക',
+'activeusers-hidesysops' => 'കാര്യനിർവാഹകരെ മറയ്ക്കുക',
+'activeusers-noresult' => 'ഉപയോക്താക്കളില്ല',
+
 # Special:ListGroupRights
 'listgrouprights' => 'ഉപയോക്തൃവിഭാഗത്തിന്റെ അവകാശങ്ങൾ',
 'listgrouprights-summary' => 'ഈ വിക്കിയിൽ നിർവ്വചിക്കപ്പെട്ടിരിക്കുന്ന ഉപയോക്തൃസംഘങ്ങളെയും, ആ സംഘങ്ങൾക്ക് പ്രാപ്തമായിട്ടുള്ള അവകാശങ്ങളേയും താഴെ കുറിച്ചിരിക്കുന്നു.
@@ -2313,8 +2381,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|താൾ|താളുകൾ}} ശ്രദ്ധിക്കുന്നുണ്ട്.',
@@ -2562,7 +2630,7 @@ $1',
 'mycontris' => 'സംഭാവനകൾ',
 'contribsub2' => '$1 എന്ന ഉപയോക്താവിന്റെ $2.',
 'nocontribs' => 'ഈ മാനദണ്ഡങ്ങളുമായി യോജിക്കുന്ന മാറ്റങ്ങൾ ഒന്നും കണ്ടില്ല.',
-'uctop' => '(à´\85വസാനതàµ\8dà´¤àµ\86 à´¤à´¿à´°àµ\81à´¤àµ\8dതൽ)',
+'uctop' => '(നിലവിലàµ\81à´³àµ\8dളതàµ\8d)',
 'month' => 'മാസം:',
 'year' => 'വർഷം:',
 
@@ -2722,6 +2790,7 @@ $1',
 'proxyblocksuccess' => 'ചെയ്തു കഴിഞ്ഞു.',
 'sorbsreason' => '{{SITENAME}} ഉപയോഗിക്കുന്ന DNSBL ൽ താങ്കളുടെ ഐ.പി. വിലാസം ഒരു ഓപ്പൺ പ്രോക്സിയായാണു രേഖപ്പെടുത്തിട്ടുള്ളത്.',
 'sorbs_create_account_reason' => '{{SITENAME}} ഉപയോഗിക്കുന്ന DNSBL ൽ താങ്കളുടെ ഐ.പി. വിലാസം ഒരു ഓപ്പൺ പ്രോക്സിയായാണു രേഖപ്പെടുത്തിട്ടുള്ളത്. താങ്കൾക്ക് അംഗത്വമെടുക്കാൻ സാദ്ധ്യമല്ല.',
+'xffblockreason' => 'എക്സ്-ഫോർവേഡഡ്-ഫോർ ഹെഡറിലെ ഒരു ഐ.പി. വിലാസം, താങ്കളുടേതോ താങ്കൾ ഉപയോഗിക്കുന്ന പ്രോക്സി സെർവറിലേതോ ആകാം, തടയപ്പെട്ടിരിക്കുന്നതാണ്. തടയലിന്റെ കാരണം: $1',
 'cant-block-while-blocked' => 'താങ്കൾ തടയപ്പെട്ടിരിക്കുമ്പോൾ മറ്റുപയോക്താക്കളെ തടയാൻ താങ്കൾക്ക് സാധിക്കില്ല.',
 'cant-see-hidden-user' => 'താങ്കൾ തടയാൻ ശ്രമിക്കുന്ന ഉപയോക്താവ് മുമ്പേ തടയപ്പെടുകയും മറയ്ക്കപ്പെടുകയും ചെയ്യപ്പെട്ടതാണ്. താങ്കൾക്ക് ഉപയോക്താവിനെ മറയ്ക്കാനുള്ള അവകാശം ഇല്ലെങ്കിൽ, ഉപയോക്താവിനെതിരെ ഉള്ള തടയൽ കാണാനോ തിരുത്താനോ കഴിയുന്നതല്ല.',
 'ipbblocked' => 'മറ്റുള്ളവരെ തടയാനോ അവരുടെ തടയൽ നീക്കാനോ താങ്കൾക്ക് കഴിയില്ല. കാരണം താങ്കൾ തന്നെ തടയപ്പെട്ടിരിക്കുകയാണ്',
@@ -2888,6 +2957,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' => 'താത്കാലിക ലഘുചിത്ര പ്രമാണം സൃഷ്ടിക്കാനായില്ല',
@@ -3212,11 +3282,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' => 'എഴുത്ത് രീതി താഴെ കൊടുത്തിരിക്കുന്നു:
 
@@ -3243,7 +3327,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'വീതി',
 'exif-imagelength' => 'ഉയരം',
 'exif-bitspersample' => 'ഓരോ ഘടകത്തിലുമുള്ള ബിറ്റുകൾ',
@@ -3417,7 +3501,7 @@ $1',
 'exif-originalimageheight' => 'വെട്ടിയെടുക്കുന്നതിനു മുമ്പ് ചിത്രത്തിന്റെ ഉയരം',
 'exif-originalimagewidth' => 'വെട്ടിയെടുക്കുന്നതിനു മുമ്പ് ചിത്രത്തിന്റെ വീതി',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'ചുരുക്കാത്തത്',
 'exif-compression-5' => 'എൽ.സെഡ്.ഡബ്ല്യു.',
 'exif-compression-6' => 'ജെപിഇജി (പഴയത്)',
@@ -3790,7 +3874,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' => 'താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയുടെ മൂലരൂപം തിരുത്തുക',
 
@@ -3836,12 +3920,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' => 'ഒരേ പ്രമാണത്തിന്റെ പലപകർപ്പുകളുണ്ടോയെന്നു തിരയുക',
@@ -3935,6 +4024,7 @@ $5
 'htmlform-selectorother-other' => 'മറ്റുള്ളവ',
 'htmlform-no' => 'ഇല്ല',
 'htmlform-yes' => 'ശരി',
+'htmlform-chosen-placeholder' => 'ഒരു ഐച്ഛികം തിരഞ്ഞെടുക്കുക',
 
 # SQLite database support
 'sqlite-has-fts' => 'പൂർണ്ണ-എഴുത്ത് തിരച്ചിൽ പിന്തുണയുള്ള $1',
index 92299dc..c48647c 100644 (file)
@@ -72,8 +72,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Харж буй хэрэглэгчдийн тоог үзүүлэх',
 'tog-oldsig' => 'Одоогийн гарын үсэг:',
 'tog-fancysig' => 'Түүхий гарын үсэг (автомат холбоосгүй)',
-'tog-externaleditor' => 'Үндсэн горимд нэмэлт засварлах багаж хэрэглэх(экспертүүдэд зориулагдсан, таны компьютерт тусгай тохиргоо шаардлагатай)',
-'tog-externaldiff' => 'Үндсэн горим гадаад харьцуулагч программ ашиглах (экспертүүдэд зориулав, таны компьютерт тусгай тохиргоо шаардлагатай)',
 'tog-showjumplinks' => '"Шууд очих" хялбар линкүүдийг ажиллагаатай болгох',
 'tog-uselivepreview' => 'Шууд байдлаар урьдчилж харах (ЖаваСкрипт) (Туршилт)',
 'tog-forceeditsummary' => 'Товч агуулгын талбарыг хоосон үлдээхэд надад мэдэгдэх',
@@ -283,7 +281,6 @@ $1',
 'disclaimers' => 'Татгалзлууд',
 'disclaimerpage' => 'Project:Ерөнхий татгалзал',
 'edithelp' => 'Засвар хийх тухай тусламж',
-'edithelppage' => 'Help:Засварлах',
 'helppage' => 'Help:Агуулга',
 'mainpage' => 'Нүүр хуудас',
 'mainpage-description' => 'Нүүр хуудас',
@@ -575,10 +572,8 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Нууц үгийг сэргээх',
-'passwordreset-text' => 'Энэхүү маягтыг бөглөж хэрэглэгчийн мэдээллээ аваарай.',
 'passwordreset-legend' => 'Нууц үгээ сэргээх',
 'passwordreset-disabled' => 'Энэ вики-д нууц үгийг сэргээх боломжгүй байна.',
-'passwordreset-pretext' => '{{PLURAL:$1||Доорх өгөгдлийн аль нэг хэсгийг оруулна уу}}',
 'passwordreset-username' => 'Хэрэглэгчийн нэр:',
 'passwordreset-domain' => 'Домайн:',
 'passwordreset-capture' => 'Цахим шуудангийн нууц үг сэргээх шууданг үзэх',
@@ -1052,7 +1047,6 @@ $1",
 'searchmenu-legend' => 'Хайх сонголтууд',
 'searchmenu-exists' => "'''Энэ викид \"[[:\$1]]\" гэсэн хуудас байна'''",
 'searchmenu-new' => "'''Энэ викид \"[[:\$1]]\" гэсэн хуудсыг үүсгэх!'''",
-'searchhelp-url' => 'Help:Агуулга',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Энэ угтвартай хуудсуудыг гүйлгэж харах]]',
 'searchprofile-articles' => 'Агуулгын хуудсууд',
 'searchprofile-project' => 'Тусламжийн болон төслийн хуудсууд',
@@ -1097,15 +1091,6 @@ $1",
 Та одоохондоо Google-г ашиглан хайх боломжтой.
 Анхааруулж хэлэхэд, тэдний {{SITENAME}}-н агуулгын индексүүд хоцрогдсон байж магадгүй.',
 
-# Quickbar
-'qbsettings' => 'Шуурхай тавцан',
-'qbsettings-none' => 'Байхгүй',
-'qbsettings-fixedleft' => 'Зүүн талд бэхжүүлсэн',
-'qbsettings-fixedright' => 'Баруун талд бэхжүүлсэн',
-'qbsettings-floatingleft' => 'Зүүн талд хөвсөн',
-'qbsettings-floatingright' => 'Баруун талд хөвсөн',
-'qbsettings-directionality' => 'Тухай хэлний барилаас хамаарч хэлбэрийг бий болгох',
-
 # Preferences page
 'preferences' => 'Хэрэглэгчийн тохиргоо',
 'mypreferences' => 'Миний тохиргоо',
@@ -1659,7 +1644,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 +2031,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 +2870,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Өргөн',
 'exif-imagelength' => 'Өндөр',
 'exif-bitspersample' => 'Бүрэлдэхүүн хэсэг бүр дэх бит',
@@ -3040,7 +3024,7 @@ $1',
 'exif-giffilecomment' => 'GIF файлын тэмдэглэгээ',
 'exif-intellectualgenre' => 'Зүйлийн төрөл',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Шахагдаагүй',
 
 'exif-unknowndate' => 'Мэдэгдэхгүй огноо',
@@ -3379,13 +3363,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 9507703..3887fd6 100644 (file)
@@ -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' => 'कधीच नाही',
@@ -563,7 +562,6 @@ $1',
 'disclaimers' => 'उत्तरदायित्वास नकार',
 'disclaimerpage' => 'Project: सर्वसाधारण उत्तरदायकत्वास नकार',
 'edithelp' => 'संपादन साहाय्य',
-'edithelppage' => 'Help:संपादन',
 'helppage' => 'Help:आशय',
 'mainpage' => 'मुखपृष्ठ',
 'mainpage-description' => 'मुखपृष्ठ',
@@ -830,10 +828,8 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'परवलीचा शब्द पूर्ववत करा',
-'passwordreset-text' => 'तुमच्या खात्याच्या माहितीसंदर्भात विपत्राद्वारे अनुस्मारक येण्यासाठी हा अर्ज पूर्ण भरा.',
 'passwordreset-legend' => 'परवलीचा शब्द पूर्ववत करा',
 'passwordreset-disabled' => 'या विकिवर परवलीचा शब्द पुनर्स्थापित करता येत नाही.',
-'passwordreset-pretext' => '{{PLURAL:$1||खालील माहितीच्या भागांपैकी एक भाग लिहा}}',
 'passwordreset-username' => 'सदस्यनाव:',
 'passwordreset-domain' => 'डोमेन',
 'passwordreset-capture' => 'ईमेल कशी असेल ते बघायचेय ?',
@@ -1039,6 +1035,8 @@ $2',
 या नावाचे पान आधीच अस्तित्वात आहे.',
 'defaultmessagetext' => 'कसूर पाठ्य मजकूर',
 'invalid-content-data' => 'अवैध माहिती',
+'editwarning-warning' => "या पानावरुन दुसर्‍या पानावर गेल्यास, तुम्ही येथे केलेले बदल जतन होणार नाहीत.
+ही सूचना घालवण्यासाठी ''माझ्या पसंती'' मधील संपादनपसंतीत बदल करा.",
 
 # Content models
 'content-model-wikitext' => 'विकिमजकूर',
@@ -1272,7 +1270,6 @@ $1",
 'searchmenu-legend' => 'विकल्प शोधा',
 'searchmenu-exists' => "'''या विकिवर \"[[:\$1]]\" या नावाचे पान आहे.'''",
 'searchmenu-new' => "'''या विकिवर \"[[:\$1]]\" हे पान तयार करा!'''",
-'searchhelp-url' => 'Help:साहाय्य पृष्ठ',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|या उपसर्गानिशी असलेली पाने न्याहाळा]]',
 'searchprofile-articles' => 'संबंधित पाने',
 'searchprofile-project' => 'साहाय्य व प्रकल्प पाने',
@@ -1314,15 +1311,6 @@ $1",
 'search-external' => 'बाह्य शोध',
 'searchdisabled' => '{{SITENAME}} शोध अनुपलब्ध केला आहे.तो पर्यंत गूगलवरून शोध घ्या.{{SITENAME}}च्या मजकुराची त्यांची सूचिबद्धता शिळी असण्याची शक्यता असू शकते हे लक्षात घ्या.',
 
-# Quickbar
-'qbsettings' => 'शीघ्रपट',
-'qbsettings-none' => 'नाही',
-'qbsettings-fixedleft' => 'स्थिर डावे',
-'qbsettings-fixedright' => 'स्थिर ऊजवे',
-'qbsettings-floatingleft' => 'तरंगते डावे',
-'qbsettings-floatingright' => 'तरंगते ऊजवे',
-'qbsettings-directionality' => 'तुमच्या भाशा ची पद्धत दिशात्मक असली पाहिजे.',
-
 # Preferences page
 'preferences' => 'माझ्या पसंती',
 'mypreferences' => 'माझ्या पसंती',
@@ -2154,6 +2142,15 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'listusers-noresult' => 'एकही सदस्य सापडला नाही.',
 'listusers-blocked' => '(खंडित)',
 
+# Special:ActiveUsers
+'activeusers' => 'कार्यरत सदस्यांची यादी',
+'activeusers-intro' => '$1 {{PLURAL:$1|day|days}} मधे शेवटी काम केलेल्या सदस्यांची यादी येथे मिळेल',
+'activeusers-count' => 'शेवटच्या {{PLURAL:$3|दिवसात|$3 दिवसांत}} $1 {{PLURAL:$1|संपादन|संपादने}}',
+'activeusers-from' => 'पुढील शब्दापासून सुरू होणारे सदस्य दाखवा:',
+'activeusers-hidebots' => 'सांगकामे लपवा',
+'activeusers-hidesysops' => 'प्रचालक लपवा',
+'activeusers-noresult' => 'एकही सदस्य सापडला नाही.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'सदस्य गट अधिकार',
 'listgrouprights-summary' => 'खाली या विकिवर दिलेली सदस्य गटांची यादी त्यांच्या अधिकारांसकट दर्शविलेली आहे. प्रत्येकाच्या अधिकारांची अधिक माहिती [[{{MediaWiki:Listgrouprights-helppage}}|इथे]] दिलेली आहे.',
@@ -2230,8 +2227,8 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'notvisiblerev' => 'आवृत्ती वगळण्यात आलेली आहे',
 'watchnochange' => 'प्रदर्शित कालावधीत, तुम्ही नित्य पहाण्यासाठी ठेवलेली कोणतीही बाब संपादित झाली नाही.',
 'watchlist-details' => '{{PLURAL:$1|$1 पान|$1 पाने}} पहाऱ्याच्या सूचीमध्ये, चर्चा पाने मोजलेले नाहीत.',
-'wlheader-enotif' => 'विपत्र सूचना सुविधा उपलब्ध केली.',
-'wlheader-showupdated' => "तुम्ही पानांस दिलेल्या शेवटच्या भेटी पासून बदललेली पाने '''ठळक''' दाखवली आहेत.",
+'wlheader-enotif' => 'विपत्र सूचना सुविधा उपलब्ध केली.',
+'wlheader-showupdated' => "तुम्ही पानांस दिलेल्या शेवटच्या भेटी पासून बदललेली पाने '''ठळक''' दाखवली आहेत.",
 'watchmethod-recent' => 'पहाऱ्यातील पानांकरिता अलीकडील बदलांचा तपास',
 'watchmethod-list' => 'अलीकडील बदलांकरिता पहाऱ्यातील पानांचा तपास',
 'watchlistcontains' => 'तुमचा $1 {{PLURAL:$1|पानावर|पानांवर}} पहारा आहे.',
@@ -3095,7 +3092,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'रूंदी',
 'exif-imagelength' => 'उंची',
 'exif-bitspersample' => 'प्रती घटक बीट्स',
@@ -3274,7 +3271,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 फॅक्स संकेतन',
@@ -3679,13 +3676,6 @@ $5
 'version-entrypoints-header-entrypoint' => 'आत येण्याचा मार्ग',
 'version-entrypoints-header-url' => 'यू॰आर॰एल',
 
-# Special:FilePath
-'filepath' => 'संचिका मार्ग',
-'filepath-page' => 'संचिका:',
-'filepath-submit' => 'चला',
-'filepath-summary' => 'हे विशेष पान संचिकेचा संपूर्ण मार्ग कळवते.
-चित्रे संपूर्ण रिझोल्युशन मध्ये दाखवली आहेत,इतर संचिका प्रकार त्यांच्या संबधित प्रोग्रामने प्रत्यक्ष सुरू होतात.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'जुळ्या संचिका शोधा',
 'fileduplicatesearch-summary' => 'हॅश किंमतीप्रमाणे जुळ्या संचिका शोधा.',
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 f4093f8..1668a97 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' ),
@@ -238,11 +245,11 @@ $messages = array(
 
 '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',
@@ -298,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}}',
@@ -323,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',
@@ -381,6 +400,7 @@ $messages = array(
 'create-this-page' => 'Cipta laman ini',
 'delete' => 'Hapuskan',
 'deletethispage' => 'Hapuskan laman ini',
+'undeletethispage' => 'Nyahhapuskan halaman ini',
 'undelete_short' => 'Nyahhapus {{PLURAL:$1|satu suntingan|$1 suntingan}}',
 'viewdeleted_short' => 'Papar {{PLURAL:$1|satu|$1}} suntingan dihapuskan',
 'protect' => 'Lindung',
@@ -434,7 +454,6 @@ $1',
 'disclaimers' => 'Penolak tuntutan',
 'disclaimerpage' => 'Project:Penolak tuntutan umum',
 'edithelp' => 'Bantuan menyunting',
-'edithelppage' => 'Help:Menyunting',
 'helppage' => 'Help:Kandungan',
 'mainpage' => 'Laman Utama',
 'mainpage-description' => 'Laman utama',
@@ -584,6 +603,8 @@ Untuk menambah atau menyunting terjemahan untuk semua wiki, sila gunakan projek
 'namespaceprotected' => "Anda tidak mempunyai keizinan untuk menyunting laman dalam ruang nama '''$1'''.",
 'customcssprotected' => 'Anda tidak dibenarkan menyunting laman JavaScript ini kerana ia mengandungi tetapan peribadi pengguna lain.',
 'customjsprotected' => 'Anda tidak dibenarkan menyunting laman JavaScript ini kerana ia mengandungi tetapan peribadi pengguna lain.',
+'mycustomcssprotected' => 'Anda tiada kebenaran untuk menyunting halaman CSS ini.',
+'mycustomjsprotected' => 'Anda tiada kebenaran untuk menyunting halaman JavaScript ini.',
 'ns-specialprotected' => 'Laman khas tidak boleh disunting.',
 'titleprotected' => "Tajuk ini telah dilindungi oleh [[User:$1|$1]] daripada dicipta. Sebab yang diberikan ialah ''$2''.",
 'filereadonlyerror' => 'Fail "$1" tidak dapat diubah suai kerana repositori fail "$2" berada dalam ragam baca sahaja.
@@ -612,10 +633,13 @@ Jangan lupa untuk mengubah [[Special:Preferences|keutamaan anda di {{SITENAME}}]
 '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' => 'Ingati saya',
-'userlogin-signwithsecure' => 'Daftar masuk dengan pelayan terlindung',
+'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.',
@@ -636,14 +660,30 @@ Jangan lupa untuk mengubah [[Special:Preferences|keutamaan anda di {{SITENAME}}]
 '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.",
@@ -691,7 +731,7 @@ e-mel bagi ciri-ciri berikut tidak boleh dikirim.',
 'cannotchangeemail' => 'Alamat e-mel akaun tidak boleh diubah di wiki ini.',
 'emaildisabled' => 'Tapak ini tidak boleh menghantar e-mel.',
 'accountcreated' => 'Akaun dibuka',
-'accountcreatedtext' => 'Akaun pengguna bagi $1 telah dibuka.',
+'accountcreatedtext' => 'Akaun pengguna [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|bual]]) telah dibuka.',
 'createaccount-title' => 'Pembukaan akaun {{SITENAME}}',
 'createaccount-text' => 'Seseorang telah membuka akaun untuk
 alamat e-mel anda di {{SITENAME}} ($4) dengan nama "$2" dan kata laluan "$3".
@@ -727,14 +767,15 @@ 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' => 'Lengkapkan borang ini untuk mengeset semula kata laluan.',
+'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-emaildisabled' => 'Ciri-ciri e-mel telah dipadamkan di wiki ini.',
-'passwordreset-pretext' => '{{PLURAL:$1||Isikan data di bawah}}',
 'passwordreset-username' => 'Nama pengguna:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Lihat e-mel yang terhasil?',
@@ -757,7 +798,7 @@ $2
 Kata laluan sementara: $2',
 '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 pengguna: $1',
+'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',
@@ -963,13 +1004,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 anda kehilangan sebarang perubahan yang telah anda lakukan.
-Anda boleh melumpuhkan amaran in di bahagian "Menyunting" dalam keutamaan anda.',
+'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',
@@ -1212,7 +1254,6 @@ Butirannya boleh didapati di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGEN
 'searchmenu-legend' => 'Pilihan carian',
 'searchmenu-exists' => "* Laman '''[[$1]]'''",
 'searchmenu-new' => "'''Cipta laman \"[[:\$1]]\" di wiki ini!'''",
-'searchhelp-url' => 'Help:Kandungan',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Senarai laman dengan awalan ini]]',
 'searchprofile-articles' => 'Laman kandungan',
 'searchprofile-project' => 'Laman bantuan dan projek',
@@ -1399,6 +1440,8 @@ 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.',
+'userrights-removed-self' => 'Anda telah berjaya menggugurkan hak-hak sendiri. Oleh yang demikian, anda tidak boleh mengakses halaman ini lagi.',
 
 # Groups
 'group' => 'Kumpulan:',
@@ -1469,6 +1512,10 @@ Tindakan ini tidak boleh dibatalkan.',
 'right-editusercssjs' => 'Menyunting fail CSS dan JavaScript pengguna lain',
 'right-editusercss' => 'Menyunting fail CSS pengguna lain',
 'right-edituserjs' => 'Menyunting fail JavaScript pengguna lain',
+'right-editmyusercss' => 'Menyunting fail CSS pengguna sendiri',
+'right-editmyuserjs' => 'Menyunting fail JavaScript pengguna sendiri',
+'right-viewmywatchlist' => 'Melihat senarai pantau sendiri',
+'right-editmywatchlist' => 'Menyunting senarai pantau sendiri. Perhatian: sesetengah tindakan masih akan dapat menambah halaman walaupun tanpa hak ini.',
 'right-rollback' => 'Mengundurkan suntigan terakhir bagi laman tertentu',
 'right-markbotedits' => 'Menanda suntingan yang diundurkan sebagai suntingan bot',
 'right-noratelimit' => 'Tidak dikenakan had kadar penyuntingan',
@@ -1530,6 +1577,8 @@ Tindakan ini tidak boleh dibatalkan.',
 'action-userrights-interwiki' => 'mengubah hak pengguna dari wiki lain',
 'action-siteadmin' => 'mengunci atau membuka kunci pangkalan data wiki ini',
 'action-sendemail' => 'menghantar e-mel',
+'action-editmywatchlist' => 'menyunting senarai pantau sendiri',
+'action-viewmywatchlist' => 'melihat senarai pantau sendiri',
 
 # Recent changes
 'nchanges' => '$1 perubahan',
@@ -1585,8 +1634,7 @@ Tindakan ini tidak boleh dibatalkan.',
 'reuploaddesc' => 'Kembali ke borang muat naik',
 'upload-tryagain' => 'Serahkan keterangan fail yang telah diubah',
 'uploadnologin' => 'Belum log masuk',
-'uploadnologintext' => 'Anda perlu [[Special:UserLogin|log masuk]]
-terlebih dahulu untuk memuat naik fail.',
+'uploadnologintext' => 'Anda mesti $1 untuk memuat naik fail.',
 'upload_directory_missing' => 'Direktori muat naik ($1) hilang dan tidak dapat dicipta oleh pelayan web.',
 'upload_directory_read_only' => 'Direktori muat naik ($1) tidak boleh ditulis oleh pelayan web.',
 'uploaderror' => 'Ralat muat naik',
@@ -2128,6 +2176,15 @@ Memerlukan sekurang-kurangnya satu domain peringkat tinggi, cth. "*.org".<br />
 'listusers-noresult' => 'Tiada pengguna dijumpai.',
 'listusers-blocked' => '(disekat)',
 
+# Special:ActiveUsers
+'activeusers' => 'Senarai pengguna aktif',
+'activeusers-intro' => 'Yang berikut ialah senarai pengguna yang bergiat sejak {{PLURAL:$1|semalam|$1 hari lalu}}.',
+'activeusers-count' => '$1 tindakan sejak {{PLURAL:$3|semalam|$3 hari lalu}}',
+'activeusers-from' => 'Tunjukkan pengguna bermula pada:',
+'activeusers-hidebots' => 'Sorokkan bot',
+'activeusers-hidesysops' => 'Sorokkan pentadbir',
+'activeusers-noresult' => 'Tiada pengguna dijumpai.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Hak kumpulan pengguna',
 'listgrouprights-summary' => 'Yang berikut ialah senarai kumpulan pengguna yang ditubuhkan di wiki ini dengan hak-hak masing-masing.
@@ -2208,8 +2265,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.',
@@ -2455,7 +2512,7 @@ $1',
 'mycontris' => 'Sumbangan',
 'contribsub2' => 'Oleh $1 ($2)',
 'nocontribs' => 'Tiada sebarang perubahan yang sepadan dengan kriteria-kriteria ini.',
-'uctop' => '(puncak)',
+'uctop' => '(terkini)',
 'month' => 'Sebelum bulan:',
 'year' => 'Sebelum tahun:',
 
@@ -2787,6 +2844,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',
@@ -3095,11 +3153,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:
 
@@ -3127,7 +3199,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',
@@ -3305,7 +3377,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',
@@ -3727,12 +3799,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',
@@ -3825,6 +3902,7 @@ Imej ditunjuk dalam leraian penuh, jenis fail yang lain dibuka dengan atur cara
 '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',
index e5cc31b..45240ed 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',
@@ -514,7 +513,6 @@ $1",
 'disclaimers' => 'Ċaħdiet',
 'disclaimerpage' => 'Project:Ċaħda ġenerali',
 'edithelp' => 'Gwida',
-'edithelppage' => 'Help:Kif Timmodifika',
 'helppage' => 'Help:Kontenut',
 'mainpage' => 'Il-Paġna prinċipali',
 'mainpage-description' => 'Il-Paġna prinċipali',
@@ -667,9 +665,17 @@ Ir-raġuni li ġiet mogħtija kienet ''$2''.",
 Tista' tkompli tuża' {{SITENAME}} bħala utent anonimu, jew tista' terġa <span class='plainlinks'>[$1 tidħol]</span> bħala l-istess utent jew wieħed differenti.
 Kun af li ċerti paġni jistgħu jkomplu jidhru bħallikieku l-illogjar 'l barra mill-kont qatt ma seħħ, sakemm ma tħassarx il-cache tal-browser.",
 'yourname' => 'Isem tal-utent:',
+'userlogin-yourname' => 'Isem tal-utent',
+'userlogin-yourname-ph' => 'Daħħal l-isem tal-utent tiegħek',
 'yourpassword' => 'Password:',
+'userlogin-yourpassword' => 'Password',
+'userlogin-yourpassword-ph' => 'Daħħal il-password tiegħek',
 'yourpasswordagain' => "Erġa' ikteb il-password:",
+'createacct-yourpasswordagain' => 'Ikkonferma l-password',
+'createacct-yourpasswordagain-ph' => "Erġa' daħħal il-password",
 'remembermypassword' => "Ftakar il-login tiegħi fuq dan il-kompjuter (għal massimu ta' {{PLURAL:$1|ġurnata|$1 ġurnata}})",
+'userlogin-remembermypassword' => 'Żommni fil-kont',
+'userlogin-signwithsecure' => 'Uża konnessjoni sigura',
 'securelogin-stick-https' => "Ibqa' konness fuq l-HTTPS wara l-login",
 'yourdomainname' => 'Id-dominju tiegħek:',
 'externaldberror' => "Kien hemm problema esterna ta' awtentiċitá jew m'għandhekx permess neċċessarju sabiex tagħmel aġġornamenti fuq l-aċċess estern.",
@@ -681,14 +687,27 @@ Kun af li ċerti paġni jistgħu jkomplu jidhru bħallikieku l-illogjar 'l barra
 'logout' => 'Oħroġ',
 'userlogout' => 'oħroġ',
 'notloggedin' => 'Għadek ma dħaltx ġewwa',
+'userlogin-noaccount' => "M'għandekx kont?",
+'userlogin-joinproject' => 'Irreġistra fuq {{SITENAME}}',
 'nologin' => "Għad m'għandekx kont? '''$1'''.",
 'nologinlink' => 'Oħloq kont',
 'createaccount' => 'Oħloq kont',
 'gotaccount' => "Diġa għandhek kont? '''$1'''.",
 'gotaccountlink' => 'Idħol',
 'userlogin-resetlink' => 'Insejt kif tidħol fil-kont tiegħek?',
+'userlogin-resetpassword-link' => 'Irrisettja l-password',
+'helplogin-url' => 'Għajnuna:Kif tirreġistra',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Għajnuna kif tillogja]]',
+'createacct-join' => 'Daħħal l-informazzjoni tiegħek hawn taħt.',
+'createacct-emailoptional' => 'Indirizz elettroniku (fakultattiv)',
+'createacct-email-ph' => 'Daħħal l-indirizz elettroniku tiegħek',
 'createaccountmail' => 'bil-posta elettronika',
 'createaccountreason' => 'Raġuni:',
+'createacct-captcha' => 'Kontroll tas-sigurtà',
+'createacct-imgcaptcha-ph' => 'Daħħal it-test li qed tara hawn fuq',
+'createacct-submit' => 'Oħloq il-kont',
+'createacct-benefit-heading' => '{{SITENAME}} hi magħmula minn persuni bħalek.',
+'createacct-benefit-body2' => 'paġna',
 'badretype' => 'Il-passwords li daħħalt ma jaqblux.',
 'userexists' => 'L-isem tal-utent li daħħalt diġà meħud. Jekk jogħġbok, agħżel isem differenti.',
 'loginerror' => 'Problemi fil-login',
@@ -696,7 +715,7 @@ Kun af li ċerti paġni jistgħu jkomplu jidhru bħallikieku l-illogjar 'l barra
 'nocookiesnew' => "Il-Kont tal-utent għal l-aċċess ġie maħluq, però ma kienx possibli li tagħmel aċċess għal {{SITENAME}} għax il-''cookies'' huma disattivati. Erġa' prova l-aċċess bl-isem tal-utent u l-password wara li tkun attivajt il-''cookies'' tal-''browser''.",
 'nocookieslogin' => "L-aċċess għal {{SITENAME}} jagħmel użu minn ''cookies'', li bħalissa huma disattivati. Jekk jogħġbok erġa' prova idħol wara li tkun attivajt il-''cookies'' fil-browser.",
 'nocookiesfornew' => "Il-kont ma ġiex maħluq, minħabba li ma stajniex nikkonfermaw is-sors. Assigura ruħek li l-cookies huma attivati, u erġa' tella' l-paġna biex terġa' tipprova.",
-'noname' => "Inti ma speċifikajtx isem ta' utent validu.",
+'noname' => 'L-isem tal-utent li tajt mhuwiex validu.',
 'loginsuccesstitle' => "Dħalt b'suċċess",
 'loginsuccess' => "'''Irnexxielek taqbad mas-server ta' {{SITENAME}} bl-isem tal-utent \"\$1\".'''",
 'nosuchuser' => 'M\'hemm l-ebda utent bl-isem ta\' "$1".<br />
@@ -777,10 +796,9 @@ Jista' jkun li int diġà biddilt il-password, jew għamilt rikjesta għal passw
 
 # Special:PasswordReset
 'passwordreset' => 'Irrisettja l-password',
-'passwordreset-text' => 'Imla din il-formola sabiex tirċievi notifikazzjoni permezz tal-posta elettronika tad-dettalji tal-kont tiegħek.',
+'passwordreset-text-one' => 'Imla din il-formola sabiex tirrisettja l-password.',
 'passwordreset-legend' => 'Irrisettja l-password',
 'passwordreset-disabled' => 'L-irrisettjar tal-password fuq din il-wiki ġie diżattivat.',
-'passwordreset-pretext' => "{{PLURAL:$1||Daħħal wieħed mill-biċċiet ta' informazzjoni t'hawn taħt}}",
 'passwordreset-username' => 'Isem tal-utent:',
 'passwordreset-domain' => 'Dominju:',
 'passwordreset-capture' => 'Ara l-kontenut tal-messaġġ?',
@@ -1010,8 +1028,10 @@ Ma ngħatat l-ebda spjegazzjoni.",
 Jidher li din ġiet imħassra.',
 'edit-conflict' => 'Kunflitt tal-editjar.',
 'edit-no-change' => 'Il-modifika li għamilt ġiet injorata, minħabba li ebda bidla ma saret lejn it-test.',
+'postedit-confirmation' => 'Il-modifika tiegħek ġiet salvata.',
 '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',
@@ -1162,7 +1182,8 @@ $1",
 'revdelete-only-restricted' => "L-oġġett bid-data $1 $2 ma jistax jinħeba: ma tistax taħbi oġġetti minn għajnejn l-amministraturi mingħajr ma tagħżel waħda mill-opzjonijiet ta' viżibilità.",
 'revdelete-reason-dropdown' => "*Raġunijiet komuni għat-tħassir
 ** Vjolazzjoni ta' copyright
-** Informazzjoni personali inapproprjata
+** Kumment jew informazzjoni personali mhux xierqa
+** Isem tal-utent mhux xieraq
 ** Informazzjoni potenzjalment libelluża",
 'revdelete-otherreason' => 'Raġuni oħra/addizzjonali:',
 'revdelete-reasonotherlist' => 'Raġuni oħra',
@@ -1237,7 +1258,6 @@ Nota li l-użu tal-links tan-navigazzjoni jagħmel reset tal-kolonna.",
 'searchmenu-legend' => 'Preferenzi għat-tfittxija',
 'searchmenu-exists' => "'''Hemm paġna bl-isem ta' \"[[:\$1]]\" fuq din il-wiki'''",
 'searchmenu-new' => "'''Oħloq il-paġna \"[[:\$1]]\" fuq din il-wiki!'''",
-'searchhelp-url' => 'Help:Kontenut',
 'searchmenu-prefix' => "[[Special:PrefixIndex/$1|Uri l-paġni b'dan il-prefiss]]",
 'searchprofile-articles' => "Paġni ta' kontenut",
 'searchprofile-project' => "Paġni ta' għajnuna u ta' proġett",
@@ -1282,15 +1302,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 +1811,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>
@@ -1877,9 +1887,9 @@ Id-deskrizzjoni fuq il-[$2 paġna ta' deskrizzjoni tal-fajl] tinsab hawn taħt."
 'filerevert-legend' => "Erġa' lura għall-fajl",
 'filerevert-intro' => "Inti qiegħed terġa lura għal fajl '''[[Media:$1|$1]]''' fil-[verżjoni $4 minn $3, $2].",
 'filerevert-comment' => 'Raġuni:',
-'filerevert-defaultcomment' => "Mort lura għal verżjoni ta' $2, $1",
+'filerevert-defaultcomment' => "Irkuprata l-verżjoni ta' $2, $1",
 'filerevert-submit' => 'Ġib lura',
-'filerevert-success' => "'''Il-Fajl [[Media:$1|$1]]''' ġie restorat għal [verżjoni $4 minn $3, $2].",
+'filerevert-success' => "'''Il-fajl [[Media:$1|$1]]''' ġie irkuprat lura għall-[$4 verżjoni tal-$2, $3].",
 'filerevert-badversion' => "M'hemmx verżjoni lokali tal-fajl aktar riċenti b'timbru tal-ħin rikjest.",
 
 # File deletion
@@ -2201,8 +2211,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}}.",
@@ -2279,7 +2289,7 @@ Ikkonsulta r-$2 biex tara paġni li ġew imħassra riċentament.',
 'dellogpage' => 'Tħassir',
 'dellogpagetext' => 'Hawn taħt hawn lista tal-paġni li ġew imħassra riċentament.',
 'deletionlog' => 'reġistru tat-tħassir',
-'reverted' => 'Mort lura għal verżjoni preċedenti',
+'reverted' => 'Irkuprata l-verżjoni preċedenti',
 'deletecomment' => 'Raġuni:',
 'deleteotherreason' => 'Raġunijiet oħra/addizzjonali:',
 'deletereasonotherlist' => 'Raġuni oħra',
@@ -2891,24 +2901,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 +2974,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 +3080,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 +3258,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 +3679,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''.",
@@ -3791,7 +3779,7 @@ Stampi huwa mogħrija b'risoluzzjoni sħiħa, tipi tal-fajl oħrajn jibdew bil-p
 'logentry-delete-event' => "$1 biddel il-viżibilità ta' {{PLURAL:$5|azzjoni tar-reġistru|$5 azzjonijiet tar-reġistru}} ta' $3: $4",
 'revdelete-content-hid' => 'kontenut moħbi',
 'revdelete-summary-hid' => 'taqsira moħbija',
-'revdelete-uname-hid' => 'isem tal-uten moħbi',
+'revdelete-uname-hid' => 'isem tal-utent moħbi',
 'revdelete-content-unhid' => 'kontenut muri mill-ġdid',
 'revdelete-summary-unhid' => 'taqsira murija mill-ġdid',
 'revdelete-uname-unhid' => 'isem tal-utent muri mill-ġdid',
index 26ed430..3f93d02 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',
@@ -275,7 +273,6 @@ $messages = array(
 'disclaimers' => 'Abiso de Cuntenido',
 'disclaimerpage' => 'Project:Abiso giral',
 'edithelp' => 'Ajuda de eidiçon',
-'edithelppage' => 'Help:Eiditar',
 'helppage' => 'Help:Cuntenidos',
 'mainpage' => 'Páigina Percipal',
 'mainpage-description' => 'Páigina Percipal',
@@ -555,7 +552,6 @@ Legenda: (atu) = defrénças de la berson atual,
 'prevn' => 'anteriores {{PLURAL:$1|$1}}',
 'nextn' => 'próssimos {{PLURAL:$1|$1}}',
 'viewprevnext' => 'Ber ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:Conteúdos',
 'searchprofile-images' => 'Multimédia',
 'searchprofile-everything' => 'Todo',
 'searchprofile-advanced' => 'Abançado',
@@ -852,7 +848,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 +1083,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 +1129,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 +1204,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..19f9cc7 100644 (file)
@@ -284,7 +284,6 @@ $1',
 'disclaimers' => 'သတိပြုစရာများ',
 'disclaimerpage' => 'Project: အထွေထွေ သတိပြုဖွယ်',
 'edithelp' => 'ပြင်​ဆင်​ရန် အ​ကူ​အ​ညီ​',
-'edithelppage' => 'Help: တည်းဖြတ်ခြင်း',
 'helppage' => 'Help: မာတိကာ',
 'mainpage' => 'ဗဟိုစာမျက်နှာ',
 'mainpage-description' => 'ဗ​ဟို​စာ​မျက်​နှာ​',
@@ -667,7 +666,6 @@ Legend: '''({{int:cur}})''' = နောက်ဆုံးမူနှင့် 
 'searchmenu-legend' => 'ရှာဖွေရန် ရွေးချယ်မှု',
 'searchmenu-exists' => "'''ဤဝီကီတွင် \"[[:\$1]]\" အမည်နှင့် စာမျက်နှာတစ်ခုရှိသည်။'''",
 'searchmenu-new' => "'''ဤဝီကီတွင် \"[[:\$1]]\" အမည်နှင့် စာမျက်နှာကို ဖန်တီးပါ။'''",
-'searchhelp-url' => 'Help: မာတိကာ',
 'searchprofile-articles' => 'မာတိကာစာမျက်နှာများ',
 'searchprofile-project' => 'အကူအညီနှင့် ပရောဂျက်စာမျက်နှာများ',
 'searchprofile-images' => 'မာလတီမီဒီယာ',
@@ -710,13 +708,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 +809,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 +1034,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 +1263,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 +1697,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 +1775,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 +1827,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 405cd8e..b527cda 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' => 'Невтик монень, мезе сёрмадомс витнемадо-петнемадо ёвтамонь вальминентень',
@@ -416,7 +414,6 @@ $messages = array(
 'disclaimers' => 'Видечинь кортамотне',
 'disclaimerpage' => 'Project:Видечинь прякс кортнема',
 'edithelp' => 'Витнемань-петнемань лезкс',
-'edithelppage' => 'Help:Витнема-петнема',
 'helppage' => 'Help:Лопась мезе кирди',
 'mainpage' => 'Прякслопа',
 'mainpage-description' => 'Прякслопа',
@@ -855,7 +852,6 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'searchmenu-legend' => 'Вешнемань аравтомкат',
 'searchmenu-exists' => "'''Те викисэнть ули \"[[\$1]]\" лем марто лопа'''",
 'searchmenu-new' => "'''Шкик \"[[:\$1]]\" лопанть те викисэнть!'''",
-'searchhelp-url' => 'Help:Лопась мезе кирди',
 'searchprofile-articles' => 'Потмокс лопат',
 'searchprofile-project' => 'Лезкс ды проекттэ лопат',
 'searchprofile-images' => 'Мультимедия',
@@ -1405,6 +1401,12 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'listusers-noresult' => 'Совицязо а муеви',
 'listusers-blocked' => '(саймас саезь)',
 
+# Special:ActiveUsers
+'activeusers' => 'Активной теицятнеде списка',
+'activeusers-hidebots' => 'Кекшемс ботатнень',
+'activeusers-hidesysops' => 'Кекшемс администратортнэнь',
+'activeusers-noresult' => 'Якинзэ-пакинзэ арасть',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Теиця куронть видечинзэ',
 'listgrouprights-group' => 'Куро',
@@ -1910,7 +1912,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Келе',
 'exif-imagelength' => 'Сэрь',
 'exif-bitspersample' => 'Эрьва компонентс зяро битт',
@@ -1962,7 +1964,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'exif-languagecode' => 'Кель',
 'exif-iimcategory' => 'Явовкс',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Апак сювордо',
 
 'exif-unknowndate' => 'Апак содань чи',
@@ -2170,11 +2172,6 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'version-software-product' => 'Шкавкс-нолдавкс',
 'version-software-version' => 'Верзия',
 
-# Special:FilePath
-'filepath' => 'Файлас яннэ',
-'filepath-page' => 'Файлась:',
-'filepath-submit' => 'Ютак',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Вешнэмс кавтаське файлат',
 'fileduplicatesearch-legend' => 'Вешнэмс кавтаське',
index 146a7ee..f916991 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' => 'زمونی که خولاصه دچی‌ین ره ننویشتمه مه ره بائو',
@@ -361,7 +359,6 @@ $2، $1',
 'disclaimers' => 'تکذیب‌نومه‌ئون',
 'disclaimerpage' => 'Project:تکذیب‌نومه',
 'edithelp' => 'دچی‌ین رانما',
-'edithelppage' => 'Help:دَچی‌ین',
 'helppage' => 'Help:راهنما',
 'mainpage' => 'گت صفحه',
 'mainpage-description' => 'گت صفحه',
@@ -1032,12 +1029,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 958004c..04bdfe0 100644 (file)
@@ -285,7 +285,6 @@ $messages = array(
 'currentevents-url' => 'Project:Āxcāncāyōtl',
 'disclaimers' => 'Nahuatīllahtōl',
 'edithelp' => 'Tlapatlaliztechcopa tēpalēhuiliztli',
-'edithelppage' => 'Help:¿Quēn motlahcuiloa cē zāzanilli?',
 'helppage' => 'Help:Tlapiyaliztli',
 'mainpage' => 'Achkàuhìxtlapalli',
 'mainpage-description' => 'Achkàuhìxtlapalli',
@@ -600,7 +599,6 @@ Hueliz ōmopolo huiqui nozo ōmozacac.
 'viewprevnext' => 'Xiquintta ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''Ye ia zāzanilli ītōca \"[[\$1]]\" inīn huiquipan'''",
 'searchmenu-new' => "'''Tihuelīti ticchīhuāz zāzanilli ītōca \"[[:\$1]]\" inīn huiquipan'''",
-'searchhelp-url' => 'Help:Tlapiyaliztli',
 'searchprofile-articles' => 'Tlapiyaliztli zāzanilli',
 'searchprofile-project' => 'Tēpalēhuiliztli īhuān īxiptlahtli āmatl',
 'searchprofile-images' => 'Nepapan media',
@@ -1341,7 +1339,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',
@@ -1471,10 +1469,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..0d9f53e 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éⁿ',
@@ -263,7 +262,6 @@ $1',
 'disclaimers' => 'Bô-hū-chek seng-bêng',
 'disclaimerpage' => 'Project:It-poaⁿ ê seng-bêng',
 'edithelp' => 'Án-choáⁿ siu-kái',
-'edithelppage' => 'Help:Pian-chi̍p',
 'helppage' => 'Help:Bo̍k-lio̍k',
 'mainpage' => 'Thâu-ia̍h',
 'mainpage-description' => 'Thâu-ia̍h',
@@ -396,7 +394,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',
@@ -588,7 +588,6 @@ Lí ê kái-piàn tī ē-kha ê bûn-jī-keh. Lí su-iàu chiōng lí chò ê k
 'nextn' => 'āu {{PLURAL:$1|$1}} hāng',
 'shown-title' => 'Múi ia̍h hián-sī $1 {{PLURAL:$1|kiat-kó|kiat-kó}}',
 'viewprevnext' => 'Khoàⁿ ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:Bo̍k-lio̍k',
 'searchprofile-articles' => 'Loē-iông ia̍h',
 'searchprofile-images' => 'To-mûi-thé',
 'searchprofile-everything' => 'Só͘-ū ê',
@@ -603,9 +602,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 +1172,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 0d6fb25..94d9f47 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,18 +360,18 @@ $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.',
+'tog-useeditwarning' => 'Si ifra dersom jeg forlater en side uten å lagre den.',
 
 'underline-always' => 'Alltid',
 'underline-never' => 'Aldri',
-'underline-default' => 'Nettleserens standardinnstillinger',
+'underline-default' => 'Drakta eller nettleserens standardinnstillinger',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Skrifttype i redigeringsboksen:',
 'editfont-default' => 'Nettleserstandard',
-'editfont-monospace' => 'Skrift med fast bredde',
-'editfont-sansserif' => 'Sans-serif',
-'editfont-serif' => 'Serif',
+'editfont-monospace' => 'Fastbredde skrifttype',
+'editfont-sansserif' => 'Sans-serif skrifttype',
+'editfont-serif' => 'Serif skrifttype',
 
 # Dates
 'sunday' => 'søndag',
@@ -425,6 +424,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|Kategorier}}',
@@ -506,6 +517,7 @@ $messages = array(
 'create-this-page' => 'Opprett denne siden',
 'delete' => 'Slett',
 'deletethispage' => 'Slett denne siden',
+'undeletethispage' => 'Legg tilbake siden',
 'undelete_short' => 'Gjenopprett {{PLURAL:$1|én revisjon|$1 revisjoner}}',
 'viewdeleted_short' => 'Vis {{PLURAL:$1|én slettet redigering|$1 slettede redigeringer}}',
 'protect' => 'Beskytt',
@@ -559,7 +571,6 @@ $1',
 'disclaimers' => 'Forbehold',
 'disclaimerpage' => 'Project:Generelle forbehold',
 'edithelp' => 'Redigeringshjelp',
-'edithelppage' => 'Help:Redigering',
 'helppage' => 'Help:Innhold',
 'mainpage' => 'Hovedside',
 'mainpage-description' => 'Hovedside',
@@ -706,6 +717,8 @@ $2',
 'namespaceprotected' => "Du har ikke tillatelse til å redigere sider i navnerommet '''$1'''.",
 'customcssprotected' => 'Du har ikke tillatelse til å redigere denne CSS-siden fordi den inneholder en annen brukers personlige innstillinger.',
 'customjsprotected' => 'Du har ikke tillatelse til å redigere denne JavaScript-siden fordi den inneholder en annen brukers personlige innstillinger.',
+'mycustomcssprotected' => 'Du har ikke rettigheter til å redigere denne CSS-siden.',
+'mycustomjsprotected' => 'Du har ikke rettigheter til å redigere denne Javascript-siden.',
 'ns-specialprotected' => 'Spesialsider kan ikke redigeres.',
 'titleprotected' => "Denne tittelen har blitt låst for oppretting av [[User:$1|$1]].
 Den angitte grunnen er «''$2''».",
@@ -731,9 +744,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' => 'Brukernavn',
+'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.',
@@ -746,18 +768,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 ditt',
+'helplogin-url' => 'Help:Innlogging',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hjelp med innlogging]]',
+'createacct-join' => 'Skriv inn informasjonen din under.',
+'createacct-emailrequired' => 'E-postadresse',
+'createacct-emailoptional' => 'E-postadresse (valgfritt)',
+'createacct-email-ph' => 'Skriv inn e-postadressen din',
 'createaccountmail' => 'Bruk et midlertidig tilfeldig passord, og send det til e-postadressen nedenfor',
+'createacct-realname' => 'Virkelig navn (valgfritt)',
 'createaccountreason' => 'Årsak:',
+'createacct-reason' => 'Årsak',
+'createacct-reason-ph' => 'Hvorfor lager du en annen bruker',
+'createacct-captcha' => 'Sikkerhetssjekk',
+'createacct-imgcaptcha-ph' => 'Skriv inn teksten du ser ovenfor',
+'createacct-submit' => 'Opprett konto',
+'createacct-benefit-heading' => '{{SITENAME}} er laget av folk som deg.',
+'createacct-benefit-body1' => '{{PLURAL:$1|redigering|redigeringer}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|side|sider}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|nylig bidragsyter|nylige bidragsytere}}',
 '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.',
@@ -807,7 +849,7 @@ Skriv inn en fungerende e-postadresse eller tøm feltet.',
 'cannotchangeemail' => 'E-postadresser knyttet til brukerkontoer kan ikke endres på denne wikien.',
 'emaildisabled' => 'Dette nettstedet kan ikke sende e-poster.',
 'accountcreated' => 'Konto opprettet',
-'accountcreatedtext' => 'Brukerkontoen for $1 har blitt opprettet.',
+'accountcreatedtext' => 'Brukerkontoen for [[{{ns:Bruker}}:$1|$1]] ([[{{ns:Brukerdiskusjon}}:$1|diskusjon]]) har blitt opprettet.',
 'createaccount-title' => 'Kontooppretting på {{SITENAME}}',
 'createaccount-text' => 'Noen opprettet en konto for din e-postadresse på {{SITENAME}} ($4) med navnet «$2», med «$3» som passord. Du burde logge inn og endre passordet nå.
 
@@ -840,13 +882,15 @@ 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 å tilbakestille passordet ditt.',
+'passwordreset-text-one' => 'Fyll ut skjemaet for å tilbakestille passordet',
+'passwordreset-text-many' => '{{PLURAL:$1|Fyll inn et av datafeltene for å tilbakestille ditt passord.}}',
 '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?',
@@ -877,7 +921,7 @@ passord.',
 Midlertidig passord: $2',
 '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 brukeren: $1',
+'passwordreset-emailerror-capture' => 'En passordtilbakestillingsepost ble laget, men det lyktes ikke å sende denne til {{GENDER:$2|brukeren}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Endre e-postadresse',
@@ -1090,13 +1134,13 @@ Slette- og flytteloggen vises nedenfor.',
 'edit-gone-missing' => 'Kunne ikke oppdatere siden fordi den har blitt slettet.',
 'edit-conflict' => 'Redigeringskonflikt.',
 'edit-no-change' => 'Redigeringen din ble ignorert fordi det ikke var noen endringer.',
+'postedit-confirmation' => 'Redigeringen din ble lagret.',
 'edit-already-exists' => 'Kunne ikke opprette ny side fordi den finnes fra før.',
 'defaultmessagetext' => 'Standard meldingstekst',
 '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 vil du miste alle endringer du har utført.
-Denne advarselen kan slås av under {{int:prefs-editing}} i instillingene dine.',
+'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',
@@ -1336,7 +1380,6 @@ Detaljer kan finnes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'searchmenu-legend' => 'Søkeinnstillinger',
 'searchmenu-exists' => "* Siden '''[[$1]]'''",
 'searchmenu-new' => "'''Opprett siden ''[[:$1]]'' på denne wikien.'''",
-'searchhelp-url' => 'Help:Hjelp',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Vis alle sider som begynner med dette]]',
 'searchprofile-articles' => 'Innholdssider',
 'searchprofile-project' => 'Hjelp- og prosjektsider',
@@ -1378,6 +1421,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.',
+'search-error' => 'En feil oppsto under søk: $1',
 
 # Preferences page
 'preferences' => 'Innstillinger',
@@ -1521,6 +1565,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:',
@@ -1591,6 +1636,8 @@ Den kan maks inneholde $1 {{PLURAL:$1|tegn|tegn}}.',
 'right-editusercssjs' => 'Redigere andre brukeres CSS- og JS-filer',
 'right-editusercss' => 'Redigere andre brukeres CSS-filer',
 'right-edituserjs' => 'Redigere andre brukeres JS-filer',
+'right-editmyusercss' => 'Rediger dine egne CSS-filer',
+'right-editmyuserjs' => 'Rediger dine egne Javascript-filer',
 'right-rollback' => 'Raskt tilbakestille den siste brukeren som har redigert en gitt side',
 'right-markbotedits' => 'Markere tilbakestillinger som robotredigeringer',
 'right-noratelimit' => 'Påvirkes ikke av hastighetsgrenser',
@@ -1963,7 +2010,7 @@ Når den filtreres av en bruker, vises bare de sist opplastede versjonene av fil
 # File description page
 'file-anchor-link' => 'Fil',
 'filehist' => 'Filhistorikk',
-'filehist-help' => 'Klikk på en dato/klokkeslett for å se filen slik den var da.',
+'filehist-help' => 'Klikk på et tidspunkt for å vise filen slik den var på det tidspunktet.',
 'filehist-deleteall' => 'slett alt',
 'filehist-deleteone' => 'slett',
 'filehist-revert' => 'tilbakestill',
@@ -2252,6 +2299,15 @@ Det kreves at det oppgis minst et toppnivådomene, for eksempel «*.org».<br />
 'listusers-noresult' => 'Ingen brukere funnet.',
 'listusers-blocked' => '(konto blokkert)',
 
+# Special:ActiveUsers
+'activeusers' => 'Liste over aktive brukere',
+'activeusers-intro' => 'Dette er en liste over brukere som har hatt en eller annen form for aktivitet innenfor {{PLURAL:$1|den siste dagen|de siste dagene}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|endring|endringer}} {{PLURAL:$3|det siste døgnet|de siste $3 dagene}}',
+'activeusers-from' => 'Vis brukere fra og med:',
+'activeusers-hidebots' => 'Skjul roboter',
+'activeusers-hidesysops' => 'Skjul administratorer',
+'activeusers-noresult' => 'Ingen brukere funnet.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Rettigheter for brukergrupper',
 'listgrouprights-summary' => 'Følgende er en liste over brukergrupper som er definert på denne wikien, og hvilke rettigheter de har.
@@ -2329,8 +2385,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-postvarsling 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}}.',
@@ -2896,6 +2952,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' => 'Feilmelding 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',
@@ -3205,11 +3263,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' => '{{PLURAL:$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 {{PLURAL:$1|time|timer}} siden',
+'minutes-ago' => '$1 {{PLURAL:$1|minutt|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' => 'I går kl. $1',
+
 # Bad image list
 'bad_image_list' => 'Formatet er som følger:
 
@@ -3239,7 +3311,7 @@ Andre vil skjules som standard.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Bredde',
 'exif-imagelength' => 'Høyde',
 'exif-bitspersample' => 'Bits per komponent',
@@ -3417,7 +3489,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',
@@ -3851,12 +3923,17 @@ 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' => 'Omdiriger via filnavn, bruker, eller versjonsid',
+'redirect-legend' => 'Omdiriger til en fil eller side',
+'redirect-summary' => 'Denne spesialsiden omdirigerer til en fil (hvis den gis et filnavn), en side (hvis den gis et versjonsnummer), eller en brukerside (hvis den gis en nummerisk brukerid).',
+'redirect-submit' => 'Gå',
+'redirect-lookup' => 'Oppslag:',
+'redirect-value' => 'Verdi:',
+'redirect-user' => 'Bruker-ID',
+'redirect-revision' => 'Sideversjon',
+'redirect-file' => 'Filnavn',
+'redirect-not-exists' => 'Verdi er ikke funnet',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Søk etter duplikatfiler',
@@ -3947,6 +4024,9 @@ 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',
index 4beb139..b79cb0b 100644 (file)
@@ -455,7 +455,6 @@ $1",
 'disclaimers' => 'Impressum',
 'disclaimerpage' => 'Project:Impressum',
 'edithelp' => 'Bearbeidenshülp',
-'edithelppage' => 'Help:Ännern',
 'helppage' => 'Help:Hülp',
 'mainpage' => 'Hööftsiet',
 'mainpage-description' => 'Hööftsiet',
@@ -620,7 +619,7 @@ Denk dor an, dat welk Sieden ünner Ümstänn noch jümmer so wiest warrn köön
 'logout' => 'Afmellen',
 'userlogout' => 'Afmellen',
 'notloggedin' => 'Nich anmellt',
-'nologin' => "Wenn du noch keen Brukerkonto hest, denn kannst di anmellen: '''$1'''.",
+'nologin' => 'Wenn du noch keen Brukerkonto hest, denn kannst di anmellen: $1.',
 'nologinlink' => 'Brukerkonto inrichten',
 'createaccount' => 'Nieg Brukerkonto anleggen',
 'gotaccount' => "Hest Du al en Brukerkonto? '''$1'''.",
@@ -1085,7 +1084,6 @@ Seh to, dat de Versionsgeschicht vun’n Artikel vun de Historie her bi de Reeg
 'searchmenu-legend' => 'Söökoptionen',
 'searchmenu-exists' => "* Sied '''[[$1]]'''",
 'searchmenu-new' => "'''Stell de Sied „[[:$1]]“ in dit Wiki nee op!'''",
-'searchhelp-url' => 'Help:Hülp',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Wies Sieden, de mit disse Bookstaven anfangt]]',
 'searchprofile-articles' => 'Inholdsieden',
 'searchprofile-project' => 'Hülp- un Projektsieden',
@@ -1515,7 +1513,7 @@ Wenn du ehr liekers hoochladen wullt, gah trüch un laad de Datei ünner en anne
 'upload-file-error' => 'Internen Fehler',
 'upload-file-error-text' => 'Dat geev en internen Fehler bi dat Anleggen vun en temporäre Datei op’n Server. Segg man en [[Special:ListUsers/sysop|Administrater]] bescheed.',
 'upload-misc-error' => 'Unbekannt Fehler bi dat Hoochladen',
-'upload-misc-error-text' => 'Bi dat Hoochladen geev dat en unbekannten Fehler. Kiek na, wat dor en Fehler in de URL is, wat de Websteed ok löppt un versöök dat denn noch wedder. Wenn dat Problem denn noch jümmer dor is, denn vertell dat en [[Special:ListUsers/sysop|System-Administrater]].',
+'upload-misc-error-text' => 'Bi dat Hoochladen geev dat en unbekannten Fehler. Kiek na, wat dor en Fehler in de URL is, wat de Websteed ok löppt un versöök dat denn noch wedder. Wenn dat Problem denn noch jümmer dor is, denn vertell dat en [[Special:ListUsers/sysop|Administrater]].',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'Kunn de URL nich kriegen',
@@ -1805,6 +1803,15 @@ Kiek ok bi de [[Special:WantedCategories|wünschten Kategorien]].',
 'listusers-noresult' => 'Keen Bruker funnen.',
 'listusers-blocked' => '(sperrt)',
 
+# Special:ActiveUsers
+'activeusers' => 'Aktive Brukers',
+'activeusers-intro' => 'Dit is en List von Brukers, de {{PLURAL:$1|den verleden Dag|de verleden $1 Daag}} aktiv wesen sünd.',
+'activeusers-count' => '$1 {{PLURAL:$1|Ännern|Ännern}} {{PLURAL:$3|den verleden Dag|in de verleden $3 Daag}}',
+'activeusers-from' => 'Brukers wiesen vanaf:',
+'activeusers-hidebots' => 'Bots nich wiesen',
+'activeusers-hidesysops' => 'Administraters nich wiesen',
+'activeusers-noresult' => 'Keen Brukers funnen.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Brukergruppen-Rechten',
 'listgrouprights-summary' => 'Dit is en List vun de Brukergruppen, de in dit Wiki defineert sünd, un de Rechten, de dor mit verbunnen sünd.
@@ -1877,7 +1884,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}}.',
@@ -2598,7 +2605,7 @@ Wiedere warrt standardmatig nich anwiest:
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Breed',
 'exif-imagelength' => 'Hööchd',
 'exif-bitspersample' => 'Bits je Farvkomponent',
@@ -2716,7 +2723,7 @@ Wiedere warrt standardmatig nich anwiest:
 'exif-languagecode' => 'Spraak',
 'exif-iimcategory' => 'Kategorie',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Unkomprimeert',
 
 'exif-unknowndate' => 'Unbekannt Datum',
@@ -3030,14 +3037,6 @@ Du kannst ok de [[Special:EditWatchlist|normale Sied to’n Ännern]] bruken.',
 'version-software-version' => 'Version',
 'version-entrypoints-header-url' => 'URL',
 
-# 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.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Söök na Datein, de jüst gliek sünd',
 'fileduplicatesearch-summary' => 'Söök na Datein, de na jemehr Hash-Tallen jüst gliek sünd.',
index 031dead..54392e8 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}}',
@@ -547,7 +548,6 @@ $1",
 'disclaimers' => 'Veurbehold',
 'disclaimerpage' => 'Project:Veurbehoud',
 'edithelp' => 'Hulpe mit bewarken',
-'edithelppage' => 'Help:Uutleg',
 'helppage' => 'Help:Inhoud',
 'mainpage' => 'Veurblad',
 'mainpage-description' => 'Veurblad',
@@ -680,7 +680,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 +713,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 +735,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',
-'nologin' => "He'j nog gien gebrukersnaam? '''$1'''.",
+'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.
@@ -830,10 +838,8 @@ Misschien he'j t wachtwoord al ewiezigd of n niej veurlopig wachtwoord an-evreug
 
 # Special:PasswordReset
 'passwordreset' => 'Wachtwoord opniej instellen',
-'passwordreset-text' => 'Vul dit formulier in zoda-w joe netpost kunnen sturen mit de gebrukersgegevens.',
 'passwordreset-legend' => 'Wachtwoord opniej instellen',
 'passwordreset-disabled' => 'Je kunnen op disse wiki joew wachtwoord niet opniej instellen.',
-'passwordreset-pretext' => '{{PLURAL:$1||Voer één van de onderstaonde velden in}}',
 'passwordreset-username' => 'Gebruker:',
 'passwordreset-domain' => 'Domein:',
 'passwordreset-capture' => 'De resulterende netpost bekieken?',
@@ -1070,6 +1076,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.
@@ -1298,7 +1312,6 @@ Waorschienlik ku'j der meer gegevens over vienen in t [{{fullurl:{{#Special:Log}
 'searchmenu-legend' => 'Zeukopsies',
 'searchmenu-exists' => "'''Der is n zied mit de naam \"[[:\$1]]\" op disse wiki.'''",
 'searchmenu-new' => "'''De zied \"[[:\$1]]\" op disse wiki anmaken!'''",
-'searchhelp-url' => 'Help:Inhold',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ziednamen mit dit veurvoegsel laoten zien]]',
 'searchprofile-articles' => 'Artikels',
 'searchprofile-project' => 'Hulp- en projektziejen',
@@ -1320,7 +1333,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 +1353,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 +1431,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)',
@@ -1795,11 +1799,11 @@ Gao weerumme naor t [[Special:Upload/stash/$1|opstuurformulier]] um dit probleem
 'upload-proto-error' => 'Verkeerd protokol',
 'upload-proto-error-text' => 'Um op disse maniere bestaanden toe te voegen mutten webadressen beginnen mit <code>http://</code> of <code>ftp://</code>.',
 'upload-file-error' => 'Interne fout',
-'upload-file-error-text' => 'Bie ons gung der effen wat fout to n tiedelik bestaand op de server an-emaakt wörden. Neem kontakt op mit n [[Special:ListUsers/sysop|systeembeheerder]].',
+'upload-file-error-text' => 'Bie ons gung der effen wat fout to n tiedelik bestaand op de server an-emaakt wörden. Neem kontakt op mit n [[Special:ListUsers/sysop|beheerder]].',
 'upload-misc-error' => 'Onbekende fout bie t inlaojen van joew bestaand',
 'upload-misc-error-text' => 'Der is bie t inlaojen van t bestaand n onbekende fout op-etrejen. 
 Kiek effen nao of de verwiezing t wel döt en probeer t opniej. 
-As t probleem zo blif, neem dan kontakt op mit één van de [[Special:ListUsers/sysop|systeembeheerders]].',
+As t probleem zo blif, neem dan kontakt op mit één van de [[Special:ListUsers/sysop|beheerders]].',
 'upload-too-many-redirects' => 'Der zatten te veule deurverwiezingen in de URL.',
 'upload-unknown-size' => 'Onbekende grootte',
 'upload-http-error' => 'Der is n HTTP-fout op-etrejen: $1',
@@ -1891,7 +1895,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 +2047,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 +2302,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 +2532,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 +3058,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 +3142,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 +3172,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 +3350,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 +3757,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 +3846,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..c0e8893 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' => 'खाली सम्पादन सार प्रविष्टि गरेमा मलाई सोध्ने',
@@ -298,7 +296,6 @@ $1',
 'disclaimers' => 'अस्विकारोक्तिहरु',
 'disclaimerpage' => 'Project:सामान्य अस्वीकारोक्ति',
 'edithelp' => 'सम्पादन सहायता',
-'edithelppage' => 'Help:सम्पादन',
 'helppage' => 'Help:विषयवस्तुहरू',
 'mainpage' => 'मुख्य पृष्ठ',
 'mainpage-description' => 'मुख्य पृष्ठ',
@@ -577,10 +574,8 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'प्रवेशशव्द पुनः तय गर्ने',
-'passwordreset-text' => 'तपाईंको खाता-विवरणको  इमेल अनुस्मारक प्राप्त गर्न यो फारम पूरा गर्नुहोस्।',
 'passwordreset-legend' => 'प्रवेशशव्द पुनः तय गर्ने',
 'passwordreset-disabled' => 'प्रवेश शव्द पुनः निर्धारण गर्ने व्यवस्था यस विकिमा निस्क्रिय पारिएको छ।',
-'passwordreset-pretext' => '{{PLURAL:$1||तल दिएका आँकड़ाका टुकुरा मध्ये एउटा प्रविष्ट गर्नुहोस्}}',
 'passwordreset-username' => 'प्रयोगकर्ता-नाम:',
 'passwordreset-domain' => 'डोमेन',
 'passwordreset-capture' => 'निस्कने इमेलको नमुना हेर्ने ?',
@@ -1022,7 +1017,6 @@ $1",
 'searchmenu-legend' => 'खोज विकल्प',
 'searchmenu-exists' => "''' \"[[:\$1]]\" नाम गरेको पृष्ठ  यो विकीमा रहेको छ'''",
 'searchmenu-new' => "'''यस विकिमा  \"[[:\$1]]\" शीर्षक भएको पृष्ठ बनाउनुहोस् !'''",
-'searchhelp-url' => 'Help:सामग्री',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|पृष्ठहरु प्रिफिक्सले हेर्नुहोस् ]]',
 'searchprofile-articles' => 'सामग्री पृष्ठहरु',
 'searchprofile-project' => 'सहायता र आयोजना पृष्ठहरु',
@@ -1067,15 +1061,6 @@ $1",
 हाललाई तपाईले गूगलद्वारा खोज्न सक्नुहुन्छ ।
 याद गर्नुहोस् उनीहरुको {{SITENAME}}को सूची सामग्री पुरानो भएको हुनसक्छ ।',
 
-# Quickbar
-'qbsettings' => 'क्विकबार',
-'qbsettings-none' => 'कुनैपनि होइन',
-'qbsettings-fixedleft' => 'देब्रे निश्चित गरिएको',
-'qbsettings-fixedright' => 'दाहिने निश्चित गरिएको',
-'qbsettings-floatingleft' => 'देब्रे तैरने',
-'qbsettings-floatingright' => 'दाहिने तैरने',
-'qbsettings-directionality' => 'तपाईको भाषाको लेखाइ दिशाको आधारमा मिलान गरिएको छ',
-
 # Preferences page
 'preferences' => 'रोजाईहरू',
 'mypreferences' => 'प्राथमिकताहरु',
@@ -1546,7 +1531,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 +1870,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 +2504,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 +2543,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 +2649,7 @@ Others will be hidden by default.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'चौडाइ',
 'exif-imagelength' => 'उचाई',
 'exif-bitspersample' => 'घटक प्रति बिट्स',
@@ -2850,7 +2823,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 +3296,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 d0c1f30..b2ca1aa 100644 (file)
@@ -10,6 +10,7 @@
  * @author Annabel
  * @author AvatarTeam
  * @author B4bol4t
+ * @author Basvb
  * @author DasRakel
  * @author Effeietsanders
  * @author Erwin
@@ -17,6 +18,7 @@
  * @author Extended by Hendrik Maryns <hendrik.maryns@uni-tuebingen.de>, March 2007.
  * @author Fryed-peach
  * @author Galwaygirl
+ * @author Geitost
  * @author GerardM
  * @author Hamaryns
  * @author Jens Liebenau
@@ -44,6 +46,7 @@
  * @author Troefkaart
  * @author Tvdm
  * @author User555
+ * @author WTM
  * @author Wiki13
  * @author לערי ריינהארט
  */
@@ -146,6 +149,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' ),
@@ -212,6 +217,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' ),
@@ -270,7 +276,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' ),
@@ -308,6 +314,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' ),
@@ -319,6 +326,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' ),
@@ -398,7 +406,7 @@ $messages = array(
 'tog-showhiddencats' => 'Verborgen categorieën weergeven',
 'tog-noconvertlink' => 'Paginanaamconversie uitschakelen',
 'tog-norollbackdiff' => 'Wijzigingen weglaten na terugdraaien',
-'tog-useeditwarning' => 'Waarschuw mij als ik een bewerkte pagina die nog niet is opgeslagen wil verlaten',
+'tog-useeditwarning' => 'U waarschuwen als u een bewerkte pagina die nog niet is opgeslagen wil verlaten',
 
 'underline-always' => 'Altijd',
 'underline-never' => 'Nooit',
@@ -462,6 +470,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}}',
@@ -543,6 +563,7 @@ $messages = array(
 'create-this-page' => 'Deze pagina aanmaken',
 'delete' => 'Verwijderen',
 'deletethispage' => 'Deze pagina verwijderen',
+'undeletethispage' => 'Pagina terugplaatsen',
 'undelete_short' => '$1 {{PLURAL:$1|bewerking|bewerkingen}} terugplaatsen',
 'viewdeleted_short' => '{{PLURAL: $1|Eén geschrapte bewerking |$1 geschrapte bewerkingen}} bekijken',
 'protect' => 'Beveiligen',
@@ -596,7 +617,6 @@ $1',
 'disclaimers' => 'Voorbehoud',
 'disclaimerpage' => 'Project:Algemeen voorbehoud',
 'edithelp' => 'Hulp bij bewerken',
-'edithelppage' => 'Help:Bewerken',
 'helppage' => 'Help:Inhoud',
 'mainpage' => 'Hoofdpagina',
 'mainpage-description' => 'Hoofdpagina',
@@ -748,6 +768,8 @@ $2",
 'namespaceprotected' => "U hebt geen rechten om pagina's in de naamruimte '''$1''' te bewerken.",
 'customcssprotected' => 'U kunt deze CSS-pagina niet bewerken, omdat die persoonlijke instellingen van een andere gebruiker bevat.',
 'customjsprotected' => 'U kunt deze JavaScriptpagina niet bewerken, omdat die persoonlijke instellingen van een andere gebruiker bevat.',
+'mycustomcssprotected' => 'U hebt geen rechten om deze CSS-pagina te bewerken.',
+'mycustomjsprotected' => 'U hebt geen rechten om deze JavaScriptpagina te bewerken.',
 'ns-specialprotected' => 'Pagina\'s in de naamruimte "{{ns:special}}" kunnen niet bewerkt worden.',
 'titleprotected' => "Het aanmaken van deze pagina is beveiligd door [[User:$1|$1]].
 De gegeven reden is ''$2''.",
@@ -778,10 +800,13 @@ Vergeet niet uw [[Special:Preferences|voorkeuren voor {{SITENAME}}]] aan te pass
 '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' => 'Aanmeldgegevens onthouden',
-'userlogin-signwithsecure' => 'Aanmelden via beveiligde server',
+'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.',
@@ -802,14 +827,30 @@ Vergeet niet uw [[Special:Preferences|voorkeuren voor {{SITENAME}}]] aan te pass
 '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.
@@ -873,7 +914,7 @@ Geef een geldig e-mailadres op of laat het veld leeg.',
 'cannotchangeemail' => 'Het e-mailadres voor een gebruiker kan op deze wiki niet gewijzigd worden.',
 'emaildisabled' => 'Deze site kan geen e-mails verzenden.',
 'accountcreated' => 'Gebruiker aangemaakt',
-'accountcreatedtext' => 'De gebruiker $1 is aangemaakt.',
+'accountcreatedtext' => 'De gebruiker [[{{ns:User}}:$1|$1]] is aangemaakt.',
 'createaccount-title' => 'Gebruikers registreren voor {{SITENAME}}',
 'createaccount-text' => 'Iemand heeft een gebruiker op {{SITENAME}} ($4) aangemaakt met de naam "$2" en uw e-mailadres.
 Het wachtwoord voor "$2" is "$3".
@@ -911,14 +952,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-emaildisabled' => 'E-mailmogelijkheden zijn uitgeschakeld op deze wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Voer één van de onderstaande velden in}}',
 'passwordreset-username' => 'Gebruiker:',
 'passwordreset-domain' => 'Domein:',
 'passwordreset-capture' => 'De resulterende e-mail bekijken?',
@@ -940,7 +982,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',
@@ -1163,6 +1205,7 @@ 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',
@@ -1415,7 +1458,6 @@ Probeer een andere zoekopdracht.',
 'searchmenu-legend' => 'Zoekopties',
 'searchmenu-exists' => "* Pagina '''[[$1]]'''",
 'searchmenu-new' => "'''De pagina \"[[:\$1]]\" aanmaken op deze wiki.'''",
-'searchhelp-url' => 'Help:Inhoud',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Paginanamen met dit voorvoegsel weergeven]]',
 'searchprofile-articles' => "Inhoudelijke pagina's",
 'searchprofile-project' => "Hulp- en projectpagina's",
@@ -1606,6 +1648,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:',
@@ -1676,6 +1719,8 @@ Als u deze opgeeft, kan deze naam gebruikt worden om u erkenning te geven voor u
 'right-editusercssjs' => 'De CSS- en JS-bestanden van andere gebruikers bewerken',
 'right-editusercss' => 'De CSS-bestanden van andere gebruikers bewerken',
 'right-edituserjs' => 'De JavaScriptbestanden van andere gebruikers bewerken',
+'right-editmyusercss' => "Uw eigen CSS-pagina's bewerken",
+'right-editmyuserjs' => "Uw eigen JavaScriptpagina's bewerken",
 'right-rollback' => 'Snel de laatste bewerking(en) van een gebruiker van een pagina terugdraaien',
 'right-markbotedits' => 'Teruggedraaide bewerkingen markeren als botbewerkingen',
 'right-noratelimit' => 'Tijdsafhankelijke beperkingen negeren',
@@ -1935,11 +1980,11 @@ Ga terug naar het [[Special:Upload/stash/$1|uploadformulier]] om dit probleem te
 'upload-proto-error-text' => "Uploads via deze methode vereisen URL's die beginnen met <code>http://</code> of <code>ftp://</code>.",
 'upload-file-error' => 'Interne fout',
 'upload-file-error-text' => 'Er is een interne fout opgetreden tijdens het aanmaken van een tijdelijk bestaan op de server.
-Neem contact op met een [[Special:ListUsers/sysop|systeembeheerder]].',
+Neem contact op met een [[Special:ListUsers/sysop|moderator]].',
 'upload-misc-error' => 'Onbekende uploadfout',
 'upload-misc-error-text' => 'Er is tijdens het uploaden een onbekende fout opgetreden.
 Controleer of de URL correct en beschikbaar is en probeer het opnieuw.
-Als het probleem aanhoudt, neem dan contact op met een [[Special:ListUsers/sysop|systeembeheerder]].',
+Als het probleem aanhoudt, neem dan contact op met een [[Special:ListUsers/sysop|moderator]].',
 'upload-too-many-redirects' => 'De URL bevatte te veel doorverwijzingen',
 'upload-unknown-size' => 'Onbekende grootte',
 'upload-http-error' => 'Er is een HTTP-fout opgetreden: $1',
@@ -2365,6 +2410,15 @@ Heeft tenminste een topleveldomein nodig, zoals bijvoorbeeld "*.org".<br />
 'listusers-noresult' => 'Geen gebruiker gevonden.',
 'listusers-blocked' => '(geblokkeerd)',
 
+# Special:ActiveUsers
+'activeusers' => 'Aanwezige gebruikers',
+'activeusers-intro' => 'Dit is een lijst met gebruikers die enige activiteit hebben laten zien in de afgelopen {{PLURAL:$1|dag|$1 dagen}}.',
+'activeusers-count' => '$1 recente {{PLURAL:$1|handeling|handelingen}} in de {{PLURAL:$3|afgelopen dag|laatste $3 dagen}}',
+'activeusers-from' => 'Gebruikers worden weergegeven vanaf:',
+'activeusers-hidebots' => 'Bots verbergen',
+'activeusers-hidesysops' => 'Beheerders verbergen',
+'activeusers-noresult' => 'Geen actieve gebruikers gevonden.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Rechten van gebruikersgroepen',
 'listgrouprights-summary' => 'Op deze pagina staan de gebruikersgroepen in deze wiki beschreven, met hun bijbehorende rechten.
@@ -2443,8 +2497,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.",
@@ -2566,7 +2620,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"',
@@ -3032,6 +3086,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.',
@@ -3189,7 +3245,6 @@ U kunt wel de broncode bekijken.',
 '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 */',
@@ -3360,11 +3415,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:
 
@@ -3394,7 +3463,7 @@ Andere velden worden verborgen.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Breedte',
 'exif-imagelength' => 'Hoogte',
 'exif-bitspersample' => 'Bits per component',
@@ -3572,7 +3641,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',
@@ -4006,13 +4075,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',
@@ -4105,6 +4178,7 @@ Andere bestandstypen worden direct in het met het MIME-type verbonden programma
 '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 ef507f0..d0bc217 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}}',
@@ -558,7 +573,6 @@ $1',
 'disclaimers' => 'Atterhald',
 'disclaimerpage' => 'Project:Atterhald',
 'edithelp' => 'Endringshjelp',
-'edithelppage' => 'Help:Endring',
 'helppage' => 'Help:Innhald',
 'mainpage' => 'Hovudside',
 'mainpage-description' => 'Hovudside',
@@ -719,9 +733,18 @@ 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',
+'createacct-yourpassword-ph' => 'Skriv inn eit passord',
 'yourpasswordagain' => 'Skriv opp att passordet',
+'createacct-yourpasswordagain' => 'Stadfest passord',
+'createacct-yourpasswordagain-ph' => 'Skriv inn passordet på nytt',
 'remembermypassword' => 'Hugs innlogginga mi på denne datamaskinen (høgst {{PLURAL:$1|éin dag|$1 dagar}})',
+'userlogin-remembermypassword' => 'Hald meg innlogga',
+'userlogin-signwithsecure' => 'Nytt trygg kopling',
 'securelogin-stick-https' => 'Fortset HTTPS-tilkopling etter innlogging.',
 'yourdomainname' => 'Domenet ditt',
 'password-change-forbidden' => 'Du kan ikkje endra passord på denne wikien.',
@@ -734,17 +757,37 @@ Gløym ikkje å endra [[Special:Preferences|innstillingane dine for {{SITENAME}}
 'logout' => 'Logg ut',
 'userlogout' => 'Logg ut',
 'notloggedin' => 'Ikkje innlogga',
-'nologin' => "Har du ingen brukarkonto? '''$1'''.",
+'userlogin-noaccount' => 'Har du ingen konto?',
+'userlogin-joinproject' => 'Vert med på {{SITENAME}}',
+'nologin' => 'Har du ingen brukarkonto? $1.',
 'nologinlink' => 'Registrer deg',
 'createaccount' => 'Opprett ny konto',
 'gotaccount' => "Har du ein brukarkonto? '''$1'''.",
 'gotaccountlink' => 'Logg inn',
 'userlogin-resetlink' => 'Har du gløymd påloggingsopplysingane dine?',
+'userlogin-resetpassword-link' => 'Attendestill passordet ditt',
+'helplogin-url' => 'Help:Innlogging',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hjelp med innlogging]]',
+'createacct-join' => 'Skriv inn informasjonen din under.',
+'createacct-emailrequired' => 'E-postadresse:',
+'createacct-emailoptional' => 'E-postadresse (valfritt)',
+'createacct-email-ph' => 'Skriv inn e-postadressa di',
 'createaccountmail' => 'Bruk eit mellombels tilfeldig passord og send det til e-postadressa som er oppgjeven under',
+'createacct-realname' => 'Sant namn (valfritt)',
 'createaccountreason' => 'Årsak:',
+'createacct-reason' => 'Årsak',
+'createacct-reason-ph' => 'Kvifor du lagar ein ny konto',
+'createacct-captcha' => 'Tryggingssjekk',
+'createacct-imgcaptcha-ph' => 'Skriv inn teksten du ser over',
+'createacct-submit' => 'Opprett kontoen din',
+'createacct-benefit-heading' => '{{SITENAME}} er laga av folk som deg.',
+'createacct-benefit-body1' => '{{PLURAL:$1|éi endring|$1 endringar}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|éi side|$1 sider}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|nyleg bidragsytar|nylege bidragsytarar}}',
 'badretype' => 'Passorda du skreiv inn er ikkje like.',
 'userexists' => 'Brukarnamnet er alt i bruk. Vel eit anna brukarnamn.',
 'loginerror' => 'Innloggingsfeil',
+'createacct-error' => 'Kontoopprettingsfeil',
 'createaccounterror' => 'Kunne ikkje oppretta kontoen:  $1',
 'nocookiesnew' => 'Brukarkontoen vart oppretta, men du er ikkje innlogga. {{SITENAME}} bruker informasjonskapslar for å logge inn brukarar,
 nettlesaren din er innstilt for ikkje å godta desse. Etter at du har endra innstillingane slik at nettlesaren godtek informasjonskapslar, kan du logge inn med det nye brukarnamnet og passordet ditt.',
@@ -825,10 +868,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 +1093,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 +1246,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".
@@ -1292,7 +1337,6 @@ Detaljar kan ein finna i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE
 'searchmenu-legend' => 'Søkjeval',
 'searchmenu-exists' => "* Sida '''[[$1]]'''",
 'searchmenu-new' => "'''Opprett sida «[[:$1|$1]]» på denne wikien.'''",
-'searchhelp-url' => 'Help:Innhald',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Sjå gjennom alle sider med denne forstavinga]]',
 'searchprofile-articles' => 'Innhaldssider',
 'searchprofile-project' => 'Hjelp- og prosjektsider',
@@ -1318,8 +1362,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,6 +1380,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.',
+'search-error' => 'Det oppstod ein feil under søket: $1',
 
 # Preferences page
 'preferences' => 'Innstillingar',
@@ -2200,6 +2245,15 @@ Det er påkravt med eit toppnivådomene, til dømes «*.org».<br />
 'listusers-noresult' => 'Ingen brukarnamn vart funne.',
 'listusers-blocked' => '(konto blokkert)',
 
+# Special:ActiveUsers
+'activeusers' => 'Liste over aktive brukarar',
+'activeusers-intro' => 'Dette er ei liste over brukarar som har hatt ei eller anna form for aktivitet innanfor {{PLURAL:$1|den siste dagen|dei siste dagane}}.',
+'activeusers-count' => '{{PLURAL:$1|Éi handling|$1 handlingar}} {{PLURAL:$3|det siste døgeret|dei siste $3 døgra}}',
+'activeusers-from' => 'Vis brukarar frå og med:',
+'activeusers-hidebots' => 'Skjul botar',
+'activeusers-hidesysops' => 'Skjul administratorar',
+'activeusers-noresult' => 'Ingen brukarar funne.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Rettar for brukargrupper',
 'listgrouprights-summary' => 'Detter ei liste som viser brukargruppene som er definerte på wikien, og kva rettar dei har. Det kan finnast [[{{MediaWiki:Listgrouprights-helppage}}|meir informasjon]]  om dei ulike rettane.',
@@ -2275,8 +2329,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}}.',
@@ -2670,6 +2724,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',
@@ -2963,7 +3018,7 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
 'tooltip-watchlistedit-raw-submit' => 'Oppdater overvakingslista',
 'tooltip-recreate' => 'Ved å trykkje på «Nyopprett» vert sida oppretta på nytt.',
 'tooltip-upload' => 'Start opplastinga',
-'tooltip-rollback' => '«Rulla attende»-knappen rullar med eitt klikk attende endringa(ne) på sida gjorde av den siste bidragsytaren',
+'tooltip-rollback' => '«Rull attende»-knappen rullar med eitt klikk attende endringa(ne) på sida gjorde av den siste bidragsytaren',
 'tooltip-undo' => '«Gjer om» attenderullar endringar og opnar endringsvindauga med førehandsvising. Gjer at ein kan leggje til ei årsak samandragsboksen.',
 'tooltip-preferences-save' => 'Lagra innstillingar',
 'tooltip-summary' => 'Skriv inn eit kort samandrag',
@@ -2974,7 +3029,6 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
 'monobook.css' => '/* CSS-tekst som vert plassert her, endrar utsjånaden til sidedrakta Monobook */',
 '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. */',
@@ -3067,7 +3121,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
@@ -3165,7 +3219,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',
@@ -3343,7 +3397,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',
@@ -3752,12 +3806,17 @@ 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:Redirect
+'redirect' => 'Omdiriger etter filnamn, brukar- eller versjons-ID',
+'redirect-legend' => 'Omdiriger til ei fil eller ei side',
+'redirect-summary' => 'Denne spesialsida omdirigerer til ei fil (med eit filnamn), ei side (med ein versjons-ID) eller ei brukarside (med eit brukartal).',
+'redirect-submit' => 'Gå',
+'redirect-lookup' => 'Sjå etter:',
+'redirect-value' => 'Verdi',
+'redirect-user' => 'Brukar-ID',
+'redirect-revision' => 'Sideversjon',
+'redirect-file' => 'Filnamn',
+'redirect-not-exists' => 'Fann ikkje verdi',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Søk etter duplikatfiler',
@@ -3847,45 +3906,48 @@ 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',
+'htmlform-chosen-placeholder' => 'Vel ein',
 
 # 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-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 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-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
@@ -3961,4 +4023,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..b933323 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',
@@ -236,7 +235,6 @@ $messages = array(
 'disclaimers' => 'Hlapa-matsogo',
 'disclaimerpage' => 'Project:Hlapa-Matsogo',
 'edithelp' => 'Thušo ya go fetola',
-'edithelppage' => 'Help:Fetola',
 'helppage' => 'Help:Mateng',
 'mainpage' => 'Letlakala la Pele',
 'mainpage-description' => 'Letlakala la Pele',
@@ -563,7 +561,6 @@ fetola tshenolo',
 'viewprevnext' => 'Lebelela ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''Go ena le letlaka la leina la \"[[:\$1]]\" go wiki ye.'''",
 'searchmenu-new' => "'''Hlola letlakala \"[[:\$1]]\" go wiki ye!'''",
-'searchhelp-url' => 'Help:Mateng',
 'searchprofile-articles' => 'Matlakala a diteng',
 'searchprofile-project' => 'Thušo le matlaka a diprojeke',
 'searchprofile-images' => 'Diphatlalatši tša "multi"',
@@ -1209,7 +1206,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..fb7e10e 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',
@@ -400,6 +400,18 @@ $messages = array(
 'oct' => "d'oct",
 'nov' => 'de nov',
 'dec' => 'de dec',
+'january-date' => '$1 genièr',
+'february-date' => '$1 febrièr',
+'march-date' => '$1 març',
+'april-date' => '$1 abril',
+'may-date' => '$1 mai',
+'june-date' => '$1 junh',
+'july-date' => '$1 julhet',
+'august-date' => '$1 agost',
+'september-date' => '$1 setembre',
+'october-date' => '$1 octobre',
+'november-date' => '$1 novembre',
+'december-date' => '$1 decembre',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categoria|Categorias}}',
@@ -534,7 +546,6 @@ $1",
 'disclaimers' => 'Avertiments',
 'disclaimerpage' => 'Project:Avertiments generals',
 'edithelp' => 'Ajuda',
-'edithelppage' => 'Help:Cossí modificar una pagina',
 'helppage' => 'Help:Acuèlh',
 'mainpage' => 'Acuèlh',
 'mainpage-description' => 'Acuèlh',
@@ -672,7 +683,7 @@ Requèsta : $2',
 'viewyourtext' => "Podètz veire e copiar lo contengut de '''vòstras modificacions''' a aquesta pagina :",
 'protectedinterface' => 'Aquesta pagina provesís de tèxte d’interfàcia pel logicial susaqueste wiki, e es protegida per evitar los abuses.
 Per apondre o modificar de traduccions sus totes los wikis, utilizatz [//translatewiki.net/ translatewiki.net], lo projècte de localizacion de MediaWiki.',
-'editinginterface' => "'''Atencion :''' sètz a editar una pagina utilizada per crear lo tèxte de l’interfàcia del logicial. Los cambiaments se repercutaràn, segon lo contèxte, sus totas o d'unas paginas visiblas pels autres utilizaires. Per las traduccions, vos convidam a utilizar lo projècte MediaWiki d'internacionalizacion dels messatges [//translatewiki.net/wiki/Main_Page?setlang=oc translatewiki.net].",
+'editinginterface' => "'''Atencion :''' sètz a mand de modificar una pagina utilizada per crear lo tèxte de l’interfàcia del logicial. Los cambiaments sus aquesta pagina se repercutaràn sus l'aparéncia de l'interfàcia d'utilizaire pels autres utilizaires d'aqueste wiki. Per apondre o modificar de traduccions per totes los wikis, utilizatz [//translatewiki.net/translatewiki.net], lo projècte MediaWiki d'internacionalizacion dels messatges .",
 'sqlhidden' => '(Requèsta SQL amagada)',
 'cascadeprotected' => "Aquesta pagina es actualament protegida perque es inclusa dins {{PLURAL:$1|la pagina seguenta|las paginas seguentas}}, {{PLURAL:$1|qu'es estada protegida|que son estadas protegidas}} amb l’opcion « proteccion en cascada » activada :
 $2",
@@ -698,9 +709,18 @@ Notatz que d'unas paginas pòdon èsser encara afichadas coma s'eratz encara con
 'welcomecreation-msg' => "Vòstre compte d'utilizaire es estat creat.
 Doblidetz pas de modificar [[Special:Preferences|vòstras preferéncias per {{SITENAME}}]].",
 'yourname' => "Nom d'utilizaire :",
+'userlogin-yourname' => "Nom d'utilizaire",
+'userlogin-yourname-ph' => "Picatz vòstre nom d'utilizaire",
 'yourpassword' => 'Vòstre senhal :',
+'userlogin-yourpassword' => 'Senhal',
+'userlogin-yourpassword-ph' => 'Picatz vòstre senhal',
+'createacct-yourpassword-ph' => 'Picatz un senhal',
 'yourpasswordagain' => 'Confirmar lo senhal :',
+'createacct-yourpasswordagain' => 'Confirmatz lo senhal',
+'createacct-yourpasswordagain-ph' => 'Entratz lo senhal tornarmai',
 'remembermypassword' => 'Me reconnectar automaticament a las visitas venentas (al maximum $1 {{PLURAL:$1|jorn|jorns}})',
+'userlogin-remembermypassword' => 'Gardar ma sesilha activa',
+'userlogin-signwithsecure' => 'Utilizar una connexion securizada',
 'securelogin-stick-https' => 'Demorar connectat en HTTPS aprèp la connexion',
 'yourdomainname' => 'Vòstre domeni',
 'password-change-forbidden' => 'Podètz pas modificar los senhals sus aqueste wiki.',
@@ -713,18 +733,38 @@ Doblidetz pas de modificar [[Special:Preferences|vòstras preferéncias per {{SI
 'logout' => 'Se desconnectar',
 'userlogout' => 'Desconnexion',
 'notloggedin' => 'Vos sètz pas identificat(ada)',
+'userlogin-noaccount' => 'Avètz pas de compte ?',
+'userlogin-joinproject' => 'Rejonhètz {{SITENAME}}',
 'nologin' => "Avètz pas un compte ? '''$1'''.",
 'nologinlink' => 'Creatz un compte',
 'createaccount' => 'Crear un compte novèl',
 'gotaccount' => "Ja avètz un compte ? '''$1'''.",
 'gotaccountlink' => 'Identificatz-vos',
 'userlogin-resetlink' => 'Avètz doblidat vòstres detalhs de connexion ?',
+'userlogin-resetpassword-link' => 'Reïnicializar lo senhal',
+'helplogin-url' => 'Help:Connexion',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajuda a la connexion]]',
+'createacct-join' => 'Entratz vòstras informacions çaijós.',
+'createacct-emailrequired' => 'Adreça electronica',
+'createacct-emailoptional' => 'Adreça de corrièr electronic (facultativa)',
+'createacct-email-ph' => 'Entratz vòstra adreça de corrièr electronic',
 'createaccountmail' => 'Utilizar un senhal aleatòri temporari e lo mandar a l’adreça de corrièl especificada çaijós',
+'createacct-realname' => 'Nom vertadièr (facultatiu)',
 'createaccountreason' => 'Motiu :',
+'createacct-reason' => 'Motiu',
+'createacct-reason-ph' => 'Perqué creatz un autre compte',
+'createacct-captcha' => 'Contraròtle de seguretat',
+'createacct-imgcaptcha-ph' => 'Entratz lo tèxte que vesètz çaisús',
+'createacct-submit' => 'Creatz vòstre compte',
+'createacct-benefit-heading' => '{{SITENAME}} es escrich per de monde coma vos.',
+'createacct-benefit-body1' => '{{PLURAL:$1|cambiament|cambiaments}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pagina|paginas}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|contributor recent|contributors recents}}',
 'badretype' => "Los senhals qu'avètz picats son pas identics.",
 'userexists' => "Lo nom d'utilizaire qu'avètz picat ja es utilizat.
 Causissètz-ne un autre.",
 'loginerror' => "Error d'identificacion",
+'createacct-error' => 'Error al moment de la creacion del compte',
 'createaccounterror' => 'Impossible de crear lo compte : $1',
 'nocookiesnew' => "Lo compte d'utilizaire es estat creat, mas sètz pas connectat. {{SITENAME}} utiliza de cookies per la connexion mas los avètz desactivats. Activatz-los e reconnectatz-vos amb lo meteis nom e lo meteis senhal.",
 'nocookieslogin' => '{{SITENAME}} utiliza de cookies per la connexion mas avètz los cookies desactivats. Activatz-los e reconnectatz-vos.',
@@ -1006,6 +1046,10 @@ Sembla que siá estada suprimida.',
 'edit-already-exists' => 'La pagina novèla a pogut èsser creada .
 Existís ja.',
 'defaultmessagetext' => 'Messatge per defaut',
+'content-failed-to-parse' => "Fracàs de l'analisi del contengut de $2 pel modèl $1: $3",
+'invalid-content-data' => 'Donadas del contengut invalidas',
+'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',
@@ -1026,6 +1070,13 @@ D'unas inclusions seràn pas efectuadas.",
 'parser-template-loop-warning' => 'Modèl en bocla detectat : [[$1]]',
 'parser-template-recursion-depth-warning' => 'Limit de longor de la recursion del modèl depassat ($1)',
 'language-converter-depth-warning' => 'Limit de prigondor del convertissor de lenga depassada ($1)',
+'node-count-exceeded-category' => 'Paginas ont nombre de nosèls es depassat',
+'node-count-exceeded-warning' => 'Pagina depassant lo nombre de nosèls',
+'expansion-depth-exceeded-category' => "Paginas ont la prigondor d'espandiment es depassada",
+'expansion-depth-exceeded-warning' => "Pagina depassant la prigondor d'espandiment",
+'parser-unstrip-loop-warning' => 'Bocla pas desmontabla detectada',
+'parser-unstrip-recursion-limit' => 'Limit de recursion pas desmontable depassat ($1)',
+'converter-manual-rule-error' => 'Error detectada dins la règla manuala de conversion de lenga',
 
 # "Undo" feature
 'undo-success' => "Aquesta modificacion va èsser desfacha. Confirmatz los cambiaments (visibles en bas d'aquesta pagina), puèi salvatz se sètz d’acòrdi. Mercés de motivar l’anullacion dins la bóstia de resumit.",
@@ -1085,18 +1136,18 @@ Coma administrator, podètz encara [$1 veire aquesta version] s'o volètz.",
 I pòt aver mai de detalhs dins [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} lo jornal de las supressions].
 Coma administrator, podètz encara [$1 veire aquesta version] s'o volètz.",
 'rev-deleted-text-view' => "Aquesta version de la pagina es estada '''escafada'''.
-En tant qu’administrator, la podètz visualizar ; i pòt aver de detalhs dins lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal dels escafaments].",
+La podètz visualizar ; de detalhs son disponibles dins lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal dels escafaments].",
 'rev-suppressed-text-view' => "Aquesta version de la pagina es estada '''suprimida'''.
-En tant qu’administrator, la podètz visualizar ; i pòt aver de detalhs dins lo [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jornal de las supressions].",
+La podètz visualizar ; de detalhs son disponibles dins lo [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jornal de las supressions].",
 'rev-deleted-no-diff' => "Podètz pas veire aquesta dif per que una de las versions es estada '''escafada'''.
 I pòt aver mai de detalhs dins lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal dels escafaments].",
 'rev-suppressed-no-diff' => "Pod�tz pas veire aquesta difer�ncia perque una de las revisions es estada '''suprimida'''.",
 'rev-deleted-unhide-diff' => "Una de las revisions d'aquesta diferéncia es estada '''escafada'''.
-I pòt aver mai de detalhs dins lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal dels escafaments].
-En tant qu'administrator, podètz encara [$1 veire aquesta diferéncia] se volètz.",
+De detalhs son disponibles dins lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal dels escafaments].
+Podètz totjorn [$1 veire aquesta diferéncia] se lo volètz.",
 'rev-suppressed-unhide-diff' => "Una de las revisions d'aqueste diff es estada '''suprimida'''.
-I pòt aver de detalhs dins lo [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jornal de las supressions].
-En tant qu'administrator, podètz totjorn [$1 veire aqueste diff] se volètz contunhar.",
+De detalhs son disponibles dins lo [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jornal de las supressions].
+Podètz totjorn [$1 veire aqueste diff] se volètz contunhar.",
 'rev-deleted-diff-view' => "Una de las revisions d'aquesta diff es estada '''suprimida'''.
 En tant qu'administrator podètz veire aquesta diff ; i pòt aver mai de detalhs dins lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de las supressions].",
 'rev-suppressed-diff-view' => "Una de las revisions d'aquesta diff es estada '''escafada'''.
@@ -1228,7 +1279,6 @@ Asseguratz-vos qu'aqueste cambiament pòsca conservar la continuitat de l'istori
 'searchmenu-legend' => 'Opcions de recèrca',
 'searchmenu-exists' => "* Pagina '''[[$1]]'''",
 'searchmenu-new' => "'''Crear la pagina ''[[:$1|$1]]'' sus aqueste wiki !'''",
-'searchhelp-url' => 'Help:Acuèlh',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Recercar las paginas amb aqueste prefix]]',
 'searchprofile-articles' => 'Paginas de contengut',
 'searchprofile-project' => "Paginas d'ajuda e del projècte",
@@ -1250,7 +1300,7 @@ Asseguratz-vos qu'aqueste cambiament pòsca conservar la continuitat de l'istori
 'search-interwiki-default' => '$1 resultats :',
 'search-interwiki-more' => '(mai)',
 'search-relatedarticle' => 'Relatat',
-'mwsuggest-disable' => 'Desactivar las suggestions AJAX',
+'mwsuggest-disable' => 'Desactivar las suggestions de recèrca',
 'searcheverything-enable' => 'Recercar dins totes los espacis de noms',
 'searchrelated' => 'relatat',
 'searchall' => 'Totes',
@@ -1272,14 +1322,7 @@ Ensajatz en utilizant lo prefix ''all:'' per recercar tot lo contengut (tot incl
 'searchdisabled' => 'La recèrca sus {{SITENAME}} es desactivada.
 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',
+'search-error' => "Una error s'es producha en recercant : $1",
 
 # Preferences page
 'preferences' => 'Preferéncias',
@@ -1405,7 +1448,7 @@ Tanben podètz causir de permetre a d’autres de vos contactar per vòstra pagi
 'userrights-lookup-user' => "Gestion dels dreches d'utilizaire",
 'userrights-user-editname' => 'Entrar un nom d’utilizaire :',
 'editusergroup' => "Modificacion dels gropes d'utilizaires",
-'editinguser' => "Cambiament dels dreches de l'utilizaire '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Modificacion dels dreches de l'{{GENDER:$1|utilizaire|utilizaire}} '''[[User:$1|$1]]''' $2",
 'userrights-editusergroup' => 'Modificar los gropes de l’utilizaire',
 'saveusergroups' => "Salvar los gropes d'utilizaires",
 'userrights-groupsmember' => 'Membre de :',
@@ -1505,7 +1548,7 @@ Tanben podètz causir de permetre a d’autres de vos contactar per vòstra pagi
 'right-siteadmin' => 'Varrolhar e desvarrolhar la banca de donadas',
 'right-override-export-depth' => 'Exportar las paginas en incluent las paginas ligadas fins a una prigondor de 5 nivèls',
 'right-sendemail' => 'Mandar un corrièl als autres utilizaires',
-'right-passwordreset' => 'Tòrna inicializar lo senhal d’un utilizaire ([[Special:PasswordReset|pagina especiala]])',
+'right-passwordreset' => 'Veire los corrièrs electronics de reïnicializacion dels senhals',
 
 # Special:Log/newusers
 'newuserlogpage' => 'Istoric de las creacions de comptes',
@@ -1635,13 +1678,13 @@ Vejatz la [[Special:NewFiles|galariá dels imatges novèls]] per una presentacio
 'minlength1' => 'Los noms de fichièrs devon comprendre almens una letra.',
 'illegalfilename' => 'Lo nom de fichièr « $1 » conten de caractèrs interdiches dins los títols de paginas. Mercé de lo tornar nomenar e de lo copiar tornarmai.',
 'badfilename' => "L'imatge es estat renomenat « $1 ».",
-'filetype-mime-mismatch' => 'L’extension del fichier correspond pas al tipe MIME.',
+'filetype-mime-mismatch' => "L'extension del fichièr « .$1 » correspond pas al tipe MIME detectat del fichièr ($2).",
 'filetype-badmime' => 'Los fichièrs del tipe MIME « $1 » pòdon pas èsser importats.',
 'filetype-bad-ie-mime' => 'Lo fichièr pòt pas èsser importat perque serià detectat coma « $1 » per Internet Explorer, tipe de fichièr interdich perque potencialament dangierós.',
 'filetype-unwanted-type' => "«.$1»''' es un format de fichièr pas desirat.
 {{PLURAL:$3|Lo tipe de fichièr preconizat es|Los tipes de fichièrs preconizats son}} $2.",
-'filetype-banned-type' => "'''\".\$1\"''' es dins un format pas admes.
-{{PLURAL:\$3|Lo qu'es acceptat es|Los que son acceptats son}} \$2.",
+'filetype-banned-type' => "''' « .$1 » '''{{PLURAL:$4|est pas un tipe de fichièr autorizat|son pas de tipes de fichièrs autorizats}}. 
+{{PLURAL:$3|lo tipe de fichièr autorizat es |los tipes de fichièrs autorizats son}} $2.",
 'filetype-missing' => "Lo fichièr a pas cap d'extension (coma « .jpg » per exemple).",
 'empty-file' => "Lo fichièr qu'avètz somés èra void.",
 'file-too-large' => "Lo fichièr qu'avètz somés èra tròp grand.",
@@ -1716,7 +1759,7 @@ MGP # Pentax
 PICT # misc.
  #</pre> <!-- daissatz aquesta linha coma es -->',
 'upload-success-subj' => 'Importacion capitada',
-'upload-success-msg' => 'Çò mandat es disponible aicí : [[:{{ns:file}}:$1]]',
+'upload-success-msg' => 'Vòstre impòrt dempuèi [$2] a capitat. Es disponible aicí : [[:{{ns:file}}:$1]]',
 'upload-failure-subj' => 'Problèma de mandadís',
 'upload-failure-msg' => 'I a agut un problèma amb vòstre mandadís [$2]: $1',
 'upload-warning-subj' => 'Avertiment al moment del telecargament',
@@ -1756,13 +1799,13 @@ Se lo problèma persistís, contactatz un [[Special:ListUsers/sysop|administrato
 
 # Special:UploadStash
 'uploadstash' => "Escondedor d'impòrt",
+'uploadstash-clear' => 'Escafar los fichièrs en escondedor',
+'uploadstash-nofiles' => "Avètz pas de fichièrs en escondedor d'impòrt.",
 
 # img_auth script messages
 'img-auth-accessdenied' => 'Accès refusat',
-'img-auth-nopathinfo' => 'PATH_INFO mancant.
-Vòstre servidor es pas parametrat per passar aquesta informacion.
-Benlèu que fonciona en CGI e supòrta pas img_atuh.
-Consultatz https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
+'img-auth-nopathinfo' => 'PATH_INFO mancant. Vòstre servidor es pas parametrat per passar aquesta informacion.
+Benlèu que fonciona en CGI e supòrta pas img_atuh. Consultatz https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'img-auth-notindir' => 'Lo camin demandat es pas lo repertòri de telecargament configurat.',
 'img-auth-badtitle' => 'Impossible de construire un títol valid a partir de « $1 ».',
 'img-auth-nologinnWL' => 'Sètz pas connectat e « $1 » es pas dins la lista blanca.',
@@ -1774,6 +1817,7 @@ Sol l'accès als fichièrs es permesa.",
 Aqueste wiki es configurat coma un wiki public.
 Per una seguretat optimala, img_auth.php es desactivat.",
 'img-auth-noread' => "L'utilizaire a pas lo drech en lectura sus « $1 ».",
+'img-auth-bad-query-string' => "L'URL a una cadena de requèsta invalida.",
 
 # HTTP errors
 'http-invalid-url' => 'URL incorrècta : $1',
@@ -1782,7 +1826,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>
@@ -1799,9 +1842,8 @@ Per una seguretat optimala, img_auth.php es desactivat.",
 'upload_source_file' => ' (un fichièr sus vòstre ordenador)',
 
 # Special:ListFiles
-'listfiles-summary' => 'Aquesta pagina especiala fa veire totes los fichièrs importats.
-Per defaut, las darrièrs fichièrs importats son afichats en naut de la lista.
-Un clic en tèsta de colomna càmbia l’òrdre d’afichatge.',
+'listfiles-summary' => 'Aquesta pagina especiala permet de far la lista de totes los fichièrs importats.
+Quand es filtrada per utilizaire, sols los fichièrs que la version la mai recenta es estada importada per aqueste utilizaire son afichats.',
 'listfiles_search_for' => 'Recèrca del mèdia nomenat :',
 'imgfile' => 'fichièr',
 'listfiles' => 'Lista dels imatges',
@@ -1876,6 +1918,7 @@ Una [[Special:WhatLinksHere/$2|tièra completa]] es disponibla.',
 ** Fichièr duplicat',
 'filedelete-edit-reasonlist' => 'Modifica los motius de la supression',
 'filedelete-maintenance' => 'La supression e lo restabliment de fichièrs es temporàriament desactivada pendent la mantenença.',
+'filedelete-maintenance-title' => 'Impossible de suprimir lo fichièr',
 
 # MIME search
 'mimesearch' => 'Recèrca per tipe MIME',
@@ -1929,6 +1972,11 @@ Doblidetz pas de verificar se i a pas d’autre ligam cap als modèls abans de l
 Deurián puslèu puntar cap a una pagina apropriada.<br />
 Una pagina es tractada coma una pagina d’omonimia s'utiliza un modèl qu'es ligat a partir de [[MediaWiki:Disambiguationspage]]",
 
+'pageswithprop' => 'Paginas amb una proprietat de pagina',
+'pageswithprop-legend' => 'Paginas amb una proprietat de pagina',
+'pageswithprop-prop' => 'Nom de la proprietat :',
+'pageswithprop-submit' => 'Anar',
+
 'doubleredirects' => 'Redireccions doblas',
 'doubleredirectstext' => 'Vaquí una lista de las paginas que redirigisson cap a de paginas que son elas-meteissas de paginas de redireccion.
 Cada entrada conten de ligams cap a la primièra e la segonda redireccions, e mai la primièra linha de tèxte de la segonda pagina, çò que provesís, de costuma, la « vertadièra » pagina cibla, cap a la quala la primièra redireccion deuriá redirigir.
@@ -1952,6 +2000,7 @@ Las entradas <del>barradas</del> son estadas resolgudas.',
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|octet|octets}}',
 'ncategories' => '$1 {{PLURAL:$1|categoria|categorias}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwikis}}',
 'nlinks' => '$1 {{PLURAL:$1|ligam|ligams}}',
 'nmembers' => '$1 {{PLURAL:$1|membre|membres}}',
 'nrevisions' => '$1 {{PLURAL:$1|revision|revisions}}',
@@ -1978,8 +2027,10 @@ Las entradas <del>barradas</del> son estadas resolgudas.',
 'mostlinkedtemplates' => 'Modèls mai utilizats',
 'mostcategories' => 'Articles utilizant mai de categorias',
 'mostimages' => 'Fichièrs mai utilizats',
+'mostinterwikis' => "Paginas amb lo mai d'interwikis",
 'mostrevisions' => 'Articles mai modificats',
 'prefixindex' => 'Totas las paginas que començan per…',
+'prefixindex-namespace' => 'Totas las paginas amb prefix (espaci de noms $1)',
 'shortpages' => 'Paginas brèvas',
 'longpages' => 'Paginas longas',
 'deadendpages' => "Paginas sul camin d'enlòc",
@@ -2047,6 +2098,10 @@ Podètz restrénher la vista en seleccionant un tipe de jornal, un nom d’utili
 'allpagesprefix' => 'Afichar las paginas que començan pel prefix :',
 'allpagesbadtitle' => 'Lo títol rensenhat per la pagina es incorrècte o possedís un prefix reservat. Conten segurament un o mantun caractèr especial que pòt pas èsser utilizats dins los títols.',
 'allpages-bad-ns' => '{{SITENAME}} a pas d’espaci de noms « $1 ».',
+'allpages-hide-redirects' => 'Amagar las redireccions',
+
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'Veire lo mai recent.',
 
 # Special:Categories
 'categories' => 'Categorias',
@@ -2067,7 +2122,9 @@ Vejatz tanben [[Special:WantedCategories|las categorias demandadas]].',
 'linksearch-pat' => 'Recercar l’expression :',
 'linksearch-ns' => 'Espacis de noms :',
 'linksearch-ok' => 'Recercar',
-'linksearch-text' => 'De caractèrs « joker » pòdon èsser utilizats, per exemple <code>*.wikipedia.org</code>.<br />Protocòls reconeguts : <code>$1</code>.',
+'linksearch-text' => 'De caractèrs jokers coma « *.wikipedia.org » pòdon èsser utilizats.
+Necessitan al mens un domeni de nivèl superior, per exemple « *.org ».<br />
+{{PLURAL:$2|Protocòl reconegut|Protocòls reconeguts}}: <code>$1</code> (http:// per defaut se cap de protocòl es pas indicat).',
 'linksearch-line' => '$1 amb un ligam a partir de $2',
 'linksearch-error' => 'Los caractèrs « joker » pòdon pas èsser utilizats qu’al començament del nom de domeni.',
 
@@ -2080,7 +2137,7 @@ Vejatz tanben [[Special:WantedCategories|las categorias demandadas]].',
 # Special:ActiveUsers
 'activeusers' => 'Lista dels utilizaires actius',
 'activeusers-intro' => "Aquò es una lista dels utilizaires qu'an exerçat una activitat quina que siá al cors {{PLURAL:$1|de la darrièra jornada|dels $1 darrièrs jorns}}.",
-'activeusers-count' => '$1 {{PLURAL:$1|modificacion recenta|modificacions recentas}} dins {{PLURAL:$3|lo darrièr jorn|los $3 darrièrs jorns}}',
+'activeusers-count' => '$1 {{PLURAL:$1|accion|accions}} al moment {{PLURAL:$3|del darrièr jorn|dels $3 darrièrs jorns}}',
 'activeusers-from' => 'Afichar los utilizaires dempuèi :',
 'activeusers-hidebots' => 'Amagar los robòts',
 'activeusers-hidesysops' => 'Amagar los administrators',
@@ -2124,6 +2181,8 @@ L'adreça electronica qu'avètz indicada dins [[Special:Preferences|vòstras pre
 'noemailtext' => "Aqueste utilizaire a pas especificat d'adreça electronica valida.",
 'nowikiemailtitle' => 'Pas de corrièr electronic autorizat',
 'nowikiemailtext' => "Aqueste utilizaire a causit de recebre pas de corrièr electronic de la part d'autres utilizaires.",
+'emailnotarget' => "Nom d'utilizaire del destinatari inexistent o invalid.",
+'emailtarget' => "Entratz lo nom d'utilizaire del destinatari",
 'emailusername' => "Nom d'utilizaire :",
 'emailusernamesubmit' => 'Sometre',
 'email-legend' => 'Mandar un corrièr electronic a un autre utilizaire de {{SITENAME}}',
@@ -2152,8 +2211,7 @@ L'adreça electronica qu'avètz indicada dins [[Special:Preferences|vòstras pre
 'watchnologintext' => 'Vos cal èsser [[Special:UserLogin|connectat(ada)]]
 per modificar vòstra lista de seguiment.',
 'addwatch' => 'Ajustar a la lista de seguiment',
-'addedwatchtext' => 'La pagina "[[:$1]]" es estada aponduda a vòstra [[Special:Watchlist|lista de seguiment]].
-Las modificacions venentas d\'aquesta pagina e de la pagina de discussion associada seràn repertoriadas aicí, e la pagina apareisserà <b>en gras</b> dins la [[Special:RecentChanges|tièra dels darrièrs cambiaments]] per èsser localizada mai aisidament.',
+'addedwatchtext' => "La pagina « [[:$1]] » es estada aponduda a vòstra [[Special:Watchlist|lista de seguiment]]. Las modificacions venentas d'aquesta pagina e de la pagina de discussion associada i seràn repertoriadas.",
 'removewatch' => 'Suprimir de la lista de seguiment',
 'removedwatchtext' => 'La pagina « [[:$1]] » es estada levada de vòstra [[Special:Watchlist|lista de seguiment]].',
 'watch' => 'Seguir',
@@ -2164,13 +2222,13 @@ 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 afichadas en '''gras'''.",
 '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}}.',
 'iteminvalidname' => "Problèma amb l'article « $1 » : lo nom es invalid...",
-'wlnote' => 'Çaijós se {{PLURAL:$1|tròba la darrièra modificacion|tròban las $1 darrièras modificacions}} dempuèi {{PLURAL:$2|la darrièra ora|las <b>$2</b> darrièras oras}}.',
+'wlnote' => "Çaijós {{PLURAL:$1|se tròba la darrièra modificacion efectuada|se tròban las $1 darrièras modificacions efectuadas}} pendent {{PLURAL:$2|la darrièra ora|las '''$2''' darrièras oras}} dempuèi $3, $4.",
 'wlshowlast' => 'Far veire las darrièras $1 oras, los darrièrs $2 jorns, o $3.',
 'watchlist-options' => 'Opcions de la lista de seguiment',
 
@@ -2370,6 +2428,7 @@ S'una pagina novèla amb lo meteis nom es estada creada dempuèi la supression,
 
 Consultatz l’[[Special:Log/delete|istoric de las supressions]] per veire las paginas recentament suprimidas e restablidas.",
 'undelete-header' => 'Consultatz l’[[Special:Log/delete|istoric de las supressions]] per veire las paginas recentament suprimidas.',
+'undelete-search-title' => 'Recercar las paginas suprimidas',
 'undelete-search-box' => 'Cercar una pagina suprimida',
 'undelete-search-prefix' => 'Far veire las paginas que començan per :',
 'undelete-search-submit' => 'Cercar',
@@ -2378,6 +2437,7 @@ Consultatz l’[[Special:Log/delete|istoric de las supressions]] per veire las p
 'undelete-bad-store-key' => 'Impossible de restablir lo fichièr datat del $1 : lo fichièr èra absent abans la supression.',
 'undelete-cleanup-error' => 'Error al moment de la supression de l’archiu inutilizada « $1 ».',
 'undelete-missing-filearchive' => 'Impossible de restablir lo fichièr amb l’ID $1 perque es pas dins la banca de donadas. Benlèu ja i es estat restablit.',
+'undelete-error' => "Pagina d'error d'anullacion",
 'undelete-error-short' => 'Error al moment del restabliment del fichièr : $1',
 'undelete-error-long' => "D'errors son estadas rencontradas al moment del restabliment del fichièr :
 
@@ -2820,27 +2880,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 +2956,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
@@ -2986,9 +3030,25 @@ Se l'executatz, vòstre sistèma pòt èsser compromés.",
 'minutes' => '{{PLURAL:$1|$1 minuta|$1 minutas}}',
 'hours' => '{{PLURAL:$1|$1 ora|$1 oras}}',
 'days' => '{{PLURAL:$1|$1 jorn|$1 jorns}}',
+'weeks' => '{{PLURAL:$1|$1 setmana|$1 setmanas}}',
+'months' => '{{PLURAL:$1|$1 mes|$1 meses}}',
+'years' => '{{PLURAL:$1|$1 an|$1 ans}}',
 'ago' => 'I a $1',
 'just-now' => 'sulpic',
 
+# Human-readable timestamps
+'hours-ago' => 'i a $1 {{PLURAL:$1|ora|oras}}',
+'minutes-ago' => 'i a $1 {{PLURAL:$1|minuta|minutas}}',
+'seconds-ago' => 'i a $1 {{PLURAL:$1|segonda|segondas}}',
+'monday-at' => 'Diluns a $1',
+'tuesday-at' => 'Dimars a $1',
+'wednesday-at' => 'Dimècres a $1',
+'thursday-at' => 'Dijòus a $1',
+'friday-at' => 'Divendres a $1',
+'saturday-at' => 'Dissabte a $1',
+'sunday-at' => 'Dimenge a $1',
+'yesterday-at' => 'Ièr a $1',
+
 # Bad image list
 'bad_image_list' => "Lo format es lo seguent :
 
@@ -3021,7 +3081,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',
@@ -3173,6 +3233,9 @@ Los autres ligams sus la meteissa linha son considerats coma d'excepcions, per e
 'exif-copyrightowner' => "Detentor del drech d'autor",
 'exif-usageterms' => "Condicions d'utilizacion",
 'exif-webstatement' => "Declaracion de dreches d'autor en linha",
+'exif-originaldocumentid' => 'Identificant unic del document original',
+'exif-licenseurl' => 'URL de la licéncia',
+'exif-morepermissionsurl' => 'Informacions sus las licéncias alternativas',
 'exif-pngfilecomment' => 'Comentari de fichièr JPEG',
 'exif-disclaimer' => 'Desistiment',
 'exif-contentwarning' => 'Avertiment sul contengut',
@@ -3186,7 +3249,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',
@@ -3560,6 +3623,7 @@ Ensajatz la previsualizacion normala.',
 'version-specialpages' => 'Paginas especialas',
 'version-parserhooks' => 'Extensions del parser',
 'version-variables' => 'Variablas',
+'version-antispam' => 'Prevencion del spam',
 'version-skins' => 'Abilhatges',
 'version-other' => 'Divèrs',
 'version-mediahandlers' => 'Supòrts mèdia',
@@ -3571,17 +3635,25 @@ Ensajatz la previsualizacion normala.',
 'version-hook-subscribedby' => 'Definit per',
 'version-version' => '(Version $1)',
 'version-license' => 'Licéncia',
+'version-poweredby-credits' => "Aqueste wiki fonciona gràcias a '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'autres',
 'version-software' => 'Logicial installat',
 '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.",
+'version-entrypoints' => "URL dels punts d'entrada",
+'version-entrypoints-header-entrypoint' => "Punt d'entrada",
+'version-entrypoints-header-url' => 'URL',
+
+# Special:Redirect
+'redirect' => 'Redirigit per fichièr, utilizaire, o ID de revision',
+'redirect-legend' => 'Redirigir cap a una pagina o un fichièr',
+'redirect-submit' => 'Validar',
+'redirect-lookup' => 'Recèrca :',
+'redirect-value' => 'Valor :',
+'redirect-user' => "ID de l'utilizaire",
+'redirect-revision' => 'Revision de la pagina',
+'redirect-file' => 'Nom del fichièr',
+'redirect-not-exists' => 'Valor pas trobada',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Recèrca dels fichièrs en doble',
@@ -3650,6 +3722,7 @@ Los imatges son afichats en nauta resolucion, los fichièrs àudio e vidèo son
 'compare-submit' => 'Comparar',
 'compare-invalid-title' => "Lo títol qu'avètz especificat es incorrècte.",
 'compare-title-not-exists' => "Lo títol qu'avètz especificat existís pas",
+'compare-revision-not-exists' => "La revision qu'avètz especificada existís pas.",
 
 # Database error messages
 'dberr-header' => 'Aqueste wiki a un problèma',
@@ -3671,10 +3744,16 @@ Los imatges son afichats en nauta resolucion, los fichièrs àudio e vidèo son
 'htmlform-submit' => 'Sometre',
 'htmlform-reset' => 'Desfar las modificacions',
 'htmlform-selectorother-other' => 'Autre',
+'htmlform-no' => 'Non',
+'htmlform-yes' => 'Òc',
+'htmlform-chosen-placeholder' => 'Causir una opcion',
+
+# SQLite database support
+'sqlite-has-fts' => '$1 amb recèrca en tèxte integral suportada',
 
 # New logging system
-'logentry-delete-delete' => '$1 a suprimit la pagina $3',
-'logentry-delete-restore' => '$1 a restablit la pagina $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|a suprimit}} la pagina $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|a restablit}} la pagina $3',
 'revdelete-content-hid' => 'contengut amagat',
 'revdelete-summary-hid' => 'resumit de modificacion amagat',
 'revdelete-uname-hid' => 'nom d’utilizaire amagat',
@@ -3698,6 +3777,8 @@ Los imatges son afichats en nauta resolucion, los fichièrs àudio e vidèo son
 'feedback-message' => 'Messatge :',
 'feedback-cancel' => 'Anullar',
 'feedback-submit' => 'Mandar vòstres comentaris',
+'feedback-error2' => 'Error : la modificacion a fracassat',
+'feedback-error3' => "Error : pas cap de responsa de l'API",
 'feedback-close' => 'Fach',
 
 # Search suggestions
index ff44208..cb4eb2d 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' => 'à¬\8fବà­\87 à¬¥à¬¿à¬¬à¬¾ à¬¨à¬¾à¬®:',
+'tog-oldsig' => 'à¬\8fବà­\87 à¬¥à¬¿à¬¬à¬¾ à¬¦à¬¸à­\8dତà¬\96ତ:',
 '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 ବେଳେ ବଦଳାଯାଇଥିଲା ।',
@@ -497,7 +510,6 @@ $1',
 'disclaimers' => 'ଆମେ ଦାୟୀ ନୋହୁଁ',
 'disclaimerpage' => 'Project:ଆମେ ଦାୟୀ ନୋହୁଁ',
 'edithelp' => 'ଲେଖା ସାହାଯ୍ୟ',
-'edithelppage' => 'Help:ବଦଳାଇବା',
 'helppage' => 'Help:ସୂଚୀ',
 'mainpage' => 'ପ୍ରଧାନ ପୃଷ୍ଠା',
 'mainpage-description' => 'ପ୍ରଧାନ ପୃଷ୍ଠା',
@@ -670,8 +682,14 @@ $2',
 'welcomecreation-msg' => 'ଆପଣଙ୍କ ଖାତାଟି ଖୋଲାଗଲା
 ନିଜର [[Special:Preferences|{{SITENAME}} ପସନ୍ଦସବୁକୁ]] ବଦଳାଇବାକୁ ଭୁଲିବେ ନାହିଁ ।',
 'yourname' => 'ବ୍ୟବହାରକାରୀଙ୍କ ନାମ:',
+'userlogin-yourname' => 'ବ୍ୟବହାରକାରୀଙ୍କ ନାମ',
 'yourpassword' => 'ପାସୱାର୍ଡ଼',
+'userlogin-yourpassword' => 'ପାସୱାର୍ଡ଼',
+'userlogin-yourpassword-ph' => 'ଆପଣଙ୍କ ପାସୱାର୍ଡ଼ ନିବେଶ କରନ୍ତୁ',
+'createacct-yourpassword-ph' => 'ପାସୱର୍ଡ଼ ନିବେଶ କରନ୍ତୁ',
 'yourpasswordagain' => 'ପାସୱାର୍ଡ଼ ଆଉଥରେ:',
+'createacct-yourpasswordagain' => 'ପାସୱର୍ଡ଼ ନିଶ୍ଚିତ କରିବେ',
+'createacct-yourpasswordagain-ph' => 'ପୁଣି ପାସୱର୍ଡ଼ ନିବେଶ କରନ୍ତୁ',
 'remembermypassword' => 'ଏହି ବ୍ରାଉଜରରେ (ସବୁଠୁ ଅଧିକ ହେଲେ $1 {{PLURAL:$1|day|ଦିନ}}) ପାଇଁ ମୋ ଲଗଇନ ମନେ ରଖିଥିବେ',
 'securelogin-stick-https' => 'ଲଗ ଇନ କଲାପରେ HTTPS ସହ ଯୋଡ଼ି ହୋଇ ରହନ୍ତୁ',
 'yourdomainname' => 'ଆପଣଙ୍କ ଡୋମେନ:',
@@ -685,14 +703,21 @@ $2',
 'logout' => 'ଲଗଆଉଟ',
 'userlogout' => 'ଲଗ ଆଉଟ',
 'notloggedin' => 'ଲଗ‌‌ ଇନ କରିନାହାନ୍ତି',
+'userlogin-noaccount' => 'ଖାତାଟିଏ ନାହିଁ?',
 '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' => 'ଆପଣ ଅନ୍ୟଏକ ଖାତା କାହିଁକି ତିଆରି କରୁଛନ୍ତି',
 'badretype' => 'ଆପଣ ଦେଇଥିବା ପାସବାର୍ଡ଼ଟି ମେଳଖାଉନାହିଁ ।',
 'userexists' => 'ଆପଣ ଦେଇଥିବା ଇଉଜର ନାମ ଆଗରୁ ଅଛି ।
 ଦୟାକରି ଅଲଗା ନାମଟିଏ ବାଛନ୍ତୁ ।',
@@ -741,8 +766,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,10 +820,9 @@ continue using your old password.',
 
 # Special:PasswordReset
 'passwordreset' => 'ପାସୱାର୍ଡ଼ ପୁନସ୍ଥାପନ କରନ୍ତୁ',
-'passwordreset-text' => 'ନିଜ ଖାତାର ସବିଶେଷ ବିବରଣୀ ଏକ ଇ-ମେଲରେ ପାଇବା ପାଇଁ ଏହି ଆବେଦନ ପତ୍ରଟି ପୂରଣ କରନ୍ତୁ ।',
 'passwordreset-legend' => 'ପାସୱାର୍ଡ଼ ପୁନସ୍ଥାପନ କରନ୍ତୁ',
 'passwordreset-disabled' => 'ପାସୱାର୍ଡ଼କୁ ପୁରାପୁରି ମୂଳକୁ ଫେରାଇବା ଏହି ଉଇକିରେ ଅଚଳ କରାଯାଇଅଛି ।',
-'passwordreset-pretext' => '{{PLURAL:$1||ତଳେ ଥିବା ତଥ୍ୟସମୂହରୁ କୌଣସି ଗୋଟିଏ ଦିଅନ୍ତୁ}}',
+'passwordreset-emaildisabled' => 'ଏହି ଉଇକିରେ ଇମେଲ ସୁବିଧା ଅଚଳ କରାଯାଇଅଛି ।',
 'passwordreset-username' => 'ବ୍ୟବହାରକାରୀଙ୍କ ନାମ:',
 'passwordreset-domain' => 'ଡୋମେନ:',
 'passwordreset-capture' => 'ଯାଉଥିବା ଇ-ମେଲଟି ଦେଖିବେ?',
@@ -824,8 +848,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 +1077,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' => 'ଉଇକିଟେକ୍ସଟ',
@@ -1295,7 +1321,6 @@ $1",
 'searchmenu-legend' => 'ଖୋଜିବା ବିକଳ୍ପ',
 'searchmenu-exists' => "'''ଏହି ଉଇକିରେ \"[[:\$1]]\" ନାଆଁରେ ପୃଷ୍ଠାଟିଏ ଅଛି ।'''",
 'searchmenu-new' => "'''ଏହି ପ୍ରସଙ୍ଗଟି ଆଗରୁ ନାହିଁ, ତେଣୁ ''[[:$1]]'' ନାମରେ ପ୍ରସଙ୍ଗଟିଏ ଏଠାରେ ଗଢ଼ନ୍ତୁ!'''",
-'searchhelp-url' => 'Help:ସୂଚୀ',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ଏହି ନାମ ଆଗରୁ ଥିବା ପୃଷ୍ଠାସବୁ ଖୋଜିବେ]]',
 'searchprofile-articles' => 'ସୂଚୀ ପୃଷ୍ଠା',
 'searchprofile-project' => 'ସାହାଯ୍ୟ ଓ ପ୍ରକଳ୍ପ ପୃଷ୍ଠା',
@@ -1340,15 +1365,6 @@ $1",
 ଆପଣ ଏହି ଭିତରେ ଗୁଗଲ ଦେଖିପାରନ୍ତି ।
 ଜାଣିରଖନ୍ତୁ ଯେ {{SITENAME}}ର ବିଷୟ ସୂଚି ପୁରାତନ ହୋଇଥାଇପାରେ ।',
 
-# Quickbar
-'qbsettings' => 'ସହଳ ପଟି (Quickbar)',
-'qbsettings-none' => 'କିଛି ନାହିଁ',
-'qbsettings-fixedleft' => 'ବାମକୁ ଥୟ କରାଗଲା',
-'qbsettings-fixedright' => 'ଡାହାଣକୁ ଥୟ କରାଗଲା',
-'qbsettings-floatingleft' => 'ବାମରେ ଭାସନ୍ତା',
-'qbsettings-floatingright' => 'ଡାହାଣରେ ଭାସନ୍ତା',
-'qbsettings-directionality' => 'ଆପଣଙ୍କ ଭାଷାର ବାମ-ଡାହାଣ ଲିଖନ ଶୈଳୀ ଅନୁସାରେ ସଜାଡ଼ି ଦିଆଗଲା',
-
 # Preferences page
 'preferences' => 'ପସନ୍ଦ',
 'mypreferences' => 'ପସନ୍ଦ',
@@ -1903,7 +1919,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 +2077,8 @@ URLଟି ଠିକ ଅଚିକି କି ନାଁ ଓ ସାଇଟଟି ସ
 ସେସବୁ ଅଧିକ ଉପଯୁକ୍ତ ପ୍ରସଙ୍ଗ ସହ ଯୋଡ଼ାହେବା ଉଚିତ  ।<br />
 [[MediaWiki:Disambiguationspage]] ସହ ଯୋଡ଼ାଥିବା ଛାଞ୍ଚ ବ୍ୟବହାର କରୁଥିଲେ ପୃଷ୍ଠାଟିଏକୁ ବହୁବିକଳ୍ପ ପୃଷ୍ଠା ବୋଲି କୁହାଯାଏ",
 
+'pageswithprop-submit' => 'ଯିବା',
+
 'doubleredirects' => 'ଯୋଡ଼ା ପୁନପ୍ରେରଣ',
 'doubleredirectstext' => 'ଏହି ପୃଷ୍ଠା ବାକି ବହୁବିକଳ୍ପ ପୃଷ୍ଠାମାନଙ୍କ ସହ ଯୋଡ଼ିଥାଏ ।
 ପ୍ରତ୍ୟେକ ଧାଡ଼ିରେ ପ୍ରଥମ ଓ ଶେଷ ପୁନପ୍ରେରଣ ସହ ଯୋଡ଼ିବା ଲିଙ୍କ ରହିଥାଏ, ଆହୁରି ମଧ୍ୟ ଏଥିରେ ଦ୍ଵିତୀୟ ପୁନପ୍ରେରଣର ଲକ୍ଷ ସହ ଯୋଡ଼ିବାର ଲିଙ୍କ ଥାଏ , ଯାହାକି ସାଧାରଣତ "ପ୍ରକୃତ" ଲକ୍ଷ ପୃଷ୍ଠା ହୋଇଥାଏ, ଯାହାକୁ ପ୍ରଥମ ପୁନପ୍ରେରଣ ପୃଷ୍ଠା ଯୋଡ଼ିଥାଏ ।
@@ -2226,6 +2243,15 @@ URLଟି ଠିକ ଅଚିକି କି ନାଁ ଓ ସାଇଟଟି ସ
 'listusers-noresult' => 'ଜଣେ ବି ସଭ୍ୟ ମିଳିଲେ ନାହିଁ ।',
 'listusers-blocked' => '(ଅଟକାଯାଇଥିବା)',
 
+# Special:ActiveUsers
+'activeusers' => 'ସଚଳ ସଭ୍ୟଙ୍କ ତାଲିକା',
+'activeusers-intro' => 'ବିଗତ $1 {{PLURAL:$1|ଦିନ|ଦିନ}} ଭିତରେ କିଛି ପ୍ରକାରର କାମ କରିଥିବା ସଭ୍ୟମାନଙ୍କର ତାଲିକା ।',
+'activeusers-count' => 'ବିଗତ {{PLURAL:$3|ଦିନ|$3 ଦିନରେ}}ରେ $1ଟି {{PLURAL:$1|ସମ୍ପାଦନା|ସମ୍ପାଦନାଗୁଡିକ}}',
+'activeusers-from' => 'ଏହି ନାମରେ ଆରମ୍ଭ ହେଉଥିବା ସଭ୍ୟମାନଙ୍କୁ ଦେଖାଇବେ:',
+'activeusers-hidebots' => 'ଆପେଆପେ ଚାଳିତ ସଭ୍ୟମାନଙ୍କୁ ଲୁଚାନ୍ତୁ',
+'activeusers-hidesysops' => 'ପରିଚାଳକମାନଙ୍କୁ ଲୁଚାଇବେ',
+'activeusers-noresult' => 'ଜଣେ ବି ସଭ୍ୟ ମିଳିଲେ ନାହିଁ ।',
+
 # Special:ListGroupRights
 'listgrouprights' => 'ସଭ୍ୟ ଗୋଠ ଅଧିକାରସମୂହ',
 'listgrouprights-summary' => 'ତଳେ ଉଇକି ସ୍ଥିର କରାଯାଇଥିବା ଏକ ଏକ ବ୍ୟବହାରକାରୀ ଗୋଠର ତାଲିକା ଦିଆଯାଇଛି, ସେଥିରେ ସେମାନଙ୍କ ବ୍ୟବହାର ଅଧିକାର ବାବଦରେ ମଧ୍ୟ ଦିଆଯାଇଛି ।
@@ -2303,8 +2329,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|ଗୋଟି ପୃଷ୍ଠା|ଗୋଟି ପୃଷ୍ଠା}} ରହିଅଛି ।',
@@ -2555,7 +2581,7 @@ $1',
 'mycontris' => 'ଅବଦାନ',
 'contribsub2' => '$1 ($2) ପାଇଁ',
 'nocontribs' => 'ଏହି ନିର୍ଣ୍ଣାୟକବଳୀ ନିମନ୍ତେ କିଛି ବି ବଦଳ ମେଳ ଖାଇଲା ନାହିଁ ।',
-'uctop' => '(à¬\89ପର)',
+'uctop' => '(à¬\8fବà­\87à¬\95ାର)',
 'month' => 'ମାସରୁ (ଓ ତା ଆଗରୁ)',
 'year' => 'ବର୍ଷରୁ (ଆଉ ତା ଆଗରୁ)',
 
@@ -3190,6 +3216,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' => 'ଗଢ଼ଣଟି ଏମିତି ହେବ:
 
@@ -3218,7 +3249,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ଓସାର',
 'exif-imagelength' => 'ଉଚ୍ଚତା',
 'exif-bitspersample' => 'ଉପାଦାନ ପ୍ରତି ବିଟ',
@@ -3396,7 +3427,7 @@ $1',
 'exif-originalimageheight' => 'ଛୋଟ କରାଯିବ ଆଗରୁ ଛବିର ଉଚ୍ଚତା',
 'exif-originalimagewidth' => 'ଛୋଟ କରାଯିବ ଆଗରୁ ଛବିର ଓସାର',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'ଅସମ୍ପାଦିତ',
 'exif-compression-2' => 'CCITT ଗୋଠ ୩ ୧-ବିମିୟ ବଦଳାଯାଇଥିବା ହଫମାନ ରନ ଲମ୍ବ ଏନକୋଡ଼ିଙ୍ଗ',
 'exif-compression-3' => 'CCITT ଗୋଠ ୩ ଫାକ୍ସ ଏନକୋଡ଼ିଙ୍ଗ',
@@ -3809,13 +3840,6 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକ୍ଷରେ ବଣ୍ଟାଯ
 'version-entrypoints-header-entrypoint' => 'ପ୍ରବେଶ ବିନ୍ଦୁ',
 'version-entrypoints-header-url' => 'ଇଉଆରଏଲ',
 
-# Special:FilePath
-'filepath' => 'ଫାଇଲ ପଥ',
-'filepath-page' => 'ଫାଇଲ:',
-'filepath-submit' => 'ଯିବା',
-'filepath-summary' => 'ଏହି ବିଶେଷ ପୃଷ୍ଠା ଏକ ଫାଇଲର ପୁରା ପଥ ଦେଖାଇଦିଏ ।
-ଛବିସବୁ ପୁରା ରେଜୋଲୁସନରେ ଦେଖାଇଦିଆଯାଏ, ବାକି ଫାଇଲସବୁ ସେମାନଙ୍କ ସହଯୋଗୀ ପ୍ରଗାମ ମାନଙ୍କ ଦେଇ ଆରମ୍ଭ ହୋଇଥାନ୍ତି ।',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ଏହାର ନକଲ ପୃଷ୍ଠା ଖୋଜିବେ ।',
 'fileduplicatesearch-summary' => 'ହାସ୍ ମୂଲ୍ୟକୁ ନେଇ ଦୁଇଥର ଥିବା ଫାଇଲ ଖୋଜନ୍ତୁ ।',
@@ -3905,6 +3929,8 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକ୍ଷରେ ବଣ୍ଟାଯ
 'htmlform-submit' => 'ଦାଖଲକରିବା',
 'htmlform-reset' => 'କରାଯାଇଥିବା ବଦଳ ପଛକୁ ଫେରାଇବେ',
 'htmlform-selectorother-other' => 'ବାକି',
+'htmlform-no' => 'ନାହିଁ',
+'htmlform-yes' => 'ହଁ',
 
 # SQLite database support
 'sqlite-has-fts' => 'ପୁରା ଟେକ୍ସ୍ଟ ଖୋଜା ସହଯୋଗ ସହିତ $1',
@@ -3940,9 +3966,9 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକ୍ଷରେ ବଣ୍ଟାଯ
 'logentry-newusers-create' => 'ସଭ୍ୟ ଖାତା $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-rights-legacy' => '$1 ଗୋଷ୍ଠୀ ସଭ୍ୟପଦ $3 ପାଇଁ {{GENDER:$2|ବଦଳିଗଲା}}',
 'logentry-rights-autopromote' => '$1 ଆପେ ଆପେ $4ରୁ $5କୁ ଗଲେ',
 'rightsnone' => '(କିଛି ନାହିଁ)',
 
index 3a6e545..b2b7fb7 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,33 +415,32 @@ $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:Ног хабæрттæ',
 'disclaimers' => 'Бæрн',
 'disclaimerpage' => 'Project:Бæрн',
 'edithelp' => 'Ивынæн æххуыс',
-'edithelppage' => 'Help:Ивын',
 'helppage' => 'Help:Мидис',
 '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 +531,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 +578,7 @@ $2',
 'namespaceprotected' => "Дæуæн нæй бар ивын фæрстæ '''$1''' номдоны.",
 'customcssprotected' => 'Дæуæн нæй бар ивын ацы CSS фарс, уымæн æмæ уым ис æндæр архайæджы персоналон æвæрдтытæ.',
 'customjsprotected' => 'Дæуæн нæй бар ивын ацы JavaScript фарс, уымæн æмæ уым ис æндæр архайæджы персоналон æвæрдтытæ.',
-'ns-specialprotected' => 'Сæрмагонд фæрстæ ({{ns:special}}) баивæн нæй.',
+'ns-specialprotected' => 'Сæрмагонд фæрстæн ивæн нæй.',
 'titleprotected' => 'Ацы ном уыд æхгæд саразынæй. Сæхгæдта йæ [[User:$1|$1]].
 Æхгæныны бындур уыд "\'\'$2\'\'".',
 'filereadonlyerror' => 'Нæ уайы фæивын файл "$1" уый тыххæй æмæ репозиторий "$2" кусы æрмæст фæрсыны уавæры.
@@ -605,9 +603,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 +626,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 +680,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 +698,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 +729,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 +737,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 +777,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 +831,7 @@ $2
 Кæд ногæй равзарай \"{{int:savearticle}}\", уæд ивд æнæ уымæй бавæрд уыдзæнис.",
 'summary-preview' => 'Ивд афыст уыдзæн:',
 'subject-preview' => 'Темæ/сæр:',
-'blockedtitle' => 'Архайæг хъодыгонд æрцыд',
+'blockedtitle' => 'Архайæг хъодыгонд у',
 'blockedtext' => "'''Дæ фæсномыг кæнæ дæ IP адрис блокгонд æрцыд.'''
 
 Блок скодта $1.
@@ -863,18 +891,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 +960,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 +978,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 +1001,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' => '(ивды афыст хафт у)',
@@ -983,7 +1054,6 @@ $2
 'viewprevnext' => 'Кæсын ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''Ацы викийы ис фарс \"[[:\$1]]\" номимæ.'''",
 'searchmenu-new' => "'''Сараз фарс \"[[:\$1]]\" ацы викийы!'''",
-'searchhelp-url' => 'Help:Мидис',
 'searchprofile-articles' => 'Мидисы фæрстæ',
 'searchprofile-project' => 'Æххуыс æмæ Проекты фæрстæ',
 'searchprofile-images' => 'Мультимеди',
@@ -999,7 +1069,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 +1083,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 +1128,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 +1171,7 @@ $2
 'group-bot' => 'Роботтæ',
 'group-sysop' => 'Админтæ',
 'group-bureaucrat' => 'Бюрократтæ',
-'group-all' => '(æппæт)',
+'group-all' => '(иууылдæр)',
 
 'group-user-member' => '{{GENDER:$1|архайæг}}',
 'group-autoconfirmed-member' => '{{GENDER:$1|хæдсгарст архайæг}}',
@@ -1128,8 +1191,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 +1227,7 @@ $2
 'rcnotefrom' => "Бындæр сты æвдыст ивдтытæ '''$2'''-æй ('''{{grammar:genitive|$1}}''' йонг).",
 'rclistfrom' => 'Равдисын ивдтытæ амæй фæстæ: $1',
 'rcshowhideminor' => '$1 чысыл ивдтытæ',
-'rcshowhidebots' => '$1 роботты куыст',
+'rcshowhidebots' => '$1 роботты',
 'rcshowhideliu' => '$1, йæхи чи бацамыдта, уыцы архайджыты',
 'rcshowhideanons' => '$1 æнæном архайджыты',
 'rcshowhidepatr' => '$1 бæрæггонд ивдтæ',
@@ -1197,13 +1260,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 +1280,7 @@ $3',
 'license-header' => 'Лицензи',
 
 # Special:ListFiles
-'listfiles' => 'Ð\9dÑ\8bвты номхыгъд',
+'listfiles' => 'Файлты номхыгъд',
 'listfiles_thumb' => 'Къаддæргонд',
 'listfiles_date' => 'Датæ',
 'listfiles_name' => 'Ном',
@@ -1372,7 +1435,7 @@ $3',
 'emailpage' => 'Электронон фыстæг йæм барвит',
 
 # Watchlist
-'watchlist' => 'Ð\9cæ Ñ\86æÑ\81Ñ\82даÑ\80д Ñ\80æгÑ\8a',
+'watchlist' => 'ЦæÑ\81Ñ\82даÑ\80д',
 'mywatchlist' => 'Цæстдард',
 'watchlistfor2' => 'Архайæг: $1 $2',
 'nowatchlist' => 'Иу уацмæ дæр дæ цæст нæ дарыс.',
@@ -1612,12 +1675,8 @@ $3',
 'spamprotectiontitle' => 'Спамы ныхмæ фильтр',
 
 # Skin names
-'skinname-standard' => 'Стандартон',
-'skinname-nostalgia' => 'Æнкъард',
 'skinname-cologneblue' => 'Кёльны æрхæндæг',
 'skinname-monobook' => 'Моно-чиныг',
-'skinname-myskin' => 'Мæхи',
-'skinname-chick' => 'Карк',
 
 # Browsing diffs
 'previousdiff' => '← Зæронддæр ивд',
@@ -1666,7 +1725,7 @@ $3',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Уæрх',
 'exif-imagelength' => 'Бæрзæнд',
 'exif-artist' => 'Автор',
@@ -1752,11 +1811,6 @@ $3',
 'version-poweredby-others' => 'æндæртæ',
 'version-software-version' => 'Верси',
 
-# Special:FilePath
-'filepath' => 'Файлмæ фæт',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Бацæуын',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Файлы ном:',
 'fileduplicatesearch-submit' => 'Агурын',
index 94ff21a..e451354 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,17 @@ $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:ਲੁਕਾਅ ਨੀਤੀ',
+'disclaimers' => 'ਦਾਅਵੇ',
+'disclaimerpage' => 'Project:ਆਮ ਦਾਅਵੇ',
+'edithelp' => 'ਸੋਧ ਮੱਦਦ',
+'helppage' => 'Help:ਸਮੱਗਰੀ',
+'mainpage' => 'ਮੁੱਖ ਸਫ਼ਾ',
+'mainpage-description' => 'ਮੁੱਖ ਸਫ਼ਾ',
+'policy-url' => 'Project:ਨੀਤੀ',
+'portal' => 'ਭਾਈਚਾਰਕ ਸੱਥ',
+'portal-url' => 'Project:ਸਮਾਜ ਸੱਥ',
+'privacy' => 'ਪਰਾਈਵੇਸੀ ਨੀਤੀ',
+'privacypage' => 'Project:ਪਰਾਈਵੇਸੀ ਨੀਤੀ',
 
 'badaccess' => 'ਅਧਿਕਾਰ ਗਲਤੀ',
 'badaccess-group0' => 'ਤੁਹਾਨੂੰ ਉਹ ਐਕਸ਼ਨ ਕਰਨ ਦੀ ਮਨਜ਼ੂਰੀ ਨਹੀਂ, ਜਿਸ ਦੀ ਤੁਸੀਂ ਮੰਗ ਕੀਤੀ ਹੈ।',
@@ -458,24 +448,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 +475,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 +502,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 +518,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 +548,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 +570,7 @@ $2',
 'exception-nologin-text' => 'ਇਹ ਸਫ਼ਾ ਜਾਂ ਕਾਰਵਾਈ ਤੁਹਾਡਾ ਇਸ ਵਿਕੀ ’ਤੇ ਲਾਗਇਨ ਕੀਤਾ ਹੋਣਾ ਲੋੜਦੀ ਹੈ।',
 
 # Virus scanner
+'virus-scanfailed' => 'ਸਕੈਨ ਫੇਲ੍ਹ ਹੈ (ਕੋਡ $1)',
 'virus-unknownscanner' => 'ਅਣਪਛਾਤਾ ਐਂਟੀਵਾਇਰਸ:',
 
 # Login and logout pages
@@ -587,12 +578,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 +604,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 +670,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 +685,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 +709,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,58 +725,58 @@ $2
 ਇਹ ਆਰਜ਼ੀ ਪਾਸਵਰਡ
 {{PLURAL:$5|ਇੱਕ ਦਿਨ|$5 ਦਿਨਾਂ}} ਵਿਚ ਖ਼ਤਮ ਹੋ {{PLURAL:$3|ਜਾਵੇਗਾ|ਜਾਣਗੇ}}।
 ਤੁਹਾਨੂੰ ਹੁਣੇ ਲਾਗਇਨ ਕਰਕੇ ਨਵਾਂ ਪਾਸਵਰਡ ਬਣਾਉਣਾ ਚਾਹੀਦਾ ਹੈ। ਜੇ ਕਿਸੇ ਹੋਰ ਨੇ ਇਹ ਬੇਨਤੀ ਕੀਤੀ ਸੀ ਜਾਂ ਜੇ ਤੁਹਾਨੂੰ ਆਪਣਾ ਪਾਸਵਰਡ ਯਾਦ ਹੈ ਅਤੇ ਤੁਸੀਂ ਇਸਨੂੰ ਬਦਲਣਾ ਨਹੀਂ ਚਾਹੁੰਦੇ ਤਾਂ ਤੁਸੀਂ ਇਸ ਸੁਨੇਹੇ ਨੂੰ ਨਜ਼ਰਅੰਦਾਜ਼ ਕਰ ਕੇ ਆਪਣਾ ਪੁਰਾਣਾ ਪਾਸਵਰਡ ਵਰਤਣਾ ਜਾਰੀ ਰੱਖ ਸਕਦੇ ਹੋ।',
-'passwordreset-emailelement' => 'ਮà©\88à¨\82ਬਰ-ਨਾਂ: $1
+'passwordreset-emailelement' => 'ਯà©\82à¨\9c਼ਰ-ਨਾਂ: $1
 ਆਰਜ਼ੀ ਪਾਸਵਰਡ: $2',
 'passwordreset-emailsent' => 'ਇੱਕ ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ ਈ-ਮੇਲ ਭੇਜੀ ਜਾ ਚੁੱਕੀ ਹੈ।',
 '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 ਨੇ ਲਾਈ ਹੈ।
@@ -801,7 +818,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}}\" ਬਟਨ ਵਰਤੋ।",
@@ -816,14 +833,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' => 'ਸੰਭਾਲਿਆ ਵਰਜਨ',
@@ -852,7 +869,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' => "'''ਚਿਤਾਵਣੀ:
 ਤੁਸੀਂ ਐਸਾ ਪੰਨਾ ਬਣਾ ਰਹੇ ਹੋ ਜੋ ਪਹਿਲਾਂ ਹਟਾਇਆ ਜਾ ਚੁੱਕਾ ਹੈ।'''
 
@@ -860,13 +877,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' => 'ਓਹ ਪੰਨੇ ਜਿੱਥੇ ਟੈਂਪਲੇਟਾਂ ਦੇ ਸ਼ਾਮਲ ਕਰਨ ਦਾ ਅਕਾਰ ਹੱਦੋਂ ਵਧ ਗਿਆ ਹੈ',
@@ -882,13 +905,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 ਮੁਤਾਬਕ ਸਭ ਤੋਂ ਨਵਾਂ ਰੀਵਿਜਨ',
@@ -899,18 +922,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
@@ -922,9 +945,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|
@@ -944,23 +967,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' => 'ਮੁੜ ਬਹਾਲ ਕੀਤੀਆਂ ਰੀਵਿਜ਼ਨਾਂ ਤੋਂ ਰੋਕਾਂ ਹਟਾਓ',
@@ -971,7 +994,7 @@ page={{FULLPAGENAMEE}}}} ਜ਼ਬਤੀ ਦੇ ਚਿੱਠੇ] ਵਿਚ ਵ
 'revdel-restore' => 'ਦਿੱਖ ਬਦਲੋ',
 'revdel-restore-deleted' => 'ਹਟਾਏ ਗਏ ਰੀਵੀਜਨ',
 'revdel-restore-visible' => 'ਦਿਸਣਯੋਗ ਰੀਵੀਜਨ',
-'pagehist' => 'ਪà©\87à¨\9c à¨¦ਾ ਅਤੀਤ',
+'pagehist' => 'ਸਫ਼ਾ ਅਤੀਤ',
 'deletedhist' => 'ਹਟਾਇਆ ਗਿਆ ਅਤੀਤ',
 'revdelete-hide-current' => 'ਤਾਰੀਖ &2, $1 ਦੀ ਚੀਜ਼ ਲੁਕਾਉਣ ਵਿਚ ਗਲਤੀ: ਇਹ ਮੌਜੂਦਾ ਰੀਵਿਜ਼ਨ ਹੈ।
 ਇਹ ਲੁਕਾਈ ਨਹੀਂ ਜਾ ਸਕਦੀ।',
@@ -1001,14 +1024,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
@@ -1019,27 +1042,26 @@ 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 ਸ਼ਬਦ}})',
@@ -1062,7 +1084,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' => 'ਰੀ-ਡਿਰੈਕਟ ਲਿਸਟ',
@@ -1074,7 +1096,7 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 
 # Preferences page
 'preferences' => 'ਮੇਰੀ ਪਸੰਦ',
-'mypreferences' => 'ਪਸੰਦਾਂ',
+'mypreferences' => 'ਪਸੰਦ',
 'prefs-edits' => 'ਸੋਧਾਂ ਦੀ ਗਿਣਤੀ:',
 'prefsnologin' => 'ਲਾਗਇਨ ਨਹੀਂ',
 'prefsnologintext' => 'ਵਰਤੋਂਕਾਰ ਪਸੰਦਾਂ ਸੈੱਟ ਕਰਨ ਲਈ ਤੁਹਾਨੂੰ <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} ਲਾਗਇਨ]</span> ਕਰਨਾ ਪਵੇਗਾ।',
@@ -1082,11 +1104,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' => 'ਵਧਾਈ ਹੋਈ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਦਿਖਾਉਣ ਲਈ ਵੱਧ ਤੋਂ ਵੱਧ ਤਬਦੀਲੀਆਂ:',
@@ -1100,12 +1124,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' => 'ਇਸ ਵਿਚ ਤਾਜ਼ਾ ਤਬਦੀਲੀਆਂ, ਸਫ਼ਿਆਂ ਦੇ ਅਤੀਤ ਅਤੇ ਚਿੱਠੇ ਸ਼ਾਮਲ ਹਨ।',
@@ -1121,27 +1147,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' => '{{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' => 'ਭਾਸ਼ਾ:',
 'yourvariant' => 'ਸਮੱਗਰੀ ਭਾਸ਼ਾ ਰੂਪ:',
-'yournick' => 'à¨\9bà©\8bà¨\9fਾ à¨¨à¨¾à¨\82:',
+'yournick' => 'ਨਵà©\87à¨\82 à¨¦à¨¸à¨¤à¨\96਼ਤ:',
 'prefs-help-signature' => 'ਗੱਲ-ਬਾਤ ਸਫ਼ਿਆਂ ਉੱਤੇ ਟਿੱਪਣੀਆਂ ਦੇ ਆਖ਼ਰ ਵਿਚ "<nowiki>~~~~</nowiki>" ਲਾਓ ਜੋ ਤੁਹਾਡੇ ਦਸਤਖ਼ਤ ਅਤੇ ਵਕਤ ਦੀ ਮੋਹਰ ਵਿਚ ਤਬਦੀਲ ਹੋ ਜਾਵੇਗਾ।',
 'badsiglength' => 'ਦਸਤਖ਼ਤ ਬਹੁਤ ਲੰਬਾ ਹੋ ਗਿਆ ਹੈ। ਇਹ {{PLURAL:$1|ਅੱਖਰ|ਅੱਖਰਾਂ}} ਤੋਂ ਲੰਬਾ ਨਹੀਂ ਹੋਣਾ ਚਾਹੀਦਾ।',
 'yourgender' => 'ਲਿੰਗ:',
@@ -1157,7 +1183,7 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'prefs-info' => 'ਮੁੱਢਲੀ ਜਾਣਕਾਰੀ',
 'prefs-i18n' => 'ਅੰਤਰਰਾਸ਼ਟਰੀਕਰਨ',
 'prefs-signature' => 'ਦਸਤਖ਼ਤ',
-'prefs-dateformat' => 'ਤਾਰà©\80à¨\96਼ ਅੰਦਾਜ਼',
+'prefs-dateformat' => 'ਮਿਤà©\80 à¨¦à¨¾ ਅੰਦਾਜ਼',
 'prefs-advancedediting' => 'ਤਕਨੀਕੀ ਚੋਣਾਂ',
 'prefs-advancedrc' => 'ਤਕਨੀਕੀ ਚੋਣਾਂ',
 'prefs-advancedrendering' => 'ਤਕਨੀਕੀ ਚੋਣਾਂ',
@@ -1173,7 +1199,7 @@ $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' => 'ਯੂਜ਼ਰ ਗਰੁੱਪ ਸੋਧ',
@@ -1188,16 +1214,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' => 'ਸਫ਼ੇ ਪੜ੍ਹਨਾ',
@@ -1207,13 +1233,13 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'right-createaccount' => 'ਨਵੇਂ ਖਾਤੇ ਬਣਾਉਣਾ',
 'right-minoredit' => 'ਸੋਧਾਂ ਦੇ ਛੋਟਾ ਹੋਣ ਲਈ ਨਿਸ਼ਾਨ ਲਾਉਣਾ',
 'right-move' => 'ਸਫ਼ੇ ਭੇਜਣਾ',
-'right-movefile' => 'ਫ਼ਾà¨\88ਲਾà¨\82 à¨¦à©\87 à¨¨à¨¾à¨\82 à¨¬à¨¦à¨²à¨£à¨¾',
-'right-upload' => 'ਫ਼ਾà¨\88ਲਾà¨\82 à¨\85ੱਪਲà©\8bਡ à¨\95ਰਨਾ',
+'right-movefile' => 'ਫਾà¨\87ਲਾà¨\82 à¨­à©\87à¨\9cਣà©\80à¨\86à¨\82',
+'right-upload' => 'ਫਾà¨\87ਲਾà¨\82 à¨\85ੱਪਲà©\8bਡ',
 '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 +1251,7 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'right-userrights-interwiki' => 'ਦੂਜੇ ਵਿਕੀਆਂ ਤੇ ਮੈਂਬਰਾਂ ਦੇ ਮੈਂਬਰ ਹੱਕਾਂ ਵਿਚ ਸੋਧ ਕਰਨਾ',
 'right-siteadmin' => 'ਡੈਟਾਬੇਸ ਨੂੰ ਤਾਲਾ ਲਾਉਣਾ ਤੇ ਖੋਲ੍ਹਣਾ',
 'right-sendemail' => 'ਦੂਜੇ ਮੈਂਬਰਾਂ ਨੂੰ ਈ-ਮੇਲ ਭੇਜਣਾ',
+'right-passwordreset' => 'ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ ਈਮੇਲ ਵੇਖੋ',
 
 # Special:Log/newusers
 'newuserlogpage' => 'ਬਣਾਏ ਖਾਤਿਆਂ ਦਾ ਚਿੱਠਾ',
@@ -1235,61 +1262,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 +1339,7 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'recentchangeslinked-to' => 'ਇਸਦੇ ਬਦਲੇ ਇਸ ਪੰਨੇ ਨਾਲ ਜੁੜੇ ਪੰਨਿਆਂ ਵਿੱਚ ਹੋਏ ਬਦਲਾਅ ਵਿਖਾਓ',
 
 # Upload
-'upload' => 'ਫ਼ਾà¨\88ਲ à¨\85ੱਪਲà©\8bਡ à¨\95ਰà©\8b',
+'upload' => 'ਫ਼ਾਈਲ ਅਪਲੋਡ ਕਰੋ',
 'uploadbtn' => 'ਫਾਇਲ ਅੱਪਲੋਡ ਕਰੋ',
 'reuploaddesc' => 'ਅੱਪਲੋਡ ਫਾਰਮ ਉੱਤੇ ਜਾਓ।',
 'uploadnologin' => 'ਲਾਗਇਨ ਨਹੀਂ ਹੋ',
@@ -1307,10 +1349,11 @@ to upload files.',
 'upload-recreate-warning' => "'''ਖ਼ਬਰਦਾਰ: ਇਸ ਨਾਮ ਦੀ ਫ਼ਾਈਲ ਮਿਟਾਈ ਜਾਂ ਹੋਰ ਨਾਮ ਤੇ ਭੇਜੀ ਜਾ ਚੁੱਕੀ ਹੈ।'''
 ਮਿਟਾਉਣ ਅਤੇ ਭੇਜੇ ਜਾਣ ਦਾ ਚਿੱਠਾ ਸਹੂਲਤ ਲਈ ਇੱਥੇ ਦਿੱਤਾ ਗਿਆ ਹੈ:",
 'uploadlog' => 'ਅੱਪਲੋਡ ਲਾਗ',
-'uploadlogpage' => 'à¨\85ੱਪਲà©\8bਡਾà¨\82 à¨¦à¨¾ à¨\9aਿੱਠਾ',
+'uploadlogpage' => 'ਅਪਲੋਡਾਂ ਦਾ ਚਿੱਠਾ',
 'filename' => 'ਫਾਇਲ ਨਾਂ',
 'filedesc' => 'ਸਾਰ',
 'fileuploadsummary' => 'ਸੰਖੇਪ:',
+'filereuploadsummary' => 'ਫਾਇਲ ਬਦਲਾਅ',
 'filestatus' => 'ਕਾਪੀਰਾਈਟ ਹਾਲਤ:',
 'filesource' => 'ਸੋਰਸ:',
 'uploadedfiles' => 'ਅੱਪਲੋਡ ਕੀਤੀਆਂ ਫਾਇਲਾਂ',
@@ -1319,9 +1362,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>
@@ -1338,8 +1387,8 @@ to upload files.',
 'sourcefilename' => 'ਸੋਰਸ ਫਾਇਲ ਨਾਂ:',
 'sourceurl' => 'ਸਰੋਤ URL:',
 'destfilename' => 'ਟਿਕਾਣਾ ਫਾਇਲ-ਨਾਂ:',
-'upload-maxfilesize' => 'ਫ਼ਾà¨\88ਲ à¨¦à¨¾ à¨µà©±à¨§ à¨¤à©\8bà¨\82 à¨µà©±à¨§ à¨\85à¨\95ਾਰ: $1',
-'upload-description' => 'ਫ਼ਾà¨\88ਲ à¨¦à¨¾ ਵੇਰਵਾ',
+'upload-maxfilesize' => 'ਫਾਈਲ ਦਾ ਵੱਧ ਤੋਂ ਵੱਧ ਅਕਾਰ: $1',
+'upload-description' => 'ਫਾà¨\88ਲ ਵੇਰਵਾ',
 'upload-options' => 'ਅੱਪਲੋਡ ਚੋਣਾਂ',
 'watchthisupload' => 'ਇਸ ਫ਼ਾਈਲ ’ਤੇ ਨਜ਼ਰ ਰੱਖੋ',
 'upload-success-subj' => 'ਠੀਕ ਤਰ੍ਹਾਂ ਅੱਪਲੋਡ',
@@ -1372,8 +1421,8 @@ to upload files.',
 ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਦੁਬਾਰਾ ਜਾਂਚ ਕਰੋ ਕਿ URL ਸਹੀ ਹੈ ਅਤੇ ਸਾਈਟ ਉਪਲੱਬਧ ਹੈ।',
 'upload-curl-error28' => 'ਅੱਪਲੋਡ ਟਾਈਮ-ਆਉਟ',
 
-'license' => 'ਲਾਈਸੈਂਸਿੰਗ:',
-'license-header' => 'ਲਸੰਸ',
+'license' => 'ਲਾਈਸੈਂਸ:',
+'license-header' => 'ਲਾà¨\88ਸà©\88à¨\82ਸ',
 'nolicense' => 'ਕੁਝ ਵੀ ਚੁਣਿਆ',
 'license-nopreview' => '(ਝਲਕ ਉਪਲੱਬਧ ਨਹੀਂ)',
 'upload_source_file' => ' (ਤੁਹਾਡੇ ਕੰਪਿਊਟਰ ਉੱਤੇ ਇੱਕ ਫਾਇਲ)',
@@ -1391,14 +1440,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' => 'ਕੋਈ ਨਮੂਨਾ-ਤਸਵੀਰ ਨਹੀਂ',
@@ -1406,8 +1455,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|ਹੋਰ ਲਿੰਕ]] ਵੇਖੋ।',
@@ -1427,7 +1476,7 @@ to upload files.',
 # File reversion
 'filerevert' => '$1 ਰੀਵਰਟ',
 'filerevert-legend' => 'ਫਾਇਲ ਰੀਵਰਟ',
-'filerevert-comment' => 'à¨\9fਿੱਪਣà©\80:',
+'filerevert-comment' => 'à¨\95ਾਰਨ:',
 'filerevert-submit' => 'ਰੀਵਰਟ',
 
 # File deletion
@@ -1473,15 +1522,16 @@ 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:ਗੁੰਝਲ ਖੋਲ੍ਹ',
 
@@ -1496,7 +1546,7 @@ to upload files.',
 'withoutinterwiki' => 'ਬਿਨਾਂ ਬੋਲੀ ਲਿੰਕਾਂ ਦੇ ਸਫ਼ੇ',
 'withoutinterwiki-summary' => 'ਇਹ ਸਫ਼ੇ ਹੋਰ ਬੋਲੀਆਂ ਵਾਲ਼ੇ ਵਰਜਨਾਂ ਨਾਲ਼ ਨਹੀਂ ਜੁੜਦੇ।',
 'withoutinterwiki-legend' => 'ਅਗੇਤਰ',
-'withoutinterwiki-submit' => 'ਵਖਾਓ',
+'withoutinterwiki-submit' => 'ਵà©\87à¨\96ਾà¨\93',
 
 'fewestrevisions' => 'ਸਭ ਤੋਂ ਘੱਟ ਰੀਵਿਜ਼ਨਾਂ ਵਾਲ਼ੇ ਸਫ਼ੇ',
 
@@ -1506,7 +1556,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' => 'ਇਸ ਰਿਪੋਟ ਦਾ ਕੋਈ ਨਤੀਜਾ ਨਹੀਂ ਹੈ।',
@@ -1517,21 +1567,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 ਨਵੇਂ}}',
@@ -1553,13 +1603,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' => 'ਪਿੱਛੇ',
@@ -1584,22 +1634,31 @@ 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' => '(ਪਾਬੰਦੀਸ਼ੁਦਾ)',
 
+# Special:ActiveUsers
+'activeusers' => 'ਚੁਸਤ ਮੈਂਬਰਾਂ ਦੀ ਲਿਸਟ',
+'activeusers-intro' => 'ਇਹ ਓਹਨਾਂ ਮੈਂਬਰਾਂ ਦੀ ਲਿਸਟ ਹੈ ਜਿੰਨ੍ਹਾਂ ਨੇ ਆਖ਼ਰੀ $1 {{PLURAL:$1|ਦਿਨ|ਦਿਨਾਂ}} ਵਿਚ ਕਿਸੇ ਤਰ੍ਹਾਂ ਦਾ ਕੋਈ ਕੰਮ ਕੀਤਾ ਹੈ।',
+'activeusers-count' => 'ਆਖ਼ਰੀ {{PLURAL:$3|ਦਿਨ|$3 ਦਿਨਾਂ}} ਵਿਚ $1 {{PLURAL:$1|ਸੋਧ|ਸੋਧਾਂ}}',
+'activeusers-from' => 'ਇਸਤੋਂ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲ਼ੇ ਮੈਂਬਰ ਵਖਾਓ:',
+'activeusers-hidebots' => 'ਬੋਟਾਂ ਨੂੰ ਲੁਕਾਓ',
+'activeusers-hidesysops' => 'ਐਡਮਨਿਸਟ੍ਰੇਟਰ ਲੁਕਾਓ',
+'activeusers-noresult' => 'ਕੋਈ ਮੈਂਬਰ ਨਹੀਂ ਲੱਭਿਆ।',
+
 # Special:ListGroupRights
 'listgrouprights-group' => 'ਗਰੁੱਪ',
 'listgrouprights-rights' => 'ਹੱਕ',
 'listgrouprights-helppage' => 'Help:ਗਰੁੱਪ ਹੱਕ',
-'listgrouprights-members' => '(ਵਰਤà©\8bà¨\82à¨\95ਾਰਾਂ ਦੀ ਸੂਚੀ)',
+'listgrouprights-members' => '(ਮà©\88à¨\82ਬਰਾਂ ਦੀ ਸੂਚੀ)',
 'listgrouprights-addgroup-all' => 'ਸਾਰੇ ਗਰੁੱਪ ਜੋੜੋ',
 'listgrouprights-removegroup-all' => 'ਸਾਰੇ ਗਰੁੱਪ ਹਟਾਓ',
 
@@ -1607,6 +1666,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 +1678,7 @@ to upload files.',
 'nowikiemailtext' => 'ਇਸ ਮੈਂਬਰ ਨੇ ਦੂਜੇ ਮੈਂਬਰਾਂ ਤੋਂ ਈ-ਮੇਲ ਨਾ ਪ੍ਰਾਪਤ ਕਰਨਾ ਚੁਣ ਰੱਖਿਆ ਹੈ।',
 'emailnotarget' => 'ਪ੍ਰਾਪਤ ਕਰਤਾ ਦਾ ਨਾ-ਮੌਜੂਦ ਜਾਂ ਗ਼ਲਤ ਮੈਂਬਰ-ਨਾਂ।',
 'emailtarget' => 'ਪ੍ਰਾਪਤ ਕਰਤਾ ਦਾ ਮੈਂਬਰ-ਨਾਂ ਦਾਖ਼ਲ ਕਰੋ',
-'emailusername' => 'ਮà©\88à¨\82ਬਰ-ਨਾਂ:',
+'emailusername' => 'ਯà©\82à¨\9c਼ਰ-ਨਾਂ:',
 'emailusernamesubmit' => 'ਭੇਜੋ',
 'email-legend' => 'ਕਿਸੇ ਦੂਜੇ {{SITENAME}} ਮੈਂਬਰ ਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ',
 'emailfrom' => 'ਵਲੋਂ:',
@@ -1633,7 +1694,7 @@ to upload files.',
 
 # Watchlist
 'watchlist' => 'ਨਿਗਰਾਨ-ਸੂਚੀ',
-'mywatchlist' => 'ਧਿà¨\86ਨਸà©\82à¨\9aà©\80',
+'mywatchlist' => 'ਨਿà¨\97ਰਾਨà©\80-ਲਿਸà¨\9f',
 'watchlistfor2' => '$1 $2 ਲਈ',
 'nowatchlist' => 'ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਕੋਈ ਚੀਜ਼ ਨਹੀਂ ਹੈ।',
 'watchlistanontext' => 'ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚਲੀਆਂ ਚੀਜ਼ਾਂ ਵੇਖਣ ਜਾਂ ਸੋਧਣ ਲਈ ਮਿਹਰਬਾਨੀ ਕਰਕੇ $1।',
@@ -1655,8 +1716,8 @@ to upload files.',
 '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' => 'ਨਿਗ੍ਹਾ (ਵਾਚ) ਰੱਖੀ ਜਾ ਰਹੀ ਹੈ...',
@@ -1670,7 +1731,7 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 'changed' => 'ਬਦਲਿਆ',
 
 # Delete
-'deletepage' => 'ਪà©\87à¨\9c ਹਟਾਓ',
+'deletepage' => 'ਸਫ਼ਾ ਹਟਾਓ',
 'confirm' => 'ਪੁਸ਼ਟੀ',
 'excontent' => "ਸਮੱਗਰੀ ਸੀ: '$1'",
 'exbeforeblank' => 'ਖ਼ਾਲੀ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਸਮੱਗਰੀ ਸੀ: "$1"',
@@ -1713,7 +1774,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' => 'ਖ਼ਤਮ ਹੋਣ ਦਾ ਸਮਾਂ ਗ਼ਲਤ ਹੈ।',
@@ -1726,7 +1787,7 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 'protect-summary-cascade' => 'ਕਾਸਕੇਡਿੰਗ',
 'protect-cascade' => 'ਇਸ ਸਫ਼ੇ ਵਿਚ ਸ਼ਾਮਲ ਸਫ਼ੇ ਸੁਰੱਖਿਅਤ ਕਰੋ (ਕਾਸਕੇਡਿੰਗ ਸੁਰੱਖਿਆ)',
 'protect-cantedit' => 'ਤੁਸੀਂ ਇਸ ਸਫ਼ੇ ਦਾ ਸੁਰੱਖਿਆ ਦਰਜਾ ਨਹੀਂ ਬਦਲ ਸਕਦੇ ਕਿਉਂਕਿ ਤੁਹਾਨੂੰ ਇਸਨੂੰ ਸੋਧਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।',
-'protect-othertime' => 'ਹੋਰ ਸਮਾਂ',
+'protect-othertime' => 'ਹੋਰ ਸਮਾਂ:',
 'protect-othertime-op' => 'ਹੋਰ ਸਮਾਂ',
 'protect-existing-expiry' => 'ਖ਼ਤਮ ਹੋਣ ਦਾ ਮੌਜੂਦਾ ਸਮਾਂ: $2, $3',
 'protect-otherreason' => 'ਹੋਰ/ਵਾਧੂ ਕਾਰਨ:',
@@ -1736,7 +1797,7 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 'restriction-type' => 'ਅਧਿਕਾਰ:',
 'restriction-level' => 'ਪਾਬੰਦੀ ਪੱਧਰ:',
 'minimum-size' => 'ਘੱਟੋ-ਘੱਟ ਆਕਾਰ',
-'maximum-size' => 'ਵੱਧੋ-ਵੱਧ ਆਕਾਰ',
+'maximum-size' => 'ਵੱਧੋ-ਵੱਧ ਆਕਾਰ:',
 'pagesize' => '(ਬਾਈਟ)',
 
 # Restrictions (nouns)
@@ -1756,16 +1817,16 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 'viewdeletedpage' => 'ਮਿਟਾਏ ਹੋਏ ਸਫ਼ੇ ਵੇਖੋ',
 'undelete-fieldset-title' => 'ਰੀਵਿਜ਼ਨਾਂ ਮੁੜ ਬਹਾਲ ਕਰੋ',
 'undelete-nodiff' => 'ਕੋਈ ਪਿਛਲੀ ਰੀਵਿਜ਼ਨ ਨਹੀਂ ਲੱਭੀ',
-'undeletebtn' => 'ਰà©\80ਸਟੋਰ',
+'undeletebtn' => 'ਮà©\81à©\9c-ਸਟੋਰ',
 'undeletelink' => 'ਵੇਖੋ/ਮੁੜ ਬਹਾਲ ਕਰੋ',
 'undeleteviewlink' => 'ਵੇਖੋ',
-'undeletereset' => 'ਰà©\80-ਸੈੱਟ',
+'undeletereset' => 'ਮà©\81à©\9c-ਸੈੱਟ',
 'undeletecomment' => 'ਕਾਰਨ:',
 '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
@@ -1783,10 +1844,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' => 'ਇਹ ਮੈਂਬਰ ਇਸ ਵੇਲ਼ੇ ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੈ।
 ਪਾਬੰਦੀ ਚਿੱਠੇ ਦਾ ਤਾਜ਼ਾ ਦਾਖ਼ਲਾ ਹਵਾਲੇ ਲਈ ਹੇਠਾਂ ਦਿੱਤਾ ਗਿਆ ਹੈ:',
@@ -1795,7 +1856,7 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'sp-contributions-search' => 'ਯੋਗਦਾਨ ਖੋਜੋ',
 'sp-contributions-username' => 'IP ਪਤਾ ਜਾਂ ਵਰਤੋਂਕਾਰਨਾਮ:',
 'sp-contributions-toponly' => 'ਕੇਵਲ ਉਨ੍ਹਾਂ ਸੰਪਾਦਨਾਂ ਨੂੰ ਵਖਾਓ ਜੋ ਨਵੀਨਤਮ ਸੰਸ਼ੋਧਨ ਹਨ',
-'sp-contributions-submit' => 'ਖੋਜ',
+'sp-contributions-submit' => 'ਖੋਜ',
 
 # What links here
 'whatlinkshere' => 'ਕਿਹੜੇ (ਪੰਨੇ) ਇੱਥੇ ਜੋੜਦੇ ਹਨ',
@@ -1805,18 +1866,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' => 'ਕਾਰਨ:',
@@ -1831,7 +1892,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 ਦੇ ਯੋਗਦਾਨ',
@@ -1889,7 +1950,7 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'lockdb' => 'ਡਾਟਾਬੇਸ ਲਾਕ',
 
 # Move page
-'move-page-legend' => 'ਪà©\87à¨\9c à¨®à©\82ਵ à¨\95ਰੋ',
+'move-page-legend' => 'ਸਫ਼ਾ à¨­à©\87à¨\9cੋ',
 'movearticle' => 'ਸਫ਼ਾ ਭੇਜੋ:',
 'movenologin' => 'ਲਾਗਇਨ ਨਹੀਂ ਹੋ',
 'movenologintext' => 'ਇਕ ਸਫ਼ੇ ਦਾ ਸਿਰਲੇਖ ਬਦਲਣ ਲਈ ਤੁਸੀਂ ਰਜਿਸਟਰਡ ਮੈਂਬਰ ਹੋਣੇ ਚਾਹੀਦੇ ਹੋ ਅਤੇ [[Special:UserLogin|ਲਾਗਇਨ]] ਕੀਤਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।',
@@ -1901,11 +1962,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' => 'ਪਿੱਛੇ ਇਕ ਰੀਡਿਰੈਕਟ ਛੱਡੋ',
@@ -1924,7 +1985,7 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'allmessagesname' => 'ਨਾਮ',
 'allmessagesdefault' => 'ਡਿਫਾਲਟ ਪਾਠ',
 'allmessagescurrent' => 'ਮੌਜੂਦਾ ਟੈਕਸਟ',
-'allmessages-filter-legend' => 'à¨\9bਾਨਣਾ',
+'allmessages-filter-legend' => 'ਫਿਲà¨\9fਰ',
 'allmessages-filter-all' => 'ਸਭ',
 'allmessages-language' => 'ਭਾਸ਼ਾ:',
 'allmessages-filter-submit' => 'ਜਾਓ',
@@ -1976,7 +2037,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' => 'ਇੱਕ ਰਲਵਾਂ ਪੰਨਾ ਲੋਡ ਕਰੋ',
@@ -1986,19 +2047,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' => 'ਆਪਣੀਆਂ ਤਬਦੀਲੀਆਂ ਸਾਂਭੋ',
@@ -2007,19 +2068,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 ਸੁਰੱਖਿਆ ਫਿਲਟਰ',
@@ -2034,8 +2095,8 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'skinname-monobook' => 'ਮੋਨੋਬੁੱਕ',
 
 # 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' => 'ਥੰਮਨੇਲ ਆਕਾਰ:',
@@ -2058,11 +2119,11 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 ਲਾਈਨ ਵਿਚ ਪਹਿਲੀ ਕੜੀ ਗ਼ਲਤ ਫ਼ਾਈਲ ਦੀ ਕੜੀ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ। ਉਸ ਲਾਈਨ ’ਚ ਅੱਗੇ ਦਿਤੀਆਂ ਕੜੀਆਂ ਨੂੰ ਇਤਰਾਜ਼ਯੋਗ ਮੰਨਿਆ ਜਾਵੇਗਾ, ਭਾਵ ਉਹ ਪੰਨੇ ਜਿਨ੍ਹਾਂ ਵਿਚ ਫ਼ਾਈਲ ਕਿਸੇ ਲਾਈਨ ਵਿਚ ਸਥਿਤ ਹੋ ਸਕਦੀ ਹੈ।',
 
 # Metadata
-'metadata' => 'ਮà©\80à¨\9fਾਡਾਟਾ',
+'metadata' => 'ਮà©\80à¨\9fਾਡà©\88ਟਾ',
 'metadata-help' => 'ਇਸ ਫ਼ਾਈਲ ਵਿੱਚ ਵਾਧੂ ਜਾਣਕਾਰੀਆਂ ਹਨ, ਜੋ ਸ਼ਾਇਦ ਉਸ ਕੈਮਰੇ ਜਾਂ ਸਕੈਨਰ ਦੀ ਦੇਣ ਹਨ ਜੋ ਇਸਨੂੰ ਬਣਾਉਣ ਲਈ ਵਰਤਿਆ ਗਿਆ। ਜੇ ਇਸ ਫ਼ਾਈਲ ਵਿੱਚ ਕੋਈ ਤਬਦੀਲੀ ਕੀਤੀ ਗਈ ਹੈ ਤਾਂ ਹੋ ਸਕਦਾ ਹੈ ਕੁਝ ਵੇਰਵੇ ਬਦਲੀ ਫ਼ਾਈਲ ਦਾ ਸਹੀ ਰੂਪਮਾਨ ਨਾ ਹੋਣ।',
 'metadata-fields' => 'ਇਸ ਸੁਨੇਹੇ ਵਿੱਚ ਸੂਚੀਬੱਧ ਖੇਤਰ ਚਿੱਤਰ ਪੰਨੇ ’ਚ ਸ਼ਾਮਲ ਕੀਤੇ ਜਾਣਗੇ ਜੋ ਉਦੋਂ ਦਿੱਸਦੇ ਹਨ ਜਦੋ ਮੈਟਾਡੈਟਾ ਖਾਕਾ ਬੰਦ ਹੋਵੇ। ਬਾਕੀ ਉਂਞ ਹੀ ਲੁਕੇ ਹੋਣਗੇ।',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ਚੌੜਾਈ',
 'exif-imagelength' => 'ਉਚਾਈ',
 'exif-samplesperpixel' => 'ਭਾਗਾਂ ਦੀ ਗਿਣਤੀ',
@@ -2102,14 +2163,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' => 'ਸਭ',
@@ -2118,12 +2179,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 ਬਹੁਤ ਲੰਬਾ ਹੈ]',
@@ -2135,16 +2196,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' => 'ਜਾਓ',
@@ -2155,18 +2216,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' => 'ਕੱਚੀ ਧਿਆਨਸੂਚੀ ਸੰਪਾਦਨ ਕਰੋ',
 
@@ -2177,14 +2238,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' => 'ਖ਼ਾਲੀ ਸਫ਼ਾ',
@@ -2200,9 +2257,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' => 'ਭੇਜੋ',
@@ -2210,7 +2267,7 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'htmlform-selectorother-other' => 'ਹੋਰ',
 
 # New logging system
-'logentry-move-move' => "$1 ਨੇ $3 ਪੰਨੇ $4 'ਤੇ ਸਥਾਨਾਂਤਰਿਤ ਕੀਤਾ",
+'logentry-move-move' => '$1 ਨੇ ਸਫ਼ਾ $3 ਨੂੰ $4 ’ਤੇ ਭੇਜਿਆ',
 'logentry-newusers-newusers' => 'ਮੈਂਬਰ ਖਾਤਾ $1 ਬਣਾਇਆ ਗਿਆ',
 'logentry-newusers-create' => 'ਵਰਤੋਂਕਾਰ ਖਾਤਾ $1 ਬਣਾਇਆ ਗਿਆ',
 'logentry-newusers-create2' => 'ਵਰਤੋਂਕਾਰ ਖਾਤਾ $3 $1 ਦੁਆਰਾ ਬਣਾਇਆ ਗਿਆ ਸੀ',
@@ -2225,14 +2282,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..017202c 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Geitost
  * @author Kaganer
  * @author Katimawan2005
  * @author Urhixidur
@@ -45,8 +46,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',
@@ -233,7 +232,6 @@ Pabusten ing pamanaliling dake kapamilatan [alilan] ning suglung',
 'disclaimers' => 'Pamananggi',
 'disclaimerpage' => 'Project:Pangkabilugan a pamananggi',
 'edithelp' => 'Saup pamanalili',
-'edithelppage' => 'Help:Pamag-edit',
 'helppage' => 'Help:Kalamnan',
 'mainpage' => 'Pun Bulung',
 'mainpage-description' => 'Pun Bulung',
@@ -381,7 +379,7 @@ Apansingan mung mapalyaring makalto la pa murin deng aliwang bulung a bala mu ma
 'logout' => 'Mag-log out',
 'userlogout' => 'Mag logout',
 'notloggedin' => 'E maka login',
-'nologin' => "Ala kang login? '''$1'''.",
+'nologin' => 'Ala kang login? $1.',
 'nologinlink' => 'Maglalang kang account',
 'createaccount' => 'Maglalang kang account',
 'gotaccount' => "Atin na kang account? '''$1'''.",
@@ -764,7 +762,6 @@ Tutuking $1 {{PLURAL:$1|result|results}}',
 'viewprevnext' => 'Lon ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''Atin bulung a mikilagiung \"[[:\$1]]\" keng wiking ini.'''",
 'searchmenu-new' => "↓'''Maglalang kang bulung \"[[:\$1]] keng wiking ini!'''",
-'searchhelp-url' => 'Help:Kalamnan',
 'searchprofile-articles' => '↓Kalamnan bulung',
 'searchprofile-project' => '↓Saup ampong bulung proyectu',
 'searchprofile-images' => '↓Dakalmedia',
@@ -797,13 +794,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',
@@ -1083,11 +1073,11 @@ Mamili ka sanang lagyung mas maglarawan keng kekang simpan.",
 'upload-proto-error-text' => 'Mangailangan yang URL a magumpisa king <code>http://</code> o <code>ftp://</code> ing pang-malaut a pamaglulan (remote upload).',
 'upload-file-error' => 'Pamagkamaling pangkilub (internal error)',
 'upload-file-error-text' => 'Mika pamagkamaling pangkilub aniang susubukan nang maglalang pansamantalang simpan king server.
-Pakiyaus me ing metung a talapanibala ning sistema (system administrator).',
+Pakiyaus me ing metung a talapanibala ([[Special:ListUsers/sysop|administrator]]).',
 'upload-misc-error' => 'E makikilalang pamagkamali king pamaglulan (unknown upload error)',
 'upload-misc-error-text' => 'Ating miliaring e makikilalang pamagkamali aniang maglulan.
 Pakilawe mu nung ustu ya at maliari yang luban ing URL, at subukan mung pasibayu.
-Nung atin pa muring prublema, maus kang talapanibala king sistema (system administrator).',
+Nung atin pa muring prublema, maus kang talapanibala ([[Special:ListUsers/sysop|administrator]]).',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'E ne ayabut ing URL',
@@ -1373,8 +1363,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 +2005,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 +2099,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 +2311,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..efd196e 100644 (file)
@@ -228,7 +228,6 @@ $messages = array(
 'disclaimers' => 'Démintis',
 'disclaimerpage' => 'Project:Déminti général',
 'edithelp' => 'Éditer el aiyude',
-'edithelppage' => 'Help:Édichion',
 'helppage' => 'Help:Étnus',
 'mainpage' => 'Moaite Pache',
 'mainpage-description' => 'Moaite Pache',
@@ -755,7 +754,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 +1058,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..3dfc3fe 100644 (file)
@@ -217,7 +217,6 @@ $messages = array(
 'disclaimers' => 'Impressum',
 'disclaimerpage' => 'Project:Impressum',
 'edithelp' => 'Hilf zum Ennere',
-'edithelppage' => 'Help:Tscheensche',
 'helppage' => 'Help:Hilf',
 'mainpage' => 'Haaptblatt',
 'mainpage-description' => 'Haaptblatt',
@@ -399,7 +398,6 @@ Paesswatt fer nau: $2',
 'nextn' => 'neegschte {{PLURAL:$1|$1}}',
 'viewprevnext' => 'Zeige ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-new' => "'''Schtaert des Blatt „[[:$1|$1]]“ uf dem Wiki.'''",
-'searchhelp-url' => 'Help:Hilf',
 'searchprofile-everything' => 'Abaddiche',
 'searchprofile-articles-tooltip' => 'Uffgucke in $1',
 'searchprofile-project-tooltip' => 'Uffgucke in $1',
@@ -420,9 +418,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 +672,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 +901,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 +971,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..619a9b8 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Als-Holder
+ * @author Imbericle
  * @author M-sch
  * @author Manuae
  * @author SPS
@@ -20,8 +21,8 @@ $namespaceNames = array(
        NS_MEDIA            => 'Medium',
        NS_SPECIAL          => 'Schbezial',
        NS_TALK             => 'Babble',
-       NS_USER             => 'Benudzer',
-       NS_USER_TALK        => 'Benudzer_Dischbediere',
+       NS_USER             => 'Middawaida',
+       NS_USER_TALK        => 'Middawaida_Dischbediere',
        NS_PROJECT_TALK     => '$1_Dischbediere',
        NS_FILE             => 'Dadai',
        NS_FILE_TALK        => 'Dadai_Dischbediere',
@@ -31,46 +32,63 @@ $namespaceNames = array(
        NS_TEMPLATE_TALK    => 'Vorlach_Dischbediere',
        NS_HELP             => 'Hilf',
        NS_HELP_TALK        => 'Hilf_Dischbediere',
-       NS_CATEGORY         => 'Kadegorie',
-       NS_CATEGORY_TALK    => 'Kadegorie_Dischbediere',
+       NS_CATEGORY         => 'Sachgrubb',
+       NS_CATEGORY_TALK    => 'Sachgrubb_Dischbediere',
 );
 
 $namespaceAliases = array(
        # German namespaces
-       'Medium'               => NS_MEDIA,
-       'Spezial'              => NS_SPECIAL,
-       'Diskussion'           => NS_TALK,
-       'Benutzer'             => NS_USER,
-       'Benutzer_Diskussion'  => NS_USER_TALK,
-       '$1_Diskussion'        => NS_PROJECT_TALK,
-       'Datei'                => NS_FILE,
-       'Datei_Diskussion'     => NS_FILE_TALK,
-       'MediaWiki_Diskussion' => NS_MEDIAWIKI_TALK,
-       'Vorlage'              => NS_TEMPLATE,
-       'Vorlage_Diskussion'   => NS_TEMPLATE_TALK,
-       'Hilfe'                => NS_HELP,
-       'Hilfe_Diskussion'     => NS_HELP_TALK,
-       'Kategorie'            => NS_CATEGORY,
-       'Kategorie_Diskussion' => NS_CATEGORY_TALK,
+       'Medium'                 => NS_MEDIA,
+       'Spezial'                => NS_SPECIAL,
+       'Diskussion'             => NS_TALK,
+       'Benutzer'               => NS_USER,
+       'Benutzer_Diskussion'    => NS_USER_TALK,
+       'Benudzer'               => NS_USER,
+       'Benudzer_Dischbediere'  => NS_USER_TALK,
+       '$1_Diskussion'          => NS_PROJECT_TALK,
+       'Datei'                  => NS_FILE,
+       'Datei_Diskussion'       => NS_FILE_TALK,
+       'MediaWiki_Diskussion'   => NS_MEDIAWIKI_TALK,
+       'Vorlage'                => NS_TEMPLATE,
+       'Vorlage_Diskussion'     => NS_TEMPLATE_TALK,
+       'Hilfe'                  => NS_HELP,
+       'Hilfe_Diskussion'       => NS_HELP_TALK,
+       'Kategorie'              => NS_CATEGORY,
+       'Kategorie_Diskussion'   => NS_CATEGORY_TALK,
+       'Kadegorie'              => NS_CATEGORY,
+       'Kadegorie_Dischbediere' => NS_CATEGORY_TALK,
 );
 
 $messages = array(
 # User preference toggles
-'tog-showtoolbar' => "Werkzaich zum Bearwaide zaische (dodezu brauchd's JavaScript)",
-'tog-showhiddencats' => 'Zaisch vaschdeglde Kadegorije',
-
-'underline-always' => 'Immer',
-'underline-never' => 'Garnet',
-'underline-default' => 'Des nemme, was em Browser gsaachd hoschd.',
+'tog-underline' => 'Lingg unnaschdraische',
+'tog-hideminor' => 'Vaschdegg klääne Bearwaidunge',
+'tog-hidepatrolled' => 'Vaschdegg gsischdede Ännarunge',
+'tog-extendwatchlist' => 'Zaisch alle Ännarunge unn ned nur die ledschde',
+'tog-showtoolbar' => "Wergzaisch fas Beawaide zaische (dodezu brauchd's JavaScript)",
+'tog-previewontop' => 'Vorbligg owwahalwb vum Beaawaidungsfenschda zaische',
+'tog-previewonfirst' => 'Zaischen Vorbligg baim erschdemol Schaffe',
+'tog-oldsig' => 'Voahonneni Unnaschfrid',
+'tog-showjumplinks' => 'Schdellde "Hubs uff"-Lingg',
+'tog-uselivepreview' => 'Uuvazeschada Vorbligg (bneedischd JavaScript) (vasugswais)',
+'tog-showhiddencats' => 'Zaisch vaschdeglde Grubbe',
+
+'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',
 'monday' => 'Mondaach',
 'tuesday' => 'Dienschdaach',
-'wednesday' => 'Midwoch',
+'wednesday' => 'Middwoch',
 'thursday' => 'Dunnaschdaach',
 'friday' => 'Fraidaach',
-'saturday' => 'Somschdaach',
+'saturday' => 'Sõmschdaach',
 'sun' => 'Su',
 'mon' => 'Mo',
 'tue' => 'Di',
@@ -78,32 +96,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 +134,529 @@ $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|Sachgrubb|Sachgrubbe}}',
+'category_header' => 'Saide inde Sachgrubb „$1“',
+'subcategories' => 'Unnagrubbe',
+'category-media-header' => 'Medje indɐ Sachgrubb „$1“',
+'category-empty' => '"Die Sachgrubb hodd kä Said odda Medje."',
+'hidden-categories' => '{{PLURAL:$1|Vaschdegldi Sachgrubb|Vaschdeglde Sachgrubbe}}',
+'hidden-category-category' => 'Verschdegelde Grubbe',
+'category-subcat-count' => '{{PLURAL:$2|Die Sachgrubb hod die Unnagrubb.|Die Sachgrubb hod {{PLURAL:$1|Unnagrubb|$1 Unnagrubbe}}, vun gsomd $2.}}',
+'category-subcat-count-limited' => 'Die Sachgrubb hod die {{PLURAL:$1|Unagrubb|$1 Unagrubbe}}.',
+'category-article-count' => '{{PLURAL:$2|Indɐ Sachgrubb hodds die Said.|Die {{PLURAL:$1|Said|$1 Saide}} gibbds inde Sachgrubb, vun gsomd $2.}}',
+'category-article-count-limited' => 'Die {{PLURAL:$1|Said|$1 Saide}} hodds inde Sachgrubb.',
+'category-file-count' => "{{PLURAL:$2|Die Sachgrubb hodd ä Said.|Die {{PLURAL:$1|Said isch änni vun $2 Saide:|S'werren $1 vun gsomd $2 Saide gzaischd:}}}}",
+'category-file-count-limited' => 'Die {{PLURAL:$1|Dadai|$1 Dadije}} hodds inde Sachgrubb.',
+'listingcontinuesabbrev' => '(Waida)',
+'index-category' => 'Eafassdi Saide',
+'noindex-category' => 'Saide, wu ned im Vazaischnis sinn',
+
+'about' => 'Iwwa',
+'newwindow' => '(werd innem naije Fenschda uffgmachd)',
+'cancel' => 'Abbresche',
+'moredotdotdot' => 'Mea …',
 'mypage' => 'Said',
 'mytalk' => 'Dischbediere',
 'navigation' => 'Nawigadzion',
+'and' => '&#32;unn',
 
 # Cologne Blue skin
 'qbfind' => 'Finne',
-'qbedit' => 'Bearwaide',
-'qbmyoptions' => 'Mai Saide',
+'qbbrowse' => 'Duaschschdewere',
+'qbedit' => 'Beawaide',
+'qbpageoptions' => 'Die Said',
+'qbmyoptions' => 'Moi Saide',
+'qbspecialpages' => 'Schbezialsaide',
 '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' => 'Õleesche',
+'vector-view-edit' => 'Beawaide',
 'vector-view-history' => 'Dadaigschischd',
 'vector-view-view' => 'Lese',
-'actions' => 'Agzione',
-'namespaces' => 'Nomensreem',
+'vector-view-viewsource' => 'Gwelltegschd zaische',
+'actions' => 'Maßnõhme',
+'namespaces' => 'Nõmensreum',
+'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-Õsischd',
+'permalink' => 'Schdendischa Lingg',
+'print' => 'Drugge',
+'view' => 'Ogugge',
+'edit' => 'Beawaide',
+'create' => 'Õleesche',
+'editthispage' => 'Die Said beawaide',
+'create-this-page' => 'Mach die Said',
 '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',
+'specialpage' => 'Schbezielli Said',
+'personaltools' => 'Persenlischs Wergzaisch',
+'postcomment' => 'Naije Abschnidd',
+'articlepage' => 'Inhald õgugge',
 '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',
+'userpage' => 'Middawaidasaid õgugge',
+'projectpage' => 'Brojegdsaid õgugge',
+'imagepage' => 'Dadaisaid õgugge',
+'mediawikipage' => 'Nochrischd õgugge',
+'templatepage' => 'Voalach õgugge',
+'viewhelppage' => 'Hilf õgugge',
+'categorypage' => 'Zaisch die Kadegorie',
+'viewtalkpage' => 'Zaischs Gbabbl',
+'otherlanguages' => 'In õnnare Schbroche',
+'redirectedfrom' => '(Nochgschiggd worre vun $1)',
+'redirectpagesub' => 'Nochschigg-Said',
+'lastmodifiedat' => 'Die Said ischs ledschde Mol gännad worre õm $1, õm $2.',
+'viewcount' => 'Die Said isch bis jedz {{PLURAL:$1|$1|$1}} mol uffgrufe worre.',
+'protectedpage' => 'Said schidze',
+'jumpto' => 'Hubs uff:',
+'jumptonavigation' => 'Nawigadzion',
+'jumptosearch' => 'Nochgugge',
+'view-pool-error' => 'Dudma leed, die Maschine isch graad iwwalaschd.
+Zu vieli Middawaida guggn grad die Said õ.
+Waad ä bissl un brobieas nomol.
+
+$1',
+'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',
 'helppage' => 'Help:Inhald',
-'mainpage' => 'Hääptsaid',
-'mainpage-description' => 'Startseid',
+'mainpage' => 'Schdadsaid',
+'mainpage-description' => 'Schdadsaid',
+'policy-url' => 'Project:Grundsedz',
 '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',
+'newmessagesdifflinkplural' => 'ledschdi {{PLURAL:$1|Ännarung|Ännarunge}}',
+'youhavenewmessagesmulti' => 'Do hoschd ä Nochrischd grischd: $1',
+'editsection' => 'beawaide',
+'editold' => 'beawaide',
+'viewsourceold' => 'Gwelltegschd õgugge',
+'editlink' => 'beawaide',
+'viewsourcelink' => 'Gwell õgugge',
+'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',
+'collapsible-expand' => 'Uffglabbe',
+'thisisdeleted' => '$1 õgugge odda widdaheaschdelle?',
+'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 hodds nedd)',
 
 # 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' => 'Middawaidasaid',
+'nstab-media' => 'Medije',
+'nstab-special' => 'Schbezialsaid',
 'nstab-project' => 'Bordal',
-'nstab-image' => 'Dadei',
-'nstab-mediawiki' => 'Mitdeelung',
-'nstab-template' => 'Vorlaach',
-'nstab-help' => 'Hilf',
-'nstab-category' => 'Kadegorie',
-
-# General errors
-'missing-article' => "De Text fer „$1“ $2 isch inde Daadebong'g nit gfunne worre.
+'nstab-image' => 'Dadai',
+'nstab-mediawiki' => 'Middeelung',
+'nstab-template' => 'Vorlach',
+'nstab-help' => 'Unaschdidzung',
+'nstab-category' => 'Sachgrubb',
 
-Normalerwais hääßd des, dass die Said gleschd worre isch.
+# Main script and global functions
+'nosuchaction' => 'Des hodds nedd',
+'nosuchspecialpage' => 'Schbezialsaid hodds nedd',
 
-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.",
-'missingarticle-rev' => '(Versionsnummer#: $1)',
+# General errors
+'error' => 'Irrdumm',
+'databaseerror' => 'Daadebongg-Irrdumm',
+'readonly' => 'Daadebongg blogiead',
+'missing-article' => 'De Tegschd fa „$1“ $2 isch inde Daadebongg nedd gfunne worre.
+
+Noamalawees heeßd des, dass die Said gleschd worre isch.
+
+Wonnse des awwa nedd isch, hoschd villaischdn Irdumm inde Daadebongg gfunne.
+Bidde meldsm [[Special:ListUsers/sysop|Adminischdrador]], un gebbde URL dzu õ.',
+'missingarticle-rev' => '(Ausgawenumma#: $1)',
+'missingarticle-diff' => '(Unnaschied: $1, $2)',
+'internalerror' => 'Inderna Irrdumm',
+'internalerror_info' => 'Inderna Irrdumm: $1',
+'fileappenderrorread' => 'Beim dzugiesche hoddma „$1“ nedd lese kenne.',
+'fileappenderror' => '"$1" hoddma nedd zu "$2" dzugiesche kenne.',
+'filecopyerror' => '"$1" hoddma nedd zu "$2" kobiere kenne.',
+'filerenameerror' => 'Die Said "$1" hoddma nedd uff "$2" umbenenne kenne.',
+'filedeleteerror' => '"$1" hoddma nedd lesche kenne.',
+'directorycreateerror' => 'S\'Vazaischnis "$1" hoddma nedd mache kenne.',
+'filenotfound' => '"$1" hoddma nedd finne kenne.',
+'fileexistserror' => '"$1" hodds schun: do hoddma nix schraiwe kenne.',
+'unexpected' => 'Uueawadeda Wead: "$1"="$2".',
+'formerror' => 'Irrdumm: hoddma nedd mache kenne.',
+'badarticleerror' => 'Des geed nedd uffde Said.',
+'cannotdelete-title' => '"$1" komma nedd lesche',
 '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 õgfordad Said isch nedd gildisch, lea, oddan nedd gildische Lingg vunem õnnare Wiki.
+S konn soi, dasses ä odda mea Zaische drin hodd, wu im Tidl vunde Said nedd gbrauchd werre dirfn.',
+'viewsource' => 'Gwelltegschd õgugge',
+'viewsource-title' => "D'Tegschd vun $1 õgugge",
+'viewsourcetext' => 'Konschdas õgugge un abschraiwe',
+'viewyourtext' => 'Konschda doi Eawed uff de Said õgugge un abschraiwe:',
+'ns-specialprotected' => 'Do komma nedd drõ schaffe',
+'exception-nologin' => 'Bischd nedd õgmeld',
+
+# Virus scanner
+'virus-unknownscanner' => 'Uubekonnda Viresucha:',
 
 # Login and logout pages
-'yourname' => 'Benutzername:',
-'yourpassword' => 'Password:',
-'yourpasswordagain' => 'Password nomol oigewe:',
-'remembermypassword' => 'Mai Passwort uff dem Computer merke (hechschtens fer $1 {{PLURAL:$1|Dach|Dach}})',
-'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',
+'welcomeuser' => 'Willkumme, $1!',
+'yourname' => 'Middawaidanõme:',
+'yourpassword' => 'Kennword:',
+'yourpasswordagain' => 'Kennword nomol oigewe:',
+'remembermypassword' => 'Moi Kennword uffm Rechna merge (hegschdns fa $1 {{PLURAL:$1|Daach|Daach}})',
+'login' => 'Õmelde',
+'nav-login-createaccount' => 'Õmelde / Kondo õleesche',
+'loginprompt' => 'Cookies mugschd fa {{SITENAME}} schun õhawe.',
+'userlogin' => 'Õmelde / Kondo õleesche',
+'userloginnocreate' => 'Oilogge',
+'logout' => 'Uffhere',
+'userlogout' => 'Uffhere',
+'nologin' => 'Hoschd noch kä Kondo? $1',
+'nologinlink' => 'E Kondo õleesche',
+'createaccount' => 'Kondo õleesche',
+'gotaccount' => 'Hoschd schun ä Kondo? $1',
+'gotaccountlink' => 'Õmelde',
+'userlogin-resetlink' => 'Hoschd doi Daade vagesse?',
+'createaccountreason' => 'Grund:',
+'badretype' => 'Kennword bassd nedd',
+'userexists' => 'De Middawaida hodds schun.
+Nemmen onnare.',
+'loginerror' => 'Irrdumm baim Õmelde',
+'createaccounterror' => 'Kondo $1 komma nedd mache',
+'loginsuccesstitle' => 'Konschd schaffe',
+'login-userblocked' => 'De Middawaida deaf do nemme schaffe.',
+'wrongpasswordempty' => 'Hoschds Kennword vagesse. Mags nomol.',
+'passwordtooshort' => 'Kennword muss {{PLURAL:$1|1 Zaische|$1 Zaische}} hawe.',
+'password-name-match' => 'Doi Kennword deaf nedd so heese wie du.',
+'password-login-forbidden' => 'De Nõme uns Kennword sinn fabode.',
+'mailmypassword' => 'Naijs Kennword iwwa E-Mail schigge',
+'accountcreated' => 'Kondo õgleeschd',
+'login-abort-generic' => 'Hodd nedd gklabbd - Abgbroche',
+'loginlanguagelabel' => 'Schbrooch: $1',
+
+# Change password dialog
+'resetpass' => 'Kennword wegsle',
+'oldpassword' => 'Alds Kennword',
+'newpassword' => 'Naijes Kennword',
+'retypenew' => 'Naijes Kennword nomol oigewe:',
+'resetpass_forbidden' => 'Kennwerda komma nedd wegsle',
+'resetpass-submit-loggedin' => 'Password wegsle',
+'resetpass-submit-cancel' => 'Uffhere',
+'resetpass-temp-password' => 'Bschrengds Kennword',
+
+# Special:PasswordReset
+'passwordreset' => 'Kennword zriggsedze',
+'passwordreset-legend' => 'Kennword zriggsedze',
+'passwordreset-username' => 'Middawaida:',
+'passwordreset-capture' => 'E-Mail õgugge?',
+
+# 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',
-'sig_tip' => 'Dai Unnerschrifd mid ener Zaidaagab',
-'hr_tip' => 'Horizontale Linie (sparsam verwenne)',
+'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'n Tegschd oi, wu nedd uffberaid werd",
+'nowiki_tip' => 'Wiki-Formatierunge ned beachde',
+'image_tip' => 'Bildvawais',
+'media_tip' => 'Dadailingg',
+'sig_tip' => 'Doi Unnaschrifd midena Zaidõgawb',
+'hr_tip' => 'Waagreschdi Linje (schbaasõm vawende)',
 
 # Edit pages
-'summary' => 'Zammefassung:',
+'summary' => 'Iwwabligg:',
 'subject' => 'Bedreff:',
-'minoredit' => 'Des isch e klänni Bearwaidung',
-'watchthis' => 'Die Said beowachde',
-'savearticle' => 'Said schbeichere',
+'minoredit' => 'Des ische glänni Beawaidung',
+'watchthis' => 'Die Said im Aach palde',
+'savearticle' => 'Said schbaischere',
 '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:',
-'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>.',
-'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)',
+'showpreview' => 'Voaschau zaische',
+'showlivepreview' => 'Live-Voaschau',
+'showdiff' => 'Ännarunge zaische',
+'anoneditwarning' => "'''Baßma uff:''' Du bischd ned õgemeld. Doi IP-Adress werd inde Gschischd vum Adiggl gschbaischad.",
+'summary-preview' => 'Iwwabligg:',
+'blockedtitle' => 'Middawaida isch gschbead',
+'blockednoreason' => "s'hod kän Grund",
+'whitelistedittext' => 'Mugschd disch $1 fas schaffe',
+'loginreqtitle' => 'Mugschd disch õmelde',
+'loginreqlink' => 'Õmelde',
+'loginreqpagetext' => 'Mugschd disch $1 fas õgugge.',
+'accmailtitle' => 'Kennword gschiggd',
+'newarticle' => '(Naij)',
+'newarticletext' => "Du bischdm Lingg nochgõnge zu enna Said, wus ganedd hodd.
+Fa die Said õzleesche, konnschd do im Käschdl unne õfonge mid schraiwe (gugg [[{{MediaWiki:Helppage}}|Hilf]] fa mea Auskinfd).
+Wonn do nedd hoschd heakumme wolle, drigg uff Browser uff '''Zrigg'''.",
+'noarticletext' => 'Uffde Said hods noch kän Tegschd. Du konnschd uff õnnare 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>.',
+'noarticletext-nopermission' => 'Do hods känn Tegschd.
+Du konschd uff onnare Saide [[Special:Search/{{PAGENAME}}|faden Tidl gugge]], odda <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} in alle Logs gugge]</span>, awwa du hoschd kä Ealauwnis die Said zu mache.',
+'updated' => '(Gännad)',
+'note' => "'''Hiwes:'''",
+'previewnote' => "'''Deng'g drõõ, dasses nua e Vorschau isch.'''
+Doi Ännarunge sinn noch nedd gschbaischadd worre!",
+'editing' => 'Õm $1 beawaide',
+'creating' => 'Magsch $1',
+'editingsection' => '$1 beawaide (de Deel)',
+'editingcomment' => '$1 beawaide (de Deel)',
+'editconflict' => 'Schdraid ums Ännare: $1',
 '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)',
-'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}}:',
+'template-semiprotected' => '(halwa-gschizd)',
+'hiddencategories' => 'Die Said kerd zu vaschdeggelde {{PLURAL:$1|1 Sachgrubb|$1 Sachgrubbe}}:',
+'permissionserrorstext-withaction' => 'Du därfschd nedd $2, weesch{{PLURAL:$1|m Grund|ede Grind}}:',
+'recreate-moveddeleted-warn' => "'''Baßma uff: Du maggschd 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.',
+De Leschoidrach fa die Said isch do unne als Gwell õgewwe.',
+'log-fulllog' => 'Alli Oidräsch vunde Logbischa õgugge',
+'edit-conflict' => 'Schdraid ums Ännare.',
+
+# Content models
+'content-model-text' => 'Glaategschd',
+'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 hodd wenigschdns ä Vorlach midä Kenngreeß, wu groß werre dud. Die Kenngreeß wead do nedd õgeguggd.",
+'post-expand-template-argument-category' => 'Saide, wu wegfallene Vorlachewead hawen.',
 
 # History pages
-'viewpagelogs' => 'Lochbischer fer die Said aagucke',
+'viewpagelogs' => 'Lochbischa fa die Said õgugge',
 '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',
-'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',
-'histfirst' => 'Ältschde',
-'histlast' => 'Naischde',
+'currentrev-asof' => 'Agduell Ausgab vun $1',
+'revisionasof' => 'Iwwaawaidung vun $1',
+'revision-info' => 'Ännarung vun $1 duasch $2',
+'previousrevision' => '← Älderi Beawaidung',
+'nextrevision' => 'Naijari Ausgawb →',
+'currentrevisionlink' => 'Agduelli Ausgawb',
+'cur' => 'jedzischi',
+'next' => 'Negschd',
+'last' => 'vorischi',
+'page_first' => 'Easchd',
+'page_last' => 'Ledschd',
+'histlegend' => "Du konnschd zwää Ausgawe wehle un vaglaische.<br />
+Ealaidarung: '''({{int:cur}})''' = Unnaschied zu jezd,
+'''({{int:last}})''' = Unnaschied zude vorischi Ausgab, '''{{int:minoreditletter}}''' = gleni Ännarung.",
+'history-fieldset-title' => 'Gugg die Gschischd',
+'history-show-deleted' => 'Bloß gleschdi Saide zaische',
+'histfirst' => 'Äldschde',
+'histlast' => 'Naijschde',
+'historyempty' => '(lea)',
 
 # Revision feed
-'history-feed-item-nocomment' => '$1 om $2',
+'history-feed-title' => 'Ännarungsgschischd',
+'history-feed-item-nocomment' => '$1 õm $2',
 
 # Revision deletion
-'rev-delundel' => 'zaisch/verschdeggle',
+'rev-delundel' => 'zaisch/vaschdeggl',
+'rev-showdeleted' => 'zaische',
+'revisiondelete' => 'Lesche/Heaschdelle vun Ännarunge',
 'revdelete-show-file-submit' => 'Ja',
+'revdelete-hide-image' => 'Vaschdegglde Inhald',
+'revdelete-hide-name' => 'Vaschdeggls',
+'revdelete-hide-comment' => 'Vaschdeggls Resimee',
+'revdelete-hide-user' => 'Vaschdeggl Middawaidanome/IP',
+'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-log' => 'Grund:',
+'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',
+'deletedhist' => 'Gleschde Gschischde',
+'revdelete-reasonotherlist' => 'Õnnare Grund',
+
+# History merging
+'mergehistory' => 'Gschischde zõmmefiere',
+'mergehistory-go' => 'Zaisch, wasma vaoinische konn',
+'mergehistory-submit' => 'Gschischde zõmmefiere',
+'mergehistory-reason' => 'Grund:',
 
 # Merge log
-'revertmerge' => 'Zammefiehrung rickgängich mache',
+'revertmerge' => 'Zõmmefiehrung 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' => 'ledschda {{PLURAL:$1|$1}}',
+'nextn' => 'negschd {{PLURAL:$1|$1}}',
+'prevn-title' => 'Frijari $1 {{PLURAL:$1|Eagewnis|Eagewnis}}',
+'nextn-title' => 'Negschdi $1 {{PLURAL:$1|Eagewnis|Eagewnis}}',
+'shown-title' => 'Zaisch $1 {{PLURAL:$1|Eagewnis}} 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 õnnare Nõmensreum',
+'search-result-size' => '$1 ({{PLURAL:$2|1 Word|$2 Wärda}})',
+'search-result-category-size' => '{{PLURAL:$1|1 Said|$1 Saide}} ({{PLURAL:$2|1 Sachgrubb|$2 Sachgrubbe}}, {{PLURAL:$3|1 Dadai|$3 Dadaije}})',
+'search-result-score' => 'Bdaidung: $1%',
+'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',
+'searcheverything-enable' => 'Gugg iwwaraal',
+'searchrelated' => 'vawond',
 'searchall' => 'alle',
+'showingresultsheader' => "{{PLURAL:$5|Eagewnis '''$1''' vun '''$3'''|Eagewnis '''$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.',
+'search-nonefound' => 'Kä Eagewnis vunde Õfroch.',
 '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',
+'datedefault' => 'Kä Oischdellunge',
+'prefs-watchlist' => 'Beowachdungslischd',
+'prefs-watchlist-edits-max' => 'Hegschdi Õzahl: 1000',
+'prefs-misc' => 'Schunschdisches',
+'prefs-rendering' => 'Uffdridd',
+'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-africa' => 'Afrika',
+'timezoneregion-america' => 'Õmerika',
+'timezoneregion-antarctica' => 'Õngdagdika',
+'timezoneregion-arctic' => 'Aadigk',
+'timezoneregion-asia' => 'Asije',
+'timezoneregion-atlantic' => 'Adlõndischa Ozeõn',
+'timezoneregion-australia' => 'Auschdralije',
+'timezoneregion-europe' => 'Oirobba',
+'timezoneregion-indian' => 'Indischa Ozeõn',
+'timezoneregion-pacific' => 'Pazifischa Ozeõn',
+'prefs-searchoptions' => 'Nochgugge',
+'default' => 'Schdondad',
+'youremail' => 'E-Mail:',
+'username' => '{{GENDER:$1|Middawaida}}:',
+'uid' => '{{GENDER:$1|Middawaida}}-Numma:',
+'prefs-memberingroups' => '{{GENDER:$2|Middglied}} vun {{PLURAL:$1|Grubb|Grubbe}}:',
+'yourrealname' => 'Birschalischa Nõme:',
 'yourlanguage' => 'Schbrooch:',
+'yournick' => 'Naiji Unnaschfrid',
+'yourgender' => 'Gschleschd:',
 'gender-unknown' => 'Ghoim gkalde',
+'gender-male' => 'Männlisch',
+'gender-female' => 'Waiblisch',
+'prefs-help-email' => 'E-mail muss ned soi, awwa wead fas naijsedze vum Kennwoad bneedischd, wonns vagesse hoschd.',
+'prefs-help-email-others' => 'Konschd a wehle, ob õnnare disch iwwan Lingg uff doina Dischbedier-Said õschbresche kennen.
+Doi Address werd ned gzaischd, wõnse midda babbln.',
+'prefs-diffs' => 'Unaschied',
+
+# User rights
+'userrights-groupsmember' => 'Midglied vun:',
+'userrights-reason' => 'Grund:',
 
 # Groups
 'group' => 'Grubb:',
+'group-user' => 'Middawaida',
 'group-bot' => 'Bots',
 'group-sysop' => 'Adminischdradore',
-'group-bureaucrat' => 'Birokrade',
+'group-bureaucrat' => 'Birograde',
 'group-all' => '(alle)',
 
 'group-bot-member' => '{{GENDER:$1|Bot}}',
@@ -424,115 +665,179 @@ Erklärung: '''({{int:cur}})''' = Unnerschied zu jetzert,
 
 'grouppage-sysop' => '{{ns:project}}:Adminischtratore',
 
+# Rights
+'right-read' => 'Saide leese',
+'right-edit' => 'Õnde Saide schaffe',
+'right-createpage' => 'Saide mache',
+'right-createtalk' => 'Dischbediersaide mache',
+'right-move' => 'Said bwesche',
+'right-move-subpages' => 'Said midde Unasaide bwesche',
+'right-movefile' => 'Saide vaschiewe',
+'right-upload' => 'Dadaije nufflade',
+'right-upload_by_url' => 'Dadaije vunna Address nufflaade',
+'right-delete' => 'Saide lesche',
+'right-undelete' => 'Said widdaheaschdelle',
+
 # Special:Log/newusers
-'newuserlogpage' => 'Naiaameldungs-Logbuch',
+'newuserlogpage' => 'Naimeldungs-Logbuch',
 
 # User rights log
-'rightslog' => 'Benutzerrecht-Logbuch',
+'rightslog' => 'Middawaidareschd-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-feed-description' => 'Di letschte Ännerunge vun {{SITENAME}} in des Feed aigewwe.',
-'recentchanges-label-minor' => "S'ische glänni Beawaidung",
-'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',
+'nchanges' => '$1 {{PLURAL:$1|Ännarung|Ännarunge}}',
+'recentchanges' => 'Ledschdi Ännarunge',
+'recentchanges-legend' => 'Wehl ä Õzaisch fa die ledschde Ännarunge',
+'recentchanges-feed-description' => 'Ledschde Ännarunge vun {{SITENAME}} im Feed oigewwe.',
+'recentchanges-label-newpage' => 'Domid magschd ä naiji Said',
+'recentchanges-label-minor' => "S'ische glenni Beawaidung",
+'recentchanges-label-bot' => 'Ännarunge duaschn Bod',
+'recentchanges-label-unpatrolled' => 'Die Ännarung isch noch nedd iwwabriefd worre',
+'rcnote' => "Õgzaischd {{PLURAL:$1|werd '''1''' Ännarung|werren die ledschde '''$1''' Ännarunge}} {{PLURAL:$2|vum ledschde Daach|inde ledschde '''$2''' Daache}} (Schdond: $4, $5)",
+'rcnotefrom' => "Unne sinn Ännarunge said '''$2''' (bis '''$1''').",
+'rclistfrom' => 'Zaisch die ledschde Ännarunge ab $1',
+'rcshowhideminor' => 'Glenni Ä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',
+'rcshowhideliu' => 'Õgmelda Middawaida $1',
+'rcshowhideanons' => 'Ned õgmelda Middawaida $1',
+'rcshowhidepatr' => '$1 iwabriefde Ännarunge',
+'rcshowhidemine' => 'Moi Beawaidunge $1',
+'rclinks' => 'Zaisch die ledschde $1 Ännarunge inde ledschde $2 Daach<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' => 'Oigschrengd uff Sachgrubbe (abgdeeld middm "|")',
+'rc_categories_any' => 'Ebbes',
+'rc-enhanced-expand' => 'Änzlhaide zaische (dozu brauchds JavaScript)',
+'rc-enhanced-hide' => 'Õgawe 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 õn valinggde Saide gännad worre isch',
+'recentchangeslinked-feed' => 'Ännarunge on valinggde Saide',
+'recentchangeslinked-toolbox' => 'Ännarunge uff verlingde Saide',
+'recentchangeslinked-title' => 'Ännarunge õn Saide, wu „$1“ druff verlinggd',
+'recentchangeslinked-noresult' => 'Do isch nix gännad worre inde Zaid.',
+'recentchangeslinked-summary' => "Die Lischd zaischd ledschdi Ännarunge, vunna bschdimmde Said, wu do valinggd isch (odda ä Midglied vunna bschdimmde Sachgrubb isch).
+Saide uff [[Special:Watchlist|Doina 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',
-'uploadedimage' => 'hod „[[$1]]“ nuffglade',
+'uploadbtn' => 'Dadai nufflade',
+'uploadlogpage' => 'Dadaije-Logbuch',
+'filedesc' => 'Iwwabligg',
+'fileuploadsummary' => 'Iwwabligg:',
+'savefile' => 'Dadai schbaischere',
+'uploadedimage' => 'hodd „[[$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 uffn Zaidpunggd zum õzaische, wies dord ausgseje hodd.',
+'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-user' => 'Benudzer',
-'filehist-dimensions' => 'Moß',
-'filehist-comment' => 'Kommentar',
+'filehist-thumb' => 'Gleenes Bild',
+'filehist-thumbtext' => 'Skizz fa die Ausgab vum $1',
+'filehist-user' => 'Middawaida',
+'filehist-dimensions' => 'Maß',
+'filehist-comment' => 'Oißarung',
 'imagelinks' => 'Dadaivawendung',
-'linkstoimage' => 'Die {{PLURAL:$1|Said verwaisd|$1 Saide verwaise}} uff die Datei:',
+'linkstoimage' => 'Die {{PLURAL:$1|Said vawaisd|$1 Saide vawaisn}} uff die Dadai:',
+'nolinkstoimage' => 'Do hodds kä Said, wu dohea zaischd.',
 'sharedupload' => 'Die Datei isch vun $1 un s kann sai, dass se ach vun annere Projekt gebraucht werd.',
+'sharedupload-desc-here' => 'Die Dadai isch vun $1 un konn a wuonaschda bnuzd werre.
+Ä Bschraiwung finschd [$2 Dadaibschraiwungssaid] unne.',
 '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' => 'Irschndn Adiggl',
 
 # Statistics
-'statistics' => 'Statischtike',
+'statistics' => 'Schdadischdigge',
+'statistics-pages' => 'Saide',
+
+'disambiguationspage' => 'Template:Vadaidlischung',
 
-'brokenredirects-edit' => 'bearwaide',
+'brokenredirects-edit' => 'beawaide',
 'brokenredirects-delete' => 'lesche',
 
+'withoutinterwiki-submit' => 'Zaische',
+
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|Byte|Bytes}}',
-'nmembers' => '$1 {{PLURAL:$1|Mitglied|Mitglieder}}',
-'prefixindex' => 'Alle Saide (mid Präfix)',
-'newpages' => 'Naie Saide',
-'move' => 'Verschiewe',
+'ncategories' => '$1 {{PLURAL:$1|Sachgrubb|Sachgrubbe}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwikis}}',
+'nlinks' => '$1 {{PLURAL:$1|Lingg|Linggs}}',
+'nmembers' => '$1 {{PLURAL:$1|Middawaida|Middawaida}}',
+'nrevisions' => '$1 {{PLURAL:$1|Ännarung|Ännarunge}}',
+'nimagelinks' => 'Used on $1 {{PLURAL:$1|Said|Saide}}',
+'ntransclusions' => 'oigsedzd uff $1 {{PLURAL:$1|Said|Saide}}',
+'uncategorizedpages' => 'Said ohne Sachgrubb',
+'uncategorizedcategories' => 'Sachgrubb ohne Sachgrubb',
+'uncategorizedimages' => 'Dadai ohne Sachgrubb',
+'uncategorizedtemplates' => 'Vorlach ohne Sachgrubb',
+'unusedcategories' => 'Vawaisdi Sachgrubb',
+'unusedimages' => 'Vawaisde Dadaije',
+'popularpages' => 'Bliewbde Saide',
+'wantedcategories' => 'Gwinschde Sachgrubbe',
+'wantedpages' => 'Gwinschde Saide',
+'mostlinkedcategories' => 'Nizlischi Sachgrubbe',
+'mostlinkedtemplates' => 'Niylischi Vorlache',
+'mostcategories' => 'Saide midd õm maigschde Sachgrubbe',
+'prefixindex' => 'Alle Saide (midd Voasilw)',
+'listusers-editsonly' => 'Zaisch bloß Bnudza mid Baidräsch',
+'usercreated' => '{{GENDER:$3|Gmachd}} vun $1 om $2',
+'newpages' => 'Naije Saide',
+'move' => 'Vaschiewe',
 'movethispage' => 'Die Said verschiewe',
-'pager-newer-n' => '{{PLURAL:$1|negschte 1|negschte $1}}',
-'pager-older-n' => '{{PLURAL:$1|vorich 1|voriche $1}}',
+'unusedcategoriestext' => 'Die Sachgrubb hodds, a wonnse vun känna onnare Said odda Sachgrubb gnumme werd.',
+'pager-newer-n' => '{{PLURAL:$1|negschd 1|negschd $1}}',
+'pager-older-n' => '{{PLURAL:$1|vorisch 1|vorische $1}}',
 
 # Book sources
-'booksources' => 'Buchqwelle',
-'booksources-search-legend' => 'No Buchquelle suche',
+'booksources' => 'Buchgwelle',
+'booksources-search-legend' => 'Noch Buchgwelle gugge',
 'booksources-go' => 'Geh',
 
 # Special:Log
-'log' => 'Logbicher',
+'log' => 'Logbischa',
 
 # Special:AllPages
 'allpages' => 'Alle Saide',
@@ -542,32 +847,52 @@ 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' => 'Sachgrubbe',
+'categoriespagetext' => 'Folschndi {{PLURAL:$1|Sachgrubb hodd|Sachgrubbe hawen}} Saide odda Dadaije. [[Special:UnusedCategories|Ubnudze Sachgrubbe]] werren do nedd gzaischd. Gugg a uffde [[Special:WantedCategories|gwinschde Sachgrubbe]].',
+'categoriesfrom' => 'Zaisch Sachgrubbe õgfonge middt:',
+
+# Special:DeletedContributions
+'sp-deletedcontributions-contribs' => 'Baidräsch',
+
 # Special:LinkSearch
-'linksearch' => 'Externe Links',
+'linksearch' => 'Exderne Lings',
+'linksearch-pat' => 'Suchmuschda',
+'linksearch-line' => '$1 isch vun $2 valinggd',
 
-# Special:ListGroupRights
-'listgrouprights-members' => '(Midgliederlischd)',
+# Special:ListUsers
+'listusers-submit' => 'Zaische',
+'listusers-noresult' => 'Kä Middawaida gfunne',
+'listusers-blocked' => '(gschberd)',
 
-# E-mail user
-'emailuser' => 'E-Mail on de Benutzer',
+# Special:ListGroupRights
+'listgrouprights-group' => 'Grubb',
+'listgrouprights-members' => '(Midgliedalischd)',
+
+# Email user
+'emailuser' => 'E-Mail õnde Middawaida',
+'emailusername' => 'Middawaidanõme:',
+'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|Beowachdungslischd]] zugfieschd worre. Zukinfdischi Ännarunge õnde Said unde Dischbediersaid, wu dzu kead, werren doo õgzaischd, un die Said werd '''fedd''' inde [[Special:RecentChanges|Ledschdi Ännarunge]] õgzaischd domidmas efacha finne konn.",
 'removedwatchtext' => 'D Said "[[:$1]]" isch aus [[Special:Watchlist|Dainer Beowachdungslischt]] rausgenumme worre.',
 'watch' => 'Beowachde',
 'watchthispage' => 'Die Said beowachde',
-'unwatch' => 'Nimmi beowachde',
-'watchlist-details' => 'S hot {{PLURAL:$1|$1 Said|$1 Saide}} uff Dainer Beowachdungslischt, Dischbediersaide zelle nid.',
-'wlshowlast' => 'Die letschte $1 Stunne $2 Dache $3 zaiche',
-'watchlist-options' => 'Optione vun de Beowachdungslischt',
+'unwatch' => 'Nemme beowachde',
+'watchlist-details' => 'S hodd {{PLURAL:$1|$1 Said|$1 Saide}} uff doina Beowachdungslischd, Dischbediersaide zeeln nedd.',
+'wlshowlast' => 'Die ledschde $1 Schdunnd $2 Daach $3 zaische',
+'watchlist-options' => 'Meschlischkaide vunde Beowachdungslischd',
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Beowachde ...',
@@ -577,11 +902,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' => 'Maßnohm ferdisch',
+'actionfailed' => 'Maßnohm gschaidad',
 'deletedtext' => '"$1" isch gelescht worre.
 Guck $2 fer e Lischt vun de letschte Leschunge.',
 'dellogpage' => 'Leschlogbuch',
@@ -590,235 +916,253 @@ Guck $2 fer e Lischt vun de letschte Leschunge.',
 'deletereasonotherlist' => 'Annere Grund',
 
 # Rollback
-'rollbacklink' => 'Zeriggsetze',
+'rollbacklink' => 'Zriggsedze',
 
 # Protect
-'protectlogpage' => 'Saideschutz-Logbuch',
-'protectedarticle' => 'hot "[[$1]]" gschizd',
+'protectlogpage' => 'Saideschudz-Logbuch',
+'protectedarticle' => 'hodd "[[$1]]" gschizd',
 'modifiedarticleprotection' => 'hot de Schutzstatus vun "[[$1]]" gännert',
 'protectcomment' => 'Grund:',
 'protectexpiry' => 'Bis:',
 'protect_expiry_invalid' => 'Zaidraum isch nid gildich.',
 'protect_expiry_old' => 'Zaidraum licht in de Vergangehääd.',
 'protect-text' => "Du kannscht de Schutzstatus vun de Said '''$1''' aagucke un ännere.",
-'protect-locked-access' => "Dai Benutzerkonto hot ken Recht zum de Schutzstatus vun ener Said ze ännere.
-Do hot s di aktuelle Aistellunge vun de Said '''$1''':",
+'protect-locked-access' => "Doi Kondo hodd kä Reschd um de Schudzsdadus vunna Said zu ännare.
+Do hodds die Oischdellunge vunde 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 Middawaida erlauwe',
+'protect-fallback' => 'Bloß fa Laid mid "$1" Bereschdischung',
+'protect-level-autoconfirmed' => 'Naiji un nedd õgmeld Middawaida 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',
-'undeleteviewlink' => 'Ogugge',
-'undeletereset' => 'Zuricksetze',
+'undeletelink' => 'õgugge/widda herschdelle',
+'undeleteviewlink' => 'Õgugge',
+'undeletereset' => 'Zuriggsedze',
 'undelete-show-file-submit' => 'Ja',
 
 # Namespace form on various pages
-'namespace' => 'Nomensraum',
-'invert' => 'Auswahl umkehre',
-'blanknamespace' => '(Haaptsaid)',
+'namespace' => 'Nõmensraum',
+'invert' => 'Wahl dausche',
+'blanknamespace' => '(Schdadsaid)',
 
 # Contributions
-'contributions' => '{{GENDER:$1|Wasa gemachd hod}}',
-'contributions-title' => 'Benutzerbaidräch vun $1',
+'contributions' => '{{GENDER:$1|Wassa gemachd hodd}}',
+'contributions-title' => 'Middawaidabaidräsch vun $1',
 'mycontris' => 'Baidräsch',
-'contribsub2' => 'Fer $1 ($2)',
-'uctop' => '(akduell)',
-'month' => 'un Monet (un frieher):',
-'year' => 'Ab em Johr (un frieher):',
-
-'sp-contributions-newbies' => 'Zaich numme Baidräch vun naie Benutzerkonte',
-'sp-contributions-blocklog' => 'Sperrlogbuch',
+'contribsub2' => 'Fa $1 ($2)',
+'uctop' => '(geschewedisch)',
+'month' => 'än Monad (un frieja):',
+'year' => 'Abm Johr (un frieja):',
+
+'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-submit' => 'Suche',
+'sp-contributions-search' => 'Noch Baidräsch gugge',
+'sp-contributions-username' => 'IP-Adress odda Middawaidanõme:',
+'sp-contributions-toponly' => 'Bloß agduelli Ännarunge zaische',
+'sp-contributions-submit' => 'Gugge',
 
 # What links here
-'whatlinkshere' => 'Was doher zeischt',
-'whatlinkshere-title' => 'Saide wu uff "$1" verlinke',
+'whatlinkshere' => 'Was doher zaische dud',
+'whatlinkshere-title' => 'Saide wu uff "$1" valinggn',
 'whatlinkshere-page' => 'Said:',
-'linkshere' => "Die Saide verlinke zu '''[[:$1]]''':",
-'isredirect' => 'Wairerlaitungsaid',
-'istemplate' => 'Vorlacheaibindung',
-'isimage' => "Dadailing'g",
-'whatlinkshere-prev' => '{{PLURAL:$1|vorich|voriche $1}}',
-'whatlinkshere-next' => '{{PLURAL:$1|negscht|negschte $1}}',
-'whatlinkshere-links' => '← Links',
-'whatlinkshere-hideredirs' => '$1 Wairerlaitunge',
-'whatlinkshere-hidetrans' => '$1 Vorlacheaibindunge',
-'whatlinkshere-hidelinks' => '$1 Links',
-'whatlinkshere-filters' => 'Filter',
+'linkshere' => "Die Saide valinggn uff '''[[:$1]]''':",
+'nolinkshere' => "Kä Said zaischd uff '''[[:$1]]'''.",
+'isredirect' => 'Waidalaidungsaid',
+'istemplate' => 'Vorlacheoibindung',
+'isimage' => 'Dadailingg',
+'whatlinkshere-prev' => '{{PLURAL:$1|vorisch|vorische $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|negschd|negschde $1}}',
+'whatlinkshere-links' => '← Linggs',
+'whatlinkshere-hideredirs' => '$1 Waidalaidunge',
+'whatlinkshere-hidetrans' => '$1 Vorlacheoibindunge',
+'whatlinkshere-hidelinks' => '$1 Linggs',
+'whatlinkshere-hideimages' => '$1 Dadailinggs',
+'whatlinkshere-filters' => 'Filda',
 
 # Block/unblock
-'blockip' => 'Benutzer bloggiere',
-'ipbsubmit' => 'Benutzer 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',
-'ipblocklist' => 'Gschberrdi IP-Adress un Benudzernome',
-'blocklink' => 'sperre',
+'blockip' => 'Middawaida bloggiere',
+'ipbsubmit' => 'Middawaida bloggiere',
+'ipboptions' => '2 Schdunne:2 hours,1 Daach:1 day,3 Daach:3 days,1 Woch:1 week,2 Woche:2 weeks,1 Monad:1 month,3 Monad:3 months,6 Monad:6 months,1 Johr:1 year,Fa imma:infinite',
+'ipbotheroption' => 'onnari',
+'ipusubmit' => 'Die Adreß fraigewwe',
+'ipblocklist' => 'Gschberrdi IP-Adress un Middawaidanõme',
+'infiniteblock' => 'ubgrensd',
+'blocklink' => 'schberre',
 'unblocklink' => 'Sperr uffhewe',
-'change-blocklink' => 'Sperr ännere',
-'contribslink' => 'Baidräch',
-'blocklogpage' => 'Sperrlogbuch',
-'blocklogentry' => 'hot [[$1]] gsperrt fer e Zaidraum vun $2 $3',
+'change-blocklink' => 'Schberr ännare',
+'contribslink' => 'Baidräsch',
+'blocklogpage' => 'Schberrlogbuch',
+'blocklogentry' => "hodd [[$1]] gschberrd fa'n Zaidraum vun $2 $3",
 'unblocklogentry' => 'hot d Sperr vun $1 uffghowwe',
-'block-log-flags-nocreate' => 'Aaleche vun Benutzerkonte isch gsperrt',
+'block-log-flags-nocreate' => 'Õleesche vun Konde 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',
+'movelogpage' => 'Vaschiewungs-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' => 'Saide rausgewe',
+'export-submit' => 'Saide exbordiere',
+'export-addcattext' => 'Saide vunde Sachgrubb dzufiesche:',
+
+# Namespace 8 related
+'allmessagesname' => 'Nõme',
+'allmessagesdefault' => 'Vorgewene Tegschd',
+'allmessages-filter-modified' => 'Vaännad',
 
 # Thumbnails
-'thumbnail-more' => 'Greßer mache',
+'thumbnail-more' => 'Mags greßa',
+'thumbnail_error' => 'Baim Voaschaubild ischwas falsch glaafe: $1',
 
 # Special:Import
 'import-interwiki-submit' => 'Impordiere',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'Dai Benudzersaid',
-'tooltip-pt-mytalk' => 'Dai Dischbedier-Said',
-'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-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-addsection' => 'E naie Abschnitt aaleche',
-'tooltip-ca-viewsource' => 'Die Said isch gschizd.
-Du kannscht awwer de Quelltegschd aagucke',
-'tooltip-ca-history' => 'Ledschde Versione vun derre Said',
+'tooltip-pt-userpage' => 'Doi Miaddawaidasaid',
+'tooltip-pt-mytalk' => 'Doi Said fas Dischbediere',
+'tooltip-pt-preferences' => 'Doi Oischdellunge',
+'tooltip-pt-watchlist' => 'Lischd vun Saide, wu beowachde duschd',
+'tooltip-pt-mycontris' => 'Lischd vun doine Baidräsch',
+'tooltip-pt-login' => 'Du konnschd disch õmelde, awwa mugschd ned',
+'tooltip-pt-logout' => 'Uffhere',
+'tooltip-ca-talk' => 'Iwwa d Inhaldssaid dischbediere',
+'tooltip-ca-edit' => 'Du konnschd die Said beawaide.
+Bidde nemmde Vorschau-Gnobb vorm Schbaischare',
+'tooltip-ca-addsection' => "N'naije Abschnidd õleche",
+'tooltip-ca-viewsource' => 'Die Said isch gschizd. Du konnschdda de Gwelltegschd õgugge.',
+'tooltip-ca-history' => 'Ledschdi Ausgawe vunde 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-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-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-ca-move' => 'Die Said vaschiewe',
+'tooltip-ca-watch' => 'Die Said zu doina Beowachdungslischd dzufiesche',
+'tooltip-ca-unwatch' => 'Die Said vun doina Beowachdunschlischd wegnemme',
+'tooltip-search' => 'Gugg uff {{SITENAME}} fa',
+'tooltip-search-go' => 'Geh zude Said midm Nõme, wonnses hodd',
+'tooltip-search-fulltext' => 'Gugg inde Said nochm Tegschd',
+'tooltip-p-logo' => 'Schdadsaid',
+'tooltip-n-mainpage' => "Uff d'Schdadsaid geje",
+'tooltip-n-mainpage-description' => 'Haubdsaid õgugge',
+'tooltip-n-portal' => 'Iwwas Brojegd, wu mache konnschd, wu ebbes finne duschd',
+'tooltip-n-currentevents' => 'Finn Auskinfd iwwas Naijischde',
+'tooltip-n-recentchanges' => 'Lischd vunde ledschde Ännarunge im Wiki',
+'tooltip-n-randompage' => 'Laad e zufellischi Said',
+'tooltip-n-help' => 'Do konschds rausfinne',
+'tooltip-t-whatlinkshere' => 'Lischd vun alle Wikisaide, wu dohie verlingd sinn',
+'tooltip-t-recentchangeslinked' => 'Ledschdi Ännarunge in Saide, wu vun do verlinggd sinn',
 '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-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-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-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-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-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-feed-atom' => 'Atom-Feed fa die Said',
+'tooltip-t-contributions' => 'Ledschdi Baidräsch vum Middawaida õgugge',
+'tooltip-t-emailuser' => 'Dem Middawaida e E-Mail schigge',
+'tooltip-t-upload' => 'Dadaije nufflade',
+'tooltip-t-specialpages' => 'Lischd vunde Schbezialsaide',
+'tooltip-t-print' => 'Druggausgab vunde Said',
+'tooltip-t-permalink' => "N'dauwahafde Lingg uff die Ausgab vunde Said",
+'tooltip-ca-nstab-main' => 'Inhald õgugge',
+'tooltip-ca-nstab-user' => 'Middawaidasaid õgugge',
+'tooltip-ca-nstab-special' => 'Des isch e Spezialsaid, du konnschd d Said selwaschd nedd ännare',
+'tooltip-ca-nstab-project' => 'Brojegdsaid õgugge',
+'tooltip-ca-nstab-image' => 'Dadaisaid õgugge',
+'tooltip-ca-nstab-template' => 'Vorlach õgugge',
+'tooltip-ca-nstab-category' => 'Sachgrubbsaid õgugge',
+'tooltip-minoredit' => 'Als gleeni Ännarung makiere',
+'tooltip-save' => 'Doi Ännarunge schbaischare',
+'tooltip-preview' => 'Guggda doi Ännarunge inde Vorschau õ, bvor uff Schbaischare drigschd!',
+'tooltip-diff' => 'Gugg, welschi Ännarunge im Tegschd gmachd hoschd',
+'tooltip-compareselectedversions' => 'D Unnaschied zwische denne zwee gwehlde Ausgawe õgugge',
+'tooltip-watch' => 'Die Said zu doina Beowachdunglischd zufiesche',
+'tooltip-rollback' => "„Zriggsedze“ machd alli Beawaidunge vum ledschde Middawaida rigg'gängisch",
+'tooltip-undo' => "„Zrigg“ machd nua die Ännarung rigg'gängich un zaischd ä Vorschau õ.
+Konnschdn Grund inde Zommefassung õgewwe.",
+'tooltip-summary' => 'Gebä koaz Resimee',
+
+# Info page
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Vaschdeggldi Sachgrubb|Vaschdegglde Sachgrubbe}} ($1)',
+'pageinfo-category-info' => 'Sachgrubb-Õgawe',
+'pageinfo-category-subcats' => 'Õzahl vun Unnagrubbe',
 
 # Browsing diffs
-'previousdiff' => '← Ältere Bearwaidung',
-'nextdiff' => 'Naiere Bearwaidung →',
+'previousdiff' => '← Äldari Beawaidung',
+'nextdiff' => 'Naijari Beawaidung →',
 
 # Media information
-'file-info-size' => '$1 × $2 Pixels, Dateigreß: $3, MIME-Type: $4',
-'file-nohires' => 'Ke hechere Ufflesung verfiechbar.',
-'svg-long-desc' => 'SVG-Datei, Basisgreß $1 × $2 Pixels, Dateigreß: $3',
-'show-big-image' => 'Gsamte Ergebnis',
+'file-info-size' => '$1 × $2 Pixels, Dadaigreß: $3, MIME-Type: $4',
+'file-nohires' => 'Ke heheri Ufflesung vafieschba.',
+'svg-long-desc' => 'SVG-Datei, Grundgreß $1 × $2 Pixels, Dadaigreß: $3',
+'show-big-image' => 'Volli Ufflesung',
 
 # Special:NewFiles
 'showhidebots' => '(Bots $1)',
 'ilsubmit' => 'Such',
 
 # Bad image list
-'bad_image_list' => 'Formad:
-
-nur Zaile, wu mid eme * aafange werre bericksichdischd.
-De erschd Link muss e Link zu ere unerwinschd Dadei sai.
-Annere Links in der glaiche Zail werre als Ausnahme behanneld, d. h. Saide, wu d Dadei drin vorkumme därfd.',
+'bad_image_list' => 'Uffbau: bloß Zaile, wu midm * õfonge werren briggsischdischd.
+De erschd Lingg mussn Lingg zu änna uuerwinschde Dadai soi.
+Õnnare Linggs inde glaische Zail werren als Ausnõhm gnumme, des heesd, Saide, wu inde Dadai vorkumme dirfn.',
 
 # 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' => 'Medadaade',
+'metadata-help' => 'Die Dadai hodd waidari Õgawe, waschoinlisch vunde Digidalkõmara odda vum Skänna, wumase mid gmachd hodd.
+Wonn die Dadai vaännad worre isch, donn konns soi, daß zusedzlischi Õgawe fa die vaännad Dadai nemme rischdisch sinn.',
 '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.
-Annere Medadaade sinn noamalawais verschdegld.
+'metadata-fields' => 'Die EXIF-Medadaade werren inde Bild-Bschraiwung a õgzaischd, wonn die Medadaade-Tabell vaschdegld isch.
+Õnnare Medadaade sinn noamalawais vaschdegld.
 * make
 * model
 * datetimeoriginal
@@ -833,11 +1177,15 @@ Annere Medadaade sinn noamalawais verschdegld.
 * gpslongitude
 * gpsaltitude',
 
+# Exif tags
+'exif-iimcategory' => 'Sachgrubb',
+'exif-iimsupplementalcategory' => 'Ergenzndi Sachgrubbe',
+
 'exif-gaincontrol-0' => 'Kään',
 
 # External editor support
-'edit-externally' => 'Die Datei bearwaide mit ener externe Aawendung',
-'edit-externally-help' => '(Guck uff [//www.mediawiki.org/wiki/Manual:External_editors Installationsaawisige] fer meh Informatione)',
+'edit-externally' => 'Die Dadai midm õnnare Weagzaisch beawaide',
+'edit-externally-help' => '(Gugg uff [//www.mediawiki.org/wiki/Manual:External_editors Inschdallazionsõwaisunge] fa mea Auskinfd)',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'alle',
@@ -845,17 +1193,21 @@ Annere Medadaade sinn noamalawais verschdegld.
 'monthsall' => 'alle',
 
 # Watchlist editing tools
-'watchlisttools-view' => 'Die wichdiche Ännerunge aagucke',
-'watchlisttools-edit' => 'D Beowachdunglischt aagucke un bearwaide',
-'watchlisttools-raw' => 'ime große Textfeld bearwaide',
+'watchlisttools-view' => 'Die wischdische Ännarunge õgugge',
+'watchlisttools-edit' => 'Beowachdunglischd õgugge un beawaide',
+'watchlisttools-raw' => 'Im große Tegschdfeld beawaide',
+
+# 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
@@ -867,4 +1219,18 @@ Annere Medadaade sinn noamalawais verschdegld.
 # Search suggestions
 'searchsuggest-search' => 'Suche',
 
+# API errors
+'api-error-unknownerror' => 'Uubekonde Irrdumm: "$1".',
+
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|Sekund|Sekunde}}',
+'duration-minutes' => '$1 {{PLURAL:$1|Minud|Minude}}',
+'duration-hours' => '$1 {{PLURAL:$1|Schdund|Schdunde}}',
+'duration-days' => '$1 {{PLURAL:$1|Daach|Daache}}',
+'duration-weeks' => '$1 {{PLURAL:$1|Woch|Woche}}',
+'duration-years' => '$1 {{PLURAL:$1|Joa|Joare}}',
+'duration-decades' => '$1 {{PLURAL:$1|Jaazehnd|Jaazehnde}}',
+'duration-centuries' => '$1 {{PLURAL:$1|Jaahunnad|Jaahunnade}}',
+'duration-millennia' => '$1 {{PLURAL:$1|Jaadausnd|Jaadausnde}}',
+
 );
index cf9148b..9bc2193 100644 (file)
  * @author BeginaFelicysym
  * @author Chrumps
  * @author Cysioland
+ * @author Debeet
  * @author Derbeth
  * @author Equadus
  * @author Fizykaa
+ * @author Geitost
  * @author Herr Kriss
  * @author Holek
  * @author Jwitos
@@ -53,6 +55,7 @@
  * @author Timpul
  * @author ToSter
  * @author Tsca
+ * @author Ty221
  * @author WTM
  * @author Woytecr
  * @author Wpedzich
@@ -306,7 +309,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Ukryj sprawdzone edycje w ostatnich zmianach',
 'tog-newpageshidepatrolled' => 'Ukryj sprawdzone strony na liście nowych stron',
 'tog-extendwatchlist' => 'Pokaż na liście obserwowanych wszystkie zmiany, nie tylko ostatnie',
-'tog-usenewrc' => 'Grupuj zmiany według stron na liście ostatnich zmian i obserwowanych (Wymaga JavaScript)',
+'tog-usenewrc' => 'Grupuj zmiany według stron na liście ostatnich zmian i obserwowanych (wymaga JavaScript)',
 'tog-numberheadings' => 'Automatyczna numeracja nagłówków',
 'tog-showtoolbar' => 'Pokaż pasek narzędzi (JavaScript)',
 'tog-editondblclick' => 'Podwójne kliknięcie rozpoczyna edycję (JavaScript)',
@@ -323,7 +326,7 @@ $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ę',
@@ -364,13 +367,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 +410,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 +491,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',
@@ -488,6 +503,7 @@ $messages = array(
 'create-this-page' => 'Utwórz tę stronę',
 'delete' => 'Usuń',
 'deletethispage' => 'Usuń tę stronę',
+'undeletethispage' => 'Przywróć tę stronę',
 'undelete_short' => 'odtwórz {{PLURAL:$1|1 wersję|$1 wersje|$1 wersji}}',
 'viewdeleted_short' => 'Podgląd {{PLURAL:$1|usuniętej|$1 usuniętych}} wersji',
 'protect' => 'Zabezpiecz',
@@ -541,7 +557,6 @@ $1',
 'disclaimers' => 'Informacje prawne',
 'disclaimerpage' => 'Project:Informacje prawne',
 'edithelp' => 'Pomoc w edycji',
-'edithelppage' => 'Help:Jak edytować stronę',
 'helppage' => 'Help:Spis treści',
 'mainpage' => 'Strona główna',
 'mainpage-description' => 'Strona główna',
@@ -689,6 +704,8 @@ $2',
 'namespaceprotected' => "Nie masz uprawnień do edytowania stron w przestrzeni nazw '''$1'''.",
 'customcssprotected' => 'Nie jesteś uprawniony do edytowania tej strony CSS, ponieważ zawiera ona ustawienia osobiste innego użytkownika.',
 'customjsprotected' => 'Nie jesteś uprawniony do edytowania tej strony JavaScript, ponieważ zawiera ona ustawienia osobiste innego użytkownika.',
+'mycustomcssprotected' => 'Nie masz uprawnień do edytowania tej strony CSS.',
+'mycustomjsprotected' => 'Nie masz uprawnień do edytowania tej strony JavaScript.',
 'ns-specialprotected' => 'Stron specjalnych nie można edytować.',
 'titleprotected' => "Utworzenie strony o tej nazwie zostało zablokowane przez [[User:$1|$1]].
 Uzasadnienie blokady: ''$2''.",
@@ -714,9 +731,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.',
@@ -729,18 +755,38 @@ Nie zapomnij dostosować [[Special:Preferences|preferencji]].',
 'logout' => 'Wyloguj',
 'userlogout' => 'Wyloguj',
 'notloggedin' => 'Nie jesteś zalogowany',
-'nologin' => "Nie masz konta? '''$1'''.",
+'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' => '[[{{MediaWiki:helplogin-url}}|Pomoc z logowaniem]]',
+'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ę.
@@ -797,7 +843,7 @@ Wpisz poprawny adres e‐mail lub wyczyść pole.',
 'cannotchangeemail' => 'Na tej wiki nie ma możliwości zmiany adresu e‐mail przypisanego do konta.',
 'emaildisabled' => 'Ta witryna nie może wysłać wiadomości e-mail.',
 'accountcreated' => 'Konto zostało utworzone',
-'accountcreatedtext' => 'Konto dla $1 zostało utworzone.',
+'accountcreatedtext' => 'Konto dla [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|dyskusja]]) zostało utworzone.',
 'createaccount-title' => 'Utworzenie konta w {{GRAMMAR:MS.lp|{{SITENAME}}}}',
 'createaccount-text' => 'Ktoś utworzył w {{GRAMMAR:MS.lp|{{SITENAME}}}} ($4), podając Twój adres e‐mail, konto „$2”. Aktualnym hasłem jest „$3”.
 Zaloguj się teraz i je zmień.
@@ -833,13 +879,15 @@ 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-text-one' => 'Wypełnij ten formularz, aby zresetować hasło.',
+'passwordreset-text-many' => '{{PLURAL:$1|Aby zresetować hasło, wpisz jedną z danych poniżej}}',
 '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?',
@@ -862,7 +910,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',
@@ -969,7 +1017,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',
@@ -1078,6 +1126,7 @@ 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',
@@ -1085,7 +1134,7 @@ Strona już istnieje.',
 '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 {{int:prefs-editing}} w swoich preferencjach.',
+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',
@@ -1170,7 +1219,7 @@ Szczegółowe informacje mogą znajdować się w [{{fullurl:{{#Special:Log}}/del
 'rev-deleted-text-unhide' => "Ta wersja strony została '''usunięta'''.
 Szczegółowe informacje mogą znajdować się w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejestrze usunięć].
 Jeśli chcesz możesz [$1 obejrzeć tę wersję].",
-'rev-suppressed-text-unhide' => "Ta wersja strony została '''ukryta'''.
+'rev-suppressed-text-unhide' => "Ta wersja strony została '''utajniona'''.
 Szczegółowe informacje mogą znajdować się w [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rejestrze utajniania].
 Jeśli chcesz możesz [$1 obejrzeć tę wersję].",
 'rev-deleted-text-view' => "Ta wersja strony została '''usunięta'''.
@@ -1188,8 +1237,8 @@ Szczegółowe informacje mogą znajdować się w [{{fullurl:{{#Special:Log}}/sup
 Jeśli chcesz możesz [$1 obejrzeć porównanie wersji].",
 'rev-deleted-diff-view' => "Jedna z wersji użytych w porównaniu została '''usunięta'''.
 Jeśli chcesz możesz zobaczyć porównanie. Szczegóły mogą znajdować się w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejestrze usunięć].",
-'rev-suppressed-diff-view' => "Jedna z wersji użytych w porównaniu została '''ukryta'''.
-Jeśli chcesz możesz zobaczyć porównanie. Szczegóły mogą znajdować się w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejestrze ukrywania].",
+'rev-suppressed-diff-view' => "Jedna z wersji użytych w porównaniu została '''utajniona'''.
+Jeśli chcesz możesz zobaczyć porównanie. Szczegóły mogą znajdować się w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejestrze utajniania].",
 'rev-delundel' => 'pokaż/ukryj',
 'rev-showdeleted' => 'pokaż',
 'revisiondelete' => 'Usuń/odtwórz wersje',
@@ -1325,7 +1374,6 @@ Zazwyczaj jest to spowodowane przestarzałym linkiem do usuniętej strony. Powó
 'searchmenu-legend' => 'Opcje wyszukiwania',
 'searchmenu-exists' => "* Strona '''[[$1]]'''",
 'searchmenu-new' => "'''Utwórz stronę „[[:$1|$1]]” na tej wiki.'''",
-'searchhelp-url' => 'Help:Spis treści',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Przeglądaj strony zaczynające się od tego przedrostka]]',
 'searchprofile-articles' => 'Strony',
 'searchprofile-project' => 'Strony pomocy i projektu',
@@ -1368,6 +1416,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.',
+'search-error' => 'Wystąpił błąd podczas wyszukiwania:$1',
 
 # Preferences page
 'preferences' => 'Preferencje',
@@ -1503,7 +1552,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.',
 '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.',
@@ -1511,6 +1560,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',
@@ -1575,12 +1625,14 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
 'right-ipblock-exempt' => 'Obejście blokad, automatycznych blokad i blokad zakresów, adresów IP',
 'right-proxyunbannable' => 'Obejście automatycznych blokad proxy',
 'right-unblockself' => 'Odblokowanie samego siebie',
-'right-protect' => 'Zmiana poziomu zabezpieczenia i dostęp do edycji zabezpieczonych stron',
+'right-protect' => 'Zmiana stopnia zabezpieczenia i dostęp do edycji zabezpieczonych stron',
 'right-editprotected' => 'Dostęp do edycji zabezpieczonych stron (bez zabezpieczenia dziedziczonego)',
 'right-editinterface' => 'Edycja interfejsu użytkownika',
 'right-editusercssjs' => 'Edycja plików CSS i JS innych użytkowników',
 'right-editusercss' => 'Edycja plików CSS innych użytkowników',
 'right-edituserjs' => 'Edycja plików JS innych użytkowników',
+'right-editmyusercss' => 'Edytuj własne pliki CSS',
+'right-editmyuserjs' => 'Edytuj własne pliki JavaScript',
 'right-rollback' => 'Szybkie wycofanie zmian wprowadzonych przez użytkownika, który jako ostatni edytował jakąś stronę',
 'right-markbotedits' => 'Oznaczanie rewertu jako edycji bota',
 'right-noratelimit' => 'Brak ograniczeń przepustowości',
@@ -1638,7 +1690,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',
@@ -1675,7 +1727,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"',
 
@@ -1832,11 +1884,11 @@ $1',
 'upload-proto-error-text' => 'Zdalne przesyłanie plików wymaga podania adresu URL zaczynającego się od <code>http://</code> lub <code>ftp://</code>.',
 'upload-file-error' => 'Błąd wewnętrzny',
 'upload-file-error-text' => 'Wystąpił błąd wewnętrzny podczas próby utworzenia tymczasowego pliku na serwerze.
-Skontaktuj się z [[Special:ListUsers/sysop|administratorem systemu]].',
+Skontaktuj się z [[Special:ListUsers/sysop|administratorem]].',
 'upload-misc-error' => 'Nieznany błąd przesyłania',
 'upload-misc-error-text' => 'Wystąpił nieznany błąd podczas przesyłania.
 Sprawdź, czy podany adres URL jest poprawny i dostępny, a następnie spróbuj ponownie.
-Jeśli problem będzie się powtarzał, skontaktuj się z [[Special:ListUsers/sysop|administratorem systemu]].',
+Jeśli problem będzie się powtarzał, skontaktuj się z [[Special:ListUsers/sysop|administratorem]].',
 'upload-too-many-redirects' => 'URL zawiera zbyt wiele przekierowań',
 'upload-unknown-size' => 'Nieznany rozmiar',
 'upload-http-error' => 'Wystąpił błąd protokołu HTTP – $1',
@@ -2254,6 +2306,15 @@ Wymaga podania co najmniej domeny najwyższego poziomu np. „*.org”.<br />
 'listusers-noresult' => 'Nie znaleziono żadnego użytkownika.',
 'listusers-blocked' => '({{GENDER:$1|zablokowany|zablokowana|zablokowany}})',
 
+# Special:ActiveUsers
+'activeusers' => 'Lista aktywnych użytkowników',
+'activeusers-intro' => 'Poniżej znajduje się lista użytkowników, którzy byli aktywni w ciągu {{PLURAL:$1|ostatniego dnia|ostatnich $1 dni}}.',
+'activeusers-count' => 'w ciągu {{PLURAL:$3|ostatniego dnia|ostatnich $3 dni}} {{GENDER:$2|wykonał|wykonała|wykonał}} $1 {{PLURAL:$1|edycję|edycje|edycji}}',
+'activeusers-from' => 'Pokaż użytkowników zaczynając od',
+'activeusers-hidebots' => 'Ukryj boty',
+'activeusers-hidesysops' => 'Ukryj administratorów',
+'activeusers-noresult' => 'Nie odnaleziono żadnego użytkownika.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Uprawnienia grup użytkowników',
 'listgrouprights-summary' => 'Poniżej znajduje się spis zdefiniowanych na tej wiki grup użytkowników, z wyszczególnieniem przydzielonych im uprawnień.
@@ -2331,8 +2392,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}}.',
@@ -2436,8 +2497,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',
@@ -2453,8 +2514,8 @@ Wszystkie aktywne zabezpieczenia odnajdziesz na liście [[Special:ProtectedPages
 '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ć.',
@@ -2580,7 +2641,7 @@ $1',
 'mycontris' => 'Edycje',
 'contribsub2' => 'Dla użytkownika $1 ($2)',
 'nocontribs' => 'Brak zmian odpowiadających tym kryteriom.',
-'uctop' => ' (jako ostatnia)',
+'uctop' => '(ostatnia)',
 'month' => 'Do miesiąca (włącznie)',
 'year' => 'Do roku (włącznie)',
 
@@ -2621,7 +2682,7 @@ Poniżej znajduje się ostatni wpis w rejestrze blokowania.',
 'whatlinkshere-filters' => 'Filtry',
 
 # Block/unblock
-'autoblockid' => 'Automatyczna blokada nr $1',
+'autoblockid' => 'automatyczna blokada nr $1',
 'block' => 'Zablokuj użytkownika',
 'unblock' => 'Odblokuj użytkownika',
 'blockip' => 'Zablokuj użytkownika',
@@ -2909,6 +2970,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',
@@ -2972,9 +3035,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
@@ -3064,7 +3127,6 @@ Pozwala na wpisanie powodu w opisie zmian.',
 '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 */',
@@ -3108,7 +3170,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',
@@ -3233,11 +3295,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:
 
@@ -3267,7 +3343,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ę',
@@ -3447,7 +3523,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',
@@ -3792,7 +3868,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',
@@ -3900,7 +3976,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.
@@ -3915,12 +3991,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',
@@ -4010,6 +4091,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',
@@ -4052,8 +4136,8 @@ Grafiki są pokazywane w pełnej rozdzielczości. Inne typy plików są otwieran
 '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ś w stanie 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 5252bc8..507ec6d 100644 (file)
@@ -10,6 +10,7 @@
  * @author Borichèt
  * @author Bèrto 'd Sèra
  * @author Dragonòt
+ * @author Geitost
  * @author Kaganer
  * @author MaxSem
  * @author SabineCretella
@@ -74,107 +75,107 @@ $messages = array(
 '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' => "Ciamé conferma se ël resumé 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-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-useeditwarning' => 'Avisme quand che i lasso na pàgina ëd modìfiche con modìfiche nen salvà',
+'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ì",
@@ -182,91 +183,91 @@ $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',
-'deletethispage' => 'Scancela pàgina',
-'undelete_short' => 'Disdëscancela {{PLURAL:$1|na modìfica|$1 modìfiche}}',
+'delete' => 'Scancelé',
+'deletethispage' => 'Scancelé sa pàgina',
+'undelete_short' => 'Arcuperé {{PLURAL:$1|na modìfica|$1 modìfiche}}',
 'viewdeleted_short' => 'Vardé {{PLURAL:$1|na modìfica scancelà|$1 modìfiche scancelà}}',
-'protect' => 'Protegg',
-'protect_change' => 'cambia',
-'protectthispage' => 'Protegg sta pàgina-sì',
+'protect' => 'Protege',
+'protect_change' => 'modifiché',
+'protectthispage' => 'Protege sta pàgina-sì',
 'unprotect' => 'Cangé la protession',
 'unprotectthispage' => 'Cangé la protession ëd sa pàgina',
 'newpage' => 'Pàgina neuva',
 'talkpage' => 'Discussion',
 'talkpagelinktext' => 'discussion',
-'specialpage' => 'Pàgina Special',
+'specialpage' => 'Pàgina special',
 'personaltools' => 'Utiss përsonaj',
 'postcomment' => 'Session neuva',
-'articlepage' => "Che a varda l'artìcol",
+'articlepage' => 'Vëdde la pàgina ëd contnù',
 'talk' => 'Discussion',
-'views' => 'vìsite',
-'toolbox' => 'utiss',
+'views' => 'Vìsite',
+'toolbox' => "Bòita dj'utiss",
 'userpage' => 'Che a varda la pàgina Utent',
-'projectpage' => 'Che a varda la pàgina ëd servissi',
-'imagepage' => "Varda la pàgina dl'archivi",
-'mediawikipage' => 'Mostra ël mëssagi',
-'templatepage' => 'Mostra lë stamp',
-'viewhelppage' => "Smon la pàgina d'agiut",
-'categorypage' => 'Fa vëdde la categorìa',
+'projectpage' => 'Che a varda la pàgina ëd proget',
+'imagepage' => "Vëdde la pàgina dl'archivi",
+'mediawikipage' => 'Mostré ël mëssagi',
+'templatepage' => 'Vëdde lë stamp',
+'viewhelppage' => "Smon-e la pàgina d'agiut",
+'categorypage' => 'Vëdde la categorìa',
 'viewtalkpage' => 'Vardé la discussion',
 'otherlanguages' => 'Àutre lenghe',
 'redirectedfrom' => '(Ridiression da $1)',
 'redirectpagesub' => 'Pàgina ëd ridiression',
-'lastmodifiedat' => "Modificà l'ùltima vira al $2, $1.",
+'lastmodifiedat' => "Modificà l'ùltima vira ai $1 a $2.",
 'viewcount' => "St'artìcol-sì a l'é stàit lesù {{PLURAL:$1|na vira|$1 vire}}.",
 'protectedpage' => 'Pàgina proteta',
-'jumpto' => 'Va a:',
+'jumpto' => 'Andé a:',
 'jumptonavigation' => 'navigassion',
-'jumptosearch' => 'arserca',
+'jumptosearch' => 'arserc',
 'view-pool-error' => "An dëspias, ij servent a son motobin carià al moment.
 Tròpi utent a son an camin ch'a preuvo a lese sta pàgina-sì.
-Për piasì, speta un pòch prima ëd prové torna a vardé sta pàgina-sì.
+Për piasì, ch'a speta un pòch prima ëd prové torna a lese costa pàgina.
 
 $1",
 'pool-timeout' => "Ël temp a l'é finì antramentre ch'a së spetava la saradura",
@@ -280,35 +281,34 @@ $1",
 'copyrightpage' => "{{ns:project}}:Drit d'autor",
 'currentevents' => 'Neuve',
 'currentevents-url' => 'Project:Neuve',
-'disclaimers' => 'Difide',
+'disclaimers' => 'Avertense',
 'disclaimerpage' => 'Project:Avertense generaj',
-'edithelp' => 'Manual dë spiegassion',
-'edithelppage' => "Help:Coma scrive n'artìcol",
-'helppage' => 'Help:Agiut',
+'edithelp' => 'Agiut a la modìfica',
+'helppage' => 'Help:Contnù',
 'mainpage' => 'Intrada',
 'mainpage-description' => 'Intrada',
-'policy-url' => 'Project:Deuit',
+'policy-url' => 'Project:Régole',
 'portal' => 'Piòla',
 'portal-url' => 'Project:Piòla',
-'privacy' => 'Polìtica ëd confindensialità',
-'privacypage' => 'Project:Polìtica ëd confidensialità',
+'privacy' => 'Régole ëd confidensialità',
+'privacypage' => 'Project:Régole ëd confidensialità',
 
 'badaccess' => 'Përmess nen giust',
 'badaccess-group0' => "A l'ha pa ij përmess dont a fa dë manca për fé st'operassion-sì.",
 'badaccess-groups' => "Costa funsion-sì a l'é riservà a j'utent che a sio almanch ant {{PLURAL:$2|la partìa|un-a dle partìe}}: $1.",
 
 'versionrequired' => 'A-i va për fòrsa la version $1 ëd MediaWiki',
-'versionrequiredtext' => 'Për dovré sta pàgina-sì a-i va la version $1 dël programa MediaWiki. Che a varda [[Special:Version]]',
+'versionrequiredtext' => 'Për dovré sta pàgina-sì a-i va la version $1 dël programa MediaWiki. Che a varda [[Special:Version|la pàgina dle version]].',
 
 'ok' => 'Va bin',
-'retrievedfrom' => 'Pijàit da  "$1"',
+'retrievedfrom' => 'Pijàit da «$1»',
 'youhavenewmessages' => "A l'ha $1 ($2).",
-'newmessageslink' => 'mëssagi neuv',
-'newmessagesdifflink' => "A-i é chèich-còs ëd diferent da 'nt l'ùltima revision",
-'youhavenewmessagesfromusers' => "It l'has $1 da {{PLURAL:$3|n'autr utent|$3 utent}} ($2).",
+'newmessageslink' => 'ëd mëssagi neuv',
+'newmessagesdifflink' => 'ùltima modìfica',
+'youhavenewmessagesfromusers' => "A l'ha $1 da {{PLURAL:$3|n'autr utent|$3 utent}} ($2).",
 'youhavenewmessagesmanyusers' => "A l'ha $1 da vàire utent ($2).",
 'newmessageslinkplural' => '{{PLURAL:$1|un mëssagi neuv|$1 mëssagi neuv}}',
-'newmessagesdifflinkplural' => 'ùltime {{PLURAL:$1|modìfica|modìfiche}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|ùltima modìfica|ùltime modìfiche}}',
 'youhavenewmessagesmulti' => "A l'ha dij neuv mëssagi an $1",
 'editsection' => 'modìfica',
 'editold' => 'modìfica',
@@ -468,7 +468,7 @@ Che as dësmentia pa ëd cambié ij [[Special:Preferences|"sò gust" an {{SITENA
 'logout' => "Seurte da 'nt ël sistema",
 'userlogout' => 'seurte dal sistema',
 'notloggedin' => "a l'é pa ant ël sistema",
-'nologin' => "Ha-lo ancó nen un cont? '''$1'''.",
+'nologin' => 'Ha-lo ancó nen un cont? $1.',
 'nologinlink' => 'creésse un cont.',
 'createaccount' => 'Crea un cont neuv',
 'gotaccount' => "Ha-lo già un sò cont? '''$1'''.",
@@ -547,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',
@@ -566,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?',
@@ -804,14 +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' => "Lassé sta pàgina-sì a peul fé an manera che it perde tute le modìfiche ch'it l'has fàit.
-S'it ses logà, it peule disabilité st'avis-sì ant la session \"{{int:prefs-editing}}\" dij tò gust.",
+'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',
@@ -1052,7 +1052,6 @@ Sòn a l'é normalment causà da l'andèje dapress a na veja liura stòrica a na
 'searchmenu-legend' => "Opsion d'arserca",
 'searchmenu-exists' => "'''A-i é na pàgina ciamà \"[[:\$1]]\" dzora a costa wiki'''",
 'searchmenu-new' => "'''Creé la pàgina «[[:$1]]» ansima a sta wiki-sì!'''",
-'searchhelp-url' => 'Help:Contnù',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Visualisé le pàgine con sto prefiss-sì]]',
 'searchprofile-articles' => 'Pàgine ëd contnù',
 'searchprofile-project' => "Pàgine d'agiut e ëd proget",
@@ -1974,6 +1973,15 @@ A-i é dabzògn almanch d\'un domini a livel pi àut, për esempi "*.org".<br />
 'listusers-noresult' => 'Gnun utent përparèj.',
 'listusers-blocked' => '(blocà)',
 
+# Special:ActiveUsers
+'activeusers' => "Lista dj'utent ativ",
+'activeusers-intro' => "Costa a l'é na lista d'utent ch'a l'han avù n'atività qualsëssìa ant j'ùltim $1 {{PLURAL:$1|di|di}}.",
+'activeusers-count' => "$1 {{PLURAL:$1|modìfica neuva|modìfiche neuve}} ant {{PLURAL:$3|l'ùltim di|j'ùltim $3 di}}",
+'activeusers-from' => "Smon-me j'utent a parte da:",
+'activeusers-hidebots' => 'Stërmé ij trigomiro',
+'activeusers-hidesysops' => "Stërmé j'aministrator",
+'activeusers-noresult' => 'Pa gnun utent trovà.',
+
 # Special:ListGroupRights
 'listgrouprights' => "Drit dël grup d'utent",
 'listgrouprights-summary' => "Ambelessì a-i é na lista dle partìe d'utent definìe ansima a costa wiki, con ij sò drit d'acess associà.
@@ -2032,7 +2040,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.",
@@ -2053,8 +2061,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}}.",
@@ -2181,8 +2189,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:',
@@ -2198,7 +2206,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)',
@@ -2845,7 +2853,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',
@@ -2854,9 +2862,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
@@ -2966,7 +2974,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',
@@ -3144,7 +3152,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',
@@ -3589,13 +3597,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..e704320 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' => 'کدی وی نئیں',
@@ -259,7 +257,6 @@ $messages = array(
 'disclaimers' => 'منکرنا',
 'disclaimerpage' => 'Project:عام منکرنا',
 'edithelp' => 'لکھن وچ مدد',
-'edithelppage' => 'Help:لکھنا',
 'helppage' => 'Help:لسٹ',
 'mainpage' => 'پہلا صفہ',
 'mainpage-description' => 'پہلا صفہ',
@@ -528,10 +525,8 @@ Note that some pages may continue to be displayed as if you were still logged in
 
 # Special:PasswordReset
 'passwordreset' => 'کنجی واپس لیاؤ',
-'passwordreset-text' => 'اے فارم مکمل کرکے اپنے کھاتے دی معلومات اپنے ای-میل تے منگوالو۔',
 'passwordreset-legend' => 'کنجی واپس لیاؤ',
 'passwordreset-disabled' => 'اس وکی تے کنجی واپس نئیں لیائی جاسکدی۔',
-'passwordreset-pretext' => '{{PLURAL:$1||تھلے دتے ہوۓ ڈیٹا چوں اک ایتھے دیو}}',
 'passwordreset-username' => 'ورتن ناں:',
 'passwordreset-domain' => 'ڈومین',
 'passwordreset-capture' => 'آن والی ای-میل ویکھو؟',
@@ -757,6 +752,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' => "'''خبردار:''' ایس صفے تے چوکھیاں ساریاں پارسر کلز نیں۔
@@ -976,7 +973,6 @@ $1",
 'searchmenu-legend' => 'چنوتیاں کھوجو',
 'searchmenu-exists' => "'''ایس وکی تے \"[[:\$1]]\" ناں دا صفہ ہے۔.'''",
 'searchmenu-new' => "'''ایس وکی تے \"[[:\$1]]\" بناؤ'''",
-'searchhelp-url' => 'Help:فہرست',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ایس پریفکس نال صفے کھوجو]]',
 'searchprofile-articles' => 'لسٹ صفے',
 'searchprofile-project' => 'مدد تے ویونت صفے',
@@ -1021,15 +1017,6 @@ $1",
 تسیں گوگل تے کھوج کرو۔
 اے گل یاد رکھنا جے انڈیکس {{SITENAME}} دے پرانے ہون۔',
 
-# Quickbar
-'qbsettings' => 'کوئکبار',
-'qbsettings-none' => 'کوئی نئیں',
-'qbsettings-fixedleft' => 'فکسڈ کھبے',
-'qbsettings-fixedright' => 'فکسڈ سجے',
-'qbsettings-floatingleft' => 'ہلدا کھبے',
-'qbsettings-floatingright' => 'ہلدا سجے',
-'qbsettings-directionality' => '!!!!فکسڈ، تھاڈی بولی تے لپی نال',
-
 # Preferences page
 'preferences' => 'تانگاں',
 'mypreferences' => 'میریاں تانگاں',
@@ -1573,7 +1560,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 +1953,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 +2798,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'چوڑائی',
 'exif-imagelength' => 'اچائی',
 'exif-bitspersample' => 'اک کمپوننٹ وچ بٹ',
@@ -2990,7 +2976,7 @@ $1',
 'exif-originalimageheight' => 'مورت دی اچائی کٹن توں پہلے',
 'exif-originalimagewidth' => 'مورت دی چوڑائی کٹن توں پہلے',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'کھولی گئی',
 'exif-compression-2' => 'سی سی آئی ٹی ٹی گروپ 3 1-ڈائمینشنل موڈیفائیڈ ہفمین رن فل لنتھ انکوڈنگ',
 'exif-compression-3' => 'سی سی آئی ٹی ٹی گروپ 3 فیکس اینکوڈنگ',
@@ -3399,13 +3385,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..fe13ba6 100644 (file)
@@ -243,7 +243,6 @@ $messages = array(
 'disclaimers' => 'Ιμπρέσουμ',
 'disclaimerpage' => 'Project:Ιμπρέσουμ',
 'edithelp' => "Βοήθεια για τ' αλλαγμαν",
-'edithelppage' => 'Help:Άλλαγμαν',
 'helppage' => 'Help:Περιεχόμενα',
 'mainpage' => 'Αρχικόν σελίδα',
 'mainpage-description' => 'Αρχικόν σελίδα',
@@ -593,7 +592,6 @@ $messages = array(
 'prevn' => '{{PLURAL:$1|$1}} προηγουμένων',
 'nextn' => '{{PLURAL:$1|$1}} επομένων',
 'viewprevnext' => 'Τέρεν ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:Περιεχόμενα',
 'searchprofile-images' => 'Πολυμέσα',
 'searchprofile-everything' => 'Όλεα',
 'search-result-size' => '$1 ({{PLURAL:$2|1 λέξη|$2 λέξεις}})',
@@ -614,9 +612,6 @@ $messages = array(
 'powersearch-togglenone' => 'Τιδέν',
 'search-external' => 'Εύρον σα εξ μερέαν',
 
-# Quickbar
-'qbsettings-none' => 'Τιδέν',
-
 # Preferences page
 'preferences' => 'Αγαπεμένα',
 'mypreferences' => "Τ' εμά τ' αγαπεμένα",
@@ -948,7 +943,7 @@ $messages = array(
 'listgrouprights-rights' => 'Δικαιώματα',
 'listgrouprights-members' => '(κατάλογον μελών)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Στείλον μένεμαν σον χρήστεν ατόν',
 'emailfrom' => 'Ασά:',
 'emailto' => 'Σο:',
@@ -1306,7 +1301,7 @@ $messages = array(
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Πλάτος',
 'exif-imagelength' => 'Ύψηλος',
 'exif-bitspersample' => 'Bits ανά στοιχείο',
@@ -1408,10 +1403,6 @@ $messages = array(
 'version-software' => "Λογισμικόν ντ'εθέκεν",
 'version-software-version' => 'Έκδοση',
 
-# Special:FilePath
-'filepath-page' => 'Αρχείον:',
-'filepath-submit' => 'Δέβα',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Όνεμα αρχείου:',
 'fileduplicatesearch-submit' => 'Εύρον',
index 20ec925..5c89d25 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',
@@ -235,7 +233,6 @@ Pāusai en kategōrijai "$1"',
 'disclaimers' => 'Etrāwingiskwas arāikinsenei',
 'disclaimerpage' => 'Project:Etrāwingiskwas arāikinsenei',
 'edithelp' => 'Redigīsnas pagalba',
-'edithelppage' => 'Help:Redigīsna',
 'helppage' => 'Help:Ēnturs',
 'mainpage' => 'Galwas pāusan',
 'mainpage-description' => 'Galwas pāusan',
@@ -801,7 +798,6 @@ Nawigaciōnis autengīsenin terpausnā naikinna etrīnksenin en kōlunei.',
 'searchmenu-legend' => 'Laukīsnas mazīngiskwas',
 'searchmenu-exists' => "'''Ast pāusan \"[[:\$1]]\" en šissei wikkin''",
 'searchmenu-new' => "'''Teīkeis pāusan \"[[:\$1|\$1]]\" en šissei wikki!'''",
-'searchhelp-url' => 'Help:Ēnturs',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Pradirēis pāusans sen šin prefiksan]]',
 'searchprofile-project' => 'Pagalbas be prōjaktas pāusai',
 'searchprofile-everything' => 'Wiss',
@@ -841,14 +837,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 +1575,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 +2242,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 +2343,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 +2611,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 bdacefc..40da2d6 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' => 'پېښليک کتل',
@@ -394,7 +409,6 @@ $1',
 'disclaimers' => 'ردادعاليکونه',
 'disclaimerpage' => 'Project:ټولګړی ردادعاليک',
 'edithelp' => 'د لارښود سمون',
-'edithelppage' => 'Help:سمونه',
 'helppage' => 'Help:نيوليک',
 'mainpage' => 'لومړی مخ',
 'mainpage-description' => 'لومړی مخ',
@@ -509,6 +523,7 @@ $1',
 'actionthrottled' => 'د دې کړنې مخنيوی وشو',
 'protectedpagetext' => 'دا مخ د سمون او نورو کړنو د ترسره کولو په تکل ژغورل شوی.',
 'viewsourcetext' => 'تاسې د دې مخ سرچينه کتلی او لمېسلی شی:',
+'viewyourtext' => "تاسې په دې مخ کې د '''خپلو سمونونو''' سرچينه کتلی او لمېسلی شی:",
 'protectedinterface' => 'دا مخ د دې ويکي د ساوترې د ليدنمخ متن لري، او د ورانکارۍ په خاطر ژغورل شوی.
 په ټولو ويکي ګانو کې د ژباړې د ورګډولو او يا هم د ژباړې د سمون او بدلون لپاره د مېډياويکي د ځايتابه پروژه [//translatewiki.net/ translatewiki.net] وکاروۍ.',
 'editinginterface' => "'''ګواښنه:''' تاسو په يوه داسې مخ کې بدلون راولی کوم چې د يوې پوستکالی د ليدنمخ متن په توګه کارېږي.
@@ -534,12 +549,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 +575,35 @@ $1',
 'logout' => 'وتل',
 'userlogout' => 'وتل',
 'notloggedin' => 'غونډال کې نه ياست ننوتي',
+'userlogin-noaccount' => 'ګڼون نه لرې؟',
+'userlogin-joinproject' => 'د {{SITENAME}} سره يوځای شه',
 'nologin' => 'کارن-نوم نه لرې؟ $1.',
 'nologinlink' => 'يو ګڼون جوړول',
 'createaccount' => 'ګڼون جوړول',
 'gotaccount' => 'آيا وار دمخې يو ګڼون لری؟ $1.',
 'gotaccountlink' => 'ننوتل',
 'userlogin-resetlink' => 'د ننوتلو مالومات مو هېر شوي؟',
+'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}} کې د ننوتلو لپاره کوکيز کارېږي.
@@ -643,10 +687,8 @@ $1',
 
 # Special:PasswordReset
 'passwordreset' => 'پټنوم بياپرځايول',
-'passwordreset-text' => 'د دې لپاره چې ستاسې د ګڼون بشپړې څرګندنې دربرېښليک شي نو دا فورمه ډکه کړۍ.',
 'passwordreset-legend' => 'پټنوم بياپرځايول',
 'passwordreset-disabled' => 'په دې ويکي پټنوم بياپرځای کولو کړنه ناچارنه شوې.',
-'passwordreset-pretext' => '{{PLURAL:$1||د لاندې اومتوک يوه برخه مالومات وليکۍ}}',
 'passwordreset-username' => 'کارن-نوم:',
 'passwordreset-domain' => 'شپول:',
 'passwordreset-capture' => 'د پايلې برېښليک کتل غواړې؟',
@@ -655,7 +697,7 @@ $1',
 '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-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' => 'برېښليک پته بدلول',
@@ -815,6 +857,7 @@ $1',
 داسې ښکاري چې دا مخ ړنګ شوی.',
 'edit-conflict' => 'د سمولو خنډ',
 'edit-no-change' => 'ستاسې سمون بابېزه وګڼل شو، دا ځکه چې تاسې په متن کې کوم بدلون نه دی راوستلی.',
+'postedit-confirmation' => 'ستاسې سمون خوندي شو.',
 'edit-already-exists' => 'په دې نوم يو نوی مخ جوړ نه شو.
 پدې نوم د پخوا نه يو مخ شته.',
 'defaultmessagetext' => 'تلواليزه پيغام متن',
@@ -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' => "'''ګواښنه:''' دا کينډۍ د خپل ټاکلي بريد نه ډېره لويه ده.
@@ -946,7 +990,6 @@ $1',
 'searchmenu-legend' => 'د پلټلو خوښنې',
 'searchmenu-exists' => "'''په دې ويکي يو مخ د \"[[:\$1]]\" په نامه دی'''",
 'searchmenu-new' => "'''په دې ويکي د \"[[:\$1]]\" مخ جوړول!'''",
-'searchhelp-url' => 'Help:لړليک',
 'searchprofile-articles' => 'مېنځپانګيز مخونه',
 'searchprofile-project' => 'د لارښود او پروژې مخونه',
 'searchprofile-images' => 'ګڼرسنۍ',
@@ -999,6 +1042,7 @@ $1',
 'prefs-beta' => 'د آزمېښتي بڼې ځانګړنې',
 'prefs-datetime' => 'نېټه او وخت',
 'prefs-labs' => 'د آزمېنتون ځانګړنې',
+'prefs-user-pages' => 'کارن مخونه',
 'prefs-personal' => 'د کارن پېژنليک',
 'prefs-rc' => 'وروستي بدلونونه',
 'prefs-watchlist' => 'کتنلړ',
@@ -1185,9 +1229,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
@@ -1219,9 +1267,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' => 'اړونده بدلونونه',
@@ -1237,6 +1287,8 @@ $1',
 # Upload
 'upload' => 'دوتنه پورته کول',
 'uploadbtn' => 'دوتنه پورته کول',
+'reuploaddesc' => 'پورته کېدنه ناګارل او بېرته د پورته کېدنې فورمې ته ورګرځېدل',
+'upload-tryagain' => 'د بدلون موندلې دوتنې څرګندونې سپارل',
 'uploadnologin' => 'غونډال کې نه ياست ننوتي',
 'uploadnologintext' => 'ددې لپاره چې دوتنې پورته کړای شۍ، نو لومړی غونډال کې [[Special:UserLogin|ورننوځۍ]].',
 'uploaderror' => 'د پورته کولو ستونزه',
@@ -1302,6 +1354,7 @@ $1',
 'upload-failure-subj' => 'د پورته کېدو ستونزه',
 'upload-warning-subj' => 'د پورته کولو ګواښ',
 
+'upload-proto-error' => 'ناسم پروتوکول',
 'upload-file-error' => 'کورنۍ ستونزه',
 'upload-unknown-size' => 'ناڅرګنده کچه',
 'upload-http-error' => 'د HTTP يوه ستونزه رامېنځ ته شوې: $1',
@@ -1428,6 +1481,7 @@ $1',
 'statistics-header-hooks' => 'بل شمار',
 'statistics-articles' => 'مېنځپانګيز مخونه',
 'statistics-pages' => 'مخونه',
+'statistics-pages-desc' => 'د ويکي ټول مخونه، د خبرو اترو، مخ ګرځېدنو، او لا نورو مخونو په ګډون.',
 'statistics-files' => 'پورته شوې دوتنې',
 'statistics-edits' => 'د {{SITENAME}} د جوړېدو راهيسې د مخونو سمون',
 'statistics-edits-average' => 'پر يوه مخ د سمون منځوۍ کچه',
@@ -1441,6 +1495,8 @@ $1',
 'disambiguations' => 'د مبهمو مخونو سره تړلي مخونه',
 'disambiguationspage' => 'Template:ناجوت',
 
+'pageswithprop-submit' => 'ورځه',
+
 'doubleredirects' => 'دوه ځلي ورګرځېدنې',
 
 'brokenredirects' => 'ماتې ورګرځېدنې',
@@ -1570,6 +1626,15 @@ $1',
 'listusers-noresult' => 'هېڅ کوم کارن و نه موندل شو.',
 'listusers-blocked' => '(بنديز لګېدلی)',
 
+# Special:ActiveUsers
+'activeusers' => 'د فعالو کارنانو لړليک',
+'activeusers-intro' => 'دا د هغو کارنانو لړليک دی چې په {{PLURAL:$1|تېرې|تېرو}} $1 {{PLURAL:$1|ورځ|ورځو}} کې يې ونډې ترسره کړي.',
+'activeusers-count' => 'په {{PLURAL:$3|تېرې ورځ|تېرو $3 ورځو}} کې $1 {{PLURAL:$1|سمون|سمونونه}}',
+'activeusers-from' => 'هغه کارنان کتل چې نومونه يې پېلېږي په:',
+'activeusers-hidebots' => 'روباټونه پټول',
+'activeusers-hidesysops' => 'پازوالان پټول',
+'activeusers-noresult' => 'کارن و نه موندل شو.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'د کارن ډلو رښتې',
 'listgrouprights-group' => 'ډله',
@@ -1636,7 +1701,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 بجو پېښ شوي.",
@@ -1744,8 +1809,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',
@@ -1808,7 +1873,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'contributions-title' => 'د $1 کارن ونډې',
 'mycontris' => 'ونډې',
 'contribsub2' => 'د $1 لپاره ($2)',
-'uctop' => '(سرپاڼÙ\87)',
+'uctop' => '(اÙ\88سÙ\86Û\8c)',
 'month' => 'له مياشتې د (او پخواني):',
 'year' => 'له کال د (او پخواني):',
 
@@ -1995,6 +2060,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 
 # Export
 'export' => 'مخونه صادرول',
+'exportall' => 'ټول مخونه صادرول',
 'export-submit' => 'صادرول',
 'export-addcattext' => 'مخونو د ورګډولو وېشنيزه:',
 'export-addcat' => 'ورګډول',
@@ -2154,7 +2220,9 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'skinname-vector' => 'وېکټور',
 
 # Patrolling
+'markaspatrolleddiff' => 'دا مخ څارل شوی په نخښه کول',
 'markaspatrolledtext' => 'دا مخ څارل شوی په نخښه کول',
+'markedaspatrolled' => 'دا مخ څارل شوی په نخښه کول',
 
 # Image deletion
 'filedeleteerror-short' => 'د دوتنې د ړنګولو ستونزه: $1',
@@ -2196,6 +2264,7 @@ $1',
 'hours' => '{{PLURAL:$1|$1 ساعت|$1 ساعتونه}}',
 'days' => '{{PLURAL:$1|$1 ورځ|$1 ورځې}}',
 'ago' => '$1 دمخه',
+'just-now' => 'همدا اوس',
 
 # Bad image list
 'bad_image_list' => 'بڼه يې په لاندې توګه ده:
@@ -2226,7 +2295,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'سوروالی',
 'exif-imagelength' => 'لوړوالی',
 'exif-datetime' => 'د دوتنې د بدلون وخت او نېټه',
@@ -2408,8 +2477,8 @@ $1',
 'confirmemail_noemail' => 'تاسې يوه سمه برېښليک پته نه ده ثبته کړې مهرباني وکړی [[Special:Preferences|د کارن غوره توبونه]] مو بدل کړۍ.',
 'confirmemail_send' => 'يو تاييدي کوډ لېږل',
 'confirmemail_sent' => 'تاييدي برېښليک ولېږل شو.',
-'confirmemail_oncreate' => 'ستاسو د برېښناليک پتې ته يو تاييدي کوډ درولېږل شو.
-ددې لپاره چې تاسو غونډال ته ورننوځی تاسو ته د همدغه کوډ اړتيا نشته، خو تاسو ته د همدغه کوډ اړتيا په هغه وخت کې پکارېږي کله چې په ويکي کې خپلې برېښناليکي کړنې چارن کول غواړی.',
+'confirmemail_oncreate' => 'ستاسې برېښليک پتې ته يو تاييدي کوډ درولېږل شو.
+که تاسې غونډال ته ورننوځی نو تاسې دې کوډ ته اړتيا نه لرۍ، خو تاسې هغه وخت همدې درلېږل شوي کوډ ته اړتيا لرۍ، کله چې په ويکي کې د برېښليک پر بنسټ نورې کړنې چارنول غواړی.',
 'confirmemail_needlogin' => 'ددې لپاره چې ستاسې د برېښليک پتې پخلی وشي، تاسې ته پکار ده چې $1.',
 'confirmemail_loggedin' => 'اوس ستاسې د برېښليک پتې پخلی وشو.',
 'confirmemail_error' => 'ستاسې د برېښليک پتې د تاييد په خوندي کولو کې يوه ستونزه رامېنڅ ته شوه.',
@@ -2565,10 +2634,6 @@ $5
 'version-software-product' => 'اېبره',
 'version-software-version' => 'بڼه',
 
-# Special:FilePath
-'filepath-page' => 'دوتنه:',
-'filepath-submit' => 'ورځه',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'د دوه ګونو دوتنو پلټنه',
 'fileduplicatesearch-legend' => 'د دوه ګونو دوتنو پلټنه',
@@ -2643,17 +2708,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
@@ -2672,6 +2739,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 c51fe22..ae13969 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,7 +36,9 @@
  * @author McDutchie
  * @author MetalBrasil
  * @author Minh Nguyen
+ * @author Nemo bis
  * @author Nuno Tavares
+ * @author OTAVIO1981
  * @author Opraco
  * @author Paulo Juntas
  * @author Pedroca cerebral
@@ -342,8 +346,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',
@@ -358,6 +360,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',
@@ -421,6 +424,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}}',
@@ -476,7 +491,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',
 
@@ -491,7 +506,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',
@@ -502,6 +517,7 @@ $messages = array(
 'create-this-page' => 'Criar/iniciar esta página',
 'delete' => 'Eliminar',
 'deletethispage' => 'Eliminar esta página',
+'undeletethispage' => 'Restaurar esta página',
 'undelete_short' => 'Restaurar {{PLURAL:$1|uma edição|$1 edições}}',
 'viewdeleted_short' => 'Ver {{PLURAL:$1|uma edição eliminada|$1 edições eliminadas}}',
 'protect' => 'Proteger',
@@ -514,13 +530,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',
@@ -529,7 +545,7 @@ $messages = array(
 'viewtalkpage' => 'Ver discussão',
 'otherlanguages' => 'Noutras línguas',
 'redirectedfrom' => '(Redireccionado de $1)',
-'redirectpagesub' => 'Página de redireccionamento',
+'redirectpagesub' => 'Página de redirecionamento',
 'lastmodifiedat' => 'Esta página foi modificada pela última vez à(s) $2 de $1.',
 'viewcount' => 'Esta página foi acedida {{PLURAL:$1|uma vez|$1 vezes}}.',
 'protectedpage' => 'Página protegida',
@@ -555,7 +571,6 @@ $1',
 'disclaimers' => 'Exoneração de responsabilidade',
 'disclaimerpage' => 'Project:Aviso_geral',
 'edithelp' => 'Ajuda de edição',
-'edithelppage' => 'Help:Editar',
 'helppage' => 'Help:Conteúdos',
 'mainpage' => 'Página principal',
 'mainpage-description' => 'Página principal',
@@ -588,7 +603,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',
@@ -702,6 +717,8 @@ $2',
 'namespaceprotected' => "Não possui permissão para editar páginas no espaço nominal '''$1'''.",
 'customcssprotected' => 'Não tem permissões para editar esta página de CSS porque ela contém as configurações pessoais de outro utilizador.',
 'customjsprotected' => 'Não tem permissões para editar esta página de JavaScript porque ela contém as configurações pessoais de outro utilizador.',
+'mycustomcssprotected' => 'Não tem permissão para editar esta página de CSS.',
+'mycustomjsprotected' => 'Não tem permissão para editar esta página de JavaScript.',
 'ns-specialprotected' => 'Não é possível editar páginas especiais',
 'titleprotected' => 'Este título foi protegido contra criação por [[User:$1|$1]].
 A justificação foi "\'\'$2\'\'".',
@@ -727,9 +744,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.',
@@ -742,18 +768,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-se ao projeto {{SITENAME}}',
 'nologin' => 'Não possui uma conta? $1.',
 'nologinlink' => 'Criar uma conta',
 'createaccount' => 'Criar conta',
 'gotaccount' => "Já possui uma conta? '''$1'''.",
 'gotaccountlink' => 'Autentique-se',
 'userlogin-resetlink' => 'Esqueceu-se do seu nome de utilizador ou da palavra-chave?',
+'userlogin-resetpassword-link' => 'Recuperar palavra-chave',
+'helplogin-url' => 'Help:Autenticação',
+'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.
@@ -808,7 +854,7 @@ Introduza um endereço formatado correctamente ou deixe o campo vazio.',
 'cannotchangeemail' => 'Os endereços de correio electrónico das contas não podem ser alterados nesta wiki.',
 'emaildisabled' => 'Este site não consegue enviar e-mails.',
 'accountcreated' => 'Conta criada',
-'accountcreatedtext' => 'A conta de utilizador para $1 foi criada.',
+'accountcreatedtext' => 'A conta de utilizador para [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) foi criada.',
 'createaccount-title' => 'Criação de conta na {{SITENAME}}',
 'createaccount-text' => 'Alguém criou uma conta com o nome $2 para o seu endereço de correio electrónico, na wiki {{SITENAME}} ($4), com a palavra-chave "$3".
 Deve agora autenticar-se e alterar a sua palavra-chave.
@@ -824,6 +870,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',
@@ -843,34 +890,38 @@ 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 repor a sua palavra-passe.',
+'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?',
 'passwordreset-capture-help' => 'Se marcar esta caixa, o e-mail (com a senha temporária) será-lhe mostrado, além de ser enviado para o utilizador.',
 'passwordreset-email' => 'Correio electrónico:',
 'passwordreset-emailtitle' => 'Detalhes da conta na {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Alguém, provavelmente você a partir do endereço IP $1, pediu a recuperação dos detalhes da sua conta na {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta está associada|As seguintes contas estão associadas}} a este correio electrónico:
+'passwordreset-emailtext-ip' => 'Alguém (provavelmente você, a partir do endereço IP $1) pediu a recuperação da palavra-passe no projeto {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta de utilizador está associada|As seguintes contas de utilizador estão associadas}} a este correio eletrónico:
 
 $2
 
-{{PLURAL:$3|Esta palavra-chave temporária irá|Estas palavras-chave temporárias irão}} expirar dentro de {{PLURAL:$5|um dia|$5 dias}}. Deve autenticar-se e escolher uma palavra-chave nova agora. Se este pedido não foi feito por si, ou se entretanto se recordou da sua palavra-chave original e já não deseja alterá-la, pode ignorar esta mensagem e continuar a usar a palavra-chave antiga.',
-'passwordreset-emailtext-user' => 'O utilizador $1 da {{SITENAME}} pediu a recuperação dos detalhes da sua conta na {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta está associada|As seguintes contas estão associadas}} a este correio electrónico:
+{{PLURAL:$3|Esta palavra-passe temporária irá|Estas palavras-passes temporárias irão}} expirar dentro de {{PLURAL:$5|um dia|$5 dias}}.
+Deve autenticar-se e escolher uma palavra-passe nova agora. Se outra pessoa fez este pedido, ou se entretanto se recordou da sua palavra-passe original e já não deseja alterá-la, pode ignorar esta mensagem e continuar a usar a palavra-passe antiga.',
+'passwordreset-emailtext-user' => 'O utilizador $1 do projeto {{SITENAME}} pediu a recuperação da sua palavra-passe no projeto {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta de utilizador está associada|As seguintes contas de utilizador estão associadas}} a este endereço de correio eletrónico:
 
 $2
 
-{{PLURAL:$3|Esta palavra-chave temporária irá|Estas palavras-chave temporárias irão}} expirar dentro de {{PLURAL:$5|um dia|$5 dias}}. Deve autenticar-se e escolher uma palavra-chave nova agora. Se este pedido não foi feito por si, ou se entretanto se recordou da sua palavra-chave original e já não deseja alterá-la, pode ignorar esta mensagem e continuar a usar a palavra-chave antiga.',
+{{PLURAL:$3|Esta palavra-passe temporária irá|Estas palavras-passes temporárias irão}} expirar dentro de {{PLURAL:$5|um dia|$5 dias}}.
+Deve autenticar-se e escolher uma palavra-passe nova agora. Se outra pessoa fez este pedido, ou se entretanto se recordou da sua palavra-passe original e já não deseja alterá-la, pode ignorar esta mensagem e continuar a usar a palavra-passe antiga.',
 'passwordreset-emailelement' => 'Utilizador: $1
 Palavra-chave temporária: $2',
-'passwordreset-emailsent' => 'Foi enviado um correio electrónico de recuperação dos dados da conta.',
-'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 utilizador: $1',
+'passwordreset-emailsent' => 'Foi enviado um correio eletrónico para recuperação da palavra-passe.',
+'passwordreset-emailsent-capture' => 'Foi enviado um e-mail de recuperação da palavra-passe, que é mostrado abaixo.',
+'passwordreset-emailerror-capture' => 'Foi gerado o e-mail de reposição de palavra-passe mostrado abaixo, contudo falhou o seu envio para {{GENDER:$2|o utilizador|a utilizadora}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Alterar o endereço de correio electrónico',
@@ -880,6 +931,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',
 
@@ -958,7 +1010,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',
@@ -1006,7 +1058,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!",
@@ -1027,8 +1079,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.
@@ -1053,7 +1105,7 @@ Garante-nos também que isto é algo escrito por si, ou copiado do domínio púb
 'longpageerror' => "'''Erro: O texto que submeteu ocupa {{PLURAL:$1|um kilobyte|$1 kilobytes}}, que excede o máximo de {{PLURAL:$2|um kilobyte|$2 kilobytes}}.'''
 A página não pode ser gravada.",
 'readonlywarning' => "'''Aviso: A base de dados foi bloqueada para manutenção, pelo que não poderá gravar a sua edição neste momento.'''
-Pode, no entanto, copiar o seu texto para um editor externo e guardá-lo para posterior submissão.
+Pode, no entanto, copiar e colar o seu texto num ficheiro de texto e guardá-lo para mais tarde.
 
 O administrador que bloqueou a base de dados forneceu a seguinte explicação: $1",
 'protectedpagewarning' => "'''Aviso: Esta página foi protegida para só poder ser editada por administradores.'''
@@ -1065,7 +1117,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}}:',
@@ -1087,14 +1139,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' => 'A 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 quaisquer alterações feitas por você.
+Se você se autenticou, pode desabilitar este aviso na secção "Edição" das suas preferências.',
 
 # Content models
 'content-model-wikitext' => 'wikitexto',
@@ -1140,13 +1197,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',
@@ -1341,7 +1398,6 @@ Os detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{F
 'searchmenu-legend' => 'Opções de pesquisa',
 'searchmenu-exists' => "'''Há uma página com o nome \"[[:\$1]]\" nesta wiki'''",
 'searchmenu-new' => "'''Crie a página \"[[:\$1]]\" nesta wiki!'''",
-'searchhelp-url' => 'Help:Conteúdos',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Navegar as páginas com este prefixo]]',
 'searchprofile-articles' => 'Páginas de conteúdo',
 'searchprofile-project' => 'Páginas de Ajuda e de Projecto',
@@ -1356,8 +1412,8 @@ Os detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{F
 'search-result-size' => '$1 ({{PLURAL:$2|1 palavra|$2 palavras}})',
 '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-redirect' => '(redirecionamento de $1)',
+'search-section' => '(seção $1)',
 'search-suggest' => 'Será que queria dizer: $1',
 'search-interwiki-caption' => 'Projectos associados',
 'search-interwiki-default' => 'Resultados de $1:',
@@ -1385,15 +1441,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',
@@ -1433,7 +1481,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:',
@@ -1475,7 +1523,7 @@ Esta operação não pode ser desfeita.',
 'prefs-textboxsize' => 'Tamanho da janela de edição',
 'youremail' => 'Correio electrónico:',
 'username' => 'Nome de {{GENDER:$1|utilizador|utilizadora}}:',
-'uid' => 'Número de identificação:',
+'uid' => 'Identificação de {{GENDER:$1|utilizador|utilizadora}}:',
 'prefs-memberingroups' => '{{GENDER:$2|Membro}} {{PLURAL:$1|do grupo|dos grupos}}:',
 'prefs-registration' => 'Hora de registo:',
 'yourrealname' => 'Nome verdadeiro:',
@@ -1538,6 +1586,8 @@ 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.',
+'userrights-removed-self' => 'Você removeu com sucesso os seus privilégios. Como resultado disso, já não consegue aceder a esta página.',
 
 # Groups
 'group' => 'Grupo:',
@@ -1574,7 +1624,7 @@ Esta informação será pública.',
 'right-move-subpages' => 'Mover páginas com as suas subpáginas',
 'right-move-rootuserpages' => 'Mover páginas raiz de utilizadores',
 'right-movefile' => 'Mover ficheiros',
-'right-suppressredirect' => 'Não criar um redireccionamento do nome antigo quando uma página é movida',
+'right-suppressredirect' => 'Não criar um redirecionamento do nome antigo quando uma página é movida',
 'right-upload' => 'Carregar ficheiros',
 'right-reupload' => 'Sobrescrever um ficheiro existente',
 'right-reupload-own' => 'Sobrescrever um ficheiro existente carregado pelo mesmo utilizador',
@@ -1608,6 +1658,8 @@ Esta informação será pública.',
 'right-editusercssjs' => 'Editar os ficheiros CSS e JS de outros utilizadores',
 'right-editusercss' => 'Editar os ficheiros CSS de outros utilizadores',
 'right-edituserjs' => 'Editar os ficheiros JS de outros utilizadores',
+'right-editmyusercss' => 'Editar os seus próprios ficheiros CSS de utilizador',
+'right-editmyuserjs' => 'Editar os seus próprios ficheiros JavaScript de utilizador',
 'right-rollback' => 'Reverter rapidamente as edições do último utilizador que editou uma página em particular',
 'right-markbotedits' => 'Marcar edições revertidas como edições de bot',
 'right-noratelimit' => 'Não ser afectado pelos limites de velocidade de operação',
@@ -1701,7 +1753,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"',
@@ -1880,6 +1932,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.',
@@ -1896,7 +1949,7 @@ Caso o problema persista, contacte um [[Special:ListUsers/sysop|administrador]].
 'backend-fail-internal' => 'Ocorreu um erro desconhecido no servidor de armazenamento "$1".',
 'backend-fail-contenttype' => 'Não foi possível determinar o tipo de conteúdo do ficheiro para armazenar em "$1".',
 'backend-fail-batchsize' => 'Foi fornecido um bloco de $1 {{PLURAL:$1|operação|operações}} sobre ficheiros ao servidor de armazenamento; o limite é de $2 {{PLURAL:$2|operação|operações}}.',
-'backend-fail-usable' => 'Não foi possível gravar o ficheiro $1 devido a permissões insuficientes ou a directórios ou repositórios inexistentes.',
+'backend-fail-usable' => 'Não foi possível ler ou gravar o ficheiro "$1" devido a permissões insuficientes ou a directórios/repositórios inexistentes.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Não foi possível estabelecer ligação à base de dados de registos no servidor de armazenamento "$1".',
@@ -1958,7 +2011,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>
@@ -1996,7 +2048,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",
@@ -2013,7 +2065,7 @@ A lista abaixo apresenta apenas {{PLURAL:$1|a primeira página|as primeiras $1 p
 Encontra-se disponível uma [[Special:WhatLinksHere/$2|lista completa]].',
 'nolinkstoimage' => 'Nenhuma página contém links para este ficheiro.',
 'morelinkstoimage' => 'Ver a [[Special:WhatLinksHere/$1|lista completa]] de páginas que contêm links para este ficheiro.',
-'linkstoimage-redirect' => '$1 (redireccionamento de ficheiro) $2',
+'linkstoimage-redirect' => '$1 (redirecionamento de ficheiro) $2',
 'duplicatesoffile' => '{{PLURAL:$1|O seguinte ficheiro é duplicado|Os seguintes $1 ficheiros são duplicados}} deste ficheiro ([[Special:FileDuplicateSearch/$2|mais detalhes]]):',
 'sharedupload' => 'Este ficheiro provém de $1 e pode ser usado por outros projectos.',
 'sharedupload-desc-there' => 'Este ficheiro provém de $1 e pode ser usado por outros projectos.
@@ -2083,7 +2135,7 @@ Talvez queira editar a descrição na [$2 página original de descrição do fic
 'randompage-nopages' => 'Não há páginas {{PLURAL:$2|no seguinte espaço nominal|nos seguintes espaços nominais}}: $1.',
 
 # Random redirect
-'randomredirect' => 'Redireccionamento aleatório',
+'randomredirect' => 'Redirecionamento aleatório',
 'randomredirect-nopages' => 'Não há redireccionamentos no espaço nominal "$1".',
 
 # Statistics
@@ -2113,13 +2165,19 @@ 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.
+'doubleredirectstext' => 'Esta página lista todas as páginas que redirecionam para outras páginas de redirecionamento.
+Cada linha contém links para o primeiro e segundo redirecionamentos, bem como o destino do segundo redirecionamento, geralmente contendo a verdadeira página de destino, que devia ser o destino do primeiro redirecionamento.
 <del>Entradas cortadas</del> já foram solucionadas.',
 'double-redirect-fixed-move' => '[[$1]] foi movido.
 Agora redirecciona para [[$2]].',
-'double-redirect-fixed-maintenance' => 'A corrigir redireccionamento duplo de [[$1]] para [[$2]].',
+'double-redirect-fixed-maintenance' => 'A corrigir redirecionamento duplo de [[$1]] para [[$2]].',
 'double-redirect-fixer' => 'Corrector de redireccionamentos',
 
 'brokenredirects' => 'Redireccionamentos quebrados',
@@ -2277,6 +2335,15 @@ Veja também as [[Special:WantedCategories|categorias desejadas]].',
 'listusers-noresult' => 'Não foram encontrados utilizadores.',
 'listusers-blocked' => '(bloqueado)',
 
+# Special:ActiveUsers
+'activeusers' => 'Utilizadores activos',
+'activeusers-intro' => 'Esta é uma lista dos utilizadores com qualquer tipo de actividade {{PLURAL:$1|no último dia|nos últimos $1 dias}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|ação|ações}} {{PLURAL:$3|no último dia|nos últimos $3 dias}}',
+'activeusers-from' => 'Mostrar utilizadores começando por:',
+'activeusers-hidebots' => 'Esconder robôs',
+'activeusers-hidesysops' => 'Esconder administradores',
+'activeusers-noresult' => 'Nenhum utilizador encontrado.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Privilégios dos grupos de utilizadores',
 'listgrouprights-summary' => 'A seguinte lista contém os grupos de utilizadores definidos nesta wiki, com os respectivos privilégios de acesso.
@@ -2301,6 +2368,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.',
@@ -2341,9 +2409,8 @@ O endereço de correio que introduziu nas [[Special:Preferences|suas preferênci
 'watchnologin' => 'Não está autenticado(a)',
 'watchnologintext' => 'Precisa de [[Special:UserLogin|autenticar-se]] para modificar a sua lista de páginas vigiadas.',
 'addwatch' => 'Adicionar às páginas vigiadas',
-'addedwatchtext' => "A página \"[[:\$1]]\" foi adicionada à sua lista de [[Special:Watchlist|páginas vigiadas]], onde serão indicadas quaisquer
-modificações futuras desta página e da respectiva página de discussão.
-O nome desta página passará a aparecer a '''negrito''' na lista de [[Special:RecentChanges|mudanças recentes]], para que a encontre facilmente.",
+'addedwatchtext' => 'A página "[[:$1]]" foi adicionada à sua [[Special:Watchlist|lista de páginas vigiadas]].
+Modificações futuras desta página e da respetiva página de discussão serão listadas lá.',
 'removewatch' => 'Remover das páginas vigiadas',
 'removedwatchtext' => 'A página "[[:$1]]" foi removida da sua lista de [[Special:Watchlist|páginas vigiadas]].',
 'watch' => 'Vigiar',
@@ -2354,8 +2421,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á activa.',
+'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}}.',
@@ -2372,6 +2439,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ágina $1 em {{SITENAME}} foi {{GENDER:$2|movida}} em $PAGEEDITDATE por $2, ver $3 para a versão actual.',
+'enotif_body_intro_restored' => 'A página $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',
@@ -2475,6 +2552,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:',
@@ -2552,10 +2631,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',
@@ -2582,7 +2661,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',
@@ -2594,7 +2673,7 @@ $1',
 'mycontris' => 'Contribuições',
 'contribsub2' => 'Para $1 ($2)',
 'nocontribs' => 'Não foram encontradas alterações com este critério.',
-'uctop' => ' (edição actual)',
+'uctop' => '(atual)',
 'month' => 'Até o mês:',
 'year' => 'Até o ano:',
 
@@ -2623,7 +2702,7 @@ Para referência é apresentado abaixo o último registo de bloqueio:',
 'linkshere' => "As seguintes páginas têm links para '''[[:$1]]''':",
 'nolinkshere' => "Não existem afluentes para '''[[:$1]]''' com as condições especificadas.",
 'nolinkshere-ns' => "Não existem links para '''[[:$1]]''' no espaço nominal seleccionado.",
-'isredirect' => 'página de redireccionamento',
+'isredirect' => 'página de redirecionamento',
 'istemplate' => 'inclusão',
 'isimage' => 'link para o ficheiro',
 'whatlinkshere-prev' => '{{PLURAL:$1|anterior|$1 anteriores}}',
@@ -2756,6 +2835,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-Forwarded-For, seja seu ou de um servidor de proxy que estiver a usar, foi bloqueado. A razão do bloqueio original foi: $1',
 'cant-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.",
@@ -2792,18 +2872,18 @@ Pode corrigir de forma automática os redireccionamentos existentes que apontam
 Caso escolha não o fazer, após a operação certifique-se de que dela não resultaram  [[Special:DoubleRedirects|redireccionamentos duplos]] ou [[Special:BrokenRedirects|quebrados]].
 É da sua responsabilidade verificar que os links continuam a apontar para onde é suposto que apontem.
 
-Note que a página '''não''' será movida se já existir uma página com o novo nome, a menos que esta esteja vazia ou seja um redireccionamento sem qualquer histórico de edições.
+Note que a página '''não''' será movida se já existir uma página com o novo título, a menos que esta última seja um redireccionamento sem qualquer histórico de edições.
 Isto significa que pode mover uma página de volta para o seu nome original se a tiver movido por engano e que não pode mover uma página para cima de outra já existente.
 
 '''CUIDADO!'''
 Numa página popular esta operação pode representar uma mudança drástica e inesperada;
 certifique-se de que compreende as consequências da mudança antes de prosseguir, por favor.",
 'movepagetext-noredirectfixer' => "Usando o formulário abaixo, pode alterar o nome de uma página e mover todo o histórico desta para o nome novo.
-A página antiga é transformada numa página de redireccionamento para a nova.
-Verifique a existência de [[Special:DoubleRedirects|redireccionamentos duplos]] ou [[Special:BrokenRedirects|quebrados]].
+A página antiga é transformada numa página de redirecionamento para a nova.
+Verifique a existência de [[Special:DoubleRedirects|redirecionamentos duplos]] ou [[Special:BrokenRedirects|quebrados]].
 É da sua responsabilidade certificar-se de que os links continuam a apontar para onde é suposto.
 
-Note que a página '''não''' será movida se já existir uma página com o nome novo, a menos que esta página já existente esteja vazia ou seja uma página de redireccionamento e não tenha um histórico de edições.
+Note que a página '''não''' será movida se já existir uma página com o nome novo, a menos que esta página já existente esteja vazia ou seja uma página de redirecionamento e não tenha um histórico de edições.
 Isto também significa que, se se tiver enganado, pode alterar o nome da página movida de volta para o seu nome original; e que não pode sobrescrever o conteúdo de uma página existente.
 
 '''Aviso!'''
@@ -2827,8 +2907,8 @@ Nestes casos, terá de mover a página de discussão manualmente, ou fundi-la co
 'movepagebtn' => 'Mover página',
 'pagemovedsub' => 'Página movida com sucesso',
 'movepage-moved' => '\'\'\'"$1" foi movida para "$2"\'\'\'',
-'movepage-moved-redirect' => 'Foi criado um redireccionamento.',
-'movepage-moved-noredirect' => 'A criação de um redireccionamento foi suprimida.',
+'movepage-moved-redirect' => 'Foi criado um redirecionamento.',
+'movepage-moved-noredirect' => 'A criação de um redirecionamento foi suprimida.',
 'articleexists' => 'Uma página com este nome já existe, ou o nome que escolheu é inválido.
 Escolha outro nome, por favor.',
 'cantmove-titleprotected' => 'Não pode mover uma página para esse destino, porque o novo título foi protegido para evitar a sua criação',
@@ -2866,8 +2946,8 @@ não é possível mover uma página para ela mesma.',
 'nonfile-cannot-move-to-file' => 'Não é possível mover algo que não é um ficheiro para o espaço nominal de ficheiros',
 'imagetypemismatch' => 'A extensão do novo ficheiro não corresponde ao seu tipo',
 'imageinvalidfilename' => 'O nome do ficheiro alvo é inválido',
-'fix-double-redirects' => 'Actualizar todos os redireccionamentos que apontem para o título original',
-'move-leave-redirect' => 'Criar um redireccionamento',
+'fix-double-redirects' => 'Atualizar todos os redirecionamentos que apontem para o título original',
+'move-leave-redirect' => 'Criar um redirecionamento',
 'protectedpagemovewarning' => "'''Aviso:''' Esta página foi protegida de maneira a que apenas utilizadores com privilégio de administrador possam movê-la.
 O último registo é apresentado abaixo para referência:",
 'semiprotectedpagemovewarning' => "'''Nota:''' Esta página protegida de maneira a que apenas utilizadores registados possam movê-la.
@@ -2902,7 +2982,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.",
@@ -2919,6 +2999,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',
@@ -2940,6 +3022,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]].
@@ -2975,7 +3058,10 @@ 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-rootpage-nosubpage' => 'O domínio "$1" da página de raiz não permite subpáginas.',
 
 # Import log
 'importlogpage' => 'Registo de importações',
@@ -3009,7 +3095,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',
@@ -3044,7 +3130,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',
@@ -3057,7 +3143,7 @@ Utilize o botão "Antever resultado" antes de gravar, por favor.',
 'tooltip-compareselectedversions' => 'Ver as diferenças entre as duas versões seleccionadas desta página.',
 'tooltip-watch' => 'Adicionar esta página à lista de páginas vigiadas',
 'tooltip-watchlistedit-normal-submit' => 'Remover títulos',
-'tooltip-watchlistedit-raw-submit' => 'Actualizar a lista de vigiados',
+'tooltip-watchlistedit-raw-submit' => 'Atualizar a lista de vigiados',
 'tooltip-recreate' => 'Recriar a página apesar de ter sido eliminada',
 'tooltip-upload' => 'Iniciar o carregamento',
 'tooltip-rollback' => '"{{int:rollbacklink}}" reverte, com um só clique, as edições do último editor desta página.',
@@ -3068,27 +3154,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 */',
 
@@ -3124,15 +3199,17 @@ 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-default-sort' => 'Chave de classificação padrão',
 'pageinfo-length' => 'Tamanho da página (em bytes)',
 'pageinfo-article-id' => 'ID da página',
 'pageinfo-language' => 'Idioma do conteúdo da página',
-'pageinfo-robot-policy' => 'Status do mecanismo de pesquisa',
+'pageinfo-robot-policy' => 'Estado para mecanismos de pesquisa',
 'pageinfo-robot-index' => 'Indexável',
 'pageinfo-robot-noindex' => 'Não indexável',
 'pageinfo-views' => 'Número de visitas',
 'pageinfo-watchers' => 'Número de vigilantes da página',
+'pageinfo-few-watchers' => 'Menos do que $1 {{PLURAL:$1|vigilante|vigilantes}}',
 'pageinfo-redirects-name' => 'Redirecionamentos para esta página',
 'pageinfo-subpages-name' => 'Subpáginas desta página',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirecionamento|redirecionamentos}}; $3 {{PLURAL:$3|não-redirecionamento|não-redirecionamentos}})',
@@ -3146,25 +3223,24 @@ Este bloqueio foi provavelmente causado por um link para um site externo que con
 'pageinfo-recent-authors' => 'Número recente de autores distintos',
 'pageinfo-magic-words' => '{{PLURAL:$1|Palavra mágica|Palavras mágicas}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria oculta|Categorias ocultas}} ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|Predefinição|Predefinições}} transcluídas ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Página|Páginas}} onde é transcluída ($1)',
 'pageinfo-toolboxlink' => 'Informações da página',
 'pageinfo-redirectsto' => 'Redireciona para',
 'pageinfo-redirectsto-info' => 'informação',
 'pageinfo-contentpage' => 'Contada como página de conteúdo',
 'pageinfo-contentpage-yes' => 'Sim',
+'pageinfo-protect-cascading' => 'A protecção é em cascata a partir daqui',
 'pageinfo-protect-cascading-yes' => 'Sim',
+'pageinfo-protect-cascading-from' => 'As protecções são em cascata a partir de',
 'pageinfo-category-info' => 'Informações da categoria',
 'pageinfo-category-pages' => 'Número de páginas',
 'pageinfo-category-subcats' => 'Número de subcategorias',
 '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',
 
@@ -3178,6 +3254,8 @@ Este bloqueio foi provavelmente causado por um link para um site externo que con
 'markedaspatrollederror' => 'Não é possível marcar como patrulhada',
 'markedaspatrollederrortext' => 'É necessário especificar uma edição a ser marcada como patrulhada.',
 'markedaspatrollederror-noautopatrol' => 'Não está autorizado a marcar as suas próprias edições como edições patrulhadas.',
+'markedaspatrollednotify' => 'Esta mudança em $1 foi marcada como patrulhada.',
+'markedaspatrollederrornotify' => 'A marcação como patrulhada falhou.',
 
 # Patrol log
 'patrol-log-page' => 'Registo de edições patrulhadas',
@@ -3241,11 +3319,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' => 'há $1 {{PLURAL:$1|hora|horas}}',
+'minutes-ago' => 'há $1 {{PLURAL:$1|minuto|minutos}}',
+'seconds-ago' => 'há $1 {{PLURAL:$1|segundo|segundos}}',
+'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:
 
@@ -3274,7 +3366,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',
@@ -3452,7 +3544,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',
@@ -3748,6 +3840,7 @@ Este código de confirmação expira a $4.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Transclusão interwikis foi impossibilitada]',
 'scarytranscludefailed' => '[Não foi possível obter a predefinição a partir de $1]',
+'scarytranscludefailed-httpstatus' => '[Não foi possível obter a predefinição a partir de $1: HTTP $2]',
 'scarytranscludetoolong' => '[URL longa demais]',
 
 # Delete conflict
@@ -3790,7 +3883,7 @@ Confirme que deseja realmente recriar esta página, por favor.",
 # Auto-summaries
 'autosumm-blank' => 'Limpou toda a página',
 'autosumm-replace' => "Página substituída por '$1'",
-'autoredircomment' => 'Redireccionamento para [[$1]]',
+'autoredircomment' => 'Redirecionamento para [[$1]]',
 'autosumm-new' => "Criou nova página com '$1'",
 
 # Live preview
@@ -3823,7 +3916,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}}:',
@@ -3860,6 +3953,7 @@ Também pode [[Special:EditWatchlist|editar a lista da maneira convencional]].',
 'version-license' => 'Licença',
 'version-poweredby-credits' => "Esta é uma wiki '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'outros',
+'version-credits-summary' => 'Gostaríamos de reconhecer as seguintes pessoas pela sua contribuição para o [[Special:Version|MediaWiki]].',
 'version-license-info' => 'O MediaWiki é software livre; pode redistribuí-lo e/ou modificá-lo nos termos da licença GNU General Public License, tal como publicada pela Free Software Foundation; tanto a versão 2 da Licença, como (por opção sua) qualquer versão posterior.
 
 O MediaWiki é distribuído na esperança de que seja útil, mas SEM QUALQUER GARANTIA; inclusive, sem a garantia implícita da POSSIBILIDADE DE SER COMERCIALIZADO ou de ADEQUAÇÂO PARA QUALQUER FINALIDADE ESPECÍFICA. Consulte a licença GNU General Public License para mais detalhes.
@@ -3872,12 +3966,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' => '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:Redirect
+'redirect' => 'Redireccionar pelo ID do ficheiro, utilizador ou revisão',
+'redirect-legend' => 'Redirecionar para um ficheiro ou página',
+'redirect-summary' => 'Esta página especial redireciona a um ficheiro (dado o nome do ficheiro), a uma página (dado um ID de revisão) ou a uma página de utilizador (dado o ID do utilizador).',
+'redirect-submit' => 'Ir',
+'redirect-lookup' => 'Pesquisa:',
+'redirect-value' => 'Valor:',
+'redirect-user' => 'Identificador do utilizador',
+'redirect-revision' => 'Revisão da página',
+'redirect-file' => 'Nome do ficheiro',
+'redirect-not-exists' => 'Valor não encontrado',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Ficheiros duplicados',
@@ -3904,7 +4003,7 @@ Imagens serão apresentadas pelo browser na resolução máxima; ficheiros de ou
 'specialpages-group-highuse' => 'Páginas muito usadas',
 'specialpages-group-pages' => 'Listas de páginas',
 'specialpages-group-pagetools' => 'Ferramentas de páginas',
-'specialpages-group-wiki' => 'Dados e ferramentas da wiki',
+'specialpages-group-wiki' => 'Dados e ferramentas',
 'specialpages-group-redirects' => 'Pesquisas e aleatoriedade',
 'specialpages-group-spam' => 'Ferramentas anti-spam',
 
@@ -3950,7 +4049,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.',
@@ -3967,6 +4066,9 @@ Imagens serão apresentadas pelo browser na resolução máxima; ficheiros de ou
 'htmlform-submit' => 'Enviar',
 'htmlform-reset' => 'Desfazer alterações',
 'htmlform-selectorother-other' => 'Outros',
+'htmlform-no' => 'Não',
+'htmlform-yes' => 'Sim',
+'htmlform-chosen-placeholder' => 'Seleccione uma opção',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 com suporte de pesquisa de texto completo',
@@ -3975,15 +4077,15 @@ Imagens serão apresentadas pelo browser na resolução máxima; ficheiros de ou
 # New logging system
 '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|das $5 entradas}} em $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-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 secretamente alterou a visibilidade {{PLURAL:$5|de uma revisão|das $5 revisões}} em $3: $4',
-'logentry-suppress-event-legacy' => '$1 secretamente alterou a visibilidade das entradas em $3',
-'logentry-suppress-revision-legacy' => '$1 secretamente alterou a visibilidade das revisões em $3',
+'logentry-delete-event' => '$1 alterou a visibilidade de {{PLURAL:$5|uma entrada|$5 entradas}} em $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|alterou}} a visibilidade de {{PLURAL:$5|uma revisão|$5 revisões}} em $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|alterou}} a visibilidade de entradas de registo em $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|alterou}} a visibilidade de revisões na página $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|suprimiu}} a página $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2|alterou}} secretamente a visibilidade de {{PLURAL:$5|uma entrada|$5 entradas}} em $3: $4',
+'logentry-suppress-revision' => '$1 secretamente alterou a visibilidade de {{PLURAL:$5|uma revisão|$5 revisões}} em $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|alterou}} secretamente a visibilidade de entradas de registo em $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|alterou}} secretamente a visibilidade de revisões da página $3',
 'revdelete-content-hid' => 'conteúdo oculto',
 'revdelete-summary-hid' => 'sumário de edição oculto',
 'revdelete-uname-hid' => 'utilizador oculto',
@@ -3994,15 +4096,17 @@ Imagens serão apresentadas pelo browser na resolução máxima; ficheiros de ou
 'revdelete-unrestricted' => 'restrições a administradores removidas',
 'logentry-move-move' => '$1 moveu a página $3 para $4',
 'logentry-move-move-noredirect' => '$1 moveu a página $3 para $4 sem deixar um redireccionamento',
-'logentry-move-move_redir' => '$1 moveu a página $3 para $4 através de um redireccionamento',
-'logentry-move-move_redir-noredirect' => '$1 moveu a página $3 para $4 sem um redireccionamento',
-'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 utilizador $1 foi criada',
+'logentry-move-move_redir' => '$1 moveu a página $3 para $4 sobre um redireccionamento',
+'logentry-move-move_redir-noredirect' => '$1 moveu a página $3 para $4 sobre um redireccionamento sem deixar um redireccionamento',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|marcou}} a revisão $4 da página $3 como patrulhada',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|marcou}} automaticamente a revisão $4 da página $3 como patrulhada',
+'logentry-newusers-newusers' => 'A conta de utilizador $1 foi {{GENDER:$2|criada}}',
 'logentry-newusers-create' => 'A conta de utilizador $1 foi criada',
 'logentry-newusers-create2' => 'A conta de utilizador $3 foi criada por $1',
-'logentry-newusers-autocreate' => 'A conta $1 foi criada automaticamente',
-'logentry-rights-rights' => '$1 modificou os privilégios do utilizador  $3  de  $4  para $5',
+'logentry-newusers-byemail' => 'Conta de utilizador $3 foi {{GENDER:$2|criada}} por $1 e a senha foi enviada por e-mail',
+'logentry-newusers-autocreate' => 'A conta de utilizador $1 foi criada automaticamente',
+'logentry-rights-rights' => '$1 modificou os privilégios do utilizador $3 de $4 para $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|mudou}} as permissões de $3',
 'logentry-rights-autopromote' => '$1 foi automaticamente {{GENDER:$2|promovido|promovida}} de $4 a $5',
 'rightsnone' => '(nenhum)',
 
@@ -4058,6 +4162,7 @@ Caso contrário, pode facilmente usar o formulário abaixo. O seu comentário se
 'api-error-ok-but-empty' => 'Erro interno: o servidor não respondeu.',
 'api-error-overwrite' => 'Não é permitido sobrescrever um ficheiro existente.',
 'api-error-stashfailed' => 'Erro interno: O servidor não conseguiu armazenar o ficheiro temporário.',
+'api-error-publishfailed' => 'Erro interno: Servidor não conseguiu publicar ficheiro temporário.',
 'api-error-timeout' => 'O servidor não respondeu no prazo esperado.',
 'api-error-unclassified' => 'Ocorreu um erro desconhecido',
 'api-error-unknown-code' => 'Erro desconhecido: "$1"',
@@ -4078,4 +4183,7 @@ Caso contrário, pode facilmente usar o formulário abaixo. O seu comentário se
 'duration-centuries' => '$1 {{PLURAL:$1|século|séculos}}',
 'duration-millennia' => '$1 {{PLURAL:$1|milénio|milénios}}',
 
+# Image rotation
+'rotate-comment' => 'Imagem rodada em $1 {{PLURAL:$1|grau|graus}} no sentido dos ponteiros do relógio',
+
 );
index 3dbe7a2..b670b28 100644 (file)
@@ -25,6 +25,7 @@
  * @author Emufarmers
  * @author Everton137
  * @author Francisco Leandro
+ * @author Fúlvio
  * @author GKnedo
  * @author Giro720
  * @author GoEThe
  * @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 OTAVIO1981
  * @author Opraco
  * @author Pedroca cerebral
  * @author Ppena
@@ -53,6 +58,7 @@
  * @author Teles
  * @author TheGabrielZaum
  * @author Urhixidur
+ * @author Vivaelcelta
  * @author Vuln
  * @author Waldir
  * @author Yves Marques Junqueira
@@ -322,8 +328,8 @@ $messages = array(
 '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)',
@@ -331,35 +337,35 @@ $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-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',
@@ -367,7 +373,7 @@ $messages = array(
 '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 +430,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 +451,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 tem apenas a seguinte subcategoria.|Esta categoria tem {{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 contém apenas a página seguinte subcategoria.|{{PLURAL:$1|A seguinte página está|As seguintes $1 páginas estão}}, nesta categoria 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',
@@ -505,6 +523,7 @@ $messages = array(
 'create-this-page' => 'Iniciar esta página',
 'delete' => 'Eliminar',
 'deletethispage' => 'Eliminar esta página',
+'undeletethispage' => 'Restaure esta página',
 'undelete_short' => 'Restaurar {{PLURAL:$1|uma edição|$1 edições}}',
 'viewdeleted_short' => 'Ver {{PLURAL:$1|uma edição eliminada|$1 edições eliminadas}}',
 'protect' => 'Proteger',
@@ -545,7 +564,7 @@ Aguarde um instante antes de tentar acessar esta página novamente.
 
 $1',
 'pool-timeout' => 'Tempo limite de espera para o bloqueio excedido',
-'pool-queuefull' => 'A pool queue está cheia',
+'pool-queuefull' => 'A fila de processos está cheia',
 'pool-errorunknown' => 'Erro desconhecido',
 
 # 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).
@@ -558,7 +577,6 @@ $1',
 'disclaimers' => 'Exoneração de responsabilidade',
 'disclaimerpage' => 'Project:Aviso_geral',
 'edithelp' => 'Ajuda de edição',
-'edithelppage' => 'Help:Editar',
 'helppage' => 'Help:Conteúdos',
 'mainpage' => 'Página principal',
 'mainpage-description' => 'Página principal',
@@ -671,7 +689,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.',
@@ -709,6 +727,8 @@ $2',
 'namespaceprotected' => "Você não possui permissão para editar páginas no espaço nominal '''$1'''.",
 'customcssprotected' => 'Você não tem permissão para editar esta página CSS, porque ele contém configurações pessoais de outro usuário.',
 'customjsprotected' => 'Você não tem permissão para editar esta página de JavaScript, porque ele contém configurações pessoais de outro usuário.',
+'mycustomcssprotected' => 'Você não tem permissão para editar esta página CSS',
+'mycustomjsprotected' => 'Você não tem permissão para editar esta página JavaScript',
 'ns-specialprotected' => 'Não é possível editar páginas especiais',
 'titleprotected' => "Este título foi protegido, para que não seja criado.
 Quem o protegeu foi [[User:$1|$1]], com a justificativa: ''$2''.",
@@ -734,9 +754,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' => 'Use a conexão segura',
 '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 +778,38 @@ 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' => 'Junte-se ao projeto {{SITENAME}}',
 'nologin' => 'Não possui uma conta? $1.',
 'nologinlink' => 'Criar uma conta',
 'createaccount' => 'Criar conta',
 'gotaccount' => "Já possui uma conta? '''$1'''.",
 'gotaccountlink' => 'Autenticar-se',
 'userlogin-resetlink' => 'Esqueceu-se do seu nome de usuário ou da senha?',
+'userlogin-resetpassword-link' => 'Troque sua 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' => '{{PLURAL:$1|contribuidor|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.
@@ -810,7 +859,7 @@ Como resultado, visitantes que usam este endereço IP não podem criar mais nenh
 'cannotchangeemail' => 'A conta de e-mail não pode ser alterada neste wiki.',
 'emaildisabled' => 'Este site não tem como enviar e-mails.',
 'accountcreated' => 'Conta criada',
-'accountcreatedtext' => 'A conta de usuário para $1 foi criada.',
+'accountcreatedtext' => 'A conta de usuário para [[{{ns:User}}:$1|$1]] ([[{{ns:Usuário Discussão}}:$1|Discussão]]) foi criada.',
 'createaccount-title' => 'Criação de conta em {{SITENAME}}',
 'createaccount-text' => 'Alguém criou uma conta de nome $2 para o seu endereço de email no wiki {{SITENAME}} ($4), tendo como senha "$3".
 Você deve se autenticar e alterar sua senha.
@@ -845,13 +894,15 @@ 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-text-one' => 'Complete este formulário para trocar sua senha.',
+'passwordreset-text-many' => '{{PLURAL:$1|Entre com uma das partes dos dados para trocar sua senha.}}',
 '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 +929,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,6 +1143,7 @@ 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',
@@ -1099,7 +1151,7 @@ Ela já existia.',
 '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.',
+Se você estiver autenticado, você pode desabilitar este aviso na seção "Edição" de suas preferências.',
 
 # Content models
 'content-model-wikitext' => 'wikitexto',
@@ -1150,7 +1202,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',
@@ -1339,7 +1391,6 @@ Os detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{F
 'searchmenu-legend' => 'Opções de pesquisa',
 'searchmenu-exists' => "'''Há uma página com o nome \"[[:\$1]]\" nesta wiki'''",
 'searchmenu-new' => "'''Criar a página \"[[:\$1|\$1]]\" nesta wiki!'''",
-'searchhelp-url' => 'Help:Conteúdos',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Navegue pelas páginas com este prefixo]]',
 'searchprofile-articles' => 'Páginas de conteúdo',
 'searchprofile-project' => 'Ajuda e páginas de projeto',
@@ -1383,6 +1434,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}}.',
+'search-error' => 'Ocorreu um erro ao buscar por: $1',
 
 # Preferences page
 'preferences' => 'Preferências',
@@ -1526,6 +1578,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:',
@@ -1596,6 +1649,8 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
 'right-editusercssjs' => 'Editar os arquivos CSS e JS de outros usuários',
 'right-editusercss' => 'Editar os arquivos CSS de outros usuários',
 'right-edituserjs' => 'Editar os arquivos JS de outros usuários',
+'right-editmyusercss' => 'Edite seu próprio arquivo CSS de usuário',
+'right-editmyuserjs' => 'Edite seu próprio arquivo JavaScript de usuário',
 'right-rollback' => 'Reverter rapidamente o último usuário que editou uma página em particular',
 'right-markbotedits' => 'Marcar edições revertidas como edições de bot',
 'right-noratelimit' => 'Não afetado pelos limites de velocidade de operação',
@@ -2274,6 +2329,15 @@ Necessário no mínimo um domínio de nível superior, por exemplo "*.org".<br /
 'listusers-noresult' => 'Não foram encontrados usuários para a forma pesquisada.',
 'listusers-blocked' => '({{GENDER:$1|bloqueado|bloqueada}})',
 
+# Special:ActiveUsers
+'activeusers' => 'Lista de usuários ativos',
+'activeusers-intro' => 'Esta é uma lista de usuários com algum tipo de atividade nos últimos $1 {{PLURAL:$1|dia|dias}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|ação|ações}} {{PLURAL:$3|no último dia|nos últimos $3 dias}}',
+'activeusers-from' => 'Mostrar usuários começando em:',
+'activeusers-hidebots' => 'Esconder robôs',
+'activeusers-hidesysops' => 'Esconder administradores',
+'activeusers-noresult' => 'Nenhum usuário encontrado.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Privilégios de grupo de usuários',
 'listgrouprights-summary' => 'O que segue é uma lista dos grupos de usuários definidos neste wiki, com os seus privilégios de acessos associados.
@@ -2351,8 +2415,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' => "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}}.',
@@ -2562,7 +2626,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',
@@ -2761,6 +2825,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',
@@ -2922,6 +2987,7 @@ Acesse [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] e [//trans
 'thumbnail-more' => 'Ampliar',
 'filemissing' => 'arquivo não encontrado',
 'thumbnail_error' => 'Erro ao criar miniatura: $1',
+'thumbnail_error_remote' => 'Mensagem de erro para $1, $2',
 'djvu_page_error' => 'página DjVu inacessível',
 'djvu_no_xml' => 'Não foi possível acessar o XML do arquivo DjVU',
 'thumbnail-temp-create' => 'Não foi possível criar o arquivo temporário de miniatura',
@@ -3113,12 +3179,12 @@ 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',
 'pageinfo-language' => 'Idioma do conteúdo da página',
-'pageinfo-robot-policy' => 'Status do mecanismo de pesquisa',
+'pageinfo-robot-policy' => 'Estado para mecanismos de pesquisa',
 'pageinfo-robot-index' => 'Indexável',
 'pageinfo-robot-noindex' => 'Não indexável',
 'pageinfo-views' => 'Número de visitas',
@@ -3232,11 +3298,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:
 
@@ -3266,7 +3346,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',
@@ -3444,7 +3524,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',
@@ -3862,12 +3942,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',
@@ -3957,6 +4042,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',
@@ -3966,14 +4054,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-suppress-delete' => '$1 suprimiu a página $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 do registro de eventos em $3',
+'logentry-delete-revision-legacy' => '$1 alterou a visibilidade de revisões na página $3',
+'logentry-suppress-delete' => '$1 supervisionou 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-event-legacy' => '$1 alterou secretamente a visibilidade do registro de eventos 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',
@@ -3992,10 +4080,10 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
 '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
@@ -4071,4 +4159,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 de987d2..707164b 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author *Surak*
+ * @author 127.0.0.1
  * @author Abanima
  * @author Ahonc
  * @author Aleator
@@ -66,6 +67,7 @@
  * @author Leinad
  * @author Lejonel
  * @author Li-sung
+ * @author Liangent
  * @author Lloffiwr
  * @author MF-Warburg
  * @author Malafaya
@@ -79,6 +81,7 @@
  * @author Mido
  * @author Mihai
  * @author Minh Nguyen
+ * @author Moha
  * @author Mormegil
  * @author Mpradeep
  * @author Murma174
  * @author Yyy
  * @author Žekřil71pl
  * @author פוילישער
+ * @author គីមស៊្រុន
  * @author 아라
  */
 
@@ -307,6 +311,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.',
@@ -404,11 +420,12 @@ This can also appear in the credits page if the credits feature is enabled,for e
 {{Identical|Find}}',
 'qbbrowse' => '{{Identical|Browse}}',
 'qbedit' => '{{Identical|Edit}}',
+'qbpageoptions' => '{{Identical|This page}}',
 'qbmyoptions' => 'Heading in the Cologne Blue skin user menu containing links to user (talk) page, preferences, watchlist, etc.
 {{Identical|My pages}}',
 'qbspecialpages' => '{{Identical|Special page}}',
 'faq' => "FAQ is short for ''frequently asked questions''.",
-'faqpage' => "FAQ is short for ''frequently asked questions''. This page is only linked on some of the old skins, not in Monobook or Modern.
+'faqpage' => "FAQ is short for ''frequently asked questions''. This page is only linked in CologneBlue (an old skin), not in Monobook or Vector.
 
 {{doc-important|Do not translate <tt>Project:</tt> part.}}",
 
@@ -426,8 +443,7 @@ This can also appear in the credits page if the credits feature is enabled,for e
 'vector-action-undelete' => 'Tab at top of page, in vector skin.
 {{Identical|Undelete}}',
 'vector-action-unprotect' => 'Tab at top of page, in vector skin.
-
-{{Identical|Unprotect}}',
+{{Identical|Change protection}}',
 'vector-simplesearch-preference' => 'Preference for enhanced search suggestion in the Vector skin.',
 'vector-view-create' => 'Tab label in the Vector skin. See for example {{canonicalurl:Foo|useskin=vector}}
 {{Identical|Create}}',
@@ -435,7 +451,8 @@ This can also appear in the credits page if the credits feature is enabled,for e
 {{Identical|Edit}}',
 'vector-view-history' => 'Tab label in the Vector skin. See for example {{canonicalurl:Main_Page|useskin=vector}}
 {{Identical|View history}}',
-'vector-view-view' => 'Tab label in the Vector skin (verb). See for example {{canonicalurl:Main_Page|useskin=vector}}',
+'vector-view-view' => 'Tab label in the Vector skin (verb). See for example {{canonicalurl:Main_Page|useskin=vector}}.
+{{Identical|Read}}',
 'vector-view-viewsource' => 'Tab label in the Vector skin.
 {{Identical|View source}}',
 'actions' => '{{Identical|Action}}',
@@ -508,8 +525,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.
 
@@ -518,8 +535,9 @@ 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.
+'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}}',
+'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.',
 '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.',
 'protect' => 'Name of protect tab displayed for admins. Should be in the infinitive mood.
@@ -531,7 +549,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
 
@@ -539,11 +557,11 @@ See also:
 * {{msg-mw|Unprotect}}
 * {{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.
+{{Identical|Change protection}}',
+'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}}',
@@ -552,7 +570,7 @@ See also:
 '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 namespace and this message is only used in skins Nostalgia, Cologneblue and Standard in the bottomLinks part.
+'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]].
@@ -636,12 +654,11 @@ 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',
-'edithelppage' => 'The help page displayed when a user clicks on editing help link which is present on the right of Show changes button.
-{{doc-important|Do not change the "<tt>Help:</tt>" part.}}',
 'helppage' => 'The link destination used by default in the sidebar, and in {{msg-mw|noarticletext}}.
 {{doc-important|Do not change the "<tt>Help:</tt>" part.}}
 {{Identical|HelpContent}}',
@@ -780,6 +797,7 @@ See also:
 'restorelink' => "This text is always displayed in conjunction with the {{msg-mw|thisisdeleted}} message (View or restore $1?). The user will see
 View or restore <nowiki>{{PLURAL:$1|one deleted edit|$1 deleted edits}}</nowiki>?    i.e ''View or restore one deleted edit?''     or
 ''View or restore n deleted edits?''",
+'feedlinks' => '{{Identical|Feed}}',
 'feed-invalid' => 'Result of check whether feed type is valid or not.',
 'feed-unavailable' => 'This message is displayed when a user tries to use an RSS or Atom feed on a wiki where such feeds have been disabled.',
 'site-rss-feed' => "Used in the HTML header of a wiki's RSS feed.
@@ -818,7 +836,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}}
@@ -1008,6 +1026,8 @@ See also {{msg-mw|protectedinterface}}.',
 'namespaceprotected' => '* $1 - namespace name',
 'customcssprotected' => 'Used as error message.',
 'customjsprotected' => 'Used as error message.',
+'mycustomcssprotected' => 'Used as error message.',
+'mycustomjsprotected' => 'Used as error message.',
 'ns-specialprotected' => 'Error message displayed when trying to edit a page in the Special namespace',
 'titleprotected' => 'Use $1 for GENDER.',
 'filereadonlyerror' => 'Parameters:
@@ -1038,25 +1058,48 @@ Parameters:
 * $1 - an URL to [[Special:Userlogin]] containing <code>returnto</code> and <code>returntoquery</code> parameters',
 'welcomeuser' => 'Text for a welcome heading that users see after registering a user account. $1 is the username of the new user. See [[bugzilla:42215]]',
 'welcomecreation-msg' => 'A welcome message users see after registering a user account, following a welcomeuser heading. $1 is the username of the new user. Replaces welcomecreation in 1.21wmf5,see [[bugzilla:42215]]',
-'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.
+'yourname' => 'Since 1.22 no longer used in core, but used by some extensions.
 {{Identical|Username}}',
-'userlogin-yourname-ph' => 'Placeholder text in new userlogin/create account form field.',
+'userlogin-yourname' => "In user login & create account forms, label for username field.
+{{doc-important|<nowiki>{{</nowiki>[[Gender|GENDER]]<nowiki>}}</nowiki> is '''NOT''' supported.}}
+
+See examples: [{{canonicalurl:Special:UserLogin}} Special:UserLogin] and [{{canonicalurl:Special:UserLogin}} Special:UserLogin]
+{{Identical|Username}}",
+'userlogin-yourname-ph' => 'Placeholder text in login & create account form field.
+
+See example: [{{canonicalurl:Special:UserLogin}} Special:UserLogin] and [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]',
 'yourpassword' => 'In user preferences
 
 {{Identical|Password}}',
-'userlogin-yourpassword' => 'In new vertical user login & create account forms, label for password field.
+'userlogin-yourpassword' => 'In login & create account forms, label for password field.
+
+See examples: [{{canonicalurl:Special:UserLogin}} Special:UserLogin] and [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]
 {{Identical|Password}}',
-'userlogin-yourpassword-ph' => 'Placeholder text in new userlogin form for password field.',
-'yourpasswordagain' => 'In user preferences',
+'userlogin-yourpassword-ph' => 'Placeholder text in login form for password field.
+
+See examples: [{{canonicalurl:Special:UserLogin}} Special:UserLogin] and [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]
+{{Identical|Enter password}}',
+'createacct-yourpassword-ph' => 'Placeholder text in create account form for password field.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]
+{{Identical|Enter password}}',
+'yourpasswordagain' => 'Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED',
+'createacct-yourpasswordagain' => 'In create account form, label for field to re-enter password
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]
+{{Identical|Confirm password}}',
+'createacct-yourpasswordagain-ph' => 'Placeholder text in create account form for re-enter password field.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]',
 '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]].
-{{Identical|Remember me}}',
-'userlogin-signwithsecure' => 'Text of link to HTTPS login form',
+
+See example: [{{canonicalurl:Special:UserLogin}} Special:UserLogin]',
+'userlogin-signwithsecure' => 'Text of link to HTTPS login form.
+
+See example: [{{canonicalurl:Special:UserLogin}} Special:UserLogin]',
 '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.',
@@ -1071,9 +1114,10 @@ See also:
 'nav-login-createaccount' => "Shown to anonymous users in the upper right corner of the page. When you can't create an account, the message {{msg-mw|login}} is shown.
 {{Identical|Log in / create account}}",
 'loginprompt' => 'A small notice in the log in form.',
-'userlogin' => 'Name of special page [[Special:UserLogin]] where a user can log in or click to create a user account.
+'userlogin' => 'Since 1.22 no longer used in core, but may still be used by extensions. DEPRECATED
+
 {{Identical|Log in / create account}}',
-'userloginnocreate' => 'A variant of {{msg-mw|Userlogin}} when the user is not allowed to create a new account.
+'userloginnocreate' => 'Since 1.22 no longer used in core, but may still be used by some extensions. A variant of {{msg-mw|Userlogin}} when the user is not allowed to create a new account. DEPRECATED
 
 {{Identical|Log in}}',
 'logout' => 'Used as link text in your personal toolbox (upper right side).
@@ -1089,37 +1133,107 @@ See also:
 '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.
+'userlogin-noaccount' => 'In the [[Special:Userlogin]] form, this is the text prior to button inviting user to join project.
+
+See example: [{{canonicalurl:Special:UserLogin}} Special:UserLogin]
 {{Identical|Do not have an account}}',
-'userlogin-joinproject' => 'Text of button inviting user to create an account',
-'nologin' => 'A message shown in the log in form. Parameters:
+'userlogin-joinproject' => 'Text of button inviting user to create an account.
+
+See example: [{{canonicalurl:Special:UserLogin}} Special:UserLogin]',
+'nologin' => 'Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED. Parameters:
 * $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.
+'nologinlink' => 'Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED.
 {{Identical|Create an account}}',
-'createaccount' => '{{doc-special|CreateAccount}}
-The special page enables users to 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.
 
-Used on the submit button in the form where you register a new account.
-
-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.
+'gotaccount' => 'Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED. Parameter:
 * $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.
+'gotaccountlink' => 'Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED.
 {{Identical|Log in}}',
-'userlogin-resetlink' => 'Used on the login page.',
-'helplogin-url' => 'Page that provides information about logging into the wiki.
+'userlogin-resetlink' => 'Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED.',
+'userlogin-resetpassword-link' => 'Used as link text on login form.
+
+The link points to the local [[Special:PasswordReset]].
+
+See example: [{{canonicalurl:Special:UserLogin}} Special:UserLogin]
 
-Used in the message {{msg-mw|Userlogin-helplink}}.',
+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.',
-'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.',
-'createaccountreason' => '{{Identical|Reason}}',
+Wikitext linking to login help.
+
+See example: [{{canonicalurl:Special:UserLogin}} Special:UserLogin]
+
+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}} Special:UserLogin?type=signup]',
+'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}} Special:UserLogin?type=signup]
+
+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}} Special:UserLogin?type=signup]',
+'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}} Special:UserLogin?type=signup]',
+'createacct-realname' => 'In vertical-layout create account form, label for field to enter optional real name.',
+'createaccountreason' => 'Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED
+
+{{Identical|Reason}}',
+'createacct-reason' => 'In create account form, label for field to enter reason to create an account when already logged-in.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]
+{{Identical|Reason}}',
+'createacct-reason-ph' => 'Placeholder in vertical-layout create account form for reason field.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]',
+'createacct-captcha' => 'Label in vertical-layout create account form for CAPTCHA input field when repositioned by JavaScript.',
+'createacct-imgcaptcha-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}} Special:UserLogin?type=signup]',
+'createacct-benefit-heading' => 'In vertical-layout create account form, the heading for the section describing the benefits of creating an account.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]',
+'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}} Special:UserLogin?type=signup]
+{{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}} Special:UserLogin?type=signup]
+{{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}} Special:UserLogin?type=signup]',
 '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.",
@@ -1153,7 +1267,7 @@ Parameters:
 $1 is the minimum number of characters in the password.',
 'password-name-match' => 'Used as error message when password validity check failed.',
 'password-login-forbidden' => 'Error message shown when the user has tried to log in using one of the special username/password combinations used for MediaWiki testing. (See [[mwr:75589]], [[mwr:75605]].)',
-'mailmypassword' => 'Shown at [[Special:UserLogin]]',
+'mailmypassword' => 'Heading in [[Special:PasswordReset]]',
 'passwordremindertitle' => 'Title of e-mail which contains temporary password',
 'passwordremindertext' => 'This text is used in an e-mail sent when a user requests a new temporary password (he has forgotten his password) or when an sysop creates a new user account choosing to have password and username sent to the new user by e-mail.
 * $1 is an IP address. Example: 123.123.123.123
@@ -1165,7 +1279,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' => 'Used as error message in [[Special:UserLogin]].',
+'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}}'.",
@@ -1238,17 +1352,22 @@ 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.
+
+{{msg-mw|Passwordreset-text-many}}, when there are multiple ways 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.
+
+{{msg-mw|Passwordreset-text-one}}, when there is only one way of resetting the password.',
 'passwordreset-legend' => '{{Identical|Reset password}}',
 'passwordreset-disabled' => 'Used as error message in changing password.',
 'passwordreset-emaildisabled' => "Used as error message in changing password when site's email feature is disabled.",
-'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-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',
@@ -1282,8 +1401,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:
+'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}}',
@@ -1329,7 +1449,8 @@ See also:
 'nowiki_sample' => 'Text inserted between nowiki tags',
 'nowiki_tip' => 'This is the text that appears when you hover the mouse over the third button from the right on the edit toolbar.',
 'image_sample' => '{{optional}}
-Used in text generated by Picture button in toolbar.',
+Used in text generated by Picture button in toolbar.
+{{Identical|Example}}',
 'image_tip' => 'This is the text that appears when you hover the mouse over the sixth (middle) button on the edit toolbar.
 
 {{Identical|Embedded file}}',
@@ -1442,7 +1563,7 @@ See also:
 See also:
 * {{msg-mw|permissionserrors}}
 {{Identical|Login required}}',
-'loginreqlink' => 'Take a look on inflection. Used as parameter in {{msg-mw|loginreqpagetext}}, {{msg-mw|whitelistedittext}}, {{msg-mw|watchlistanontext‎}} and {{msg-mw|Confirmemail needlogin}}.
+'loginreqlink' => 'Take a look on inflection. Used as parameter in {{msg-mw|loginreqpagetext}}, {{msg-mw|whitelistedittext}}, {{msg-mw|Uploadnologintext}}, {{msg-mw|watchlistanontext‎}} and {{msg-mw|Confirmemail needlogin}}.
 
 {{Identical|Log in}}',
 'loginreqpagetext' => 'This message is displayed if an anonymous reader attempts to access a page which is only available to logged-in users.
@@ -1482,6 +1603,7 @@ Example: [{{canonicalurl:Project:News|oldid=9999999}} Permalink with invalid rev
 'sitejspreview' => 'Text displayed on preview of .js pages in MediaWiki namespace',
 'userinvalidcssjstitle' => '* $1 - skin name',
 'updated' => '{{Identical|Updated}}',
+'note' => '{{Identical|Note}}',
 'previewnote' => 'Note displayed when clicking on Show preview',
 'continue-editing' => '{{doc-actionlink}}
 A link to the beginning of the editing textarea on the same page.
@@ -1605,6 +1727,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:
@@ -1725,6 +1848,8 @@ See also:
 
 {{Identical|Undo}}',
 'undo-summary' => 'Edit summary for an undo action.{{Identical|Undo}}',
+'undo-summary-username-hidden' => 'Edit summary for an undo action where the username of the old revision is hidden.
+$1 is the revision ID being undone',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Used as title of the error message {{msg-mw|Cantcreateaccount-text}}.',
@@ -2231,9 +2356,6 @@ Viewprevnext is sometimes preceded by the {{msg-mw|Showingresults}} or {{msg-mw|
 'searchmenu-legend' => '{{Identical|Search options}}',
 'searchmenu-exists' => 'An option shown in a menu beside search form offering a link to the existing page having the specified title (when using the default MediaWiki search engine).',
 'searchmenu-new' => 'An option shown in a menu beside search form offering a red link to the not yet existing page having the specified title (when using the default MediaWiki search engine).',
-'searchhelp-url' => 'Description: The URL of the search help page.
-{{doc-important|Do not change the "<tt>Help:</tt>" part.}}
-{{Identical|HelpContent}}',
 'searchmenu-prefix' => '{{doc-important|Do not translate "Special:PrefixIndex"}}
 Parameters:
 * $1 - prefix string',
@@ -2253,7 +2375,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:
@@ -2339,7 +2462,8 @@ See also:
 'powersearch-ns' => 'Used in the extended search form at [[Special:Search]]',
 'powersearch-redir' => 'Used in the extended search form at [[Special:Search]]',
 'powersearch-field' => 'Used in the extended search form at [[Special:Search]]',
-'powersearch-togglelabel' => 'Used in [{{canonicalurl:Special:Search|advanced=1}} Advanced search]. Synonym: "Select" as verb.',
+'powersearch-togglelabel' => 'Used in [{{canonicalurl:Special:Search|advanced=1}} Advanced search]. Synonym: "Select" as verb.
+{{Identical|Check}}',
 'powersearch-toggleall' => '"All" refers to namespaces. It is used in Advanced search: {{canonicalurl:Special:Search|advanced=1}}
 {{Identical|All}}',
 'powersearch-togglenone' => '"None" refers to namespaces. It is used in Advanced search: {{canonicalurl:Special:Search|advanced=1}}
@@ -2420,7 +2544,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',
@@ -2459,7 +2584,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.
@@ -2553,7 +2679,9 @@ See also:
 {{Identical|Date format}}',
 'prefs-timeoffset' => 'Used in [[Special:Preferences]], tab "Date and time".',
 'prefs-advancedediting' => 'Used in [[Special:Preferences]], tab "Editing".
-{{Identical|Advanced options}}',
+This used to say "Advanced options", the key name is a left over from that.',
+'prefs-editor' => 'Used in [[Special:Preferences]], tab "Editing".',
+'prefs-preview' => 'Used in [[Special:Preferences]], tab "Editing".',
 'prefs-advancedrc' => 'Used in [[Special:Preferences]], tab "Recent changes".
 {{Identical|Advanced options}}',
 'prefs-advancedrendering' => 'Used in [[Special:Preferences]], tab "Appearence".
@@ -2630,6 +2758,8 @@ 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.",
+'userrights-removed-self' => 'Shown on [[Special:UserRights]] in a green box after the user removed its own rights to access that page.',
 
 # Groups
 'group' => '{{Identical|Group}}',
@@ -2782,8 +2912,20 @@ This user automatically bypasses IP blocks, auto-blocks and range blocks - so I
 'right-editprotected' => '{{doc-right|editprotected}}',
 'right-editinterface' => '{{doc-right|editinterface}}',
 'right-editusercssjs' => '{{doc-right|editusercssjs}}',
-'right-editusercss' => '{{doc-right|editusercss}}',
-'right-edituserjs' => '{{doc-right|edituserjs}}',
+'right-editusercss' => '{{doc-right|editusercss}}
+
+See also {{msg-mw|Right-editmyusercss}}',
+'right-edituserjs' => '{{doc-right|edituserjs}}
+
+See also {{msg-mw|Right-editmyuserjs}}',
+'right-editmyusercss' => '{{doc-right|editmyusercss}}
+
+See also {{msg-mw|Right-editusercss}}',
+'right-editmyuserjs' => '{{doc-right|editmyuserjs}}
+
+See also {{msg-mw|Right-edituserjs}}',
+'right-viewmywatchlist' => '{{doc-right|viewmywatchlist}}',
+'right-editmywatchlist' => '{{doc-right|editmywatchlist}}',
 'right-rollback' => '{{doc-right|rollback}}
 {{Identical|Rollback}}',
 'right-markbotedits' => '{{doc-right|markbotedits}}
@@ -2856,6 +2998,8 @@ This action allows editing of all of the "user rights", not just the rights of t
 'action-userrights-interwiki' => '{{Doc-action|userrights-interwiki}}',
 'action-siteadmin' => '{{Doc-action|siteadmin}}',
 'action-sendemail' => '{{doc-action|sendemail}}',
+'action-editmywatchlist' => '{{doc-action|editmywatchlist}}',
+'action-viewmywatchlist' => '{{doc-action|viewmywatchlist}}',
 
 # Recent changes
 'nchanges' => 'Appears on the [[Special:RecentChanges]] special page in brackets after pages having more than one change on that date. $1 is the number of changes on that day.',
@@ -2868,6 +3012,7 @@ See also:
 {{Identical|Recent changes}}',
 'recentchanges-legend' => 'Legend of the fieldset of [[Special:RecentChanges]]',
 'recentchanges-summary' => 'Summary of [[Special:RecentChanges]].',
+'recentchanges-noresult' => 'Used in [[Special:RecentChanges]], [[Special:RecentChangesLinked]], and [[Special:Watchlist]] when there are no changes to be shown.',
 'recentchanges-feed-description' => 'Used in feed of RecentChanges. See example [{{canonicalurl:Special:RecentChanges|feed=atom}} feed].',
 'recentchanges-label-newpage' => 'Tooltip for {{msg-mw|newpageletter}}',
 'recentchanges-label-minor' => 'Tooltip for {{msg-mw|minoreditletter}}',
@@ -2966,7 +3111,6 @@ 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}}',
 'recentchangeslinked-to' => 'Checkbox in [[Special:RecentChangesLinked]].',
@@ -2999,7 +3143,8 @@ See also:
 * {{msg-mw|reuploaddesc|button text}}',
 'uploadnologin' => 'Used as title of the error message {{msg-mw|Uploadnologintext}}.
 {{Identical|Not logged in}}',
-'uploadnologintext' => 'Used as error message. The title for this message is {{msg-mw|Uploadnologin}}.
+'uploadnologintext' => 'Used as error message. The title for this message is {{msg-mw|Uploadnologin}}. Parameters:
+* $1 - Login link – {{msg-mw|Loginreqlink}}
 
 See also:
 * {{msg-mw|Whitelistedittext}}
@@ -3803,7 +3948,8 @@ $1 is the name of the shared repository. On wikimedia sites, $1 is {{msg-mw|shar
 * $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}}',
@@ -3896,7 +4042,7 @@ 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]]',
@@ -4058,10 +4204,15 @@ 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' => '{{doc-special|BookSources}}
+'booksources' => "{{doc-special|BookSources}}
+
+'''This message shouldn't be changed unless it has serious mistakes.'''
+
+It's used as the page name of the configuration page of [[Special:BookSources]]. Changing it breaks existing sites using the default version of this message.
+
 See also:
 * {{msg-mw|Booksources|title}}
-* {{msg-mw|Booksources-text|text}}',
+* {{msg-mw|Booksources-text|text}}",
 'booksources-search-legend' => 'Box heading on [[Special:BookSources|book sources]] special page. The box is for searching for places where a particular book can be bought or viewed.',
 'booksources-isbn' => '{{optional}}',
 'booksources-go' => 'Name of button in [[Special:BookSources]]
@@ -4132,8 +4283,7 @@ The other parts are {{msg-mw|Prevpage}} and {{msg-mw|Nextpage}}.
 
 # 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]].
 
@@ -4155,7 +4305,7 @@ 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.
@@ -4193,7 +4343,38 @@ You can apparently use 'URL' instead of 'hostname'.",
 {{Identical|Show}}',
 'listusers-noresult' => 'identical with {{msg-mw|activeusers-noresult}}',
 'listusers-blocked' => 'Used on [[Special:ActiveUsers]] when a user has been blocked.
-* $1 is a user name for use with GENDER (optional)',
+* $1 - a user name for use with GENDER (optional)
+{{Identical|Blocked}}',
+
+# Special:ActiveUsers
+'activeusers' => 'Title of [[Special:ActiveUsers]]',
+'activeusers-intro' => 'Used as introduction in [[Special:ActiveUsers]]. Parameters:
+* $1 - number of days (<code>$wgActiveUserDays</code>)',
+'activeusers-count' => "Used in [[Special:ActiveUsers]] to show the active user's recent action count in brackets ([]).
+* $1 is the number of recent actions
+* $2 is the user's name for use with GENDER (optional)
+* $3 is the maximum number of days of the RecentChangesList",
+'activeusers-from' => 'Used as label for checkbox in the form on [[Special:ActiveUsers]].
+
+identical with {{msg-mw|listusersfrom}}
+
+See also:
+* {{msg-mw|activeusers|legend for the form}}
+* {{msg-mw|activeusers-hidebots|label for checkbox}}
+* {{msg-mw|activeusers-hidesysops|label for checkbox}}',
+'activeusers-hidebots' => 'Used as label for checkbox in the form on [[Special:ActiveUsers]].
+
+See also:
+* {{msg-mw|activeusers|legend for the form}}
+* {{msg-mw|activeusers-from|label for input box}}
+* {{msg-mw|activeusers-hidesysops|label for checkbox}}',
+'activeusers-hidesysops' => 'Used as label for checkbox in the form on [[Special:ActiveUsers]].
+
+See also:
+* {{msg-mw|activeusers|legend for the form}}
+* {{msg-mw|activeusers-from|label for input box}}
+* {{msg-mw|activeusers-hidebots|label for checkbox}}',
+'activeusers-noresult' => 'identical with {{msg-mw|listusers-noresult}}',
 
 # Special:ListGroupRights
 'listgrouprights' => 'The name of the special page [[Special:ListGroupRights]].',
@@ -4372,7 +4553,6 @@ Possible alternatives to the word 'content' are 'subject matter' or 'wiki subjec
 
 See also:
 * {{msg-mw|Cantrollback}}',
-'watchnochange' => 'Used in [[Special:Watchlist]] if there is nothing to show.',
 'watchlist-details' => 'Message on [[Special:Watchlist]]. Parameters:
 * $1 - number of pages in your watchlist
 This is paired with the message {{msg-mw|Nowatchlist}} which appears instead of Watchlist-details when $1 is 0.
@@ -4381,13 +4561,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:
@@ -4498,7 +4677,8 @@ The subject of the e-mail is one of the following messages:
 'created' => '{{Optional}}
 Possible value for $CHANGEDORCREATED in the following messages:
 * {{msg-mw|enotif_subject}}
-* {{msg-mw|enotif_body}}',
+* {{msg-mw|enotif_body}}
+{{Identical|Created}}',
 'changed' => '{{Optional}}
 Possible value for $CHANGEDORCREATED in the following messages:
 * {{msg|enotif_subject}}
@@ -4638,7 +4818,7 @@ Example:
 'protect-norestrictiontypes-title' => "Page title in case there aren't any restriction types (like edit or create) available ($1 represents the page title).",
 'protect-legend' => 'Legend of the fieldset around the input form of the protection form.',
 'protectcomment' => '{{Identical|Reason}}',
-'protectexpiry' => '{{Identical|Expires}}',
+'protectexpiry' => '{{Identical|Expire}}',
 'protect_expiry_invalid' => 'Used as error message about the Protection Form.
 
 See also:
@@ -4680,7 +4860,9 @@ See also:
 * $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-expiring-local' => 'Parameter:
+* $1 - a timestamp like "22:51, 23 July 2011 (UTC)" depending on the wiki content language.
+{{Identical|Expire}}',
 '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.',
@@ -4893,7 +5075,8 @@ This message has a tooltip {{msg-mw|tooltip-invert}}
 
 This message has a tooltip {{msg-mw|tooltip-namespace association}}',
 'tooltip-namespace_association' => 'Used in [[Special:Recentchanges]] as a tooltip for the associated namespace checkbox. See also the message {{msg-mw|namespace_association}}',
-'blanknamespace' => 'Name for main namespace (blank namespace) in drop-down menus at [[Special:RecentChanges]] and other special pages.',
+'blanknamespace' => 'Name for main namespace (blank namespace) in drop-down menus at [[Special:RecentChanges]] and other special pages.
+{{Identical|Main}}',
 
 # Contributions
 'contributions' => "Display name for the 'User contributions', shown in the sidebar menu of all user pages and user talk pages. Also the page name of the target page. The target page shows an overview of the most recent contributions by a user.
@@ -4915,7 +5098,8 @@ 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) (current)
+{{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 an input box to select a specific year to view the edits made in that year, and the earlier years.
 
@@ -5036,7 +5220,8 @@ Parameter $1 is a page title.',
 
 {{Identical|Redirect page}}',
 'istemplate' => 'Means that a page (a template, specifically) is used as <code><nowiki>{{Page name}}</nowiki></code>.
-Displayed in [[Special:WhatLinksHere]] (see [[Special:WhatLinksHere/Template:New portal]] for example).',
+Displayed in [[Special:WhatLinksHere]] (see [[Special:WhatLinksHere/Template:New portal]] for example).
+{{Identical|Transclusion}}',
 'isimage' => 'This message is displayed on [[Special:WhatLinksHere]] for images. It means that the image is used on the page (as opposed to just being linked to like an non-image page).',
 'whatlinkshere-prev' => 'This is part of the navigation message on the top and bottom of Whatlinkshere pages, where it is used as the first argument of {{msg-mw|Viewprevnext}}.
 $1 is the number of items shown per page. It is not used when $1 is zero; not sure what happens when $1 is one.
@@ -5237,7 +5422,8 @@ For an explanation of "range blocks", see [[mw:Help:Range_blocks]]
 'blocklist-timestamp' => 'This is a column header for dates and times in the table on the page [[Special:BlockList]].
 {{Identical|Timestamp}}',
 'blocklist-target' => 'The table header for the column containing the block targets, that is user names or IP-addresses linked to their respective user pages, in the table on the page [[Special:BlockList]].',
-'blocklist-expiry' => 'This is a column header in the table on the page [[Special:BlockList]].',
+'blocklist-expiry' => 'This is a column header in the table on the page [[Special:BlockList]].
+{{Identical|Expire}}',
 'blocklist-by' => 'This is a column header in the table on the page [[Special:BlockList]].',
 'blocklist-params' => 'This is a column header in the table on the page [[Special:BlockList]].',
 'blocklist-reason' => 'This is a column header in the table on the page [[Special:BlockList]].
@@ -5675,8 +5861,10 @@ See also:
 'movepagebtn' => "Button label on the special 'Move page'.
 
 {{Identical|Move page}}",
-'pagemovedsub' => 'Message displayed as aheader of the body, after succesfully moving a page from source to target name.',
-'movepage-moved' => 'Message displayed after succesfully moving a page from source to target name. Parameters:
+'pagemovedsub' => 'Message displayed as aheader of the body, after successfully moving a page from source to target name.',
+'movepage-moved' => 'Message displayed after successfully moving a page from source to target name.
+
+Parameters:
 * $1 - the source page as a link with display name
 * $2 - the target page as a link with display name
 * $3 - (optional) the source page name without a link
@@ -5948,6 +6136,9 @@ The reason $1 is one of the following messages:
 * {{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:
@@ -6607,8 +6798,6 @@ CSS applied to users using Monobook skin.',
 '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}}',
@@ -6746,15 +6935,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, linked to '{{int:Prefixindex}}' page ([[Special:PrefixIndex]]).",
+Used as link text. The link points to the "{{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
@@ -6993,48 +7186,50 @@ 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.
-
-Part of variable $1 in {{msg-mw|Ago}}',
-'years' => 'Full word for "years". $1 is the number of years.
-
-Part of variable $1 in {{msg-mw|Ago}}',
-'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}}
-*{{msg-mw|Hours}}
-*{{msg-mw|Days}}
-*{{msg-mw|Months}}
-*{{msg-mw|Years}}',
+'weeks' => 'Full word for "weeks".
+
+Parameters:
+* $1 - the number of weeks',
+'months' => 'Full word for "months". $1 is the number of months.',
+'years' => 'Full word for "years".
+
+Parameters:
+* $1 - the number of years',
+'ago' => 'Phrase for indicating how long ago something happened. $1 is some kind of timestamp.',
 '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}}
@@ -7138,7 +7333,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].
@@ -7231,7 +7426,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].
 
@@ -7494,7 +7690,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.
@@ -7542,7 +7738,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',
@@ -7574,7 +7771,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}}',
@@ -8162,7 +8359,8 @@ See also:
 'table_pager_limit' => "Do not use PLURAL in this message, because ''$1'' is not the actual number. ''$1'' is a limit selector drop-down list.",
 'table_pager_limit_label' => 'Used as label for input field.',
 'table_pager_limit_submit' => '{{Identical|Go}}',
-'table_pager_empty' => 'Used in a table pager when there are no results (e.g. when there are no images in the table on [[Special:ImageList]]).',
+'table_pager_empty' => 'Used in a table pager when there are no results (e.g. when there are no images in the table on [[Special:ImageList]]).
+{{Identical|No result}}',
 
 # Auto-summaries
 'autosumm-blank' => 'The auto summary when blanking the whole page. This is not the same as deleting the page.',
@@ -8460,14 +8658,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]].',
@@ -8654,6 +8867,7 @@ See also:
 {{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]].
index 2fc25b2..bb01bd8 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",
@@ -374,6 +373,18 @@ $messages = array(
 'oct' => 'ukt',
 'nov' => 'nuw',
 'dec' => 'dis',
+'january-date' => '$1 ñiqin inirupi',
+'february-date' => '$1 ñiqin phiwrirupi',
+'march-date' => '$1 ñiqin marsupi',
+'april-date' => '$1 ñiqin awrilpi',
+'may-date' => '$1 ñiqin mayukillapi',
+'june-date' => '$1 ñiqin hunyupi',
+'july-date' => '$1 ñiqin hulyupi',
+'august-date' => '$1 ñiqin awustupi',
+'september-date' => '$1 ñiqin sitimripi',
+'october-date' => '$1 ñiqin uktuwripi',
+'november-date' => '$1 ñiqin nuwimripi',
+'december-date' => '$1 ñiqin disimripi',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Katiguriya|Katiguriyakuna}}',
@@ -455,6 +466,7 @@ $messages = array(
 'create-this-page' => "Kay p'anqata kamariy",
 'delete' => 'Qulluy',
 'deletethispage' => "Kay p'anqata qulluy",
+'undeletethispage' => "Kay p'anqata qullusqamanta paqarichiy",
 'undelete_short' => "Paqarichiy {{PLURAL:$1|huk llamk'apusqa|$1 llamk'apusqa}}",
 'viewdeleted_short' => '{{PLURAL:$1|qullusqa hukchasqa|$1 qullusqa hukchasqa}} qhaway',
 'protect' => 'Amachay',
@@ -508,7 +520,6 @@ $1",
 'disclaimers' => 'Chiqakunamanta rikuchiy',
 'disclaimerpage' => 'Project:Sapsilla saywachasqa paqtachiy',
 'edithelp' => "Llamk'ana yanapay",
-'edithelppage' => 'Help:Qillqa yanapay',
 'helppage' => 'Help:Yanapana',
 'mainpage' => "Qhapaq p'anqa",
 'mainpage-description' => "Qhapaq p'anqa",
@@ -655,6 +666,8 @@ $2",
 'namespaceprotected' => "'''$1''' nisqa suti k'ititaqa llamk'apuyta manam saqillasunkichu.",
 'customcssprotected' => "Manam saqillasunkichu kay CSS p'anqata llamk'apuyta, huk ruraqpa kikin tiyachisqankunayuq kaptinmi.",
 'customjsprotected' => "Manam saqillasunkichu kay JavaScript p'anqata llamk'apuyta, huk ruraqpa kikin tiyachisqankunayuq kaptinmi.",
+'mycustomcssprotected' => "Kay CSS p'anqataqa manam llamk'apuyta atinkichu.",
+'mycustomjsprotected' => "Kay JavaScript p'anqataqa manam llamk'apuyta atinkichu.",
 'ns-specialprotected' => "{{ns:special}} suti k'itipi p'anqakunaqa manam llamk'apunallachu.",
 'titleprotected' => "Kay p'anqa sutitaqa [[User:$1|$1]] sutiyuq ruraq kamariymanta hark'arqanmi, kayraykum nispa: ''$2''.",
 'filereadonlyerror' => 'Manam atinichu "$1" sutiyuq willañiqita hukchayta, "$2" sutiyuq willañiqi churamuna ñawirillanapaq kachkaptinmi.
@@ -678,9 +691,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,18 +715,38 @@ 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',
+'createacct-reason-ph' => 'Imaraykutaq huk rakiqunata kamarichkanki',
+'createacct-captcha' => 'Amachana llanchiy',
+'createacct-imgcaptcha-ph' => 'Hanaqpi rikusqayki qillqata yaykuchiy',
+'createacct-submit' => 'Rakiqunaykita kamariy',
+'createacct-benefit-heading' => '{{SITENAME}}taqa qam hina runakunam ruran.',
+'createacct-benefit-body1' => "{{PLURAL:$1|llamk'apusqa|llamk'apusqakuna}}",
+'createacct-benefit-body2' => "{{PLURAL:$1|p'anqa|p'anqakuna}}",
+'createacct-benefit-body3' => "{{PLURAL:$1|llamk'apuq|llamk'apuqkuna}}",
 'badretype' => 'Qusqayki yaykuna rimakunaqa manam kaqllachu.',
 'userexists' => 'Munasqayki ruraqpa sutiykiqa kachkanñam.
 Ama hina kaspa, huk ruraqpa sutiykita akllay.',
 'loginerror' => "Pantasqa llamk'apuy tiyaypa qallarisqan",
+'createacct-error' => 'Rakiquna kamariy pantasqa',
 'createaccounterror' => 'Manam atinichu rakiqunata kamariyta: $1',
 'nocookiesnew' => "Ruraqpa rakiqunaykiqa kichasqañam, ichataq manaraqmi yaykurqankichu. {{SITENAME}}qa <em>kuki</em> nisqakunatam llamk'achin ruraqkunata kikinyachinapaq. Antañiqiqniykipiqa manam <em>kuki</em> nisqakuna atinchu. Ama hina kaspa, atichispa huk kutita yaykuykachay.",
 'nocookieslogin' => "{{SITENAME}} <em>kuki</em> nisqakunata llamk'achin ruraqkunata kikinyachinapaq. Antañiqiqniykipiqa manam <em>kuki</em> nisqakuna atinchu. Ama hina kaspa, atichispa huk kutita ruraykachay.",
@@ -749,7 +791,7 @@ Ama hina kaspa, chaskispaykiqa ruraqpa sutiykita nispa musuqmanta yaykuy.',
 'cannotchangeemail' => 'Ruraqpa rakiqunanpi e-chaski imamaytakunaqa kay wikipi manam hukchanallachu.',
 'emaildisabled' => 'Kay tiyayqa e-chaskita manam kachayta atinchu.',
 'accountcreated' => 'Rakiqunaqa kichasqañam',
-'accountcreatedtext' => '$1 sutiyuq ruraqpa rakiqunanqa kichasqañam.',
+'accountcreatedtext' => '[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|rimanakuy]]) sutiyuq ruraqpa rakiqunanqa kichasqañam.',
 'createaccount-title' => '{{SITENAME}}paq musuq rakiqunata kichariy',
 'createaccount-text' => 'Pipas e-chaski imamaytaykipaq {{SITENAME}}pi ($4) "$2" sutiyuq rakiqunatam kicharqan, "$3" nisqa yaykuna rimayuq. Yaykuspayki yaykuna rimaykita hukchanaykim tiyanman.
 
@@ -782,13 +824,15 @@ Kay willay pantasqa kaptinqa, qhawarparillay.',
 'resetpass-wrong-oldpass' => "Mit'alla icha kunan yaykuna rimaqa manam allinchu.
 Yaykuna rimaykitaqa aypalla hukcharqunkiñachá icha huk mit'alla yaykuna rimata mañakurqunkiñachá.",
 'resetpass-temp-password' => "Mit'alla yaykuna rima:",
+'resetpass-abort-generic' => "Yaykuna rima hukchaytaqa yapa wakichim p'itirqan.",
 
 # Special:PasswordReset
 'passwordreset' => 'Yaykuna rimata kutichiy',
-'passwordreset-text' => "Kay hunt'ana p'anqata hunt'ay, yaykuna rimaykita kutichinaykipaq.",
+'passwordreset-text-one' => "Kay hunt'ana p'anqata hunt'ay, yaykuna rimaykita kutichinaykipaq.",
+'passwordreset-text-many' => '{{PLURAL:$1|Kay willa rakikunamanta hukta yaykuchiy, 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}}',
+'passwordreset-emaildisabled' => "Kay wikipiqa e-chaski llamk'anakunaman ama nisqam.",
 'passwordreset-username' => 'Ruraqpa sutin:',
 'passwordreset-domain' => 'Duminyu:',
 'passwordreset-capture' => 'Llalliwaq e-chaskita qhawayta munankichu?',
@@ -819,7 +863,7 @@ kay willayta mana qhawaspa mana imatapas ruraspa ñawpaq yaykuna rimaykiwanmi ll
 Mit'alla yaykuna rima: $2",
 'passwordreset-emailsent' => 'Yaykuna rimata kutichina e-chaskiqa kachasqañam.',
 'passwordreset-emailsent-capture' => 'Yaykuna rimata kutichina e-chaskiqa kachasqañam, kay qatiqpi rikunki.',
-'passwordreset-emailerror-capture' => 'Yaykuna rimata kutichina e-chaskiqa rurasqa karqan, imatachus kay qatiqpi rikunki, ichataq kachasqa kaptin pantasqam tukurqan: $1',
+'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',
@@ -1013,11 +1057,15 @@ Manam nirqanchu imarayku.",
 Qullusqachá.",
 'edit-conflict' => "Tuylla llamk'apuymanta sasachakuy.",
 'edit-no-change' => "Manapuni hukchaptiykim, llamk'apusqayki manam hallch'asqachu.",
+'postedit-confirmation' => "Llamk'apusqaykiqa waqaychasqañam.",
 'edit-already-exists' => "Manam atinichu musuq p'anqata kamariyta.
 Kachkañam.",
 'defaultmessagetext' => 'Ñawpaq qillqa',
+'content-failed-to-parse' => "Manam atinichu $2 samiqta $1 kikinchapaq t'ikrayta: $3",
 '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',
@@ -1256,7 +1304,6 @@ Imaymanata [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} qulluy ha
 'searchmenu-legend' => 'Maskaypaq akllanakuna',
 'searchmenu-exists' => "'''Kay wikipiqa «[[$1]]» sutiyuq p'anqam kachkan'''",
 'searchmenu-new' => "'''Kay wikipi \"[[:\$1]]\" sutiyuq p'anqata kamariy!'''",
-'searchhelp-url' => 'Help:Yanapana',
 'searchmenu-prefix' => "[[Special:PrefixIndex/$1|Kay ñawpa k'askaqchayuq huk p'anqakunata maskay]]",
 'searchprofile-articles' => "Samiq p'anqakuna",
 'searchprofile-project' => "Yanapanapaq ruraykamaypaqpas p'anqakuna",
@@ -1297,15 +1344,7 @@ Imaymanata [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} qulluy ha
 'powersearch-togglenone' => 'Mana imapas',
 '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',
+'search-error' => 'Maskaypiqa pantasqam tukurqan: $1',
 
 # Preferences page
 'preferences' => 'Allinkachinakuna',
@@ -1447,6 +1486,7 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
 'userrights-notallowed' => 'Qampa rakiqunaykiwanqa manam ruraqkunap hayñinkunata yapayta icha qichuyta atinkichu.',
 'userrights-changeable-col' => 'Hukchanayki huñukuna',
 'userrights-unchangeable-col' => 'Mana hukchanayki huñukuna',
+'userrights-conflict' => 'Ruraqpa hayñin tupanakuymi. Ama hina kaspa, hukchasqaykikunata musuqmanta quy.',
 
 # Groups
 'group' => 'Huñu:',
@@ -1517,6 +1557,8 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
 'right-editusercssjs' => "Huk ruraqkunap CSS, JS willañiqinkunata llamk'apuy",
 'right-editusercss' => "Huk ruraqkunap CSS willañiqinkunata llamk'apuy",
 'right-edituserjs' => "Huk ruraqkunap JS willañiqinkunata llamk'apuy",
+'right-editmyusercss' => "Kikiykip ruraqpaq CSS willañiqiykikunata llamk'apuy",
+'right-editmyuserjs' => "Kikiykip ruraqpaq JavaScript willañiqiykikunata llamk'apuy",
 'right-rollback' => "Huk p'anqapi qhipaq llamk'apuqpa hukchasqankunata utqaylla kutichiy",
 'right-markbotedits' => "Kutichisqa llamk'apusqakunata rurana antachap llamk'apusqankunata hina sananchay",
 'right-noratelimit' => 'Achura saywakunap manam chayachisqanchu',
@@ -1834,7 +1876,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>
@@ -2155,6 +2196,15 @@ Q\'imichisqa tantari {{PLURAL:$2|qillqa|qillqakuna}}: <code>$1</code> (mana mayq
 'listusers-noresult' => 'Ruraqqa manam tarisqachu.',
 'listusers-blocked' => "(hark'asqa)",
 
+# Special:ActiveUsers
+'activeusers' => "Llamk'achkaq ruraqkuna",
+'activeusers-intro' => "Kay qatiqpiqa ruraqkunatam rikunki, qhipaq $1 {{PLURAL:$1|p'unchawpi|p'unchawkunapi}} kay wikipi imatapas ruraq.",
+'activeusers-count' => "$1 {{PLURAL:$1|llamk'apusqa|llamk'apusqakuna}} ñaqha {{PLURAL:$3|p'unchawpi|$3 p'unchawkunapi}}",
+'activeusers-from' => 'Ruraqkunata rikuchiy, kaywan qallarispa:',
+'activeusers-hidebots' => 'Rurana antachakunata pakay',
+'activeusers-hidesysops' => 'Kamachiqkunata pakay',
+'activeusers-noresult' => 'Ruraqkunataqa manam tarinichu.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Ruraq huñup hayñinkuna',
 'listgrouprights-summary' => "Kay qatiq sutisuyupiqa kay wikipi sut'ichasqa ruraq huñukunatam, kikinpa chayamuna hayñinkunatawan rikunki.
@@ -2231,8 +2281,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.",
@@ -2471,7 +2521,7 @@ $1',
 'mycontris' => "Llamk'apusqaykuna",
 'contribsub2' => '$1 ($2)',
 'nocontribs' => 'Manam kay hina hukchasqakuna kanchu.',
-'uctop' => ' (qhipaq hukchasqa)',
+'uctop' => '(qhipaq hukchasqa)',
 'month' => 'Kay killamanta (ñawpaqmantapas):',
 'year' => 'Kay watamanta (ñawpaqmantapas):',
 
@@ -2781,6 +2831,7 @@ Ama hina kaspa, [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] n
 'thumbnail-more' => 'Hatunchay',
 'filemissing' => 'Manam willañiqi kachkanchu',
 'thumbnail_error' => 'Manam atinichu rikchachata kamayta: $1',
+'thumbnail_error_remote' => '$1 nisqamanta pantasqa willasqa: $2',
 'djvu_page_error' => "DjVu nisqa p'anqaqa nisyum",
 'djvu_no_xml' => 'Manam atinichu XML-ta apamuy DjVu willañiqipaq',
 'thumbnail-temp-create' => "Manam atinichu mit'alla rikch'acha willañiqita kamariyta.",
@@ -2834,6 +2885,7 @@ Tukuy hawa wikimanta chaskisqakunaqa [[Special:Log/import|hawamanta chaskiy hall
 'import-error-interwiki' => '"$1" sutiyuq p\'anqaqa hawamanta manam chaskisqachu, sutin wikipura (interwiki) nisqapaq hallch\'asqa kaptinmi.',
 'import-error-special' => '"$1" sutiyuq p\'anqaqa hawamanta manam chaskisqachu, mana p\'anqapaq kaq sapaq suti k\'itiman kapuspanmi.',
 'import-error-invalid' => '"$1" sutiyuq p\'anqaqa hawamanta manam chaskisqachu, sutin mana allin kaptinmi.',
+'import-error-unserialize' => '"$1" nisqa p\'anqapi $2 musuqchasqataqa manam ñiqirayta atinichu. Kay musuqchasqaqa $4 hina ñiqichasqa $3 kikinchatas llamk\'achin.',
 'import-options-wrong' => 'Pantasqa {{PLURAL:$2|akllasqa|akllasqakuna}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => "Qusqa saphi p'anqaqa manam allin sutichu.",
 'import-rootpage-nosubpage' => 'Saphi p\'anqap "$1" sutisuyunpiqa urin p\'anqakuna manam kanqachu.',
@@ -2927,26 +2979,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
@@ -3094,11 +3135,25 @@ Payta rurachiyqa antañiqiqniykita llikaykitapas waqllinqachá.",
 'minutes' => '{{PLURAL:$1|huk minutu|$1 minutu}}',
 'hours' => '{{PLURAL:$1|huk ura|$1 ura}}',
 'days' => "{{PLURAL:$1|huk p'unchaw|$1 p'unchaw}}",
+'weeks' => '{{PLURAL:$1|huk simana|$1 simana}}',
 'months' => '{{PLURAL:$1|huk killa|$1 killa}}',
 'years' => '{{PLURAL:$1|huk wata|$1 wata}}',
 'ago' => '$1 ñaqha',
 'just-now' => 'kunallan',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|ura|urakuna}} ñaqha',
+'minutes-ago' => '$1 {{PLURAL:$1|minutu|minutukuna}} ñaqha',
+'seconds-ago' => '$1 {{PLURAL:$1|sikundu|sikundukuna}} ñaqha',
+'monday-at' => 'Killachaw $1 pachapi',
+'tuesday-at' => 'Atipachaw $1 pachapi',
+'wednesday-at' => 'Quyllurchaw $1 pachapi',
+'thursday-at' => 'Illapachaw $1 pachapi',
+'friday-at' => "Ch'askachaw $1 pachapi",
+'saturday-at' => "K'uychichaw $1 pachapi",
+'sunday-at' => 'Intichaw $1 pachapi',
+'yesterday-at' => "Qayna p'unchaw $1 pachapi",
+
 # Bad image list
 'bad_image_list' => "Chantaqa kay hinam:
 
@@ -3125,7 +3180,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',
@@ -3303,7 +3358,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',
@@ -3703,12 +3758,16 @@ 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:Redirect
+'redirect' => 'Willañiqikama, ruraqkama icha musuqchay ID-kama pusapuy',
+'redirect-legend' => "Willañiqiman icha p'anqaman pusapuy",
+'redirect-submit' => 'Riy',
+'redirect-lookup' => 'Maskay:',
+'redirect-value' => 'Chani:',
+'redirect-user' => 'Ruraqpa kikin kaynin',
+'redirect-revision' => "P'anqamanta musuqchasqa",
+'redirect-file' => 'Willañiqip sutin',
+'redirect-not-exists' => 'Chaniqa manam tarisqachu',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Iskaychasqa willañiqikunata maskay',
@@ -3798,6 +3857,9 @@ Rikchakunatataq hunt'a ch'irkukupim rikunki. Huk willañiqi llayakunaqa tantapus
 'htmlform-submit' => 'Kachay',
 'htmlform-reset' => 'Hukchasqakunata kutichiy',
 'htmlform-selectorother-other' => 'Wakin',
+'htmlform-no' => 'Mana',
+'htmlform-yes' => 'Arí',
+'htmlform-chosen-placeholder' => 'Akllanata akllay',
 
 # SQLite database support
 'sqlite-has-fts' => "$1 hunt'a qillqa maskana yanapawan",
index 0544c24..722c90b 100644 (file)
@@ -259,7 +259,6 @@ $1',
 'disclaimers' => 'Kamachikmanta willaykuna',
 'disclaimerpage' => 'Project:Kamachikmanta kapak willaykuna',
 'edithelp' => 'Llankanapaa yanapa',
-'edithelppage' => 'Help:Imashina killkankapa yanapana ?',
 'helppage' => 'Help:Yanapa',
 'mainpage' => 'Kapak Panka',
 'mainpage-description' => 'Kapak panka',
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..0d8b976 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',
@@ -283,7 +281,6 @@ $1',
 'disclaimers' => 'Impressum',
 'disclaimerpage' => 'Project:Impressum',
 'edithelp' => 'Agid per modifitgar',
-'edithelppage' => 'Help:Prims pass',
 'helppage' => 'Help:Cuntegn',
 'mainpage' => 'Pagina principala',
 'mainpage-description' => 'Pagina principala',
@@ -574,10 +571,8 @@ Eventualmain has ti gia midà cun success tes pled-clav u dumandà per in nov pl
 
 # Special:PasswordReset
 'passwordreset' => 'Redefinir il pled-clav',
-'passwordreset-text' => "Emplenescha quest formular per retschaiver in e-mail che cuntegna ils detagls per acceder tes conto d'utilisader.",
 'passwordreset-legend' => 'Redefinir il pled-clav',
 'passwordreset-disabled' => 'La pussaivladad da redefinir il pled-clav è vegnida deactivada sin questa wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Endatescha in dals tocs da data sutvart}}',
 'passwordreset-username' => "Num d'utilisader:",
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => "Mussar l'e-mail che resultescha?",
@@ -1068,7 +1063,6 @@ Detagls pon vegnir chattads en il [{{fullurl:{{#Special:Log}}/delete|page={{FULL
 'searchmenu-legend' => 'Opziuns da tschertgar',
 'searchmenu-exists' => "'''Igl exista ina pagina cun il num \"[[:\$1]] sin questa vichi\"'''",
 'searchmenu-new' => "'''Crear la pagina \"[[:\$1]]\" sin questa vichi!'''",
-'searchhelp-url' => 'Help:Cuntegn',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Mussar tut las paginas cun quest prefix]]',
 'searchprofile-articles' => 'Paginas da cuntegn',
 'searchprofile-project' => 'Agid e paginas dal project',
@@ -1113,15 +1107,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 +1657,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 +2065,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 +2316,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 +2982,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 +3160,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 +3576,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 d00cf6c..e182ee4 100644 (file)
@@ -12,6 +12,7 @@
  * @author Danutz
  * @author Emily
  * @author Firilacroco
+ * @author Geitost
  * @author Gutza
  * @author KlaudiuMihaila
  * @author Laurap
@@ -406,6 +407,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}}',
@@ -489,6 +502,7 @@ pe titlul secțiunii (JavaScript)',
 'create-this-page' => 'Creați această pagină',
 'delete' => 'Ștergere',
 'deletethispage' => 'Șterge pagina',
+'undeletethispage' => 'Recuperează această pagină',
 'undelete_short' => 'Recuperarea {{PLURAL:$1|unei modificări|a $1 modificări|a $1 de modificări}}',
 'viewdeleted_short' => 'Vedeți {{PLURAL:$1|o modificare ștearsă|$1 (de) modificări șterse}}',
 'protect' => 'Protejare',
@@ -542,7 +556,6 @@ $1',
 'disclaimers' => 'Termeni',
 'disclaimerpage' => 'Project:Termeni',
 'edithelp' => 'Ajutor pentru modificare',
-'edithelppage' => 'Help:Cum să modifici o pagină',
 'helppage' => 'Help:Ajutor',
 'mainpage' => 'Pagina principală',
 'mainpage-description' => 'Pagina principală',
@@ -691,6 +704,8 @@ $2',
 'namespaceprotected' => "Nu aveți permisiunea de a modifica pagini din spațiul de nume '''$1'''.",
 'customcssprotected' => 'Nu aveți permisiunea de a modifica această pagină CSS, deoarece conține setările personale ale altui utilizator.',
 'customjsprotected' => 'Nu aveți permisiunea de a modifica această pagină JavaScript, deoarece conține setările personale ale altui utilizator.',
+'mycustomcssprotected' => 'Nu aveți permisiunea să modificați această pagină CSS.',
+'mycustomjsprotected' => 'Nu aveți permisiunea să modificați această pagină JavaScript.',
 'ns-specialprotected' => 'Paginile din spațiul de nume {{ns:special}} nu pot fi editate.',
 'titleprotected' => "Acest titlu a fos protejat la creare de [[User:$1|$1]].
 Motivul invocat este ''$2''.",
@@ -721,10 +736,13 @@ Nu uitați să vă modificați [[Special:Preferences|preferințele]] pentru {{SI
 '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' => 'Ține-mă minte',
-'userlogin-signwithsecure' => 'Autentificare prin serverul securizat',
+'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.',
@@ -739,20 +757,36 @@ Nu uitați să vă modificați [[Special:Preferences|preferințele]] pentru {{SI
 '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'''.",
+'nologin' => 'Nu aveți cont încă? $1.',
 'nologinlink' => 'Creați-vă un cont de utilizator acum',
 'createaccount' => 'Creare cont',
 'gotaccount' => "Aveți deja un cont de utilizator? '''$1'''.",
 'gotaccountlink' => 'Autentificați-vă',
 'userlogin-resetlink' => 'Ați uitat datele de autentificare?',
+'userlogin-resetpassword-link' => 'Resetare parolă',
 'helplogin-url' => 'Help:Autentificare',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajutor la autentificare]]',
-'createaccountmail' => 'Utilizează o parolă temporară aleasă la întâmplare și o trimite la adresa de e-mail specificată mai jos',
+'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.',
@@ -800,7 +834,7 @@ Prin urmare, vizitatorii care folosesc același IP nu mai pot crea alte conturi
 'cannotchangeemail' => 'Adresele de e-mail asociate conturilor nu pot fi schimbate pe acest wiki.',
 'emaildisabled' => 'Acest site nu poate trimite e-mailuri.',
 'accountcreated' => 'Contul a fost creat.',
-'accountcreatedtext' => 'Contul utilizatorului pentru $1 a fost creat.',
+'accountcreatedtext' => 'Contul utilizatorului pentru [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|discuție]]) a fost creat.',
 'createaccount-title' => 'Creare de cont la {{SITENAME}}',
 'createaccount-text' => 'Cineva a creat un cont asociat adresei dumneavoastră de e-mail pe {{SITENAME}} ($4) numit „$2” și având parola „$3”.
 Este de dorit să vă autentificați și să schimbați parola cât mai repede.
@@ -819,10 +853,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ă:',
@@ -835,14 +869,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-emaildisabled' => 'Funcțiile de e-mail au fost dezactivate de pe acest wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1| | Introduceți mai jos o parte din informații}}',
 'passwordreset-username' => 'Nume de utilizator:',
 'passwordreset-domain' => 'Domeniu:',
 'passwordreset-capture' => 'Vizualizați e-mailul rezultat?',
@@ -869,7 +904,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',
@@ -950,14 +985,14 @@ Nu veți putea folosi opțiunea de "trimite e-mail" decât dacă aveți înregis
 Aveți adresa IP $3, iar identificatorul dumneavoastră de blocare este $5.
 Vă rugăm să includeți detaliile de mai sus în orice interogări pe care le faceți.',
 'blockednoreason' => 'nici un motiv oferit',
-'whitelistedittext' => 'Trebuie să $1 pentru a edita articole.',
+'whitelistedittext' => 'Trebuie să vă $1 pentru a putea modifica pagini.',
 'confirmedittext' => 'Trebuie să vă confirmați adresa de e-mail înainte de a edita pagini. Vă rugăm să vă setați și să vă validați adresa de e-mail cu ajutorul [[Special:Preferences|preferințelor utilizatorului]].',
 'nosuchsectiontitle' => 'Secțiunea nu poate fi găsită',
 'nosuchsectiontext' => 'Ați încercat să modificați o secțiune care nu există.
 Aceasta fie a fost mutată, fie a fost ștearsă în timp ce vizualizați pagina.',
 'loginreqtitle' => 'Necesită autentificare',
 'loginreqlink' => 'autentificați',
-'loginreqpagetext' => 'Trebuie să te $1 pentru a vizualiza alte pagini.',
+'loginreqpagetext' => 'Trebuie să  $1 pentru a vizualiza alte pagini.',
 'accmailtitle' => 'Parola a fost trimisă.',
 'accmailtext' => "Parola generată automat pentru [[User talk:$1|$1]] a fost trimisă la $2.
 
@@ -1084,6 +1119,7 @@ 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',
@@ -1296,7 +1332,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)',
@@ -1331,7 +1367,6 @@ Detalii se pot găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE
 'searchmenu-legend' => 'Opțiuni căutare',
 'searchmenu-exists' => "'''Există o pagină cu titlul „[[:$1]]'” pe acest site.'''",
 'searchmenu-new' => "'''Creați pagina „[[:$1]]” pe acest wiki!'''",
-'searchhelp-url' => 'Help:Ajutor',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Răsfoiește paginile cu acest prefix]]',
 'searchprofile-articles' => 'Pagini cu conținut',
 'searchprofile-project' => 'Pagini din spațiile Proiect și Ajutor',
@@ -1381,7 +1416,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ță',
@@ -1518,6 +1553,8 @@ 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ă.',
+'userrights-removed-self' => 'V-ați eliminat cu succes propriile drepturi. Ca urmare, nu mai puteți accesa această pagină.',
 
 # Groups
 'group' => 'Grup:',
@@ -1588,6 +1625,10 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
 'right-editusercssjs' => 'Modifică fișierele CSS și JS ale altor utilizatori',
 'right-editusercss' => 'Modifică fișierele CSS ale altor utilizatori',
 'right-edituserjs' => 'Modifică fișierele JS ale altor utilizatori',
+'right-editmyusercss' => 'Modificați-vă propriile fișiere CSS',
+'right-editmyuserjs' => 'Modificați-vă propriile fișiere JavaScript',
+'right-viewmywatchlist' => 'Vizualizați propria listă de pagini urmărite',
+'right-editmywatchlist' => 'Modificați propria listă de pagini urmărite. Rețineți că anumite acțiuni vor adăuga pagini chiar și fără acest drept.',
 'right-rollback' => 'Revocarea rapidă a modificărilor ultimului utilizator care a modificat o pagină particulară',
 'right-markbotedits' => 'Marchează revenirea ca modificare efectuată de robot',
 'right-noratelimit' => 'Neafectat de limitele raportului',
@@ -1649,6 +1690,8 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
 'action-userrights-interwiki' => 'modificați permisiunile utilizatorilor de pe alte wiki',
 'action-siteadmin' => 'blocați sau deblocați baza de date',
 'action-sendemail' => 'trimite e-mailuri',
+'action-editmywatchlist' => 'vă modificați lista de pagini urmărite',
+'action-viewmywatchlist' => 'vă vizualizați lista de pagini urmărite',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|modificare|modificări|de modificări}}',
@@ -1706,7 +1749,7 @@ Paginile pe care le [[Special:Watchlist|urmăriți]] apar în '''aldine'''.",
 'reuploaddesc' => 'Revocare încărcare și întoarcere la formularul de trimitere.',
 'upload-tryagain' => 'Trimiteți descrierea fișierului modificată',
 'uploadnologin' => 'Nu sunteți autentificat',
-'uploadnologintext' => 'Trebuie să fiți [[Special:UserLogin|autentificat]] pentru a putea trimite fișiere.',
+'uploadnologintext' => 'Trebuie să vă $1 pentru a încărca fișiere.',
 'upload_directory_missing' => 'Directorul în care sunt încărcate fișierele ($1) lipsește și nu poate fi creat de serverul web.',
 'upload_directory_read_only' => 'Directorul de încărcare ($1) nu poate fi scris de server.',
 'uploaderror' => 'Eroare la trimitere fișier',
@@ -2072,7 +2115,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',
@@ -2256,6 +2299,15 @@ Necesită cel puțin un domeniu de nivel superior, cum ar fi „*.org”.<br />
 'listusers-noresult' => 'Nici un utilizator găsit.',
 'listusers-blocked' => '(blocat{{GENDER:$1||ă|}})',
 
+# Special:ActiveUsers
+'activeusers' => 'Listă utilizatori activi',
+'activeusers-intro' => 'Aceasta este o listă cu utilizatorii care au avut orice fel de activitate în {{PLURAL:$1|ultima zi|ultimele $1 zile}}.',
+'activeusers-count' => '{{PLURAL:$1|o acțiune|$1 acțiuni|$1 de acțiuni}} în {{PLURAL:$3|ultima zi|ultimele $3 zile|ultimele $3 de zile}}',
+'activeusers-from' => 'Afișează utilizatori începând cu:',
+'activeusers-hidebots' => 'Ascunde roboții',
+'activeusers-hidesysops' => 'Ascunde administratorii',
+'activeusers-noresult' => 'Niciun utilizator găsit.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Permisiuni grupuri de utilizatori',
 'listgrouprights-summary' => 'Mai jos se află o listă a grupurilor de utilizatori definite în acest wiki, împreună cu permisiunile de acces asociate.
@@ -2333,8 +2385,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}}.',
@@ -2519,7 +2571,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}}'''''.
@@ -2580,7 +2632,7 @@ $1',
 'mycontris' => 'Contribuții',
 'contribsub2' => 'Pentru $1 ($2)',
 'nocontribs' => 'Nu a fost găsită nici o modificare care să satisfacă acest criteriu.',
-'uctop' => '(sus)',
+'uctop' => '(actuală)',
 'month' => 'Din luna (și dinainte):',
 'year' => 'Până în anul:',
 
@@ -2913,6 +2965,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ă',
@@ -3221,11 +3275,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:
 
@@ -3257,7 +3325,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ă',
@@ -3435,7 +3503,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',
@@ -3841,12 +3909,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',
@@ -3939,6 +4012,7 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
 '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 ec1df2d..46a666b 100644 (file)
@@ -132,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}}',
@@ -216,6 +228,7 @@ $messages = array(
 'create-this-page' => "Ccreje 'a pàgene",
 'delete' => 'Scangìlle',
 'deletethispage' => 'Scangille sta pàgene',
+'undeletethispage' => 'Repristine sta pàgene',
 'undelete_short' => "Annulle {{PLURAL:$1|'nu camgiamende|$1 cangiaminde}}",
 'viewdeleted_short' => "Vide {{PLURAL:$1|'nu cangiamende scangellate|$1 cangiaminde scangellate}}",
 'protect' => 'Prutette',
@@ -269,7 +282,6 @@ $1",
 'disclaimers' => 'No ne sacce ninde',
 'disclaimerpage' => 'Project:Scareca uarrile',
 'edithelp' => "Cangianne l'ajute",
-'edithelppage' => 'Help:Cangiaminde',
 'helppage' => 'Help:Condenute',
 'mainpage' => 'Pàgene Prengepàle',
 'mainpage-description' => 'Pàgene Prengepàle',
@@ -426,6 +438,8 @@ $2',
 'namespaceprotected' => "Non ge tine 'u permesse pe cangià pàggene d'u neimspeise '''$1'''.",
 'customcssprotected' => "Non ge tine 'u permesse pe cangià sta pàgene de CSS, purcè tène otre configurazione personale.",
 'customjsprotected' => "Non ge tine 'u permesse pe cangià sta pàgene de Javascript, purcè tène otre configurazione personale.",
+'mycustomcssprotected' => 'Non ge tìne le permesse pe cangià sta pàgene CSS',
+'mycustomjsprotected' => 'Non ge tìne le permesse pe cangià sta pàgene JavaScript',
 'ns-specialprotected' => 'Le pàgene speciale no ponne essere cangete.',
 'titleprotected' => "Stu titele ha state prutette da 'a ccreazione da [[User:$1|$1]].
 'U mutive jè ''$2''.",
@@ -456,10 +470,13 @@ No te sce scurdanne de cangià le [[Special:Preferences|{{SITENAME}} preferenze
 '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' => "Reggistrate cu 'nu server secure",
+'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.',
@@ -480,14 +497,30 @@ No te sce scurdanne de cangià le [[Special:Preferences|{{SITENAME}} preferenze
 '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}}.
 
@@ -548,7 +581,7 @@ Pe piacere mitte l'indirizze a cumme criste cumanne, ce nò no 'u scè mettènne
 'cannotchangeemail' => "Le indirizze e-mail d'u cunde utende non ge ponne essere cangiate sus a sta uicchi.",
 'emaildisabled' => 'Stu site non ge pò mannà e-mail.',
 'accountcreated' => 'cunde utende ccrejete',
-'accountcreatedtext' => "'U cunde utende pe $1 ha state ccrejete.",
+'accountcreatedtext' => "'U cunde utende pe [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|'ngazzaminde]]) ha state ccrejate.",
 'createaccount-title' => "Ccreazzione de 'u cunde utende pe {{SITENAME}}",
 'createaccount-text' => 'Quacchedune ha ccrejete \'nu cunde utende cu l\'indirizze e-mail tue sus a {{SITENAME}} ($4) chiamete "$2", cu password "$3".
 Tu, mò, t\'avisse a collegà e cangià \'a password toje.
@@ -584,14 +617,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-emaildisabled' => "Le funziune de l'email onne state disabbilitate sus a sta uicchi.",
-'passwordreset-pretext' => '{{PLURAL:$1||Mitte une de le stuèzze de le date aqquà sotte}}',
 'passwordreset-username' => 'Nome utende:',
 'passwordreset-domain' => 'Dominie:',
 'passwordreset-capture' => "Vide 'a mail resultande?",
@@ -615,7 +649,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",
@@ -838,6 +872,7 @@ 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",
@@ -1090,7 +1125,6 @@ Le dettaglie le puè acchià jndr'à l'[{{fullurl:{{#Special:Log}}/delete|page={
 'searchmenu-legend' => 'Opzione de ricerche',
 'searchmenu-exists' => "'''Stè 'na pàgene nnumenete \"[[\$1]]\" sus 'a sta Uicchipèdie'''",
 'searchmenu-new' => "'''[[:\$1|Ccreje]] 'a pàgene \"[[:\$1|\$1]]\" sus 'a sta Uicchipèdie!'''",
-'searchhelp-url' => 'Help:Condenute',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Sfogghije le pàggene cu stu prefisse]]',
 'searchprofile-articles' => 'Vôsce',
 'searchprofile-project' => 'Pàggene de ajiute e de pruggette',
@@ -1282,6 +1316,8 @@ 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.',
+'userrights-removed-self' => "T'è luate le deritte tune. Mò non ge puè cchiù trasè jndr'à sta pàgene.",
 
 # Groups
 'group' => 'Gruppe:',
@@ -1352,6 +1388,10 @@ Ce tu 'u mitte, a fatje ca è fatte t'avène ricanusciute.",
 'right-editusercssjs' => "Cange 'u CSS e 'u JS de l'otre utinde",
 'right-editusercss' => "Cange 'u CSS de l'otre utinde",
 'right-edituserjs' => "Cange 'u JS de l'otre utinde",
+'right-editmyusercss' => 'Cange le file tune de CSS',
+'right-editmyuserjs' => 'Cange le file tune de JavaScript',
+'right-viewmywatchlist' => "'Ndruche le pàggene condrollate tune",
+'right-editmywatchlist' => 'Cange le pàggene condrollate tune. Vide bbuene ca certe aziune vonne a aggiungere pàggene pure ca non ge stonne le deritte.',
 'right-rollback' => "Annulle velocemende le cangiaminde de l'urteme utende ca ha cangiate 'na pàgena particolare",
 'right-markbotedits' => 'Marche le cangiaminde annullate cumme cangiaminde de bot',
 'right-noratelimit' => "Non g'à state tuccate da le limite de le pundegge",
@@ -1413,6 +1453,8 @@ Ce tu 'u mitte, a fatje ca è fatte t'avène ricanusciute.",
 'action-userrights-interwiki' => "cange le deritte de l'utende de l'utinde de le otre Uicchi",
 'action-siteadmin' => "blocche o sblocche 'u database",
 'action-sendemail' => 'manne e-mail',
+'action-editmywatchlist' => 'cange le pàggene condrollate tune',
+'action-viewmywatchlist' => "'ndruche le pàggene condrollate tune",
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|cangiaminde|cangiaminde}}',
@@ -2035,6 +2077,15 @@ Onne abbesogne almene de \'nu dominie de levèlle ierte, pe esembie "*.org". <br
 'listusers-noresult' => 'Nisciune utende acchiete.',
 'listusers-blocked' => '(bloccate)',
 
+# Special:ActiveUsers
+'activeusers' => "Liste de l'utinde attive",
+'activeusers-intro' => "Queste jè 'n'elenghe de utinde ca avene fatte certe tipe de attività fine a l'urteme $1 {{PLURAL:$1|sciurne|sciurne}}.",
+'activeusers-count' => "$1 {{PLURAL:$1|cangiamende|cangiaminde}} jndr'à l'urteme {{PLURAL:$3|sciurne}}",
+'activeusers-from' => "Fà vedè l'utinde partenne da:",
+'activeusers-hidebots' => 'Scunne le bot',
+'activeusers-hidesysops' => 'Scunne le amministrature',
+'activeusers-noresult' => 'Nisciune utende acchiate.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Deritte de le gruppe utinde',
 'listgrouprights-summary' => "'A liste ca ste vide ète 'na liste de le gruppe utinde ccreiate sus a sta Uicchi, cu le lore deritte d'accesse associate.
@@ -2115,8 +2166,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}}.",
@@ -2375,7 +2426,7 @@ $1",
 'mycontris' => 'Condrebbute mie',
 'contribsub2' => 'Pe $1 ($2)',
 'nocontribs' => 'Nisciune cangiamende ha state acchiate cu ste criterie.',
-'uctop' => '(sus)',
+'uctop' => '(de mò)',
 'month' => "Da 'u mese (e cchiù recende):",
 'year' => "Da l'anne (e cchiù recende):",
 
@@ -2709,6 +2760,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",
@@ -2868,7 +2921,6 @@ Permette de aggiungere 'nu mutive jndr'à 'u riepileghe",
 '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 */",
@@ -3045,11 +3097,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:
 
@@ -3059,8 +3125,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',
@@ -3136,7 +3200,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',
@@ -3329,7 +3393,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",
@@ -3864,12 +3928,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',
@@ -3962,6 +4031,7 @@ Le immaggine sonde fatte vedè jndr'à resoluziona megghie, otre tipe de file re
 '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 045f0a7..3276e05 100644 (file)
@@ -15,6 +15,7 @@
  * @author AlexSm
  * @author Alexander Sigachov (alexander.sigachov@gmail.com)
  * @author Alexandr Efremov
+ * @author Altai uul
  * @author Amikeco
  * @author Amire80
  * @author Anonim.one
@@ -40,6 +41,7 @@
  * @author Flrn
  * @author G0rn
  * @author Gazeb
+ * @author Geitost
  * @author Grigol
  * @author Haffman
  * @author HalanTul
@@ -47,6 +49,7 @@
  * @author Ignatus
  * @author Illusion
  * @author Iltever
+ * @author Iluvatar
  * @author Incnis Mrsi
  * @author Iniquity
  * @author Innv
  * @author KorneySan
  * @author Kv75
  * @author Lockal
+ * @author Lunacy1911
+ * @author Matma Rex
  * @author MaxBioHazard
  * @author MaxSem
  * @author NBS
+ * @author Nemo bis
  * @author Ola
  * @author Ole Yves
  * @author Putnik
@@ -80,6 +86,8 @@
  * @author Александр Сигачёв
  * @author Гусейн
  * @author ОйЛ
+ * @author Умар
+ * @author Чаховіч Уладзіслаў
  * @author לערי ריינהארט
  * @author გიორგიმელა
  */
@@ -117,16 +125,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( 'Тупиковые_страницы' ),
@@ -136,9 +145,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( 'Список_администраторов' ),
@@ -153,7 +165,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( 'Моя_страница' ),
@@ -165,9 +183,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( 'Удаление_правки' ),
@@ -182,6 +202,7 @@ $specialPageAliases = array(
        'Uncategorizedpages'        => array( 'Некатегоризованные_страницы' ),
        'Uncategorizedtemplates'    => array( 'Некатегоризованные_шаблоны' ),
        'Undelete'                  => array( 'Восстановить', 'Восстановление' ),
+       'Unlockdb'                  => array( 'Разблокировка_БД' ),
        'Unusedcategories'          => array( 'Неиспользуемые_категории' ),
        'Unusedimages'              => array( 'Неиспользуемые_файлы' ),
        'Unusedtemplates'           => array( 'Неиспользуемые_шаблоны' ),
@@ -240,6 +261,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' ),
@@ -287,6 +309,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' ),
@@ -348,6 +371,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' ),
 );
 
 
@@ -504,7 +531,7 @@ $messages = array(
 'feb' => 'фев',
 'mar' => 'мар',
 'apr' => 'апр',
-'may' => 'мая',
+'may' => 'май',
 'jun' => 'июн',
 'jul' => 'июл',
 'aug' => 'авг',
@@ -512,6 +539,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|Категория|Категории}}',
@@ -563,7 +602,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' => 'Просмотр разметки',
@@ -593,6 +632,7 @@ $messages = array(
 'create-this-page' => 'Создать эту страницу',
 'delete' => 'Удалить',
 'deletethispage' => 'Удалить эту страницу',
+'undeletethispage' => 'Восстановить эту страницу',
 'undelete_short' => 'Восстановить $1 {{PLURAL:$1|правку|правки|правок}}',
 'viewdeleted_short' => 'Просмотр $1 {{PLURAL:$1|удалённой правки|удалённых правок|удалённых правок}}',
 'protect' => 'Защитить',
@@ -646,7 +686,6 @@ $1',
 'disclaimers' => 'Отказ от ответственности',
 'disclaimerpage' => 'Project:Отказ от ответственности',
 'edithelp' => 'Справка по редактированию',
-'edithelppage' => 'Help:Редактирование',
 'helppage' => 'Help:Содержание',
 'mainpage' => 'Заглавная страница',
 'mainpage-description' => 'Заглавная страница',
@@ -669,7 +708,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|последнее изменение|последние изменения}}',
@@ -794,6 +833,8 @@ $2',
 'namespaceprotected' => 'У вас нет разрешения редактировать страницы в пространстве имён «$1».',
 'customcssprotected' => 'У вас нет разрешения редактировать эту CSS-страницу, так как она содержит личные настройки другого участника.',
 'customjsprotected' => 'У вас нет разрешения редактировать эту JavaScript-страницу, так как она содержит личные настройки другого участника.',
+'mycustomcssprotected' => 'У вас нет прав для редактирования этого CSS страницы.',
+'mycustomjsprotected' => 'У вас нет прав для редактирования JavaScript на странице.',
 'ns-specialprotected' => 'Страницы пространства имён «{{ns:special}}» не могут правиться.',
 'titleprotected' => "Создание страницы с таким заголовком было запрещено участником [[Участник:$1|$1]].
 Указана следующая причина: ''$2''.",
@@ -819,9 +860,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' => 'Вы не можете изменить пароль в этой вики.',
@@ -834,18 +884,38 @@ $2',
 'logout' => 'Завершение сеанса',
 'userlogout' => 'Завершение сеанса',
 'notloggedin' => 'Вы не представились системе',
+'userlogin-noaccount' => 'Нет учетной записи?',
+'userlogin-joinproject' => 'Присоединиться к {{grammar:genitive|{{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' => 'Введённое имя участника уже используется.
 Пожалуйста, выберите другое имя.',
 'loginerror' => 'Ошибка опознавания участника',
+'createacct-error' => 'Ошибка создания учетной записи',
 'createaccounterror' => 'Невозможно создать учётную запись: $1',
 'nocookiesnew' => 'Участник зарегистрирован, но не представлен. {{SITENAME}} использует «cookies» для представления участников. У вас «cookies» запрещены. Пожалуйста, разрешите их, а затем представьтесь со своиим новым именем участника и паролем.',
 'nocookieslogin' => '{{SITENAME}} использует «cookies» для представления участников. Вы их отключили. Пожалуйста, включите их и попробуйте снова.',
@@ -898,7 +968,7 @@ $2',
 'cannotchangeemail' => 'Адреса электронной почты этой учётной записи не могут быть изменены в этой вики.',
 'emaildisabled' => 'Этот сайт не может отправлять сообщения электронной почты.',
 'accountcreated' => 'Учётная запись создана',
-'accountcreatedtext' => 'Создана учётная запись участника $1.',
+'accountcreatedtext' => 'Создана учётная запись участника [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|обс.]]).',
 'createaccount-title' => '{{SITENAME}}: создание учётной записи',
 'createaccount-text' => 'Кто-то создал учётную запись «$2» на сервере проекта {{SITENAME}} ($4), указав ваш адрес электронной почты. 
 
@@ -934,13 +1004,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' => 'Просмотреть получившееся письмо?',
@@ -969,7 +1041,7 @@ $2
 Временный пароль: $2',
 'passwordreset-emailsent' => 'Отправлено электронное письмо с информацией о сбросе пароля.',
 'passwordreset-emailsent-capture' => 'Отправлено электронное письмо с информацией о сбросе пароля, текст которого можно увидеть ниже.',
-'passwordreset-emailerror-capture' => 'Было создано электронное письмо с информацией о сбросе пароля, текст которого можно увидеть ниже. Однако его не удалось отправить по следующей причине: $1',
+'passwordreset-emailerror-capture' => 'Было создано электронное письмо с информацией о сбросе пароля, текст которого можно увидеть ниже, однако его не удалось отправить {{GENDER:$2|участнику|участнице}} по следующей причине: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Изменить адрес электронной почты',
@@ -1184,6 +1256,7 @@ $2
 Вероятно, она была удалена.',
 'edit-conflict' => 'Конфликт редактирования.',
 'edit-no-change' => 'Ваша правка была отклонена, так как в тексте не было сделано изменений.',
+'postedit-confirmation' => 'Ваша правка сохранена.',
 'edit-already-exists' => 'Невозможно создать новую страницу.
 Она уже существует.',
 'defaultmessagetext' => 'Текст по умолчанию',
@@ -1191,7 +1264,7 @@ $2
 'invalid-content-data' => 'Недопустимые данные',
 'content-not-allowed-here' => 'Содержимое "$1" недопустимо на странице [[$2]]',
 'editwarning-warning' => 'Переход на другую страницу может привести к потере сделанных вами изменений.
-Если вы зарегистрированы в системе, то вы можете отключить это предупреждение в разделе «{{int:prefs-editing}}» ваших настроек.',
+Если вы зарегистрированы в системе, то вы можете отключить это предупреждение в разделе «Редактирование» ваших настроек.',
 
 # Content models
 'content-model-wikitext' => 'вики-текст',
@@ -1431,7 +1504,6 @@ $1",
 'searchmenu-legend' => 'Настройки поиска',
 'searchmenu-exists' => "'''В этой вики есть страница «[[:$1]]»'''",
 'searchmenu-new' => "'''Создать страницу «[[:$1]]» в этом вики-проекте!'''",
-'searchhelp-url' => 'Help:Содержание',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Показать страницы с этим префиксом]]',
 'searchprofile-articles' => 'Основные страницы',
 'searchprofile-project' => 'Страницы справки и проекта',
@@ -1617,6 +1689,8 @@ $1",
 'userrights-notallowed' => 'С вашей учётной записи не разрешено добавлять и удалять права участников.',
 'userrights-changeable-col' => 'Группы, которые вы можете изменять',
 'userrights-unchangeable-col' => 'Группы, которые вы не можете изменять',
+'userrights-conflict' => 'Конфликт прав участника! Пожалуйста, примените изменения заново.',
+'userrights-removed-self' => 'Вы успешно удалили собственные права. Таким образом, вы больше не сможете получить доступ к этой странице.',
 
 # Groups
 'group' => 'Группа:',
@@ -1687,6 +1761,10 @@ $1",
 'right-editusercssjs' => 'правка CSS- и JS-файлов других участников',
 'right-editusercss' => 'правка CSS-файлов других участников',
 'right-edituserjs' => 'правка JavaScript-файлов других участников',
+'right-editmyusercss' => 'Редактирование файлов CSS пользователя',
+'right-editmyuserjs' => 'Редактировать свои пользовательские JavaScript-файлы',
+'right-viewmywatchlist' => 'Посмотреть свой список наблюдения',
+'right-editmywatchlist' => 'Редактировать свой список наблюдения. Обратите внимание, что некоторые действия будут добавлять страницы даже без такого права.',
 'right-rollback' => 'быстрый откат правок последнего участника на определенной странице',
 'right-markbotedits' => 'отметка откатываемых правок как правок бота',
 'right-noratelimit' => 'нет ограничений по скорости',
@@ -1748,6 +1826,8 @@ $1",
 'action-userrights-interwiki' => 'изменение прав участников в других вики',
 'action-siteadmin' => 'блокировка и разблокировка базы данных',
 'action-sendemail' => 'отправка электронных писем',
+'action-editmywatchlist' => 'редактирование вашего списка наблюдения',
+'action-viewmywatchlist' => 'просмотр вашего списка наблюдения',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|изменение|изменения|изменений}}',
@@ -1803,8 +1883,7 @@ $1",
 'reuploaddesc' => 'Вернуться к форме загрузки',
 'upload-tryagain' => 'Отправить изменённое описание файла',
 'uploadnologin' => 'Вы не представились системе',
-'uploadnologintext' => 'Вы должны [[Special:UserLogin|представиться системе]],
-чтобы загружать файлы на сервер.',
+'uploadnologintext' => 'Вы должны $1, чтобы загружать файлы на сервер.',
 'upload_directory_missing' => 'Директория для загрузок ($1) отсутствует и не может быть создана веб-сервером.',
 'upload_directory_read_only' => 'Веб-сервер не имеет прав записи в папку ($1), в которой предполагается хранить загружаемые файлы.',
 'uploaderror' => 'Ошибка загрузки файла',
@@ -1936,7 +2015,7 @@ $1',
 'upload-file-error-text' => 'Внутренняя ошибка при попытке создать временный файл на сервере.
 Пожалуйста, обратитесь к [[Special:ListUsers/sysop|администратору]].',
 'upload-misc-error' => 'Неизвестная ошибка загрузки',
-'upload-misc-error-text' => 'Неизвестная ошибка загрузки. Пожалуйста, проверьте, что адрес верен, и повторите попытку. Если проблема остаётся, обратитесь к системному администратору.',
+'upload-misc-error-text' => 'Неизвестная ошибка загрузки. Пожалуйста, проверьте, что адрес верен, и повторите попытку. Если проблема остаётся, обратитесь к [[Special:ListUsers/sysop|администратору]].',
 'upload-too-many-redirects' => 'URL содержит слишком много перенаправлений',
 'upload-unknown-size' => 'Неизвестный размер',
 'upload-http-error' => 'Произошла ошибка HTTP: $1',
@@ -2353,6 +2432,15 @@ $1',
 'listusers-noresult' => 'Не найдено участников.',
 'listusers-blocked' => '(заблокирован{{GENDER:$1||а}})',
 
+# Special:ActiveUsers
+'activeusers' => 'Список активных участников',
+'activeusers-intro' => 'Это список участников, совершавших какие-либо действия за {{PLURAL:$1|последний $1 день|последние $1 дня|последние $1 дней}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|правка|правки|правок}} за {{PLURAL:$3|$3 последний день|последние $3 дня|последние $3 дней}}',
+'activeusers-from' => 'Показать участников, начиная с:',
+'activeusers-hidebots' => 'Скрыть ботов',
+'activeusers-hidesysops' => 'Скрыть администраторов',
+'activeusers-noresult' => 'Не найдено участников.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Права групп участников',
 'listgrouprights-summary' => 'Ниже представлен список определённых в этой вики групп участников, указаны соответствующие им права доступа.
@@ -2432,8 +2520,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|страница|страницы|страниц}}.',
@@ -2680,7 +2768,7 @@ $1',
 'mycontris' => 'Вклад',
 'contribsub2' => 'Вклад $1 ($2)',
 'nocontribs' => 'Изменений, соответствующих заданным условиям, найдено не было.',
-'uctop' => '(последняя)',
+'uctop' => '(текущая)',
 'month' => 'С месяца (и ранее):',
 'year' => 'С года (и ранее):',
 
@@ -3007,6 +3095,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' => 'Не удаётся создать временный файл эскиза',
@@ -3159,7 +3249,6 @@ $1',
 '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 будет применяться только для ботов */',
@@ -3336,11 +3425,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' => 'Формат должен быть следующим:
 
@@ -3368,7 +3471,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Ширина',
 'exif-imagelength' => 'Высота',
 'exif-bitspersample' => 'Глубина цвета',
@@ -3547,7 +3650,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, факсовое кодирование',
@@ -4045,12 +4148,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' => 'Поиск одинаковых файлов',
@@ -4143,6 +4251,7 @@ MediaWiki распространяется в надежде, что она бу
 'htmlform-selectorother-other' => 'Иное',
 'htmlform-no' => 'Нет',
 'htmlform-yes' => 'Да',
+'htmlform-chosen-placeholder' => 'Выберите вариант',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 с поддержкой полнотекстового поиска',
index 25f1bef..b5583ce 100644 (file)
@@ -225,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|Катеґорія|Катеґорії}}',
@@ -306,6 +318,7 @@ $messages = array(
 'create-this-page' => 'Створити тоту сторінку',
 'delete' => 'Вымазати',
 'deletethispage' => 'Змазати тоту сторінку',
+'undeletethispage' => 'Обновити тоту сторінку',
 'undelete_short' => 'Обновити $1 {{PLURAL:$1|верзію|верзії|верзії}}',
 'viewdeleted_short' => 'Видїти {{PLURAL:$1|змазанов едітаціёв|$1 змазаны едітації|$1 змазаных едітацій}}',
 'protect' => 'Всокотити',
@@ -359,14 +372,13 @@ $1',
 'disclaimers' => 'Вылучіня одповідности',
 'disclaimerpage' => 'Project:Вылучіня одповідности',
 'edithelp' => 'Поміч едітованя',
-'edithelppage' => 'Help:Едітованя',
 'helppage' => 'Help:Обсяг',
 'mainpage' => 'Головна сторінка',
 'mainpage-description' => 'Головна сторінка',
 '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".
@@ -506,6 +518,8 @@ $2',
 'namespaceprotected' => 'Не маєте права едітовати сторінкы в просторї  назв «$1».',
 'customcssprotected' => 'Не маєте права едітовати тоту сторінку з CSS, бо обсягує персоналны наставлїна іншого хоснователя.',
 'customjsprotected' => 'Не маєте права едітовати тоту сторінку з JavaScript-ом, бо обсягує персоналны наставлїна іншого хоснователя.',
+'mycustomcssprotected' => 'Не мате права на управы той CSS сторінкы.',
+'mycustomjsprotected' => 'Не мате права на едітованя той JavaScript сторінкы.',
 'ns-specialprotected' => 'Шпеціалны сторінкы не є можне едітовати.',
 'titleprotected' => "Створїня сторінкы з таков назвов было заборонене хоснователём [[User:$1|$1]] з причінов: ''$2''.",
 'filereadonlyerror' => "Не годно змінити файл „$1“, бо архів файлів „$2“ є теперь лем на чітаня.
@@ -529,9 +543,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 +567,38 @@ $2',
 'logout' => 'Одголосити',
 'userlogout' => 'Одголошіня',
 'notloggedin' => 'Не сьте приголошеный(а)',
+'userlogin-noaccount' => 'Не мате конто?',
+'userlogin-joinproject' => 'Придайте ся {{grammar:3sg|{{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' => '{{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 выпнуты .
@@ -606,7 +649,7 @@ $2',
 'cannotchangeemail' => 'В тій вікі не годен мінити імейловы адресы.',
 'emaildisabled' => 'Сесь сервер не годен одосылати імейлы.',
 'accountcreated' => 'Конто вытворене',
-'accountcreatedtext' => 'Конто хоснователя $1 было вытворене.',
+'accountcreatedtext' => 'Конто хоснователя [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]])  было створене.',
 'createaccount-title' => 'Вытвориня конта про  {{SITENAME}}',
 'createaccount-text' => 'Хтось створив про Вас конто «$2» на сервері проєкту {{SITENAME}} ($4) з геслом «$3», і зазначів вашу адресу електронічной пошты. Мали бы сьте ся што найскоре приголосити і змінити гесло.
 
@@ -639,30 +682,29 @@ $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) пожадав о припомянутя інформацій ку вашому 
-конту на {{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
 
@@ -673,8 +715,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' => 'Зміна імейловой адресы',
@@ -837,7 +879,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' => "'''Увага: Тота сторінка была замкнута, также єй можуть едітовати лем адміністраторы.'''
@@ -873,6 +915,7 @@ $2
 Асі была змазана.',
 'edit-conflict' => 'Конфлікт едітованя.',
 'edit-no-change' => 'Ваша едітація была іґнорована, бо ся не зробила жадна зміна тексту.',
+'postedit-confirmation' => 'Ваше едітованя было уложене.',
 'edit-already-exists' => 'Не вдало ся створити нову сторінку, бо она уж існує.',
 'defaultmessagetext' => 'Преднаставленый текст повідомлїня',
 'content-failed-to-parse' => 'Не вдало ся проаналізовати $2 як тіп $1: $3',
@@ -1026,7 +1069,7 @@ $1",
 $1",
 'revdel-restore' => 'Змінити видимость',
 'revdel-restore-deleted' => 'вылучены ревізії',
-'revdel-restore-visible' => 'видительны ревізії',
+'revdel-restore-visible' => 'видимы ревізії',
 'pagehist' => 'Історія сторінкы',
 'deletedhist' => 'Вымазана історія',
 'revdelete-hide-current' => 'Хыба сховаваня положкы з $1 $2: їднать ся о сучасну ревізію.
@@ -1119,7 +1162,6 @@ $1",
 'searchmenu-legend' => 'Параметры гляданя',
 'searchmenu-exists' => "'''У тій вікі є сторінка з назвов «[[:$1]]»'''",
 'searchmenu-new' => "'''Створити сторінку «[[:$1]]» у тій вікі!'''",
-'searchhelp-url' => 'Help:Обсяг',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Вказати сторінкы з тым префіксом]]',
 'searchprofile-articles' => 'Статї',
 'searchprofile-project' => 'Сторінкы помочі і проєкту',
@@ -1141,7 +1183,7 @@ $1",
 'search-interwiki-default' => '$1 резултаты:',
 'search-interwiki-more' => '(веце)',
 'search-relatedarticle' => 'Звязаный',
-'mwsuggest-disable' => 'Выпнути пораду AJAX',
+'mwsuggest-disable' => 'Выпнути пораду під час гляданя',
 'searcheverything-enable' => 'Глядати во вшыткых просторах назв',
 'searchrelated' => 'звязаный',
 'searchall' => 'вшыткы',
@@ -1161,6 +1203,7 @@ $1",
 'powersearch-togglenone' => 'Жадный',
 'search-external' => 'Екстерне гляданя',
 'searchdisabled' => '<p>Перебачте. Повнотекстове гляданя є дочасно недоступне. Затля можете спробовати гляданя Google; є але можне, же ёго резултаты не мусять быти актуалны.</p>',
+'search-error' => 'Як ся глядало трафіла ся хыба: $1',
 
 # Preferences page
 'preferences' => 'Наставлїня',
@@ -1304,6 +1347,8 @@ $1",
 'userrights-notallowed' => 'Ваше конто не має права придати або одстранити хосновательскы права.',
 'userrights-changeable-col' => 'Ґрупы, котры можете змінити',
 'userrights-unchangeable-col' => 'Ґрупы, котры не можете змінити',
+'userrights-conflict' => 'Конфлікт прав хоснователїв! Учіньте потрібны зміны іщі раз.',
+'userrights-removed-self' => 'Вы успішно позбавили ся властных прав. Зато уж веце не мате приступ до той сторінкы.',
 
 # Groups
 'group' => 'Ґрупа:',
@@ -1375,6 +1420,8 @@ $1",
 'right-editusercssjs' => 'Едітованя CSS і JS файлів іншых хоснователїв',
 'right-editusercss' => 'Едітованя CSS файлів іншых хоснователїв',
 'right-edituserjs' => 'Едітованя JS файлів іншых хоснователїв',
+'right-editmyusercss' => 'Едітовати вашы властны хосновательскы CSS файлы.',
+'right-editmyuserjs' => 'Едітовати вашы властны хосновательскы JavaScript файлы',
 'right-rollback' => 'Швыдкый реверт управ послїднёго хоснователя едітуючого дану сторінку',
 'right-markbotedits' => 'Означованя ревертів як едітованя робота',
 'right-noratelimit' => 'Не має обмеджіня в швыдкости',
@@ -1850,6 +1897,12 @@ $1',
 Асі намісто того мали бы одказовати на конкретнїшу сторінку.<br />
 Сторінка є тримана за чеперушку, кідь хоснує дакотру із шаблон одказованых на [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Сторінкы з властностями',
+'pageswithprop-legend' => 'Сторінкы з властностёв',
+'pageswithprop-text' => 'Тота сторінка обсягує список сторінкы, што хоснують вызначену властность сторінкы.',
+'pageswithprop-prop' => 'Назва властности:',
+'pageswithprop-submit' => 'Выконати',
+
 'doubleredirects' => 'Двоїты напрямлїня',
 'doubleredirectstext' => 'На тій сторінцї є список напрямлїн ведучіх на далшы напрямлїня.
 Каждый рядок обсягує одказ на перше і друге напрямлїня і ку тому ціль другого напрямлїня, котрый звычайно вказує мено „реалной“ цілёвой сторінкы, на котру бы ся мало перше напрямлїня одказовати.
@@ -2002,7 +2055,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' => 'Заступны сімболы може хосновати лем на початку доменового мена.',
 
@@ -2012,6 +2065,15 @@ $1',
 'listusers-noresult' => 'Ненайдженый жаден хоснователь.',
 'listusers-blocked' => '({{GENDER:$1|заблокованый|заблокована|заблокованый}})',
 
+# Special:ActiveUsers
+'activeusers' => 'Список актівных хоснователїв',
+'activeusers-intro' => 'Тото є список хоснователїв, котры были даяк актівны за {{plural:$1|остатнїй день|остатных $1 днїв}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|дїя|дїї|дїй}} через {{PLURAL:$3|остатнёго дня|остатнїх  $3 днїв}}',
+'activeusers-from' => 'Вказати хоснователїв, што ся зачінають на:',
+'activeusers-hidebots' => 'Сховати ботів',
+'activeusers-hidesysops' => 'Сховати адміністраторів',
+'activeusers-noresult' => 'Ненайдженый жаден хоснователь.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Права ґруп хоснователїв',
 'listgrouprights-summary' => 'Тото є список ґруп хоснователїв дефінованых на тій вікіi і&nbsp;їх приступовых прав.
@@ -2070,7 +2132,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' => 'Ваш список слїдованых сторінок є порожнїй.',
@@ -2216,6 +2278,8 @@ $UNWATCHURL
 'prot_1movedto2' => '«[[$1]]» переменована на «[[$2]]»',
 'protect-badnamespace-title' => 'Незамыкательный простор назв',
 'protect-badnamespace-text' => 'Сторінкы в тім просторї назв не годен замыкати.',
+'protect-norestrictiontypes-text' => 'Тоту сторінку не годен сокотити, бо не суть ниякы тіпы обмеджіня.',
+'protect-norestrictiontypes-title' => 'Сторінка, яку не годен замкнути',
 'protect-legend' => 'Потвердити замкнутя',
 'protectcomment' => 'Причіна:',
 'protectexpiry' => 'Кінчіть:',
@@ -2230,9 +2294,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',
@@ -2331,7 +2395,7 @@ $1',
 'mycontris' => 'Приспівкы',
 'contribsub2' => 'Приспівок $1 ($2)',
 'nocontribs' => 'Ненайджены жадны зміны за тыма крітеріями.',
-'uctop' => ' (послїдня)',
+'uctop' => '(остатня)',
 'month' => 'Од місяця (і скоре):',
 'year' => 'Од року (і скоре):',
 
@@ -2493,6 +2557,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:|заблокованый|заблокована|заблокованый}}',
@@ -2520,14 +2585,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нуючу сторінку.
 
 '''ВАРОВАНЯ!'''
 Тота дїя може ся стати причінов серіозных а неочекованых змін популарных сторінок.
@@ -2654,6 +2719,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' => 'Дочасный файл нагляду негодно было створити',
@@ -2763,7 +2830,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 канал гевсёй сторінкы',
@@ -2839,6 +2906,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|ненапрямлїня}})',
@@ -2853,6 +2921,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' => 'інформація',
@@ -2861,6 +2930,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' => 'Означіти як перевірене',
@@ -2938,15 +3011,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
@@ -2970,7 +3059,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Шырька',
 'exif-imagelength' => 'Вышка',
 'exif-bitspersample' => 'Глубка фарбы',
@@ -3148,7 +3237,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',
@@ -3555,11 +3644,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' => 'Гляданя дуплікатных файлів',
@@ -3587,7 +3682,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' => 'Протиспамовы інштрументы',
 
@@ -3650,23 +3745,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' => 'імя хоснователя сховане',
@@ -3675,19 +3773,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
@@ -3742,6 +3841,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“',
@@ -3762,4 +3862,7 @@ MediaWiki є дістрібуована в надїї, же буде хосно
 'duration-centuries' => '$1 {{PLURAL:$1|стороча|стороча|стороч}}',
 'duration-millennia' => '$1 {{PLURAL:$1|тісячроча|тісячроча|тісячроч}}',
 
+# Image rotation
+'rotate-comment' => 'Образчік обернутый о $1 {{PLURAL:$1|ґрадус|ґрадусів}} за цайґером',
+
 );
index 10337e8..f5f151f 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' => 'कदापि न',
@@ -519,7 +518,6 @@ $1',
 'disclaimers' => 'प्रत्याख्यानम्',
 'disclaimerpage' => 'Project:साधारणं प्रत्याख्यानम्',
 'edithelp' => 'सम्पादनार्थं सहाय्यम्',
-'edithelppage' => 'Help:सम्पादनम्',
 'helppage' => 'Help:आन्तर्यम्',
 'mainpage' => 'मुख्यपृष्ठम्',
 'mainpage-description' => 'मुख्यपृष्ठम्',
@@ -684,9 +682,15 @@ $2',
 'welcomecreation-msg' => 'भवतः लेखा रचिताऽस्ति।
 स्वकीयानां [[Special:Preferences|{{SITENAME}} इष्टतमानां]]. निगदनं मा विस्मर्यताम्।',
 'yourname' => 'योजकनामन्:',
+'userlogin-yourname' => 'प्रयोक्तुः नाम',
+'userlogin-yourname-ph' => 'स्वकीयं प्रयोक्तृनाम दीयताम्',
 'yourpassword' => 'कूटशब्दः',
+'userlogin-yourpassword-ph' => 'स्वकीयं कूटशब्दं दीयताम्',
+'createacct-yourpassword-ph' => 'कूटशब्दः प्रविश्यताम्',
 'yourpasswordagain' => 'कूटशब्दः पुनः लिख्यताम् ।',
+'createacct-yourpasswordagain-ph' => 'कूटशब्दः पुनः प्रविश्यताम्',
 'remembermypassword' => 'अस्मिन् सङ्गणके मम प्रवेशः स्मर्यताम् (अधिकतमम् $1 {{PLURAL:$1|दिनम्|दिनानि}})',
+'userlogin-remembermypassword' => 'अहं प्रविष्टमेव तिष्ठेयम्',
 'securelogin-stick-https' => 'प्रवेशोपरान्तं एचटीटीपीएस(HTTPS) इत्यनेन सह संबद्धः तिष्ठतु।',
 'yourdomainname' => 'भवतः प्रक्षेत्रम्:',
 'password-change-forbidden' => 'अस्यां विक्यां निकुञ्चं परिवर्तयितुं न शक्नोति ।',
@@ -699,14 +703,19 @@ $2',
 'logout' => 'निर्गमनम्',
 'userlogout' => 'निर्गमनम्',
 'notloggedin' => 'नैव प्रविष्टः',
+'userlogin-noaccount' => 'सदस्यता नास्ति किम्?',
 'nologin' => 'पूर्वमेव योजकः नास्ति किम् ? $1।',
 'nologinlink' => 'सदस्यता प्राप्यताम्',
 'createaccount' => 'सदस्यता प्राप्यताम्',
 'gotaccount' => 'पूर्वमेव योजकः अस्ति किम् ? $1।',
 'gotaccountlink' => 'प्रविश्यताम्',
 'userlogin-resetlink' => 'प्रवेशविवरणानि विस्मृतानि किम् ?',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|प्रवेशनार्थं सहायता]]',
+'createacct-join' => 'स्वकीया सूचना अधस्तात् प्रवेश्यताम्।',
 'createaccountmail' => 'ईपत्रद्वारा',
 'createaccountreason' => 'कारणम्',
+'createacct-reason' => 'कारणम्',
+'createacct-reason-ph' => 'भवान् अन्यां लेखां किमर्थं रचितुमिच्छसि?',
 'badretype' => 'भवता प्रदत्ते कूटशब्दे न खलु समाने स्तः। कृपया पुनः लिखतु।',
 'userexists' => 'भवतः प्रदत्तः प्रयोक्तृनाम अन्येन प्रयुज्यमानम् अस्ति। कृपया अन्यदेकं प्रयोक्तृनाम चिनोतु।',
 'loginerror' => 'प्रवेशने प्रमादः',
@@ -810,10 +819,8 @@ You may ignore this message, if this account was created in error.',
 
 # Special:PasswordReset
 'passwordreset' => 'कूटशब्द पुनःस्थापनम्',
-'passwordreset-text' => 'भवतः सदस्यताविवरणानि ईपत्रद्वारा प्राप्तुम् इदं प्रपत्रं पूर्यताम् ।',
 'passwordreset-legend' => 'कूटशब्द पुनःस्थापनम्',
 'passwordreset-disabled' => 'अस्मिन् विक्यां कूटशब्द पुनःस्थापनं असमर्थीकृतमस्ति।',
-'passwordreset-pretext' => '{{PLURAL:$1| |समंकेषु एकम् अधस्यात् प्रविष्टीकरोतु।}}',
 'passwordreset-username' => 'योजकनामन्:',
 'passwordreset-domain' => 'क्षेत्रम्:',
 'passwordreset-capture' => 'फलितरूपम् ईपत्रं किं दृश्यते ?',
@@ -1039,6 +1046,8 @@ $2
 'defaultmessagetext' => 'सन्देशपाठं स्थिरयतु ।',
 'invalid-content-data' => 'अमान्यः सामग्रीदत्तांशः',
 'content-not-allowed-here' => '[[$2]] इति पृष्ठे "$1" सामग्री अनुमता नास्ति।',
+'editwarning-warning' => 'अस्मात् पृष्ठात् गमनेन अत्र भवता कृतानि परिवर्तनानि निष्फलानि भवेयुः ।
+भवता यदि प्रविष्टं तर्हि मम इष्टतमानि इत्यत्र अस्मिन् विभागे सम्पादनेन एषः प्रबोधः यथा न आगच्छेत् तथा कर्तुं शक्यते ।',
 
 # Content models
 'content-model-wikitext' => 'विकिपाठः',
@@ -1260,7 +1269,6 @@ You can still [$1 view this revision]",
 'searchmenu-legend' => 'अन्वेषणस्य विकल्पाः ।',
 'searchmenu-exists' => 'अस्मिन् विकिमध्ये "[[:$1]]"नामकं पृष्ठं विद्यते।',
 'searchmenu-new' => "'''अस्यां विक्यां \"[[:\$1]]\" इति पृष्ठं सृज्यताम्!'''",
-'searchhelp-url' => 'Help: साहाय्यम् : आधेयाः ।',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|एतदुपसर्गयुक्तपुटं पश्यतु ]]',
 'searchprofile-articles' => 'आन्तर्यम्',
 'searchprofile-project' => 'सहायता प्रकल्पपृष्ठानि च',
@@ -1306,15 +1314,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' => 'मम इष्टतमानि',
@@ -2180,6 +2179,15 @@ See https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'listusers-noresult' => 'योजकः न प्राप्तः ।',
 'listusers-blocked' => 'अवरुद्धम् ।',
 
+# Special:ActiveUsers
+'activeusers' => 'सक्रिययोजकानाम् आवली ।',
+'activeusers-intro' => 'एषा तु गतेषु $1 {{PLURAL:$1|दिनेषु}} कृतकार्याणां योजकाना आवली ।',
+'activeusers-count' => '$1 {{PLURAL:$1|सम्पादनानि}} गतेषु $3 {{PLURAL:$3|दिनेषु}} कृतानि  ।',
+'activeusers-from' => 'एतस्मात् आरभमाणान् योजकान् दर्शयतु ।',
+'activeusers-hidebots' => 'स्वयं चालकान् गोपयतु ।',
+'activeusers-hidesysops' => 'प्रशासकान् गोपयतु ।',
+'activeusers-noresult' => 'योजकः न प्राप्तः ।',
+
 # Special:ListGroupRights
 'listgrouprights' => 'योजकसमूहाधिकाराः ।',
 'listgrouprights-summary' => 'अधोदत्ता विकिपरिभाषितस्य सङ्गताभिगम्यताधिकारैः सहिता योजकसमूहस्य आवली । [[{{MediaWiki:Listgrouprights-helppage}}|additional information]]',
@@ -2256,8 +2264,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}}.',
@@ -3150,7 +3158,7 @@ $2 इति प्रकारस्य अवरोधं कर्तुं 
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'विस्तारः',
 'exif-imagelength' => 'औन्नत्यम्',
 'exif-bitspersample' => 'प्रत्येकं भागस्य अंशः ।',
@@ -3328,7 +3336,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 समूह ३ फेक्स  सङ्केतीकरणम् ।',
@@ -3734,13 +3742,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..b840e3b 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|Категория|Категориялар}}',
@@ -232,6 +244,7 @@ $messages = array(
 'create-this-page' => 'Бу сирэйи ай',
 'delete' => 'Соттор',
 'deletethispage' => 'Бу сирэйи соттор',
+'undeletethispage' => 'Бу сирэйи сөргүт (төннөр)',
 'undelete_short' => 'Төттөрү аҕал {{PLURAL:$1|биир уларытыыны|$1 уларытыылары}}',
 'viewdeleted_short' => '{{PLURAL:$1|Соҕотох сотторуллубут көннөрүүнү|$1 сотторуллубут көннөрүүнү}} көрүү',
 'protect' => 'Уларыппат гын',
@@ -285,7 +298,6 @@ $1',
 'disclaimers' => 'Бүк охсунуу',
 'disclaimerpage' => 'Project:Бүк охсунуу',
 'edithelp' => 'Уларытааччыларга көмө',
-'edithelppage' => 'Help:Уларытарга көмө',
 'helppage' => 'Help:Көмө',
 'mainpage' => 'Сүрүн сирэй',
 'mainpage-description' => 'Сүрүн сирэй',
@@ -429,6 +441,8 @@ $2',
 'namespaceprotected' => "Эн '''$1''' аат эйгэтигэр киирэр сирэйдэри уларытар кыаҕыҥ суох.",
 'customcssprotected' => 'Эн бу CSS-сирэйи уларытар кыаҕыҥ суох, тоҕо диэтэххэ онтуҥ атын киһи тус бэйэтин туруорууларын таарыйар.',
 'customjsprotected' => 'Эн бу JavaScript-сирэйи уларытар кыаҕыҥ суох, тоҕо диэтэххэ онтуҥ атын киһи тус бэйэтин туруорууларын таарыйар.',
+'mycustomcssprotected' => 'CSS-сирэйи уларытар кыаҕыҥ суох эбит.',
+'mycustomjsprotected' => 'Сирэйгэ JavaScript уларытар кыаҕыҥ суох эбит.',
 'ns-specialprotected' => '{{ns:special}} ааттаах сирэйдэр уларытыллыбаттар.',
 'titleprotected' => "Бу бас тыл оҥоһулларын [[User:$1|$1]] боппут.
 Төрүөтэ - ''$2''",
@@ -455,9 +469,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 +493,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 +563,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-тан киирэр дьон саҥа ааты билигин бэлиэтиир кыахтара суох.',
@@ -535,7 +578,7 @@ $2',
 'cannotchangeemail' => 'Бу биикигэ бу аакка баайыллыбыт электроннай почта аадырыһа уларытыллар кыаҕа суох эбит.',
 'emaildisabled' => 'Бу ситим-сир сурук ыыппат эбит.',
 'accountcreated' => 'Саҥа аат иҥэрилиннэ',
-'accountcreatedtext' => 'Кыттааччы $1 диэн ааттанна.',
+'accountcreatedtext' => '$1 диэн ааттаах кыттааччы баар буолла.',
 'createaccount-title' => '{{SITENAME}} бырайыакка саҥа аат оҥоруу',
 'createaccount-text' => 'Ким эрэ {{SITENAME}} бырайыакка ($4) саҥа $2 ааты бэлиэтээбит. "$2" киирии тыла "$3". Билигин киирэн киирии тылгын уларытыаххын наада.
 
@@ -570,30 +613,31 @@ $2',
 'resetpass-wrong-oldpass' => 'Киирии тыл сөп түбэспэтэ.
 Баҕар уларыппытыҥ буолуо эбэтэр быстах кэмҥэ туттуллар киирии тылы оҥотторбутуҥ буолуо.',
 'resetpass-temp-password' => 'Быстах кэмҥэ туттуллар киирии тыл:',
+'resetpass-abort-generic' => 'Киирии тылы уларытыыны кэҥэтии тохтотто.',
 
 # Special:PasswordReset
 'passwordreset' => 'Киирии тылы саҥаттан',
-'passwordreset-text' => 'Бу форманы толорон аккааунуҥ туһунан сурук тутуоххун сөп.',
+'passwordreset-text-one' => 'Урукку киирии тылы уларытарга бу форманы толор.',
 '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' => 'Ð\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 +645,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' => 'Манна киирии тылы уларытар туһунан сурук көрдөрүлүннэ. Ол эрэн сурук бу төрүөттэн $2 кыттааччыга сатаан барбата: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Ааадырыһын уларыт',
@@ -817,12 +861,15 @@ IP-аадырыһа эрэ көстөр.
 Арааһа сотуллубут быһыылаах.',
 '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' => 'биики-тиэкис',
@@ -1065,7 +1112,6 @@ $1",
 'searchmenu-legend' => 'Көрдөөһүн туруоруулара',
 'searchmenu-exists' => "'''Бу биикигэ бу сирэй маннык ааттаах \"[[\$1]]\"'''",
 'searchmenu-new' => "'''Бу биикигэ \"[[:\$1]]\" сирэйи айарга!'''",
-'searchhelp-url' => 'Help:Көмө',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Маннык префикстаах сирэйдэри көрөргө]]',
 'searchprofile-articles' => 'Ыстатыйалар истэрэ',
 'searchprofile-project' => 'Көмө уонна Бырайыак сирэйдэрэ',
@@ -1087,7 +1133,7 @@ $1",
 'search-interwiki-default' => '$1 түмүгэ:',
 'search-interwiki-more' => '(өссө)',
 'search-relatedarticle' => 'Сигэнэр',
-'mwsuggest-disable' => 'AJAX этэн биэриилэрин араар',
+'mwsuggest-disable' => 'Көрдөөһүн этэн биэриилэрин араар',
 'searcheverything-enable' => 'Туох баар аат далларыгар көрдөөһүн',
 'searchrelated' => 'сибээстэммит',
 'searchall' => 'бары',
@@ -1106,15 +1152,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' => 'Уларытыылар',
@@ -1258,6 +1296,7 @@ $1 {{PLURAL:$1|бэлиэттэн|бэлиэттэн (буукубаттан)}}
 'userrights-notallowed' => 'Бэлиэтэммит ааккынан атын кыттааччы быраабын уларытар кыаҕыҥ суох эбит.',
 'userrights-changeable-col' => 'Эн уларытар кыахтаах бөлөхтөрүҥ',
 'userrights-unchangeable-col' => 'Бу бөлөхтөрү уларытар кыаҕыҥ суох',
+'userrights-conflict' => 'Кыттааччы быраабын быһаарарга алҕас таҕыста! Хатылаан көр.',
 
 # Groups
 'group' => 'Бөлөх:',
@@ -1328,6 +1367,7 @@ $1 {{PLURAL:$1|бэлиэттэн|бэлиэттэн (буукубаттан)}}
 'right-editusercssjs' => 'Атын кыттааччылар CSS- и JS-билэлэрин уларытыы',
 'right-editusercss' => 'Атын кыттааччылар CSS-билэлэрин уларытыы',
 'right-edituserjs' => 'Атын кыттааччылар JS-билэлэрин уларытыы',
+'right-editmyusercss' => 'Кыттааччы CSS-билэтин уларытыы',
 'right-rollback' => 'Кыттааччы оҥорбут көннөрүүлэрин талыллыбыт биир сирэйгэ суох гыныы',
 'right-markbotedits' => 'Төннөрүллэр көннөрүүлэри робот уларытыытын курдук бэлиэтээһин',
 'right-noratelimit' => 'Нуорманнан хааччахтааһын суох',
@@ -1591,6 +1631,7 @@ $1',
 'backend-fail-notsame' => 'Майгыннаабат гынан баран маннык ааттаах $1 билэ баар эбит',
 'backend-fail-invalidpath' => '$1 - бу суолунан сатаан угуллубат.',
 'backend-fail-delete' => '$1 билэни сотор табыллыбата.',
+'backend-fail-describe' => '"$1" билэ метадааннайдарын уларытар табыллыбата.',
 'backend-fail-alreadyexists' => '$1 билэ хайыы-үйэ баар эбит.',
 'backend-fail-store' => '$1 билэни манна $2 угар табыллыбата.',
 'backend-fail-copy' => '$1 билэни манна $2 хатылыыр табыллыбата.',
@@ -1669,7 +1710,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>
@@ -1824,6 +1864,12 @@ $1',
 Ол оннугар ханнык эрэ чопчу сирэйгэ сигэниэхтээхтэр.<br />
 Быһаарыы: [[MediaWiki:Disambiguationspage]] халыып баар сирэйдэрэ хас да суолталаах сирэй ахсааныгар киирэллэр.",
 
+'pageswithprop' => 'Эрдэттэн туруоруулаах сирэйдэр',
+'pageswithprop-legend' => 'Уларытыллыбыт туруоруулаах сирэйдэр',
+'pageswithprop-text' => 'Манна сорох туруоруулара уларытыллыбыт сирэйдэр көстүбүттэр.',
+'pageswithprop-prop' => 'Туруоруу аата:',
+'pageswithprop-submit' => 'Толор',
+
 'doubleredirects' => 'Хос көһөрөөһүн',
 'doubleredirectstext' => 'Бу сирэйгэ атын сиргэ утаарар хос утаарыылар тиһиктэрэ көстөр.
 Хас устуруока аайы бастакы уонна иккис утаарыга сигэ баар, ону таһынан иккис утаарыыга баар сирэй аадырыһа (аата) баар, ол аата бастакы утаарыы дьиҥинэн ханна утаарыахтааҕа көстөр.
@@ -2073,8 +2119,8 @@ $1',
 'notvisiblerev' => 'Торум сотуллубут',
 'watchnochange' => 'Кэтиир сирэйдэргиттэн этиллибит кэмҥэ биир да уларыйбатах.',
 'watchlist-details' => '{{PLURAL:$1|$1 сирэйи кэтиигин|$1 сирэй кэтэбилгэ сылдьар}}, ырытыы сирэйдэрин аахпатахха.',
-'wlheader-enotif' => 'эл. почтанан биллэрии холбоммут.',
-'wlheader-showupdated' => "Бүтэһик киириигит кэннэ уларыйбыт сирэйдэр '''модьу''' бичигинэн бэлиэтэннилэр",
+'wlheader-enotif' => 'эл. почтанан биллэрии холбоммут.',
+'wlheader-showupdated' => "Бүтэһик киириигит кэннэ уларыйбыт сирэйдэр '''модьу''' бичигинэн бэлиэтэннилэр",
 'watchmethod-recent' => 'кэтээн көрүү бүтэһик уларыйыыларын көрүү',
 'watchmethod-list' => 'кэтээһин бүтэһик уларыйыылара',
 'watchlistcontains' => '$1 сирэйи кэтээн көрөҕүн.',
@@ -2091,6 +2137,16 @@ $1',
 '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' => '$PAGEEDITDATE «{{SITENAME}}» бырайыак «$1» ааттаах сирэйин бу {{gender:$2|кыттааччы|кыттааччы}} соппут - $2, көр. $3.',
+'enotif_body_intro_created' => '«{{SITENAME}}» бырайыак «$1» ааттаах сирэйин бу {{gender:$2|кыттааччы|кыттааччы}} айбыт - $2, билиҥҥи барылын манна көр: $3',
+'enotif_body_intro_moved' => '$PAGEEDITDATE «{{SITENAME}}» бырайыак «$1» ааттаах сирэйин бу {{gender:$2|кыттааччы|кыттааччы}} аатын уларыппыт - $2, билиҥҥи барылын манна көр: $3',
+'enotif_body_intro_restored' => '$PAGEEDITDATE «{{SITENAME}}» бырайыак «$1» ааттаах сирэйин бу {{gender:$2|кыттааччы|кыттааччы}} соппут - $2, билиҥҥи барылын манна көр: $3',
+'enotif_body_intro_changed' => '$PAGEEDITDATE «{{SITENAME}}» бырайыак «$1» ааттаах сирэйин бу {{gender:$2|кыттааччы|кыттааччы}} айбыт - $2, билиҥҥи барылын манна көр: $3',
 'enotif_lastvisited' => 'Бутэһик киирииҥ кэнниттэн оҥоһуллубут уларыйыылары барытын көрөргө манна киир: $1.',
 'enotif_lastdiff' => 'Уларытыыны манна көрүҥ: $1.',
 'enotif_anon_editor' => 'ааттамматах кыттааччы $1',
@@ -2189,6 +2245,8 @@ $UNWATCHURL
 'prot_1movedto2' => '[[$1]] аата манныкка уларытылынна: [[$2]]',
 'protect-badnamespace-title' => 'Көмүскэммэт аат дала',
 'protect-badnamespace-text' => 'Бу аат далын сирэйдэрэ көмүскэниллэр кыахтара суохю',
+'protect-norestrictiontypes-text' => 'Бу сирэй көмүскэниллэр кыаҕа суох.',
+'protect-norestrictiontypes-title' => 'Көмүскэниллибэт сирэй',
 'protect-legend' => 'Уларытыы таһымын бигэргэт',
 'protectcomment' => 'Төрүөтэ:',
 'protectexpiry' => 'Бүтүөхтээх:',
@@ -2273,7 +2331,8 @@ $UNWATCHURL
 'undeletedrevisions' => '{{PLURAL:$1|1 уларытыы|$1 уларытыы}} төннөрүлүннэ',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 уларытыы|$1 уларытыы}}  уонна {{PLURAL:$2|1 билэ|$2 билэ}} төннөрүлүннэ',
 'undeletedfiles' => '{{PLURAL:$1|1 билэ|$1 билэ}} төннөрүлүннэ',
-'cannotundelete' => 'Төннөрүллүбэтэ; баҕар ким эрэ номнуо төннөрө охсубута буолуо.',
+'cannotundelete' => 'Сөргүтүү алҕаһа:
+$1',
 'undeletedpage' => "'''$1 төннөрүлүннэ (төннөрүллүбүт)'''
 
 Кэнники сотуулар уонна төннөрүүлэр испииһэктэрин [[Special:Log/delete|манна]] көрүөххүн сөп.",
@@ -2309,7 +2368,7 @@ $1',
 'mycontris' => 'Суруйуу тиһигэ',
 'contribsub2' => 'Вклад $1 ($2)',
 'nocontribs' => 'Эппит критерийгэр эппиэттиир уларытыылар көстүбэтилэр.',
-'uctop' => '(бүтэһик)',
+'uctop' => '(билиҥҥи)',
 'month' => 'Ыйтан бэттэх:',
 'year' => 'Сылтан бэттэх:',
 
@@ -2470,6 +2529,7 @@ $1',
 'proxyblocksuccess' => 'Сатанна.',
 'sorbsreason' => 'Эн IP-ҥ {{SITENAME}} саайт DNSBL-гар аһаҕас прокси быһыытынан сылдьар.',
 'sorbs_create_account_reason' => 'Эн IP-ҥ {{SITENAME}} саайт DNSBL-гар аһаҕас прокси быһыытынан сылдьар. Саҥаттан бэлиэтэнэр кыаҕыҥ суох.',
+'xffblockreason' => 'X-Forwarded-For баһыгар баар IP-аадырыс бобуллубут. Бу IP Эйиэнэ эбэтэр туһанар проксиҥ гиэнэ буолуон сөп. Бобуу төрүөтэ маннык эбит: $1',
 'cant-block-while-blocked' => 'Бэйэҥ хааччахтаммыт кэмҥэр атын кыттааччылары хааччахтыыр кыаҕыҥ суох.',
 'cant-see-hidden-user' => 'Эн хааччахтаары гыммыт кыттааччыҥ урут хааччахтаммыт уонна кистэммит эбит. Кыттааччылары кистиир кыаҕыҥ суох буолан ол туһунан суругу көрөр да уларытар да быраабыҥ суох.',
 'ipbblocked' => 'Атын кыттааччылары хааччахтыыр да, хааччахтарын да устар кыаҕыҥ суох, тоҕо диэтэххэ бэйэҥ хааччахтааххын',
@@ -2510,8 +2570,8 @@ $1',
 Ол аата эн сирэй аатын сыыһа уларыппыт буоллаххына төттөрү урукку аатыгар төннөрүөххүн сөп, ол гынан баран баар сирэйи алҕас сотор кыаҕыҥ суох.
 
 '''Сэрэтии!'''
-Сирэй аатын уларытыы бөдөҥ уонна эрдэттэн өйдөммөтөх содуллаах буолуон сөп.
-Онон, бука диэн салгыаҥ иннинэ үчүгэйдик толкуйдаа.",
+''Элбэхтик туһаныллар'' сирэй аатын уларытыы бөдөҥ уонна эрдэттэн өйдөммөтөх содуллаах буолуон сөп.
+Онон, бука диэн, салгыаҥ иннинэ үчүгэйдик толкуйдаа.",
 'movepagetext-noredirectfixer' => "Манна баар форманы туһанан сирэй аатын уларытыаххын сөп.
 Бу түбэлтэҕэ уларытыы сурунаала саҥа сиргэ көһөр.
 Урукку аат саҥа сирэйгэ утаарар сирэйгэ кубулуйар.
@@ -2576,6 +2636,7 @@ $1',
 'immobile-target-namespace-iw' => 'Интервики сигэтэ ааты уларытыыга туһаныллыбат.',
 'immobile-source-page' => 'Бу сирэйи аатын уларытар табыллыбат.',
 'immobile-target-page' => 'Сирэйгэ бу ааты иҥэрэр табыллыбат.',
+'bad-target-model' => 'Маны $1 манна $2 уларытар табыллыбат: дааннайдарын көрүҥнэрэ тус-туһунаннар.',
 'imagenocrossnamespace' => 'Ойууга атын аат далыттан аат биэрэр сатаммат',
 'nonfile-cannot-move-to-file' => 'Сирэйдэри билэ гынан ааттарын уларытар табыллыбат',
 'imagetypemismatch' => 'Билэ саҥа расширенията тиибигэр сөп түбэспэт',
@@ -2637,6 +2698,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' => 'Эскииз быстах билэтин оҥорор табыллыбата',
@@ -2827,11 +2890,13 @@ $1',
 'pageinfo-default-sort' => 'Наардааһын күлүүһэ',
 'pageinfo-length' => 'Сирэй устата (баайтынан)',
 'pageinfo-article-id' => 'Сирэй нүөмэрэ',
+'pageinfo-language' => 'Сирэй омугун тыла',
 'pageinfo-robot-policy' => 'Көрдүүр сулууспалар туруктара',
 'pageinfo-robot-index' => 'Индекстанар',
 'pageinfo-robot-noindex' => 'Индекстаммат',
 'pageinfo-views' => 'Көрүү ахсаана',
 'pageinfo-watchers' => 'Кэтээнэр сирэйдэр ахсааннара',
+'pageinfo-few-watchers' => '$1 кыттааччыттан аҕыйах кэтээччи',
 'pageinfo-redirects-name' => 'Бу сирэйгэ утаарыы ахсаана',
 'pageinfo-subpages-name' => 'Сирэй аннынааҕы сирэйдэр ахсааннара',
 'pageinfo-subpages-value' => '$1 ($2 утаарыы; $3 көннөрү (утаарыыта суох))',
@@ -2846,17 +2911,21 @@ $1',
 'pageinfo-magic-words' => 'Аптаах {{PLURAL:$1|тыл|тыллар}} ($1)',
 'pageinfo-hidden-categories' => 'Кистэммит {{PLURAL:$1|категория|категориялар}} ($1)',
 'pageinfo-templates' => '$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-standard' => 'Классика',
-'skinname-nostalgia' => 'Мунчаарыы',
-'skinname-myskin' => 'Миэнэ',
-'skinname-chick' => 'Чуппууска',
-'skinname-simple' => 'Судургу',
 'skinname-modern' => 'Билиҥҥи',
 
 # Patrolling
@@ -2869,6 +2938,8 @@ $1',
 'markedaspatrollederror' => 'Бэрэбиэркэлэммит курдук бэлиэтиир сатаммата',
 'markedaspatrollederrortext' => 'Бэрэбиэркэлэммит курдук бэлиэтииргэ торуму чопчу талыахтааххын.',
 'markedaspatrollederror-noautopatrol' => 'Бэйэҥ уларытыыгын бэрэбиэркэлэммит курдук оҥороруҥ сатаммат.',
+'markedaspatrollednotify' => 'Бу «$1» сирэйгэ оҥоһуллубут уларытыы тургутуллубут курдук бэлиэтэммит.',
+'markedaspatrollederrornotify' => 'Бэлиэтэммит курдук бэлиэтиир сатаммата.',
 
 # Patrol log
 'patrol-log-page' => 'Бэрэбиэркэ сурунаала',
@@ -2902,6 +2973,7 @@ $1',
 'file-nohires' => 'Бу ойуу маннааҕар улахан торума суох.',
 'svg-long-desc' => 'SVG билэ, номинальнай кээмэйэ $1 × $2 пииксэл, билэ кээмэйэ: $3',
 'svg-long-desc-animated' => '$1 × $2 пииксэллээх анимацияламмыт SVG-билэ, кээмэйэ: $3',
+'svg-long-error' => 'Алҕастаах SVG-билэ: $1',
 'show-big-image' => 'Ойуу бэйэтин толору кээмэйэ',
 'show-big-image-preview' => 'Бигэргэтиэх иннинэ көрүү улахана: $1.',
 'show-big-image-other' => 'Атын {{PLURAL:$2|түмүк|түмүктэр}}: $1.',
@@ -2934,7 +3006,20 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 мүнүүтэ|$1 мүнүүтэ}}',
 'hours' => '{{PLURAL:$1|$1 чаас|$1 чаас}}',
 'days' => '{{PLURAL:$1|$1 күн|$1 күн}}',
+'months' => '$1 ый',
+'years' => '$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' => 'Формаата маннык буолуохтаах:
@@ -2961,7 +3046,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Кэтитэ',
 'exif-imagelength' => 'Үрдүгэ',
 'exif-bitspersample' => 'Глубина цвета',
@@ -3140,7 +3225,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, факс куодтааһына',
@@ -3428,6 +3513,7 @@ $5
 # Scary transclusion
 'scarytranscludedisabled' => '[Interwiki transcluding араҕыста]',
 'scarytranscludefailed' => '[$1 халыыбы туһанар табыллыбата]',
+'scarytranscludefailed-httpstatus' => '[Манна $1 анаммыт халыыбы холбуур сатаммата: HTTP $2]',
 'scarytranscludetoolong' => '[URL наһаа уһун]',
 
 # Delete conflict
@@ -3539,6 +3625,7 @@ $5
 'version-license' => 'Лиссиэнзийэ',
 'version-poweredby-credits' => "Бу биики бу движокка олоҕурар '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'атыттар',
+'version-credits-summary' => '[[Special:Version|MediaWiki]] сайдыытыгар үлэлэрин иһин манна ахтыллыбыт дьоҥҥо махтанабыт.',
 'version-license-info' => 'MediaWiki көҥүл тарҕанар бырагырааммаларга киирэр, кинини көмпүүтэр аһаҕас бырагырааммаларын пуондатын GNU General Public License усулуобуйатынан көҥүл тарҕатаргыт уонна/эбэтэр уларытаргыт көҥүллэнэр; иккис эбэтэр онтон хойукку ханнык баҕарар барылыттан саҕалаан.
 
 MediaWiki туһалаах буоллун диэн тарҕатыллар, ол эрээри АТЫЫЛАНАР СЫАННАҺА эбэтэр ХАННЫК ЭРЭ ЧОПЧУ СОРУККА СӨП ТҮБЭҺИИТЭ бигэргэтиллибэт (гарантията суох). Сиһилии GNU General Public License усулуобуйатын көрүҥ.
@@ -3551,12 +3638,16 @@ MediaWiki туһалаах буоллун диэн тарҕатыллар, ол
 'version-entrypoints-header-entrypoint' => 'Киирии сирэ',
 'version-entrypoints-header-url' => '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' => 'Хос билэлэри көрдөөһүн',
@@ -3647,6 +3738,9 @@ MediaWiki туһалаах буоллун диэн тарҕатыллар, ол
 'htmlform-submit' => 'Ыыт',
 'htmlform-reset' => 'Уларытыыны төннөр',
 'htmlform-selectorother-other' => 'Атын',
+'htmlform-no' => 'Суох',
+'htmlform-yes' => 'Сөп',
+'htmlform-chosen-placeholder' => 'Барылы тал',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 толору тиэкистээх көрдөөһүнү өйүүр',
@@ -3654,9 +3748,9 @@ MediaWiki туһалаах буоллун диэн тарҕатыллар, ол
 
 # New logging system
 'logentry-delete-delete' => '$3 сирэйи $1 соппут',
-'logentry-delete-restore' => '$3 Ñ\81иÑ\80Ñ\8dйи $1 Ñ\82өннөÑ\80бүт',
-'logentry-delete-event' => 'Сурунаал {{PLURAL:$5|суругун|$5 суруктарын}} көстүүтүн манна $3: $4 $1 уларыппыт',
-'logentry-delete-revision' => 'Сурунаал {{PLURAL:$5|суругун|$5 суруктарын}} көстүүтүн бу сирэйгэ $3: $4 $1 уларыппыт',
+'logentry-delete-restore' => '$3 Ñ\81иÑ\80Ñ\8dйи $1 Ñ\81Ó©Ñ\80гүппүт',
+'logentry-delete-event' => 'Сурунаал $5 суругун көстүүтүн манна $3 $1 уларыппыт: $4',
+'logentry-delete-revision' => 'Сурунаал $5 суругун көстүүтүн бу сирэйгэ $3 $1 уларыппыт: $4',
 'logentry-delete-event-legacy' => '$3 сурунаал суруктарын көстүүтүн $1 уларыппыт',
 'logentry-delete-revision-legacy' => '$3 сирэй барылларын көстүүтүн $1 уларыппыт',
 'logentry-suppress-delete' => '$3 сирэйи $1 баттаабыт',
@@ -3673,15 +3767,19 @@ 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' => 'Маннык аат $1 аптамаатынан бэлиэтэнилиннэ',
+'logentry-newusers-create2' => '$3 кыттааччы аатын $1 бэлиэтээтэ',
+'logentry-newusers-byemail' => '$3 бэлиэ-ааты $1 оҥорбут, киирии тыла электрон почтанан ыытыллыбыт',
+'logentry-newusers-autocreate' => '$1 бэлиэ-аат аптамаатынан бэлиэтэннэ',
+'logentry-rights-rights' => '$3 бөлөхтөргө киириитин $1 уларыппыт: манныктан $4 манныкка $5',
+'logentry-rights-rights-legacy' => '$3 бөлөхтөргө киириитин $1 уларыппыт',
+'logentry-rights-autopromote' => '$1 мантан $4 манна $5 көһөрүллүбүт',
 'rightsnone' => '(суох)',
 
 # Feedback
@@ -3737,6 +3835,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»',
@@ -3757,4 +3856,7 @@ MediaWiki туһалаах буоллун диэн тарҕатыллар, ол
 'duration-centuries' => '$1 үйэ',
 'duration-millennia' => '$1 тыһыынча сыл',
 
+# Image rotation
+'rotate-comment' => 'Ойуу $1 кыраадыс чаһы хоту эргитиллибит',
+
 );
index 7060b13..5e07aac 100644 (file)
@@ -13,6 +13,7 @@
  * @author Joseph Mardy
  * @author Nipon087
  * @author Reedy
+ * @author Rillke
  * @author Salvator
  * @author Samar88
  * @author Srabony90
@@ -26,7 +27,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 +35,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 +50,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',
@@ -258,7 +257,6 @@ $1',
 'disclaimers' => 'Dạbi bạnuḱko',
 'disclaimerpage' => 'Project: Sadharon ḍiskleimarko(General disclaimer)',
 'edithelp' => 'Tońge goṛo',
-'edithelppage' => 'Help:So̠mpado̠n',
 'helppage' => 'Help: Bhitri renaḱ',
 'mainpage' => 'Mukhiạ Sakam',
 'mainpage-description' => 'Mukhiạ sakam',
@@ -431,7 +429,7 @@ Amaḱ sendrare kukiko bondo hoeakana. Dayakate kukiko kạmi hoe ocoemẽ ar am
 Ale do baḍae ocolem amaḱ kuki doe kạmikana, sakam do arhõ rakaṕ lạgit́te kurumuṭuemẽ.',
 'noname' => 'Am do asol beoharićaḱ ńutum ṭhikte bam emakada.',
 'loginsuccesstitle' => 'Bhitri boloḱ do moctege puraoena',
-'loginsuccess' => '\'\'\'Am do nitge "$1" ńutumte {{SITENAME}} rem bolo akana.',
+'loginsuccess' => "'''Am do nitge \"\$1\" ńutumte {{SITENAME}} rem bolo akana.'''",
 'nosuchuser' => '"$1" ńutuman jahan beoharić bạnuea.
 Beoharićaḱ ńutum do bukṛogea.
 Amaḱ bananko ńelmẽ, se [[Special:Userlogin/signup nãwã mit́ṭen ekaunṭ tearmẽ]].',
@@ -491,10 +489,8 @@ Nitoḱ do am bhitritem boloḱkana...',
 
 # Special:PasswordReset
 'passwordreset' => 'Nãwãte oku nambar emme',
-'passwordreset-text' => 'Amaḱ ekaunṭ reaḱ purapuri thuti e-mail hotete ńam lạgit́te latar reaḱ forom purạomẽ.',
 'passwordreset-legend' => 'Nãwãte oku nambar emme',
 'passwordreset-disabled' => 'Noa wikire amaḱ uku nambar nãwãte em lạgit subita do bando gea.',
-'passwordreset-pretext' => '{{PLURAL:$1 latar re menaḱ ḍaṭako khon mit́ṭen emmẽ}}',
 'passwordreset-username' => 'Beoharicaḱ ńutum:',
 'passwordreset-domain' => 'Ḍomen:',
 'passwordreset-capture' => 'Sendra fol reaḱ e-mail ńelmẽ?',
@@ -710,7 +706,6 @@ Unuduḱ: '''({{int:cur}})''' = nahaḱ nãwã aroeko saõte tulạo, '''({{int:
 'viewprevnext' => 'Ńelme ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''Noa wiki re do \"[[:\$1]] ńutum sakam menaḱa",
 'searchmenu-new' => 'wiki re [[:$1]]nãwã sakam tear',
-'searchhelp-url' => 'Help: Goṛawaḱ',
 'searchprofile-articles' => 'Menaḱaḱ sakamko',
 'searchprofile-project' => 'Go̠ṛo ar Project sakam',
 'searchprofile-images' => 'Multimedia',
@@ -737,9 +732,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 +1170,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..9db96bf 100644 (file)
@@ -280,7 +280,6 @@ $messages = array(
 'disclaimers' => 'Abbertimentos',
 'disclaimerpage' => 'Project:Abbertimentos generales',
 'edithelp' => "Agiudu pro s'acontzu o sa scritura",
-'edithelppage' => 'Help:Acontzare',
 'helppage' => 'Help:Agiudu',
 'mainpage' => 'Pàgina Base',
 'mainpage-description' => 'Pàgina Base',
@@ -631,7 +630,6 @@ Cosas de ammentare: '''({{int:cur}})''' = diferèntzias cun sa versione currente
 'shown-title' => 'Ammustra $1 {{PLURAL:$1|resurtadu|resurtados}} pro pàgina',
 'viewprevnext' => 'Càstia ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-legend' => 'Possibilidades de chirca',
-'searchhelp-url' => 'Help:Agiudu',
 'searchprofile-everything' => 'Totu',
 'searchprofile-advanced' => 'Avantzada',
 'searchprofile-articles-tooltip' => 'Chirca in $1',
@@ -660,14 +658,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 +1006,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 +1418,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 +1463,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 +1521,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..c0cdd0c 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",
@@ -197,6 +195,7 @@ $messages = array(
 'tog-diffonly' => "Nun visualizzari lu cuntinutu dâ pàggina quannu s'esequi na ''diff'' tra dui virsioni",
 'tog-showhiddencats' => 'Ammustra li catigurìi ammucciati.',
 'tog-norollbackdiff' => "Umettiri li ''diff'' doppu aviri fattu nu ''rollback''",
+'tog-useeditwarning' => 'Avvisa quannu si lasaa na paggina di canci cu canci nu sarbati',
 
 'underline-always' => 'sempri',
 'underline-never' => 'mai',
@@ -260,6 +259,18 @@ $messages = array(
 'oct' => 'utt',
 'nov' => 'nuv',
 'dec' => 'Dic',
+'january-date' => '$1 jinnaru',
+'february-date' => '$1 frivaru',
+'march-date' => '$1 di marzu',
+'april-date' => '$1 di aprili',
+'may-date' => '$1 di maiu',
+'june-date' => '$1 di giugnu',
+'july-date' => '$1 di giugnettu',
+'august-date' => '$1 di austu',
+'september-date' => '$1 di sittèmmiru',
+'october-date' => '$1 di uttùviru',
+'november-date' => '$1 di nuvèmmiru',
+'december-date' => '$1 di dicèmmiru',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Catigurìa|Catigurìi}}',
@@ -285,7 +296,8 @@ $messages = array(
 'newwindow' => '(grapi na finestra nova)',
 'cancel' => 'annulla',
 'moredotdotdot' => 'Àutru...',
-'mypage' => 'La mè pàggina',
+'morenotlisted' => 'cchiossai non ntâ lista',
+'mypage' => 'Pàggina',
 'mytalk' => 'la mè pàggina di discussioni',
 'anontalk' => 'Discussione pi stu IP',
 'navigation' => 'Navigazzioni',
@@ -308,7 +320,7 @@ $messages = array(
 'vector-action-protect' => 'Pruteggi',
 'vector-action-undelete' => 'Riprìstina',
 'vector-action-unprotect' => 'Cancia la prutizzioni',
-'vector-simplesearch-preference' => 'Abbilita li suggirimenti pâ ricerca avanzata',
+'vector-simplesearch-preference' => 'Abbilita la barra pâ ricerca simprificata (sulu pi la skin Vector)',
 'vector-view-create' => 'Crea',
 'vector-view-edit' => 'Cancia',
 'vector-view-history' => 'Talìa a storia',
@@ -318,6 +330,7 @@ $messages = array(
 'namespaces' => 'Namespace',
 'variants' => 'Varianti',
 
+'navigation-heading' => 'Menù di navigazzioni',
 'errorpagetitle' => 'Erruri',
 'returnto' => 'Ritorna a $1.',
 'tagline' => 'Di {{SITENAME}}',
@@ -339,6 +352,7 @@ $messages = array(
 'create-this-page' => 'Crea sta pàggina',
 'delete' => 'elìmina',
 'deletethispage' => 'Elìmina sta pàggina',
+'undeletethispage' => 'Annulla la scancillazzioni di sta pàggina',
 'undelete_short' => 'Ricùpira {{PLURAL:$1|na rivisioni|$1 rivisioni}}',
 'viewdeleted_short' => 'Talìa {{PLURAL:$1|nu canciamentu scancillatu|$1 canciamenti scancillati}}',
 'protect' => 'Pruteggi',
@@ -390,7 +404,6 @@ $1",
 'disclaimers' => 'Avvirtenzi',
 'disclaimerpage' => 'Project:Avvirtenzi ginirali',
 'edithelp' => 'Guida',
-'edithelppage' => 'Help:Canciamentu',
 'helppage' => 'Help:Cuntinuti',
 'mainpage' => 'Pàggina principali',
 'mainpage-description' => 'Pàggina principali',
@@ -412,6 +425,10 @@ $1",
 'youhavenewmessages' => 'Ricivìsti $1 ($2).',
 'newmessageslink' => 'missaggi novi',
 'newmessagesdifflink' => 'ùrtimi canciamenti',
+'youhavenewmessagesfromusers' => "Hai $1 di {{PLURAL:$3|n'àutru utenti|$3 utenti}} ($2).",
+'youhavenewmessagesmanyusers' => 'Hai $1 di na pocu di utenti ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|Nu missaggiu novu|missaggi novi}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|ùrtimu canciamenti|ùrtimi canciamenti}}',
 'youhavenewmessagesmulti' => 'Hai missaggi novi supra $1',
 'editsection' => 'cancia',
 'editold' => 'cancia',
@@ -502,6 +519,8 @@ V\'arringrazziamu si signaliati zoccu succidìu a nu [[Special:ListUsers/sysop|a
 'badarticleerror' => 'Opirazzioni nun cunzintita pi sta pàggina.',
 'cannotdelete' => 'Mpussìbbili cancillari la pàggina o lu file "$1" addumannatu. Putissi siri già cancillatu di quarcun\'àutru.',
 'cannotdelete-title' => 'Mpussibbili eliminari la pàggina "$1"',
+'delete-hook-aborted' => "Canciamentu nun arsciuttiattu di l'hook.
+Nun desi nudda spiecazzioni.",
 'badtitle' => 'Tìtulu nun currettu',
 'badtitletext' => "Lu tìtulu dâ pàggina addumannata è vacanti, erratu o cu caràttiri nun ammessi oppuru diriva di n'erruri ntê culligamenti tra siti wiki diversi o virsioni n lingui diversi dû stissu situ.",
 'perfcached' => "'''Nota:''' li dati ca sèquinu sunnu stratti di na copia ''cache'' dû database, nun aggiurnati n tempu riali. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
@@ -516,7 +535,8 @@ Query: $2',
 'actionthrottledtext' => "Comu misura di sicurezza contru lu spam, l'esecuzioni di alcuni azzionu è limitata a nu nùmmuru massimu di voti ni nu determinatu piriudu du tempu, limiti ca ni stu casu fu supiratu. Si prega di ripruvari tra qualchi minutu.",
 'protectedpagetext' => 'Sta pàggina fu bluccata pi privèniri li canciamenti.',
 'viewsourcetext' => 'È pussìbbili visualizzari e cupiari lu còdici surgenti di sta pàggina:',
-'protectedinterface' => "Sta pàggina cunteni un elementu ca fà parti dâ nterfaccia utenti dû software; è quinni prutetta p'evitari pussìbbili abbusi.",
+'viewyourtext' => "È pussibbili visualizzarei cupiari lu còdici surgenti dî '''tò canciamenti''' nti sta pàggina:",
+'protectedinterface' => "Sta pàggina cunteni un elementu ca fà parti dâ nterfaccia utenti dû software eggh'è  prutetta p'evitari pussìbbili abbusi. Pi jùnciri o canciari li traduzzioni pi tutti li wiki usari [//translatewiki.net/translatewiki.net] lu pruggettu di lucalizzazzioni di Mediawiki.",
 'editinginterface' => "'''Accura:''' Lu testu di sta pàggina fà parti dî interfaccia utenti dû situ. Tutti li canciamenti appurtati a sta pàggina si riflèttinu supra li missaggi visualizzati pi tutti l'utenti. Pi li traduzioni, cunsidira â pussibilità di usari [//translatewiki.net/wiki/Main_Page?setlang=scn translatewiki.net], u prugettu di localizzazioni MediaWiki.",
 'sqlhidden' => '(la query SQL hà statu ammucciata)',
 'cascadeprotected' => 'Supra sta pàggina nun è pussìbbili effittuari canciamenti pirchì veni nclusa nt{{PLURAL:$1|â pàggina siquenti, ca fu prutetta|ê pàggini siquenti, ca foru prutetti}} silizziunannu la prutizzioni "ricursiva":
@@ -526,6 +546,8 @@ $2',
 'titleprotected' => "La criazzioni di sta pàggina cu stu tìtulu fu bluccata da [[User:$1|$1]].
 La mutivazzioni è chista: ''$2''.",
 'filereadonlyerror' => 'Nun fu pussìbbili canciari lu file "$1" pirchì lu repository di file "$2" è \'n mudalitati di sula littura.La mutivazzioni è "\'\'$3\'\'".',
+'exception-nologin' => 'Nun trasutu',
+'exception-nologin-text' => 'Sta pàggina o stâzzioni havi abbisognu ca tu si cunnittutu a sta wiki',
 
 # Virus scanner
 'virus-badscanner' => "Sbagghiu di cunfigurazzioni: antivirus scanusciutu: ''$1''",
@@ -538,11 +560,23 @@ La mutivazzioni è chista: ''$2''.",
 Poi cuntinuari a usari {{SITENAME}} di manera anònima, o poi <span class='plainlinks'>[$1 tràsiri n'àutra vota]</span> cu lu stissu o cu n'àutru nomu d'utenti.
 Accura chi quarchi pàggina pò cuntinuari a èssiri ammustrata comu si nun avissi nisciutu nzinu a quannu tu nun scancelli tutta la mimoria dû tò browser.",
 'welcomeuser' => 'Bommegna, $1!',
+'welcomecreation-msg' => 'Lu cuntu fu criatu. Nun ascurdàriti di pirsunalizzari li prifirenzi pi {{SITENAME}}',
 'yourname' => "Lu tò nomu d'utenti (''user name'')",
+'userlogin-yourname' => 'Nomu utenti',
+'userlogin-yourname-ph' => 'Nzirìsci lu tò nomu utenti',
 'yourpassword' => "La tò ''password''",
+'userlogin-yourpassword' => 'Password',
+'userlogin-yourpassword-ph' => 'Nzirisci la tò password',
+'createacct-yourpassword-ph' => 'Nzirisci na password',
 'yourpasswordagain' => "Scrivi la password n'àutra vota",
+'createacct-yourpasswordagain' => 'Cunfirma la password',
+'createacct-yourpasswordagain-ph' => 'Nzirisci la password attorna',
 'remembermypassword' => 'Arricorda la password supra stu computer (pi ô massimu $1 {{PLURAL:$1|jornu|jorna}})',
+'userlogin-remembermypassword' => 'Mantènimi culligatu',
+'userlogin-signwithsecure' => 'Usa na cunnissioni sicura',
+'securelogin-stick-https' => 'Resta cunnittutu cu HTTPS doppu la trasuta',
 'yourdomainname' => 'Lu tò dominiu',
+'password-change-forbidden' => 'Nun putiti canciari la password nti sta wiki',
 'externaldberror' => "S'havi virificatu n'erruri cû server d'autinticazzioni sternu, oppuru nun si disponi di l'auturizzazzioni nicissari p'aggiurnari lu propiu accessu sternu.",
 'login' => 'Trasi',
 'nav-login-createaccount' => 'Riggìstrati o trasi',
@@ -552,14 +586,32 @@ Accura chi quarchi pàggina pò cuntinuari a èssiri ammustrata comu si nun avis
 'logout' => 'Nesci',
 'userlogout' => 'Nesci',
 'notloggedin' => "Nun v'aviti riggistratu",
+'userlogin-noaccount' => "Nun ci l'hai nu cuntu?",
+'userlogin-joinproject' => 'Scrìviti a {{SITENAME}}',
 'nologin' => "Nun nn'aviti nu cuntu pi ccà? '''$1'''.",
 'nologinlink' => 'Criati nu cuntu sùbbitu',
 'createaccount' => 'Criati un cuntu novu',
 'gotaccount' => "Hai già nu cuntu? '''$1'''.",
 'gotaccountlink' => 'Trasi',
 'userlogin-resetlink' => "T'ascurdasti li dittagli pâ trasuta?",
-'createaccountmail' => 'via e-mail',
+'userlogin-resetpassword-link' => 'Reinizzializza la tò password',
+'helplogin-url' => 'Help:Cunnissioni',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Aiutu câ fasi di login]]',
+'createacct-join' => 'Nzirisci li tò nfurnazzioni ccà',
+'createacct-emailrequired' => 'Nnirizzu e-mail',
+'createacct-emailoptional' => 'Nnirizzu e-mail (facurtativu)',
+'createacct-email-ph' => 'Nzirisci lu tò nnirizzu e-mail',
+'createaccountmail' => 'Utilizzari na password timpurania casuali e mannàrila ô nnirizzu e-mail spicificatu ccàssutta',
+'createacct-realname' => 'Nomu riali (facurtativu)',
 'createaccountreason' => 'Mutivu:',
+'createacct-reason' => 'Mutivu',
+'createacct-reason-ph' => "Pirchì stai criannu n'àutru cuntu?",
+'createacct-captcha' => 'Cuntrollu di sicurezza',
+'createacct-imgcaptcha-ph' => 'Nzirìsci lu testu ca vidi ccassupra',
+'createacct-submit' => 'Crèa nu cuntu',
+'createacct-benefit-heading' => '{{SITENAME}} è fatta di pirsunu comu a tìa.',
+'createacct-benefit-body1' => '{{PLURAL:$1|cuntribbutu|cuntribbuti}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pàggina|pàggini}}',
 'badretype' => "La ''password'' chi mittisti nun è bona.",
 'userexists' => 'Lu nomu utenti nzeritu è già usatu. Ti prijamu pirciò di vuliri scègghiri nu nomu utenti diversu.',
 'loginerror' => "Erruri nta l'accessu",
@@ -631,6 +683,10 @@ Aspetta tanticchia prima di pruvari  n'àutra vota.",
 Pò èssiri ca ggià canciasti cu successu la tò password o c'addumannasti na nova password timpurrània.",
 'resetpass-temp-password' => 'Password timpurrània:',
 
+# Special:PasswordReset
+'passwordreset' => 'Resetta la password',
+'passwordreset-text-one' => 'Jinchi stu mòdulu pi reimpostari la password',
+
 # Special:ChangeEmail
 'changeemail-submit' => 'Cancia e-mail',
 
@@ -724,7 +780,7 @@ P’idintificàrilu è pirciò nicissariu usari lu nùmmiru di lu sò nnirizzu I
 Li nnirizzi IP ponnu pirò èssiri spartuti di cchiù utenti.
 Siddu sî n’utenti anònimu e riteni ca li cummenti prisenti nta sta pàggina nun si rifirìscinu a tia, [[Special:UserLogin/signup|crea n’accessu novu]] o [[Special:UserLogin|trasi]] cu chiddu ca già hai p’evitari d’èssiri cunfusu cu àutri utenti anònimi ‘n futuru.''",
 'noarticletext' => 'Nta stu mumentu la pàggina addumannata è vacanti. È pussìbbili [[Special:Search/{{PAGENAME}}|circari stu tìtulu]] nta l\'àutri pàggini dû situ oppuru <span class="plainlinks">[{{fullurl:{{#Special:Log}}|action=edit}} circari ntê riggistra culligati] oppuru [{{fullurl:{{FULLPAGENAME}}|action=edit}} canciari la pàggina ora]</span>.',
-'noarticletext-nopermission' => 'Nta stu mumentu la pàggina addumannata è vacanti. È pussibbili [[Special:Search/{{PAGENAME}}|circari stu titulu]] nti àutri pàggini dû situ oppuru <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} circari ntê riggistra currilati]</span>.',
+'noarticletext-nopermission' => 'Nta stu mumentu la pàggina addumannata è vacanti. È pussibbili [[Special:Search/{{PAGENAME}}|circari stu titulu]] nti àutri pàggini dû situ o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} circari ntê riggistra culligati]</span>, ma nun hai li pirmissa pi criari sta pàggina.',
 'userpage-userdoesnotexist' => 'L\'account "<nowiki>$1</nowiki>" nun currispunni a n\'utenti riggistratu. Virificari si si voli criari o canciari sta pàggina.',
 'blocked-notice-logextract' => "Stu utenti è attualmenti bluccatu. L'ùrtimu elimentu dû riggistru dî blocca è ripurtatu ccà pi nfurnazzioni:",
 'clearyourcache' => "'''Nota:''' doppu aviri sarvatu è nicissariu puliri la cache dû propiu browser pi vìdiri li canciamenti. Pi '''Mozilla / Firefox / Safari''': fari clic supra ''Ricarica'' tinnennu primutu lu tastu dî maiùsculi, oppuru prèmiri ''Ctrl-Maiusc-R'' (''Cmd-Maiusc-R'' supra Mac); pi '''Internet Explorer:''' mantèniri primutu lu tastu ''Ctrl'' mentri si premi lu pulsanti ''Aggiorna'' o prèmiri ''Ctrl-F5''; pi '''Konqueror''': prèmiri lu pulsanti ''Ricarica'' o lu tastu ''F5''; pi '''Opera''' pò èssiri nicissariu svacantari cumpletamenti la cache dû menu ''Strumenti → Preferenze''.",
@@ -736,7 +792,8 @@ Siddu sî n’utenti anònimu e riteni ca li cummenti prisenti nta sta pàggina
 'userinvalidcssjstitle' => "'''Accura:''' Nun esisti arcuna skin cu nomu \"\$1\". S'arricorda ca li pàggini pi li .css e .js pirsunalizzati hannu la nizziali dû tìtulu minùscula, p'asempiu {{ns:user}}:Asempiu/vector.js e nun {{ns:user}}:Asempiu/Vector.css.",
 'updated' => '(Aggiurnatu)',
 'note' => "'''Accura:'''",
-'previewnote' => "'''Ricurdàtivi ca chista è sulu n'antiprima, e ca nun hà statu ancora sarvata!'''",
+'previewnote' => "'''Ricurdàtivi ca chista è sulu n'antiprima.'''
+Li canci nun foru ancora sarvati!'''",
 'previewconflict' => "L'antiprima currispunni a lu testu prisenti ntâ casella di canciamentu supiriuri e rapprisenta la pàggina comu appari siddu si scegghi di prèmiri 'Sarva' 'n stu mumentu.",
 'session_fail_preview' => "'''Purtroppu nun hà statu pussìbbili sarvari li tò canciamenti pirchì li dati dâ sissioni hannu jutu pirduti. Pi favuri, riprova. Siddu arricevi stu missaggiu d'erruri cchiù voti, prova a sculligàriti e a culligàriti novamenti.'''",
 'session_fail_preview_html' => "'''Semu spiacenti, nun hà statu pussìbbili elabburari lu canciamentu pirchì hannu jutu pirduti li dati rilativi â sissioni.'''
@@ -796,6 +853,7 @@ Nun desi nudda spiecazzioni.",
 Pari ca fu scancillata.',
 'edit-conflict' => 'Cunflittu di edizzioni.',
 'edit-no-change' => 'La mudifica fu ignurata pirchì nu foru appurtati canci ntô testu.',
+'postedit-confirmation' => 'Lu canciamentu fu sarbatu.',
 'edit-already-exists' => 'Mpussìbbili criari na nova pàggina.
 Esisti ggià.',
 
@@ -964,13 +1022,13 @@ S'havi accirtari ca la cuntinuità storica di la pàggina nun veni altirata.",
 'mergelogpagetext' => "Appressu veni ammustrata na lista dî operazioni cchiù ricenti di unioni dâ storia di na pàggina ni n'autra.",
 
 # Diffs
-'history-title' => 'Crunoluggìa dî canciamenti di "$1"',
+'history-title' => '$1: crunoluggìa dî canciamenti',
 'difference-title' => '$1: diffirenzi ntra li virsiuni',
 'lineno' => 'Lìnia $1:',
 'compareselectedversions' => 'Fari lu paraguni',
 'showhideselectedversions' => 'Ammustra/ammuccia virsioni silizziunati',
 'editundo' => 'annulla',
-'diff-multi' => '({{PLURAL:$1|Na rivisioni ntirmèdia nun ammustrata|$1 rivisioni ntirmedi nun ammustrati}}.)',
+'diff-multi' => '({{PLURAL:$1|Na rivisioni ntirmèdia|$1 rivisioni ntirmedi}} di {{PLURAL:$2|nu utenti|$2 utenti}} nun {{PLURAL:$1|ammusciata|ammusciati}}.)',
 
 # Search results
 'searchresults' => 'Risurtati dâ circata',
@@ -992,7 +1050,6 @@ S'havi accirtari ca la cuntinuità storica di la pàggina nun veni altirata.",
 'searchmenu-legend' => 'Opzioni di circata',
 'searchmenu-exists' => "* Pàggina '''[[$1]]'''",
 'searchmenu-new' => "'''Crea la pàggina \"[[:\$1]]\" supra sta wiki!'''",
-'searchhelp-url' => 'Help:Cuntinuti',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Visualizza li pàggini cu stu prifissu]]',
 'searchprofile-articles' => 'Pàggini di cuntinutu',
 'searchprofile-project' => "Pàggini d'ajutu e dô pruggettu",
@@ -1005,6 +1062,7 @@ S'havi accirtari ca la cuntinuità storica di la pàggina nun veni altirata.",
 'searchprofile-everything-tooltip' => 'Cerca unnegghiè (puru ntî pàggini di discussioni)',
 'searchprofile-advanced-tooltip' => 'Cerca ntê namespace pirsunalizzati',
 'search-result-size' => '$1 ({{PLURAL:$2|na parola|$2 paroli}})',
+'search-result-category-size' => '{{PLURAL:$1|1 utenti|$1 utenti}} ({{PLURAL:$2|1 suttacatigurìa|$2 suttacatigurìi}}, {{PLURAL:$3|1 file|$3 files}})',
 'search-result-score' => 'Rilivanza: $1%',
 'search-redirect' => '(redirect $1)',
 'search-section' => '(sizzioni $1)',
@@ -1033,14 +1091,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',
@@ -1131,7 +1181,7 @@ L'operazioni nun pò èssiri annullata.",
 'prefs-help-gender' => "Opzionali: cunsenti di adattari li missaggi dô software in funzioni dô generi d'utenti. Sta nfurmazioni sarà pubblica.",
 'email' => 'Nnirizzu email',
 'prefs-help-realname' => '* Nomu veru (upziunali): siddu scegghi di furnìrilu veni usatu pi dàriti crèditu dû tò travagghiu.',
-'prefs-help-email' => "* Imeil (opziunali): abbìlita l'àutri utenti a cuntattàriti attraversu la tò pàggina d'utenti o di discussioni, senza pi chissu rivilari la tò idintitati.",
+'prefs-help-email' => 'Lu nnirizzu e-mail è facurtativu, ma è abbisugnatu pi risittari la password, ntô casu n cui è scurdata.',
 'prefs-help-email-others' => "Putiti videmma scegghiri di pirmèttiri ca l'autri ti cuntattanu pi posta elittronica cu nu culligamentu di la tò pàggina d'utilizzaturi o di discussioni. Lu tò nnirizzu nun veni rivilatu quannu l'àutri utilizzatura ti cuntattanu.",
 'prefs-help-email-required' => 'Lu nnirizzu email è nicissariu.',
 'prefs-info' => 'Informazzioni di basi',
@@ -1384,7 +1434,7 @@ Pi nziriri nu file nta na pàggina, fai nu lijami accussì:
 'filepageexists' => "La pàggina di discrizzioni di stu file fu ggià criata nnû nnirizzu <strong>[[:$1]]</strong>, macari si ancora non c'è nu file cu stu nomu. La discrizzioni di l'uggettu ca fu misa ntô mentri dû caricamentu non si vidi supra a la pàggina di discussioni. Pi fàrila cumpàriri ntâ pàggina di discussioni, c'è la nicissitati di mudificàrila a manu",
 'fileexists-extension' => "Nu file cu nu nomu simili a chistu esisti già; l'unica diffirenza è l'usu dê maiusculi nte l'estensioni: [[$2|thumb]]
 * Nomu dû file carricatu: <strong>[[:$1]]</strong>
-* Nome dû file esistenti: <strong>[[:$2]]</strong>
+* Nomu dû file esistenti: <strong>[[:$2]]</strong>
 Pi favuri scegghiti n'àutru nomu.",
 'fileexists-thumbnail-yes' => "Lu file carricato sembra èssiri lu risurtatu di n'antiprima ''(thumbnail)''. [[$1|thumb]]
 Virificari, pi cunfruntu, lu file <strong>[[:$1]]</strong>.
@@ -1778,7 +1828,7 @@ Protucolli suppurtati: <code>$1</code>',
 'emailuserfooter' => 'Sta e-mail fu mannata di $1 a $2 attraversu la funzionu "Manna nu missàggiu e-mail a l\'utenti" supra {{SITENAME}}.',
 
 # Watchlist
-'watchlist' => 'Lista taliata mia',
+'watchlist' => 'Taliati spiciali',
 'mywatchlist' => 'Lista taliata mia',
 'watchlistfor2' => 'Pi $1, $2',
 'nowatchlist' => "Nun hai innicatu pàggini a tèniri d'occhiu.",
@@ -1795,8 +1845,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}}.',
@@ -1996,12 +2046,12 @@ $1',
 'blanknamespace' => '(Principali)',
 
 # Contributions
-'contributions' => 'cuntribbuti',
+'contributions' => 'Cuntribbuti {{GENDER:$1|utenti}}',
 'contributions-title' => 'Cuntribbuti di $1',
-'mycontris' => 'Li mei cuntribbuti',
+'mycontris' => 'Li mè cuntribbuti',
 'contribsub2' => 'Pi $1 ($2)',
 'nocontribs' => 'Secunnu sti criteri nun ci sunnu canci o cuntribbuti.',
-'uctop' => '(ùrtima pi la pàggina)',
+'uctop' => '(attuali)',
 'month' => 'A pàrtiri dô mese (e pricidenti):',
 'year' => "A pàrtiri di l'annu (e pricidenti):",
 
@@ -2016,7 +2066,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
@@ -2035,7 +2085,7 @@ $1',
 'whatlinkshere-hideredirs' => '$1 redirect',
 'whatlinkshere-hidetrans' => '$1 nclusioni',
 'whatlinkshere-hidelinks' => '$1 link',
-'whatlinkshere-hideimages' => '$1 link di mmàggini',
+'whatlinkshere-hideimages' => '$1 liami di files',
 'whatlinkshere-filters' => 'Filtri',
 
 # Block/unblock
@@ -2411,13 +2461,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 +2547,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 +2661,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 +2954,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..6b1dd4d 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',
@@ -242,7 +240,6 @@ $messages = array(
 'disclaimers' => 'Disclamation',
 'disclaimerpage' => 'Project:General_disclamation',
 'edithelp' => 'Editin help',
-'edithelppage' => 'Help:Editin',
 'helppage' => 'Help:Contents',
 'mainpage' => 'Main Page',
 'mainpage-description' => 'Main Page',
@@ -708,7 +705,6 @@ there micht be parteeculars in the [{{fullurl:{{#Special:Log}}/suppress|page={{F
 'viewprevnext' => 'View ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''There is a page named \"[[:\$1]]\" oan this wiki.'''",
 'searchmenu-new' => "'''Mak the page \"[[:\$1]]\" on this wiki!'''",
-'searchhelp-url' => 'Help:Contents',
 'searchprofile-articles' => 'Content pages',
 'searchprofile-project' => 'Help and Project pages',
 'searchprofile-images' => 'Multimedia',
@@ -738,9 +734,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 +1444,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 +1527,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..d5879fa 100644 (file)
@@ -321,7 +321,6 @@ $messages = array(
 'disclaimers' => 'غيرجوابداريناما',
 'disclaimerpage' => 'Project:عام غيرجوابدارينامو',
 'edithelp' => 'مدد براءِ ترميم',
-'edithelppage' => 'Help:سنوارڻ',
 'helppage' => 'Help:فهرست',
 'mainpage' => 'مُک صفحو',
 'mainpage-description' => 'مُک صفحو',
@@ -524,7 +523,6 @@ You cannot use the 'e-mail this user' feature unless a valid e-mail address is s
 'prevn' => 'پويان {{PLURAL:$1|$1}}',
 'nextn' => 'اڳيان {{PLURAL:$1|$1}}',
 'viewprevnext' => 'ڏسو ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:فهرست',
 'powersearch' => 'نفيس ڳولا',
 'powersearch-redir' => 'چورڻن جي فهرست ڏيکاريو',
 
@@ -694,7 +692,7 @@ $1 {{PLURAL:$1|اکر|اکرن}} کان ننڍي هوڻ گھرجي.',
 # Special:Categories
 'categories' => 'زمرا',
 
-# E-mail user
+# Email user
 'emailuser' => 'هن يوزر کي برق ٽپال اماڻيو',
 
 # Watchlist
@@ -912,7 +910,7 @@ $1 {{PLURAL:$1|اکر|اکرن}} کان ننڍي هوڻ گھرجي.',
 'metadata-expand' => 'توسيعي تفصيل ڏيکاريو',
 'metadata-collapse' => 'توسيعي تفصيل لڪايو',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ويڪر',
 'exif-imagelength' => 'اوچائي',
 'exif-bitspersample' => 'ٻٽڻيون في جُز',
@@ -966,7 +964,7 @@ $1 {{PLURAL:$1|اکر|اکرن}} کان ننڍي هوڻ گھرجي.',
 'namespacesall' => 'سڀ',
 'monthsall' => 'سڀ',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail_success' => 'توھان جي برق ٽپال جي پڪ ڪئي وئي آھي. ھاڻِ توھان لاگ ان ٿي وڪيءَ جو مزو وٺي سگھو ٿا',
 
 # Delete conflict
index e09bb1f..97f3469 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",
@@ -306,7 +304,6 @@ $messages = array(
 'disclaimers' => 'Avvirthènzi',
 'disclaimerpage' => 'Project:Avvirthènzi ginarari',
 'edithelp' => 'Ghia',
-'edithelppage' => 'Help:Mudìfigga',
 'helppage' => 'Help:Indizi',
 'mainpage' => 'Pàgina prinzipari',
 'mainpage-description' => 'Pàgina prinzipari',
@@ -776,7 +773,6 @@ Cunsulthà lu [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rigi
 'nextn' => 'sighenti {{PLURAL:$1|$1}}',
 'viewprevnext' => 'Vèdi ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-legend' => 'Opzioni di zercha',
-'searchhelp-url' => 'Help:Indizi',
 'searchprofile-everything' => 'Tuttu',
 'search-result-size' => '$1 ({{PLURAL:$2|una paraura|$2 parauri}})',
 'search-redirect' => '(rinviu $1)',
@@ -800,14 +796,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 +1273,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 +1829,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 +2005,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..b30e7c7 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", '.' => ',' );
@@ -314,7 +331,6 @@ $messages = array(
 'disclaimers' => 'Friijavuohta vástideamis',
 'disclaimerpage' => 'Project:Friijavuohta vástideamis',
 'edithelp' => 'Rievdadanrávvagat',
-'edithelppage' => 'Help:Mo rievdadit siidduid',
 'helppage' => 'Help:Sisdoallu',
 'mainpage' => 'Váldosiidu',
 'mainpage-description' => 'Váldosiidu',
@@ -602,7 +618,6 @@ Eará bajasdoallit sáhtet lohkat čihkojuvvon sisdoalu ja máhcahit dan.",
 
 $1 {{int:pipe-separator}} $2',
 'searchmenu-new' => "'''Álggat siiddu ''[[:$1]]'' dán Wikipediai'''",
-'searchhelp-url' => 'Help:Rávvagat',
 'searchprofile-articles' => 'Sisdoallosiiddut',
 'searchprofile-project' => 'Veahkke- ja prošeaktasiiddut',
 'searchprofile-everything' => 'Buot',
@@ -616,13 +631,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 +719,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 +1039,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 +1358,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..fee1e56 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',
@@ -200,7 +198,6 @@ $messages = array(
 'disclaimers' => 'Isój cacóomx',
 'disclaimerpage' => 'Project:Isoj cacóomx geniiraloj',
 'edithelp' => 'Help ticpatlöx',
-'edithelppage' => 'Help:Ticpatlöx',
 'helppage' => 'Help:Caálixötöj',
 'mainpage' => 'Caálixötöj',
 'mainpage-description' => 'Caálixötöj',
@@ -579,13 +576,8 @@ Informacion: (curt) = quiíxde vercion currentua,
 'prevn' => 'jan {{PLURAL:$1|$1}}',
 'nextn' => 'hun {{PLURAL:$1|$1}}',
 'viewprevnext' => 'Cohuatlöx ($1 {{int:pipe-separator}} $2) ($3)',
-'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 +1015,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..2ac7628 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',
@@ -291,7 +289,6 @@ $1',
 'disclaimers' => 'Atsakuomībės aprėbuojims',
 'disclaimerpage' => 'Project:Atsakuomībės aprėbuojims',
 'edithelp' => 'Kāp redagoutė',
-'edithelppage' => 'Help:Redagavėms',
 'helppage' => 'Help:Torėnīs',
 'mainpage' => 'Pėrms poslapis',
 'mainpage-description' => 'Pėrms poslapis',
@@ -725,7 +722,6 @@ Kėtė admėnėstratuorē šėtom pruojekte vėsdar galės pasėiktė pasliepta
 'searchmenu-legend' => 'Paėiškuos nustatīmā',
 'searchmenu-exists' => "'''Poslapis pavadėnts „[[$1]]“ šėtuo wiki'''",
 'searchmenu-new' => "'''Sokortė poslapi „[[:$1]]“ šėtuo wiki!'''",
-'searchhelp-url' => 'Help:Torėnīs',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ėiškuotė poslapiu so šėtuom prīšdielio]]',
 'searchprofile-articles' => 'Torėnė poslapē',
 'searchprofile-project' => 'Pagelbas ė pruojekta poslapē',
@@ -762,10 +758,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 +1262,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 +1765,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 +1900,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..2807cad 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}}',
@@ -449,7 +461,6 @@ $1',
 'disclaimers' => 'Odricanje odgovornosti',
 'disclaimerpage' => 'Project:Uslovi korištenja, pravne napomene i odricanje odgovornosti',
 'edithelp' => 'Pomoć pri uređivanju',
-'edithelppage' => 'Help:Uređivanje',
 'helppage' => 'Help:Sadržaj',
 'mainpage' => 'Glavna strana',
 'mainpage-description' => 'Glavna strana',
@@ -622,9 +633,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 +657,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 +779,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 +801,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 +812,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 +1037,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',
@@ -1241,7 +1282,6 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
 'searchmenu-legend' => 'Opcije pretrage',
 'searchmenu-exists' => "'''Postoji stranica pod nazivom \"[[:\$1]]\" na ovoj wiki'''",
 'searchmenu-new' => "'''Napravi stranicu \"[[:\$1|\$1]]\" na ovoj wiki!'''",
-'searchhelp-url' => 'Help:Sadržaj',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Pregledaj stranice sa ovim prefiksom]]',
 'searchprofile-articles' => 'Stranice sadržaja',
 'searchprofile-project' => 'Stranice pomoći i projekta',
@@ -1285,15 +1325,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 +1471,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 +1877,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 +2035,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 +2714,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 +2879,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 +3180,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 +3226,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 +3406,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 +3823,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 +3924,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 +3952,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 +4041,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..e8e83d9 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',
@@ -249,7 +247,6 @@ $1',
 'disclaimers' => 'Ur darssuq',
 'disclaimerpage' => 'Project: Ur illa maddar illa ssuq',
 'edithelp' => 'Aws ɣ tirra',
-'edithelppage' => 'Help:Imaratn',
 'helppage' => 'Help:Mayllan',
 'mainpage' => 'Tasana tamzwarut',
 'mainpage-description' => 'Tasna tamzwarut',
@@ -405,7 +402,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
@@ -614,7 +611,6 @@ Tigira n ujbbad ns, ar takka yat tayafut bahra imqqurn,  ɣayan afan ur ttili.',
 'searchmenu-legend' => 'Istayn ucnubc',
 'searchmenu-exists' => '"\'Tlla yat tasna lli ilan assaɣ « [[:$1]] » ɣ wiki yad',
 'searchmenu-new' => "'''Skr Tasna « [[:$1|$1]] » ɣ wiki !'''",
-'searchhelp-url' => 'Help:Mayllan',
 'searchprofile-articles' => 'Mayllan ɣ tasna',
 'searchprofile-project' => 'Tisniwin n w-aws n usnfar',
 'searchprofile-images' => 'Multimedia',
@@ -657,14 +653,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 +899,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 +1281,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 c7480d1..3145581 100644 (file)
@@ -193,8 +193,8 @@ $magicWords = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'à·\83බà·\90ඳà·\92 à¶ºà¶§à·\93ර කිරීම:',
-'tog-justify' => 'ඡà·\9aදයනà·\8a à¶´à·\9aළ ගස්වන්න',
+'tog-underline' => 'à·\83බà·\90ඳà·\92 à¶ºà¶§à·\92à¶\89ර කිරීම:',
+'tog-justify' => 'ඡà·\9aදයනà·\8a à¶´à·\99ළ ගස්වන්න',
 'tog-hideminor' => 'මෑත වෙනස් කිරීම්වල සුළු සංස්කරණ සඟවන්න',
 'tog-hidepatrolled' => 'මෑත වෙනස් කිරීම්වල මුර සංචාරය කරන ලද සංස්කරණ සඟවන්න',
 'tog-newpageshidepatrolled' => 'විමසුමට ලක්කෙරුණු පිටු, අළුත් පිටු ලැයිස්තුවෙහි නොපෙන්වන්න',
@@ -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' => 'කිසිවිටෙක නොකරන්න',
@@ -436,7 +435,6 @@ $1",
 'disclaimers' => 'වියාචනයන්',
 'disclaimerpage' => 'Project:පොදු වියාචන',
 'edithelp' => 'සංස්කරණ උදවු',
-'edithelppage' => 'Help:සංස්කරණ',
 'helppage' => 'Help:පටුන',
 'mainpage' => 'මුල් පිටුව',
 'mainpage-description' => 'මුල් පිටුව',
@@ -608,9 +606,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 +630,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 +693,8 @@ $2',
 'blocked-mailpassword' => 'ඔබගේ අන්තර්ජාල ලිපිනය භාවිතා කරමින් සංස්කරණයෙහි යෙදීම වාරණය කොට ඇති අතර, අපයෙදුම වළකනු වස්,  මුර-පදය පුනරුත්ථාන  කෘත්‍යය භාවිත කිරීමට අවසරයද අහිමි කොට ඇත.',
 'eauthentsent' => 'නම් කර ඇති විද්‍යුත්-ලිපි ලිපිනය වෙත, තහවුරු කිරීම් විද්‍යුත්-ලිපියක් යවා ඇත.
 ගිණුම වෙත වෙනත් විද්‍යුත්-ලිපියක්  යැවීමට පෙර, ගිණුම සත්‍ය වශයෙන්ම ඔබගේම බව තහවුරු කරනු වස්, විද්‍යුත්-ලිපියෙහි අඩංගු උපදෙස්  පිළිපදින්න.',
-'throttled-mailpassword' => 'අවසන් {{PLURAL:$1| පැය|පැය $1 }} අතරතුරදී, දැනටමත් එක් මුර-පද සිහිගැන්වීමක් යවා ඇත .
-à¶\85පයà·\99දà·\94ම à·\80à·\85à¶\9aà·\8aà·\80නà·\94 à·\80à·\83à·\8a, {{PLURAL:$1|à¶\91à¶\9aà·\8a à¶´à·\90යà¶\9a| à¶´à·\90ය $1 à¶\9a}}ට à·\80රà¶\9aà·\8a à¶\91à¶\9aà·\8a à¶¸à·\94ර-පද à·\83à·\92à·\84à·\92à¶\9cà·\90නà·\8aà·\80à·\93මක් පමණක් යවනු ලැබේ.',
+'throttled-mailpassword' => 'අවසන් {{PLURAL:$1|පැය|පැය $1}} තුල, මුරපද යළි සැකසුම් ඊ-ලිපියක් යවාඇත.
+à¶\85පයà·\99දà·\94ම à·\80à·\85à¶\9aනà·\94 à·\80à·\83à·\8a, {{PLURAL:$1|à¶\91à¶\9aà·\8a à¶´à·\90යà¶\9a|පà·\90ය $1 à¶\9a}}ට à·\80රà¶\9aà·\8a à¶\91à¶\9aà·\8a à¶¸à·\94රපද à¶ºà·\85à·\92 à·\83à·\90à¶\9aà·\83à·\94මà·\8a à¶\8a-ලà·\92පà·\92යක් පමණක් යවනු ලැබේ.',
 'mailerror' => 'තැපෑල යැවීමේදී වූ දෝෂය: $1',
 'acct_creation_throttle_hit' => 'ඔබගේ අන්තර්ජාල ලිපිනය භාවිතා කල මෙම විකියට අමුත්තන් විසින් {{PLURAL:$1|එක් ගිණුමක්|ගිණුම් $1 ක්}} පසුගිය දිනය තුලදී තනා ඇති අතර, එය මෙම කාල පරිච්ඡේදය තුලදී ඉඩ දෙනු ලබන උපරිමය වෙයි.
 මේ හේතුවෙන්, මෙම අන්තර්ජාල ලිපිනය භාවිතා කරන අමුත්තන් විසින් මෙම අවස්ථාවෙහිදී තවත් ගිණුම් තැනීම සිදු කල නොහැකිව ඇත.',
@@ -727,10 +746,8 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'මුරපදය වෙනස් කරන්න',
-'passwordreset-text' => 'ඔබගේ ගිණුම් තොරතුරුවල විද්‍යුත් තැපැල් මතක්කිරීමක් ලබා ගැනීම සදහා මෙම ආකෘතිපත්‍රය සම්පූර්ණ කරන්න.',
 'passwordreset-legend' => 'මුරපදය යළි පිහිටුවන්න',
 'passwordreset-disabled' => 'මෙම විකියෙහි මුර පද ප්‍රත්‍යාරම්භ කිරීම් අක්‍රීය කොට ඇත.',
-'passwordreset-pretext' => '{{PLURAL:$1||පහත දැක්වෙන දත්ත කණ්ඩ වලින් එකක් ඇතුල් කරන්න}}',
 'passwordreset-username' => 'පරිශීලක නාමය:',
 'passwordreset-domain' => 'වසම:',
 'passwordreset-capture' => 'ප්‍රතිපලදායක විද්‍යුත් තැපෑල නරඹනවාද?',
@@ -963,10 +980,13 @@ $2
 එය මකා දමා ඇති බවක් පෙනේ.',
 'edit-conflict' => 'සංස්කරණ ගැටුම.',
 'edit-no-change' => 'පෙළට කිසිදු වෙනසක් සිදු නොකල  බැවින් ඔබගේ සංස්කරණය නොසලකාහරින ලදි.',
+'postedit-confirmation' => 'ඔබගේ සංස්කරණය සුරකින ලදී.',
 'edit-already-exists' => 'නව පිටුවක් තැනිය නොහැකි විය.
 එය දැනටමත් පවතියි.',
 'defaultmessagetext' => 'සාමාන්‍ය පණිවුඩ පෙළ',
 'invalid-content-data' => 'වලංගු නොවන අන්තර්ගත දත්ත',
+'editwarning-warning' => 'අවධානයට: මෙම පිටුවෙන් නික්ම යාම ඔබ සිදු කළ වෙනස්කම් නැතිවී යෑමට හේතු විය හැක.
+ඔබ ප්‍රවිෂ්ටවී ඇත්නම්, ඔබගේ වරණයන්වල "සංසකරණය කිරීම්" කොටසේ ඇති මෙම අනතුරු ඇඟවීම අක්‍රීය කළ හැක.',
 
 # Content models
 'content-model-wikitext' => 'විකිපෙළ',
@@ -1197,7 +1217,6 @@ $1",
 'searchmenu-legend' => 'ගවේෂණ තෝරාගැනීම්',
 'searchmenu-exists' => "'''මෙම විකියෙහි \"[[:\$1]]\" ලෙස නම් කර ඇති පිටුවක් ඇත.'''",
 'searchmenu-new' => "'''මෙම විකියෙහි \"[[:\$1]]\" පිටුව තනන්න!'''",
-'searchhelp-url' => 'Help:පටුන',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|මෙම උපසර්ගය භාවිත කරමින් පිටු පිරික්සන්න]]',
 'searchprofile-articles' => 'අන්තර්ගත පිටු',
 'searchprofile-project' => 'උදවු හා ව්‍යාපෘති පිටු',
@@ -2101,6 +2120,15 @@ When filtered by user, only files where that user uploaded the most recent versi
 'listusers-noresult' => 'පරිශීලකයෙකු සොයාගත නොහැකි විය.',
 'listusers-blocked' => '(වාරණය කොට)',
 
+# Special:ActiveUsers
+'activeusers' => 'සක්‍රීය පරිශීලකයන් ලැයිස්තුව',
+'activeusers-intro' => 'මෙය පසුගිය $1 {{PLURAL:$1|දිනය|දින}}තුළ යම් ක්‍රියාකාරකමක් කළ පරිශීලකයන්ගේ ලැයිස්තුවකි.',
+'activeusers-count' => '{{PLURAL:$1|එක් සංස්කරණයක්|සංස්කරණ $1 ක්}} අවසන් {{PLURAL:$3|දිනය|දින $3}} තුළ',
+'activeusers-from' => 'මෙයින් ඇරඹෙන පරිශීලකයන් පෙන්වන්න:',
+'activeusers-hidebots' => ' bots සඟවන්න',
+'activeusers-hidesysops' => 'පරිපාලකයින් සඟවන්න',
+'activeusers-noresult' => 'කිසිදු පරිශීලකයෙකු හමුනොවිණි.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'පරිශීලක කාණ්ඩ හිමිකම්',
 'listgrouprights-summary' => 'මෙම විකියේ අර්ථදක්වා ඇති පරිශීලක කාණ්ඩ ලැයිස්තුවක් ඔවුනට අදාළ ප්‍රවේශ හිමිකම්ද සමගින් මෙහි පහත ලැයිස්තුගත කොට ඇත.
@@ -2176,8 +2204,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 ක්}} අඩංගුය.',
@@ -2901,7 +2929,6 @@ $1 ගේ වාරණයට හේතුව මෙය වේ: "$2"',
 'monobook.css' => '/* මෙහි CSS  බහාලීම ඒකායන ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */',
 'modern.css' => '/* මෙහි CSS  බහාලීම නූතන ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */',
 'print.css' => '/* මෙහි CSS  බහාලීම මුද්‍රණ ප්‍රතිදානයට බලපෑම් සිදු කල හැක */',
-'handheld.css' => '/* මෙහි බහාලන CSS විසින් $wgHandheldStyle හි වින්‍යාසකෙරෙන ජවිය මත පදනම් වූ අතේ ගෙන යා හැකි උපකරණ වලට බලපෑම් කල හැක*/',
 
 # Scripts
 'common.js' => '/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් සෑම පිටු ප්‍රවේශනයකදීම සියළු පරිශීලකයන්හට ප්‍රවේශනය කෙරේ. */',
@@ -3054,8 +3081,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',
@@ -3114,7 +3139,7 @@ Others will be hidden by default.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'පළල',
 'exif-imagelength' => 'උස',
 'exif-bitspersample' => 'එක් සංරචකයකට බිට් ගණන',
@@ -3293,7 +3318,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 ෆැක්ස් කේතීකරණය',
@@ -3791,13 +3816,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' => 'එහි පූරක අගය පාදක කර ගෙන අනුපිටපත් ගොනු සඳහා ගවේෂණය කරන්න.',
@@ -3824,7 +3842,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..e20bb9d 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Chiak
  * @author Danny B.
+ * @author Geitost
  * @author Helix84
  * @author Kaganer
  * @author Kusavica
@@ -16,6 +17,7 @@
  * @author Maros
  * @author Michawiki
  * @author Mormegil
+ * @author Nemo bis
  * @author Palica
  * @author Pitr2311
  * @author Ragimiri
@@ -287,14 +289,14 @@ $messages = array(
 'tog-hideminor' => 'V posledných úpravách nezobrazovať drobné úpravy',
 'tog-hidepatrolled' => 'Skryť strážené úpravy v Posledných úpravách',
 'tog-newpageshidepatrolled' => 'Skryť strážené stránky zo zoznamu nových stránok',
-'tog-extendwatchlist' => 'Rozšíriť zoznam sledovaných, aby zobrazoval všetky zmeny, nie len posledné',
-'tog-usenewrc' => 'Zoskupiť zmeny v posledných úpravách a zoznamoch sledovaných (vyžaduje JavaScript)',
+'tog-extendwatchlist' => 'Rozšíriť zoznam sledovaných stránok, aby zobrazoval všetky zmeny, nie len posledné',
+'tog-usenewrc' => 'Zoskupiť v posledných úpravách a na zozname sledovaných stránok podľa stránky (vyžaduje JavaScript)',
 'tog-numberheadings' => 'Automaticky číslovať nadpisy',
-'tog-showtoolbar' => 'Zobraziť panel nástrojov úprav',
-'tog-editondblclick' => 'Upravovať stránky po dvojitom kliknutí (JavaScript)',
-'tog-editsection' => 'Umožniť úpravu sekcie pomocu odkazov [upraviť]',
-'tog-editsectiononrightclick' => 'Umožniť upravovať sekcie po kliknutí pravým tlačidlom na nadpisy sekcií (JavaScript)',
-'tog-showtoc' => 'Zobrazovať obsah (pre stránky s viac ako 3 nadpismi)',
+'tog-showtoolbar' => 'Zobraziť panel nástrojov úprav (vyžaduje JavaSkript)',
+'tog-editondblclick' => 'Upravovať stránky po dvojitom kliknutí (vyžaduje JavaScript)',
+'tog-editsection' => 'Umožniť upravovanie sekcie prostredníctvom odkazov [upraviť]',
+'tog-editsectiononrightclick' => 'Umožniť upravovanie sekcie pravým kliknutím na nadpisy sekcií (vyžaduje JavaScript)',
+'tog-showtoc' => 'Zobrazovať tabuľku s obsahom (pre stránky s viac ako 3 nadpismi)',
 'tog-rememberpassword' => 'Zapamätať si prihlásenie na tomto počítači (najviac $1 {{PLURAL:$1|deň|dni|dní}})',
 'tog-watchcreations' => 'Pridávať stránky, ktoré vytvorím a súbory, ktoré nahrám medzi sledované',
 'tog-watchdefault' => 'Pridávať stránky a súbory, ktoré upravím medzi sledované',
@@ -311,8 +313,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 +327,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 +416,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 +450,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}}}}',
@@ -522,7 +525,6 @@ $1',
 'disclaimers' => 'Vylúčenie zodpovednosti',
 'disclaimerpage' => 'Project:Vylúčenie zodpovednosti',
 'edithelp' => 'Ako upravovať stránku',
-'edithelppage' => 'Help:Ako upravovať stránku',
 'helppage' => 'Help:Obsah',
 'mainpage' => 'Hlavná stránka',
 'mainpage-description' => 'Hlavná stránka',
@@ -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ý/á',
-'nologin' => "Nemáte ešte účet? '''$1'''.",
+'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',
@@ -1297,7 +1313,6 @@ Podrobnosti nájdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'searchmenu-legend' => 'Možnosti hľadania',
 'searchmenu-exists' => "*Stránka '''[[$1]]'''",
 'searchmenu-new' => "'''Vytvoriť stránku „[[:$1|$1]]“ na tejto wiki'''",
-'searchhelp-url' => 'Help:Obsah',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Prehliadať stránky s touto predponou]]',
 'searchprofile-articles' => 'Stránky s obsahom',
 'searchprofile-project' => 'Stránky pomocníka a projektu',
@@ -1319,7 +1334,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 +1353,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 +1434,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 +1829,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 +1907,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 +2058,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 +2216,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 +2301,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 +2313,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 +2331,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 +2435,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 +2452,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 +3039,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 +3052,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 +3127,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 +3177,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 +3207,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 +3252,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 +3430,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 +3852,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 +3878,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 +3941,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 +3971,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 +4036,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 +4057,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 d4b8e0e..e7fda88 100644 (file)
@@ -12,6 +12,7 @@
  * @author Freakolowsky
  * @author Irena Plahuta
  * @author McDutchie
+ * @author Nemo bis
  * @author Smihael
  * @author Vadgt
  * @author XJamRastafire
@@ -293,6 +294,18 @@ $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}}',
@@ -374,6 +387,7 @@ $messages = array(
 'create-this-page' => 'Ustvari stran',
 'delete' => 'Briši',
 'deletethispage' => 'Briši stran',
+'undeletethispage' => 'Obnovi stran',
 'undelete_short' => 'Vrni $1 {{PLURAL:$1|izbrisano urejanje|izbrisani urejanji|izbrisana urejanja|izbrisanih urejanj|izbrisanih urejanj}}',
 'viewdeleted_short' => 'Ogled {{PLURAL:$1|enega izbrisanega urejanja|$1 izbrisanih urejanj}}',
 'protect' => 'Zaščiti',
@@ -427,7 +441,6 @@ $1',
 'disclaimers' => 'Zanikanja odgovornosti',
 'disclaimerpage' => 'Project:Splošno zanikanje odgovornosti',
 'edithelp' => 'Pomoč pri urejanju',
-'edithelppage' => 'Help:Urejanje',
 'helppage' => 'Help:Vsebina',
 'mainpage' => 'Glavna stran',
 'mainpage-description' => 'Glavna stran',
@@ -578,6 +591,8 @@ $2',
 'namespaceprotected' => "Nimate dovoljenja urejati strani v imenskem prostoru '''$1'''.",
 'customcssprotected' => 'Nimate pravice urejati te strani CSS, ker vsebuje osebne nastavitve drugega uporabnika.',
 'customjsprotected' => 'Nimate pravice urejati te strani JavaScript, ker vsebuje osebne nastavitve drugega uporabnika.',
+'mycustomcssprotected' => 'Nimate pravic za urejanje te strani s CSS.',
+'mycustomjsprotected' => 'Nimate pravic za urejanje te strani z JavaScriptom.',
 'ns-specialprotected' => 'Posebnih strani ni mogoče urejati.',
 'titleprotected' => "Uporabnik [[User:$1|$1]] je preprečil ustvarjanje strani s takim naslovom.
 Podani razlog je bil »''$2''«.",
@@ -608,10 +623,13 @@ Ne pozabite si prilagoditi vaših [[Special:Preferences|nastavitev {{GRAMMAR:rod
 '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' => 'Vpiši se z varnim strežnikom',
+'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.',
@@ -632,14 +650,30 @@ Ne pozabite si prilagoditi vaših [[Special:Preferences|nastavitev {{GRAMMAR:rod
 '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.
@@ -650,7 +684,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]].',
@@ -699,7 +733,7 @@ Prosimo, vpišite pravilno oblikovanega ali polje izpraznite.',
 'cannotchangeemail' => 'E-poštnih naslovov računa na tem wikiju ni mogoče spremeniti.',
 'emaildisabled' => 'Stran ne more pošiljati e-pošte.',
 'accountcreated' => 'Račun je ustvarjen',
-'accountcreatedtext' => 'Uporabniški račun za »$1« je ustvarjen.',
+'accountcreatedtext' => 'Ustvarili smo uporabniški račun za [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|pogovor]]).',
 'createaccount-title' => 'Ustvarjanje računa za {{GRAMMAR:tožilnik|{{SITENAME}}}}',
 'createaccount-text' => 'Nekdo je ustvaril račun $2 na {{GRAMMAR:dajalnik|{{SITENAME}}}} ($4). Geslo za »$2« je »$3«. Priporočljivo je, da se prijavite in spremenite svoje geslo sedaj.
 
@@ -734,14 +768,15 @@ 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-text-one' => 'Izpolnite obrazec, da ponastavite svoje geslo.',
+'passwordreset-text-many' => 'Vnesite {{PLURAL:$1|podatek|enega od podatkov}}, da ponastavite svoje geslo.',
 'passwordreset-legend' => 'Ponastavitev gesla',
 'passwordreset-disabled' => 'Ponastavljanje gesla je na tem wikiju onemogočeno.',
 'passwordreset-emaildisabled' => 'Na tem wikiju so možnosti e-pošte onemogočene.',
-'passwordreset-pretext' => '{{PLURAL:$1||Vnesite enega od dela podatkov spodaj}}',
 'passwordreset-username' => 'Uporabniško ime:',
 'passwordreset-domain' => 'Domena:',
 'passwordreset-capture' => 'Ogled nastale e-pošte?',
@@ -755,7 +790,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.',
@@ -773,7 +808,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',
@@ -983,13 +1018,14 @@ Spodaj sta za sklicevanje na razpolago dnevnik brisanja in dnevnik prestavljanja
 Izgleda, da je bila izbrisana.',
 'edit-conflict' => 'Navzkrižje urejanj.',
 'edit-no-change' => 'Vaše urejanje je bilo prezrto, saj ni vsebovalo sprememb.',
+'postedit-confirmation' => 'Vaše urejanje smo shranili.',
 'edit-already-exists' => 'Ni bilo mogoče ustvariti nove strani, ker že obstaja.',
 'defaultmessagetext' => 'Prednastavljeno besedilo',
 '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.',
+Če ste prijavljeni, lahko to opozorilo onemogočite v razdelku »Urejanje« v svojih nastavitvah.',
 
 # Content models
 'content-model-wikitext' => 'wikibesedilo',
@@ -1232,7 +1268,6 @@ Podrobnosti lahko najdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
 'searchmenu-legend' => 'Možnosti za iskanje',
 'searchmenu-exists' => "'''Na tem wikiju obstaja stran »[[:$1]]«'''",
 'searchmenu-new' => "'''Ustvari stran »[[:$1]]« na tem wikiju!'''",
-'searchhelp-url' => 'Help:Vsebina',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Iskanje strani s to predpono]]',
 'searchprofile-articles' => 'Članki',
 'searchprofile-project' => 'Pomoč in projektne strani',
@@ -1376,7 +1411,7 @@ Ne sme biti daljši od $1 {{PLURAL:$1|znaka|znakov}}.',
 'prefs-help-gender' => 'Podatek ni obvezen, uporablja pa se ga izključno za pravilno obliko naslavljanja programja glede na spol.
 Podatek bo javno prikazan.',
 'email' => 'E-pošta',
-'prefs-help-realname' => 'Pravo ime je neobvezno.
+'prefs-help-realname' => 'Pravo ime ni obvezno.
 Če se ga odločite navesti, bo uporabljeno za priznavanje vašega dela.',
 'prefs-help-email' => 'E-poštni naslov ni obvezen, vendar omogoča, da vam v primeru pozabljenega gesla pošljemo novo.',
 'prefs-help-email-others' => 'Omogočite lahko tudi možnost, da vam lahko ostali uporabniki pošiljajo e-pošto prek vaše uporabniške ali pogovorne strani.
@@ -1422,6 +1457,8 @@ 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.',
+'userrights-removed-self' => 'Uspešno ste odstranili svoje pravice. Tako sedaj ne morete več dostopati do te strani.',
 
 # Groups
 'group' => 'Skupina:',
@@ -1492,6 +1529,10 @@ Ko vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo ra
 'right-editusercssjs' => 'Urejanje CSS- in JS-datotek drugih uporabnikov',
 'right-editusercss' => 'Uredi CSS datotek drugih uporabnikov',
 'right-edituserjs' => 'Uredi JS datotek drugih uporabnikov',
+'right-editmyusercss' => 'Uredite svoje uporabniške datoteke CSS',
+'right-editmyuserjs' => 'Uredite svoje uporabniške datoteke JavaScript',
+'right-viewmywatchlist' => 'Ogledovanje svojega spiska nadzorov',
+'right-editmywatchlist' => 'Urejanje svojega spiska nadzorov. Pomnite, da bodo nekatera dejanja dodala strani tudi brez te pravice.',
 'right-rollback' => 'Hitro vračanje urejanj zadnjega uporabnika, ki je urejal določeno stran',
 'right-markbotedits' => 'Označi vrnjena urejanja kot urejanja botov',
 'right-noratelimit' => 'Omejitve dejavnosti ne veljajo',
@@ -1553,6 +1594,8 @@ Ko vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo ra
 'action-userrights-interwiki' => 'upravljanje uporabniških pravic za uporabnike drugih wikijev',
 'action-siteadmin' => 'zaklenitev ali odklepanje podatkovne baze',
 'action-sendemail' => 'pošiljanje e-sporočil',
+'action-editmywatchlist' => 'urejanje svojega spiska nadzorov',
+'action-viewmywatchlist' => 'ogleda svojega spiska nadzorov',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|sprememba|spremembi|spremembe|sprememb|sprememb}}',
@@ -1607,7 +1650,7 @@ Strani iz [[Special:Watchlist|vašega spiska nadzorov]] so '''odebeljene'''.",
 'reuploaddesc' => 'Prekliči nalaganje in se vrni na obrazec za nalaganje',
 'upload-tryagain' => 'Vnesite spremenjen opis datoteke',
 'uploadnologin' => 'Niste prijavljeni',
-'uploadnologintext' => 'Za nalaganje datotek se [[Special:UserLogin|prijavite]].',
+'uploadnologintext' => 'Za nalaganje datotek se morate $1.',
 'upload_directory_missing' => 'Mapa za nalaganje datotek ($1) manjka in je ni bilo mogoče ustvariti s spletnim strežnikom.',
 'upload_directory_read_only' => 'V mapo za nalaganje datotek ($1) spletni strežnik ne more pisati.',
 'uploaderror' => 'Napaka',
@@ -1877,7 +1920,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',
@@ -2170,6 +2213,15 @@ Zahtevana je vsaj najvišja domena, na primer »*.org«.<br />
 'listusers-noresult' => 'Ni najdenih uporabnikov.',
 'listusers-blocked' => '(blokiran)',
 
+# Special:ActiveUsers
+'activeusers' => 'Seznam aktivnih uporabnikov',
+'activeusers-intro' => 'Seznam uporabnikov, ki so bili kakor koli aktivni v {{PLURAL:$1|zadnjem $1 dnevu|zadnjih $1 dneh}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|dejanje|dejanji|dejanja|dejanj}} v {{PLURAL:$3|preteklem dnevu|preteklih $3 dneh}}',
+'activeusers-from' => 'Prikaži uporabnike začenši z:',
+'activeusers-hidebots' => 'Skrij bote',
+'activeusers-hidesysops' => 'Skrij administratorje',
+'activeusers-noresult' => 'Noben uporabnik ni bil najden.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Pravice uporabniških skupin',
 'listgrouprights-summary' => 'Tu je na razpolago seznam uporabniških skupin na tem wikiju z navedbo dodeljenih pravic dostopa.
@@ -2247,8 +2299,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}}.',
@@ -2501,7 +2553,7 @@ $1',
 'mycontris' => 'Prispevki',
 'contribsub2' => 'Uporabnik: $1 ($2)',
 'nocontribs' => 'Ne najdem nobene merilom ustrezajoče spremembe.',
-'uctop' => ' (vrh)',
+'uctop' => '(trenutno)',
 'month' => 'Od meseca (in prej):',
 'year' => 'Od leta (in prej):',
 
@@ -2833,6 +2885,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',
@@ -3135,11 +3189,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:
 
@@ -3168,7 +3236,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',
@@ -3346,7 +3414,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',
@@ -3770,14 +3838,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',
@@ -3871,6 +3942,7 @@ Ta stran se sooča s tehničnimi težavami.',
 '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',
@@ -3897,9 +3969,9 @@ Ta stran se sooča s tehničnimi težavami.',
 'revdelete-restricted' => 'uveljavljene omejitve administratorjev',
 'revdelete-unrestricted' => 'odstranjene omejitve administratorjev',
 'logentry-move-move' => '$1 je {{GENDER:$2|premaknil|premaknila|premaknil(-a)}} stran $3 na $4',
-'logentry-move-move-noredirect' => '$1 je {{GENDER:$2|premaknil|premaknila|premaknil(-a)}} stran $3 na $4 brez preusmeritve',
-'logentry-move-move_redir' => '$1 je {{GENDER:$2|premaknil|premaknila|premaknil(-a)}} stran $3 na $4 prek preusmeritve',
-'logentry-move-move_redir-noredirect' => '$1 je {{GENDER:$2|premaknil|premaknila|premaknil(-a)}} stran $3 na $4 prek preusmeritve in brez preusmeritve',
+'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',
index fbcf663..6fcbac1 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Als-Holder
+ * @author Geitost
  * @author Jens Liebenau
  * @author Jonny84
  * @author Kaganer
@@ -54,8 +55,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',
@@ -244,7 +243,6 @@ $1",
 'disclaimers' => 'Impressum',
 'disclaimerpage' => 'Project:Impressum',
 'edithelp' => 'Bearbeitungshilfe',
-'edithelppage' => 'Help:Bearbeitungshilfe',
 'helppage' => 'Help:Hilfe',
 'mainpage' => 'Hauptseite',
 'mainpage-description' => 'Hauptseite',
@@ -377,7 +375,7 @@ Beachte, doas einige Seyta noo oazeiga kinna, doas du oagemeldet best, sulange d
 'logout' => 'Oabmelda',
 'userlogout' => 'Oabmelda',
 'notloggedin' => 'Nä oangemeldet',
-'nologin' => "Du hast keen Benutzerkonto? '''$1'''.",
+'nologin' => 'Du hast keen Benutzerkonto? $1.',
 'nologinlink' => 'Neues Benutzerkonto oanleega',
 'createaccount' => 'Benutzerkonto oanlega',
 'gotaccount' => "Du hast bereits a Benutzerkonto? '''$1'''.",
@@ -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',
@@ -1096,11 +1090,11 @@ Bitte gieb dar Datei an'n Noama, dar dann Inhalt besser beschreibt.",
 'upload-proto-error' => 'Foalsches Protokoll',
 'upload-proto-error-text' => 'De URL muuß miet <code>http://</code> oder <code>ftp://</code> beginna.',
 'upload-file-error-text' => "Bei dar Erstellung a'r temporären Datei uff'd Server ies a interner Fahler uffgetreta.
-Bitte informiere an'n [[Special:ListUsers/sysop|System-Administrator]].",
+Bitte informiere an'n [[Special:ListUsers/sysop|Administrator]].",
 'upload-misc-error' => 'Unbekennter Fahler beim Huchloada',
 'upload-misc-error-text' => "Beim Huchloada ies a unbekennter Fahler uffgetreta.
 Priefe de URL uff Fahler, dann Online-Status der Seite und versuche 's erneut.
-Wenn doas Problem wetter bestieht, informiere anna [[Special:ListUsers/sysop|System-Administrator]].",
+Wenn doas Problem wetter bestieht, informiere anna [[Special:ListUsers/sysop|Administrator]].",
 'upload-too-many-redirects' => 'De URL beinhaltete zu viele Wetterleitunga',
 'upload-unknown-size' => 'Unbekennte Grieße',
 'upload-http-error' => 'A HTTP-Fahler ies uffgetreta: $1',
@@ -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 72743f9..a9748e9 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,11 +247,10 @@ $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',
-'edithelppage' => 'Help:Wax ka bedelka',
 'helppage' => 'Help:Caawinaad',
 'mainpage' => 'Bogga Hore',
 'mainpage-description' => 'Bogga Hore',
@@ -390,6 +387,7 @@ Waad sii isticmaali kartaa {{SITENAME}} adoona lagu aqoon, ama <span class='plai
 'yourpassword' => 'Eraysir:',
 'yourpasswordagain' => 'Markale qor ereysirka:',
 'remembermypassword' => 'Kumbuyuutarkaan ku xasuusnaaw magaceyga gudagalka (ilaa  $1 {{PLURAL:$1|maalin|maalmood}})',
+'userlogin-remembermypassword' => 'Ka dhig mid diyaar ah mar waliba',
 'yourdomainname' => 'Magacaga shabakada',
 'password-change-forbidden' => 'Ma badali kartid Eraysir ee wiki.',
 'login' => 'Gudaha gal',
@@ -400,12 +398,14 @@ Waad sii isticmaali kartaa {{SITENAME}} adoona lagu aqoon, ama <span class='plai
 'logout' => 'Ka bax',
 'userlogout' => 'Ka bax',
 'notloggedin' => 'Gudaha kuma jirtid',
+'userlogin-noaccount' => "Akoon ma heysatid? '''$1'''.",
 'nologin' => "Akoon ma heysatid? '''$1'''.",
 'nologinlink' => 'Akoon sameyso',
 'createaccount' => 'Sameey gudagale',
 'gotaccount' => "Waan heystaa gudagale? '''$1'''.",
 'gotaccountlink' => 'Gudaha gal',
 'userlogin-resetlink' => 'Ma ilaawday tafaasiisha gudagalahaada?',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Caawinaad habka gudagalka]]',
 'createaccountmail' => 'E-mail ahaan',
 'createaccountreason' => 'Sababta:',
 'badretype' => 'Ereyada sirta ah oo qortay ma islahan.',
@@ -741,7 +741,6 @@ sababteeda neh waxaa laga heli kartaa  [{{fullurl:{{#Special:Log}}/delete|page={
 'searchmenu-legend' => 'Raadi doorashooyinka',
 'searchmenu-exists' => "'''Wikigaan wuu ku jiraa bog la dhoho  \"[[:\$1]]\" .'''",
 'searchmenu-new' => "'''Ku sameey bogga  \"[[:\$1]]\" wikigaan!'''",
-'searchhelp-url' => 'Help:Caawinaad',
 'searchprofile-articles' => 'Maqaalada kooban',
 'searchprofile-project' => 'Caawin iyo Bogga mashruuca',
 'searchprofile-images' => 'Multimedia-ha',
@@ -776,9 +775,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 +1122,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 +1406,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 +1452,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 84a2763..4bfa788 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',
@@ -457,7 +456,6 @@ $1",
 'disclaimers' => 'Shfajësimet',
 'disclaimerpage' => 'Project:Shfajësimet e përgjithshme',
 'edithelp' => 'Ndihmë për redaktim',
-'edithelppage' => 'Help:Redaktimi',
 'helppage' => 'Help:Përmbajtje',
 'mainpage' => 'Faqja kryesore',
 'mainpage-description' => 'Faqja kryesore',
@@ -737,10 +735,8 @@ Për të hyrë tërësisht duhet të vendosni një fjalëkalim të ri këtu:',
 
 # Special:PasswordReset
 'passwordreset' => 'Ndrysho fjalkalimin',
-'passwordreset-text' => 'Plotësoni këtë formular për të marrë një këshillë e-mail të dhënat e llogarisë suaj.',
 'passwordreset-legend' => 'Ndrysho fjalkalimin',
 'passwordreset-disabled' => 'Rivendosja e fjalëkalimit është deaktivizuar në këtë wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1| | Shkruani një nga pjesët e të dhënave më poshtë}}',
 'passwordreset-username' => 'Nofka:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Dëshiron të shikosh e-mail-in që rezulton?',
@@ -982,6 +978,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ë',
@@ -1207,7 +1205,6 @@ Kini kujdes se përdorimi i lidhjeve të shfletimit do të ndryshojë përzgjedh
 'searchmenu-legend' => 'Parazgjedhjet e kërkimit',
 'searchmenu-exists' => "'''Në këtë wiki kjo faqe është emëruar \"[[:\$1]]\"'''",
 'searchmenu-new' => "'''Hapë faqen \"[[:\$1]]\" në këtë wiki!'''",
-'searchhelp-url' => 'Help:Ndihmë',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Shfletoi faqet me këtë parashtesë]]',
 'searchprofile-articles' => 'Përmbajtja e faqeve',
 'searchprofile-project' => 'Ndihmë dhe faqet e Projektit',
@@ -1249,15 +1246,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',
@@ -2110,6 +2098,15 @@ Protokolle të mbështetura: <code>$1<code> (mos shtoni ndonjërin nga këta në
 'listusers-noresult' => "Asnjë përdorues s'u gjet.",
 'listusers-blocked' => '(Bllokuar)',
 
+# Special:ActiveUsers
+'activeusers' => 'Lista e përdoruesve aktivë',
+'activeusers-intro' => 'Kjo është një listë e përdoruesve që kanë qenë aktivë për $1 {{PLURAL:$1|ditë|ditë}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|redaktim|redaktime}} në {{PLURAL:$3|ditën|$3 ditët}} e fundit',
+'activeusers-from' => 'Trego përdoruesit duke filluar prej te:',
+'activeusers-hidebots' => 'Fshih robotët',
+'activeusers-hidesysops' => 'Fshih administratorët',
+'activeusers-noresult' => 'Asnjë përdorues nuk u gjet.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Grupime përdoruesish me privilegje',
 'listgrouprights-summary' => 'Më poshtë jepet grupimi i përdoruesve sipas privilegjeve që ju janë dhënë në këtë wiki. Më shumë informacion rreth privilegjeve në veçanti mund të gjendet [[{{MediaWiki:Listgrouprights-helppage}}|këtu]].',
@@ -2185,8 +2182,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}}.',
@@ -3049,7 +3046,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',
@@ -3227,7 +3224,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',
@@ -3633,13 +3630,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 8058926..05d209c 100644 (file)
  * @author CERminator
  * @author Charmed94
  * @author FriedrickMILBarbarossa
+ * @author Geitost
  * @author Helios13
  * @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 +403,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 +422,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 +435,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 +504,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 +540,10 @@ $messages = array(
 
 'about' => 'О нама',
 'article' => 'Страница са садржајем',
-'newwindow' => '(отвара у новом прозору)',
+'newwindow' => '(оÑ\82ваÑ\80а Ñ\81е Ñ\83 Ð½Ð¾Ð²Ð¾Ð¼ Ð¿Ñ\80озоÑ\80Ñ\83)',
 'cancel' => 'Откажи',
 'moredotdotdot' => 'Више…',
+'morenotlisted' => 'Више није приказано…',
 'mypage' => 'Страница',
 'mytalk' => 'Разговор',
 'anontalk' => 'Разговор за ову ИП адресу',
@@ -636,7 +652,6 @@ $1',
 'disclaimers' => 'Одрицање одговорности',
 'disclaimerpage' => 'Project:Одрицање одговорности',
 'edithelp' => 'Помоћ при уређивању',
-'edithelppage' => 'Help:Уређивање',
 'helppage' => 'Help:Садржај',
 'mainpage' => 'Главна страна',
 'mainpage-description' => 'Главна страна',
@@ -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' => 'Потврда лозинке:',
-'remembermypassword' => 'Запамти ме на овом прегледачу (најдуже $1 {{PLURAL:$1|дан|дана|дана}})',
+'createacct-yourpasswordagain' => 'Потврдите лозинку',
+'createacct-yourpasswordagain-ph' => 'Унесите лозинку још једном',
+'remembermypassword' => 'Запамти моју лозинку на овом прегледачу (најдуже $1 {{PLURAL:$1|дан|дана}})',
+'userlogin-remembermypassword' => 'Остави ме пријављеног/у',
+'userlogin-signwithsecure' => 'Користите сигурну конекцију',
 'securelogin-stick-https' => 'Останите повезани са HTTPS након пријаве',
 'yourdomainname' => 'Домен:',
 'password-change-forbidden' => 'Не можете да промените лозинку на овом викију.',
@@ -832,17 +856,37 @@ $2',
 'logout' => 'Одјава',
 'userlogout' => 'Одјави ме',
 'notloggedin' => 'Нисте пријављени',
-'nologin' => 'Немате налог? Идите на страницу „$1“.',
+'userlogin-noaccount' => 'Немате налог?',
+'userlogin-joinproject' => 'Отворите га',
+'nologin' => 'Немате налог? Идите на страницу $1.',
 'nologinlink' => 'Отварање налога',
 'createaccount' => 'Отвори налог',
 'gotaccount' => 'Већ имате налог? Идите на страницу „$1“.',
 'gotaccountlink' => 'Пријава',
 'userlogin-resetlink' => 'Заборавили сте податке за пријаву?',
-'createaccountmail' => 'Е-поштом',
+'userlogin-resetpassword-link' => 'Ресетујте лозинку',
+'helplogin-url' => 'Help:Logging in',
+'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' => 'Кориснички налог је отворен, али нисте пријављени.
 Овај вики користи колачиће за пријаву. Вама су колачићи онемогућени.
@@ -883,7 +927,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 +957,7 @@ $2',
 # Email sending
 'php-mail-error-unknown' => 'Непозната грешка у функцији PHP mail().',
 'user-mail-no-addy' => 'Покушали сте да пошаљете поруку без е-адресе.',
+'user-mail-no-body' => 'Покушано слање електронске поруке с празним или неразумно кратким садржајем.',
 
 # Change password dialog
 'resetpass' => 'Промена лозинке',
@@ -933,27 +978,27 @@ $2',
 'resetpass-wrong-oldpass' => 'Неисправна привремена или текућа лозинка.
 Можда сте већ променили лозинку или сте затражили нову привремену лозинку.',
 'resetpass-temp-password' => 'Привремена лозинка:',
+'resetpass-abort-generic' => 'Промену лозинке је спречио додатак.',
 
 # Special:PasswordReset
 'passwordreset' => 'Обнављање лозинке',
-'passwordreset-text' => 'Попуните овај образац да бисте примили е-поруку са својим подацима за пријаву.',
+'passwordreset-text-one' => 'Попуните овај образац да бисте ресетовали лозинку.',
 '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 +1190,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' => "'''Упозорење: ова страница је заштићена, тако да само администратори могу да је мењају.'''
@@ -1170,7 +1215,7 @@ $2
 'sectioneditnotsupported-text' => 'Уређивање одељка није подржано на овој страници.',
 'permissionserrors' => 'Грешке у дозволама',
 'permissionserrorstext' => 'Немате овлашћење за ту радњу из {{PLURAL:$1|следећег|следећих}} разлога:',
-'permissionserrorstext-withaction' => 'Ð\9dемаÑ\82е Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\83 Ð´а $2 из {{PLURAL:$1|следећег|следећих}} разлога:',
+'permissionserrorstext-withaction' => 'Ð\9dемаÑ\82е Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\83 Ð·а $2 из {{PLURAL:$1|следећег|следећих}} разлога:',
 'recreate-moveddeleted-warn' => "'''Упозорење: поново правите страницу која је претходно обрисана.'''
 
 Размотрите да ли је прикладно да наставите с уређивањем ове странице.
@@ -1184,12 +1229,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' => 'викитекст',
@@ -1415,7 +1463,7 @@ $1",
 
 # Search results
 'searchresults' => 'Резултати претраге',
-'searchresults-title' => 'РезÑ\83лÑ\82аÑ\82и Ð¿Ñ\80еÑ\82Ñ\80аге Ð·Ð° â\80\9e$1â\80\9d',
+'searchresults-title' => 'РезÑ\83лÑ\82аÑ\82и Ð¿Ñ\80еÑ\82Ñ\80аге Ð·Ð° â\80\9e$1â\80\9c',
 'searchresulttext' => 'За више информација о претраживању пројекта {{SITENAME}} погледајте [[{{MediaWiki:Helppage}}|{{int:help}}]].',
 'searchsubtitle' => "Тражили сте '''[[:$1]]''' ([[Special:Prefixindex/$1|све странице које почињу са „$1“]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|све странице које воде до „$1“]])",
 'searchsubtitleinvalid' => "Тражили сте '''$1'''",
@@ -1433,7 +1481,6 @@ $1",
 'searchmenu-legend' => 'Поставке претраге',
 'searchmenu-exists' => "'''Постоји и чланак под називом „[[:$1]]“.'''",
 'searchmenu-new' => "'''Направите страницу „[[:$1]]“.'''",
-'searchhelp-url' => 'Help:Садржај',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Прегледај странице с овим префиксом]]',
 'searchprofile-articles' => 'Чланци',
 'searchprofile-project' => 'Странице помоћи и пројеката',
@@ -1455,7 +1502,7 @@ $1",
 'search-interwiki-default' => '$1 резултати:',
 'search-interwiki-more' => '(више)',
 'search-relatedarticle' => 'Повезано',
-'mwsuggest-disable' => 'Онемогући предлоге AJAX',
+'mwsuggest-disable' => 'Онемогући предлоге при претраживању',
 'searcheverything-enable' => 'сви именски простори',
 'searchrelated' => 'повезано',
 'searchall' => 'све',
@@ -1478,15 +1525,6 @@ $1",
 У међувремену можете тражити преко Гугла.
 Упамтите да његови пописи овог викија могу бити застарели.',
 
-# Quickbar
-'qbsettings' => 'Бочна палета',
-'qbsettings-none' => 'Ништа',
-'qbsettings-fixedleft' => 'Причвршћена лево',
-'qbsettings-fixedright' => 'Причвршћена десно',
-'qbsettings-floatingleft' => 'Плутајућа лево',
-'qbsettings-floatingright' => 'Плутајућа десно',
-'qbsettings-directionality' => 'Фиксно, у зависности од смера писања вашег језика',
-
 # Preferences page
 'preferences' => 'Подешавања',
 'mypreferences' => 'Подешавања',
@@ -1566,7 +1604,7 @@ $1",
 'prefs-textboxsize' => 'Величина оквира за уређивање',
 'youremail' => 'Е-адреса:',
 'username' => 'Корисничко име:',
-'uid' => 'Кориснички ИБ:',
+'uid' => 'Кориснички ID:',
 'prefs-memberingroups' => 'Члан {{PLURAL:$1|групе|групâ}}:',
 'prefs-memberingroups-type' => '$1',
 'prefs-registration' => 'Време уписа:',
@@ -1700,7 +1738,7 @@ $1",
 'right-unblockself' => 'деблокирање самог себе',
 'right-protect' => 'мењање заштићених страница и степена заштите',
 'right-editprotected' => 'уређивање заштићених страница (с преносивом заштитом)',
-'right-editinterface' => 'уређивање корисничког сучеља',
+'right-editinterface' => 'уређивање корисничког окружења',
 'right-editusercssjs' => 'уређивање туђих CSS и јаваскрипт датотека',
 'right-editusercss' => 'уређивање туђих CSS датотека',
 'right-edituserjs' => 'уређивање туђих јаваскрипт датотека',
@@ -2059,7 +2097,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 +2257,12 @@ $1',
 Уместо тога, ваљало би да воде до одговарајуће теме.
 Страница се сматра вишезначном одредницом ако користи шаблон који води од [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Стране с особином стране',
+'pageswithprop-legend' => 'Стране с особином стране',
+'pageswithprop-text' => 'Ова страна излистава стране које имају одређену особину',
+'pageswithprop-prop' => 'Име особине:',
+'pageswithprop-submit' => 'Иди',
+
 'doubleredirects' => 'Двострука преусмерења',
 'doubleredirectstext' => 'Ова страница приказује странице које преусмеравају на друга преусмерења.
 Сваки ред садржи везе према првом и другом преусмерењу, као и одредишну страницу другог преусмерења која је обично „прави“ чланак на кога прво преусмерење треба да упућује.
@@ -2373,9 +2416,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' => 'Џокери се могу појавити само на почетку адресе.',
 
@@ -2385,6 +2428,15 @@ $1',
 'listusers-noresult' => 'Корисник није пронађен.',
 'listusers-blocked' => '({{GENDER:$1|блокиран|блокирана|блокиран}})',
 
+# Special:ActiveUsers
+'activeusers' => 'Списак активних корисника',
+'activeusers-intro' => 'Ово је списак корисника који су били активни {{PLURAL:$1|претходни дан|у последња $1 дана|у последњих $1 дана}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|измена|измене|измена}} {{PLURAL:$3|претходни дан|у последња $3 дана|у последњих $3 дана}}',
+'activeusers-from' => 'Прикажи кориснике почев од:',
+'activeusers-hidebots' => 'Сакриј ботове',
+'activeusers-hidesysops' => 'Сакриј администраторе',
+'activeusers-noresult' => 'Корисник није пронађен.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Права корисничких група',
 'listgrouprights-summary' => 'Следи списак корисничких група на овом викију, заједно с правима приступа.
@@ -2467,8 +2519,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|страницу|странице|страница}}.',
@@ -2601,6 +2653,7 @@ $UNWATCHURL
 'prot_1movedto2' => '{{GENDER:|је преместио|је преместила|је преместио}} [[$1]] у [[$2]]',
 'protect-badnamespace-title' => 'Незаштитљив именски простор',
 'protect-badnamespace-text' => 'Странице у овом именском простору се не могу заштитити.',
+'protect-norestrictiontypes-title' => 'Незаштитљива страна',
 'protect-legend' => 'Потврдите заштиту',
 'protectcomment' => 'Разлог:',
 'protectexpiry' => 'Истиче:',
@@ -2617,9 +2670,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',
@@ -2719,12 +2772,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' => 'од године (и раније):',
 
@@ -3115,6 +3168,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“ основне странице не дозвољава подстранице.',
@@ -3208,17 +3262,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 постављен овде ће утицати само на ботове */',
@@ -3227,13 +3275,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' => '/* Јаваскрипт постављен овде ће се учитати за самопотврђене кориснике */',
@@ -3283,6 +3326,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|непреусмерење|непреусмерења|непреусмерења}})',
@@ -3297,6 +3341,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' => 'подаци',
@@ -3305,15 +3350,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' => 'Векторско',
 
@@ -3363,6 +3407,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.',
@@ -3398,6 +3443,7 @@ $1',
 'hours' => '{{PLURAL:$1|$1 сат|$1 сата|$1 сати}}',
 'days' => '{{PLURAL:$1|$1 дан|$1 дана|$1 дана}}',
 'ago' => 'пре $1',
+'just-now' => 'управо сад',
 
 # Bad image list
 'bad_image_list' => 'Формат је следећи:
@@ -3408,8 +3454,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',
@@ -3484,7 +3528,7 @@ Variants for Chinese language
 'metadata-langitem' => "'''$2:''' $1",
 'metadata-langitem-default' => '$1',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Ширина',
 'exif-imagelength' => 'Висина',
 'exif-bitspersample' => 'Дубина боје',
@@ -3677,7 +3721,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 факс кодирање',
@@ -4181,11 +4225,11 @@ $5
 'version-poweredby-credits' => "Овај вики покреће '''[//www.mediawiki.org/ Медијавики]''', ауторска права © 2001-$1 $2.",
 'version-poweredby-others' => 'остали',
 'version-credits-summary' => 'Желели бисмо да захвалимо следећим људима на њиховом доприносу [[Special:Version|Медијавикији]].',
-'version-license-info' => 'Медијавики је слободан софтвер; можете га расподељивати и мењати под условима ГНУ-ове опште јавне лиценце (ОЈЛ) коју је објавила Задужбина за слободан софтвер, било да је у питању друго или новије издање лиценце.
+'version-license-info' => 'Медијавики је слободан софтвер можете га редистрибуирати и/или модификовати под условима ГНУ-ове опште јавне лиценце верзија 2 или сваке следеће коју објави Задужбина за слободан софтвер.
 
-Медијавики се нуди у нади да ће бити од користи, али БЕЗ ИКАКВЕ ГАРАНЦИЈЕ; чак и без подразумеване гаранције о ПРОДАЈНОЈ ВРЕДНОСТИ или ПОГОДНОСТИ ЗА ОДРЕЂЕНЕ НАМЕНЕ. Погледајте ГНУ-ову општу јавну лиценцу за више информација.
+Медијавики се редистрибуирати у нади да ће бити од користи, али БЕЗ ИКАКВЕ ГАРАНЦИЈЕ чак и без ПОДРАЗУМЕВАНЕ ГАРАНЦИЈЕ ФУНКЦИОНАЛНОСТИ или ПРИКЛАДНОСТИ ЗА ОДРЕЂЕНЕУ НАМЕНУ. Погледајте ГНУ-ову општу јавну лиценцу за више информација.
 
-Требало би да сте примили [{{SERVER}}{{SCRIPTPATH}}/COPYING примерак ГНУ-ове опште јавне лиценце] заједно с овим програмом. Ако нисте, пишите на Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA или [//www.gnu.org/licenses/old-licenses/gpl-2.0.html прочитајте овде].',
+Требало би да сте примили [{{SERVER}}{{SCRIPTPATH}}/COPYING примерак ГНУ-ове опште јавне лиценце] заједно са овим програмом. Ако нисте, пишите на Free Software Foundation, Inc., 51 Franklin St, 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' => 'Верзија',
@@ -4193,12 +4237,11 @@ $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' => 'Назив датотеке',
+'redirect-not-exists' => 'Вредност није пронађена',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Претрага дупликата',
@@ -4226,7 +4269,7 @@ $5
 'specialpages-group-highuse' => 'Најчешће коришћене странице',
 'specialpages-group-pages' => 'Спискови страница',
 'specialpages-group-pagetools' => 'Алатке',
-'specialpages-group-wiki' => 'Подаци и алати енциклопедије',
+'specialpages-group-wiki' => 'Подаци и алати',
 'specialpages-group-redirects' => 'Преусмеравање посебних страница',
 'specialpages-group-spam' => 'Алатке против непожељних порука',
 
@@ -4289,6 +4332,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..09e205f 100644 (file)
@@ -8,14 +8,17 @@
  * @file
  *
  * @author FriedrickMILBarbarossa
+ * @author Geitost
  * @author Kaganer
  * @author Liangent
  * @author Meno25
  * @author Michaello
+ * @author Milicevic01
  * @author Rancher
  * @author Red Baron
  * @author Reedy
  * @author Slaven Kosanovic
+ * @author TheStefan12345
  * @author Жељко Тодоровић
  * @author Михајло Анђелковић
  * @author לערי ריינהארט
@@ -332,8 +335,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 +349,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',
@@ -411,6 +413,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}}',
@@ -438,7 +452,8 @@ $messages = array(
 'newwindow' => '(otvara u novom prozoru)',
 'cancel' => 'Otkaži',
 'moredotdotdot' => 'Više…',
-'mypage' => 'Moja stranica',
+'morenotlisted' => 'Više nije prikazano...',
+'mypage' => 'Stranica',
 'mytalk' => 'Razgovor',
 'anontalk' => 'Razgovor za ovu IP adresu',
 'navigation' => 'Navigacija',
@@ -545,7 +560,6 @@ $1',
 'disclaimers' => 'Odricanje odgovornosti',
 'disclaimerpage' => 'Project:Odricanje odgovornosti',
 'edithelp' => 'Pomoć pri uređivanju',
-'edithelppage' => 'Help:Uređivanje',
 'helppage' => 'Help:Sadržaj',
 'mainpage' => 'Glavna strana',
 'mainpage-description' => 'Glavna strana',
@@ -722,10 +736,20 @@ Administrator koji ju je zaključao ponudio je sledeće objašnjenje: „$3“.'
 
 Možete da nastavite s korišćenjem ovog vikija kao gost, ili se <span class='plainlinks'>[$1 ponovo prijavite]</span> kao drugi korisnik.
 Imajte na umu da neke stranice mogu nastaviti da se prikazuju kao da ste još prijavljeni, sve dok ne očistite privremenu memoriju svog pregledača.",
+'welcomeuser' => 'Dobrodošli, $1!',
 'yourname' => 'Korisničko ime:',
+'userlogin-yourname' => 'Korisničko ime',
+'userlogin-yourname-ph' => 'Unesite vaše korisničko ime',
 'yourpassword' => 'Lozinka:',
+'userlogin-yourpassword' => 'Lozinka',
+'userlogin-yourpassword-ph' => 'Unesite vašu lozinku',
+'createacct-yourpassword-ph' => 'Unesite novu lozinku',
 'yourpasswordagain' => 'Potvrda lozinke:',
+'createacct-yourpasswordagain' => 'Potvrdite lozinku',
+'createacct-yourpasswordagain-ph' => 'Unesite lozinku još jednom',
 'remembermypassword' => 'Zapamti me na ovom pregledaču (najduže $1 {{PLURAL:$1|dan|dana|dana}})',
+'userlogin-remembermypassword' => 'Ostavi me prijavljenog/u',
+'userlogin-signwithsecure' => 'Koristite sigurnu konekciju',
 'securelogin-stick-https' => 'Ostanite povezani sa HTTPS nakon prijave',
 'yourdomainname' => 'Domen:',
 'password-change-forbidden' => 'Ne možete da promenite lozinku na ovom vikiju.',
@@ -738,17 +762,35 @@ Imajte na umu da neke stranice mogu nastaviti da se prikazuju kao da ste još pr
 'logout' => 'Odjava',
 'userlogout' => 'Odjavi me',
 'notloggedin' => 'Niste prijavljeni',
-'nologin' => 'Nemate nalog? Idite na stranicu „$1“.',
+'userlogin-noaccount' => 'Nemate nalog?',
+'userlogin-joinproject' => 'Otvorite ga',
+'nologin' => 'Nemate nalog? Idite na stranicu $1.',
 'nologinlink' => 'Otvaranje naloga',
 'createaccount' => 'Otvori nalog',
 'gotaccount' => 'Već imate nalog? Idite na stranicu „$1“.',
 'gotaccountlink' => 'Prijava',
 'userlogin-resetlink' => 'Zaboravili ste podatke za prijavu?',
-'createaccountmail' => 'E-poštom',
+'userlogin-resetpassword-link' => 'Resetuj lozinku',
+'helplogin-url' => 'Help:Logging in',
+'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 (opcijono)',
+'createacct-email-ph' => 'Unesite vašu adresu e-pоšte',
+'createaccountmail' => 'Koristite privremenu, slučajno stvorenu lozinku i pošaljite na dole navedenu adresu elektronske pošte',
+'createacct-realname' => 'Pravo ime (opcijono)',
 'createaccountreason' => 'Razlog:',
+'createacct-reason' => 'Razlog',
+'createacct-reason-ph' => 'Zašto pravite još jedan nalog?',
+'createacct-captcha' => 'Sigurnosna provera',
+'createacct-imgcaptcha-ph' => 'Unesite tekst koji vidite iznad',
+'createacct-submit' => 'Otvorite nalog',
+'createacct-benefit-heading' => '{{SITENAME}} je napravljen od strane ljudi kao što ste vi.',
+'createacct-benefit-body3' => 'skorašnjih {{PLURAL:$1|doprinosa}}',
 'badretype' => 'Unete lozinke se ne poklapaju.',
 'userexists' => 'Korisničko ime je zauzeto. Izaberite drugo.',
 'loginerror' => 'Greška pri prijavljivanju',
+'createacct-error' => 'Došlo je do greške pri kreiranju naloga',
 'createaccounterror' => 'Ne mogu da otvorim nalog: $1',
 'nocookiesnew' => 'Korisnički nalog je otvoren, ali niste prijavljeni.
 Ovaj viki koristi kolačiće za prijavu. Vama su kolačići onemogućeni.
@@ -842,10 +884,9 @@ 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-text-one' => 'Popunite ovaj obrazac da biste resetovali lozinku.',
 '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?',
@@ -1075,7 +1116,7 @@ Možete se vratiti i urediti postojeću stranicu, ili se [[Special:UserLogin|pri
 'sectioneditnotsupported-text' => 'Uređivanje odeljka nije podržano na ovoj stranici.',
 'permissionserrors' => 'Greške u dozvolama',
 'permissionserrorstext' => 'Nemate ovlašćenje za tu radnju iz {{PLURAL:$1|sledećeg|sledećih}} razloga:',
-'permissionserrorstext-withaction' => 'Nemate dozvolu da $2 iz {{PLURAL:$1|sledećeg|sledećih}} razloga:',
+'permissionserrorstext-withaction' => 'Nemate dozvolu za $2 iz {{PLURAL:$1|sledećeg|sledećih}} razloga:',
 'recreate-moveddeleted-warn' => "'''Upozorenje: ponovo pravite stranicu koja je prethodno obrisana.'''
 
 Razmotrite da li je prikladno da nastavite s uređivanjem ove stranice.
@@ -1089,12 +1130,15 @@ Nije dato nikakvo obrazloženje.',
 Izgleda da je obrisana.',
 'edit-conflict' => 'Sukob izmena.',
 'edit-no-change' => 'Vaša izmena je zanemarena jer nije bilo nikakvih izmena u tekstu.',
+'postedit-confirmation' => 'Vaša izmena je sačuvana.',
 'edit-already-exists' => 'Ne mogu da napravim stranicu.
 Izgleda da ona već postoji.',
 'defaultmessagetext' => 'Podrazumevani tekst poruke',
 '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',
@@ -1320,7 +1364,7 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
 
 # Search results
 'searchresults' => 'Rezultati pretrage',
-'searchresults-title' => 'Rezultati pretrage za â\80\9e$1â\80\9d',
+'searchresults-title' => 'Rezultati pretrage za â\80\9e$1â\80\9c',
 'searchresulttext' => 'Za više informacija o pretraživanju projekta {{SITENAME}} pogledajte [[{{MediaWiki:Helppage}}|{{int:help}}]].',
 'searchsubtitle' => "Tražili ste '''[[:$1]]''' ([[Special:Prefixindex/$1|sve stranice koje počinju sa „$1“]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|sve stranice koje vode do „$1“]])",
 'searchsubtitleinvalid' => "Tražili ste '''$1'''",
@@ -1338,7 +1382,6 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
 'searchmenu-legend' => 'Postavke pretrage',
 'searchmenu-exists' => "'''Postoji i članak pod nazivom „[[:$1]]“.'''",
 'searchmenu-new' => "'''Napravite stranicu „[[:$1]]“.'''",
-'searchhelp-url' => 'Help:Sadržaj',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Pregledaj stranice s ovim prefiksom]]',
 'searchprofile-articles' => 'Članci',
 'searchprofile-project' => 'Stranice pomoći i projekata',
@@ -1360,7 +1403,7 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
 'search-interwiki-default' => '$1 rezultati:',
 'search-interwiki-more' => '(više)',
 'search-relatedarticle' => 'Povezano',
-'mwsuggest-disable' => 'Onemogući predloge AJAX',
+'mwsuggest-disable' => 'Onemogući predloge pri pretraživanju',
 'searcheverything-enable' => 'svi imenski prostori',
 'searchrelated' => 'povezano',
 'searchall' => 'sve',
@@ -1383,15 +1426,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',
@@ -1885,6 +1919,7 @@ Ako se problem ne reši, kontaktirajte [[Special:ListUsers/sysop|administratora]
 'backend-fail-notsame' => 'Već postoji neistovetna datoteka – $1.',
 'backend-fail-invalidpath' => '$1 nije ispravna putanja za skladištenje.',
 'backend-fail-delete' => 'Ne mogu da obrišem datoteku $1.',
+'backend-fail-describe' => 'Ne mogu da promenim metapodatke za datoteku „$1“.',
 'backend-fail-alreadyexists' => 'Datoteka $1 već postoji.',
 'backend-fail-store' => 'Ne mogu da smestim datoteku $1 u $2.',
 'backend-fail-copy' => 'Ne mogu da umnožim datoteku $1 u $2.',
@@ -1963,7 +1998,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>
@@ -2124,6 +2158,9 @@ Pre brisanja proverite da li druge stranice vode do tih šablona.',
 Umesto toga, valjalo bi da vode do odgovarajuće teme.
 Stranica se smatra višeznačnom odrednicom ako koristi šablon koji vodi od [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop-prop' => 'Ime osobine:',
+'pageswithprop-submit' => 'Idi',
+
 'doubleredirects' => 'Dvostruka preusmerenja',
 'doubleredirectstext' => 'Ova stranica prikazuje stranice koje preusmeravaju na druga preusmerenja.
 Svaki red sadrži veze prema prvom i drugom preusmerenju, kao i odredišnu stranicu drugog preusmerenja koja je obično „pravi“ članak na koga prvo preusmerenje treba da upućuje.
@@ -2380,8 +2417,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' => 'Obaveštenje e-porukom 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}}.',
@@ -2504,6 +2541,7 @@ Pogledajte [[Special:ProtectedPages|spisak zaštićenih stranica]] za više deta
 'prot_1movedto2' => '{{GENDER:|je premestio|je premestila|je premestio}} [[$1]] u [[$2]]',
 'protect-badnamespace-title' => 'Nezaštitljiv imenski prostor',
 'protect-badnamespace-text' => 'Stranice u ovom imenskom prostoru se ne mogu zaštititi.',
+'protect-norestrictiontypes-title' => 'Nezaštitljiva strana',
 'protect-legend' => 'Potvrdite zaštitu',
 'protectcomment' => 'Razlog:',
 'protectexpiry' => 'Ističe:',
@@ -2627,7 +2665,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 +3149,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 +3162,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 +3213,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}})',
@@ -3208,15 +3236,14 @@ Ovo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnoj li
 'pageinfo-protect-cascading' => 'Prenosiva zaštita stranica važi odavde',
 'pageinfo-protect-cascading-yes' => 'Da',
 'pageinfo-protect-cascading-from' => 'Stranice sa prenosivom zaštitom od',
+'pageinfo-category-info' => 'Informacije o kategoriji',
+'pageinfo-category-pages' => 'Broj stranica',
+'pageinfo-category-subcats' => 'Broj potkategorija',
+'pageinfo-category-files' => 'Broj datoteka',
 
 # 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',
 
@@ -3266,6 +3293,7 @@ Ako ga pokrenete, vaš računar može biti ugrožen.",
 'file-nohires' => 'Veća rezolucija nije dostupna.',
 'svg-long-desc' => 'SVG datoteka, nominalno $1 × $2 piksela, veličina: $3',
 'svg-long-desc-animated' => 'Animirana SVG datoteka, nominalno: $1 × $2 piksela, veličina: $3',
+'svg-long-error' => 'Neispravna SVG datoteka: $1',
 'show-big-image' => 'Puna veličina',
 'show-big-image-preview' => 'Veličina ovog prikaza: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Druga rezolucija|Druge rezolucije}}: $1.',
@@ -3301,6 +3329,7 @@ Ako ga pokrenete, vaš računar može biti ugrožen.",
 'hours' => '{{PLURAL:$1|$1 sat|$1 sata|$1 sati}}',
 'days' => '{{PLURAL:$1|$1 dan|$1 dana|$1 dana}}',
 'ago' => 'pre $1',
+'just-now' => 'upravo sad',
 
 # Bad image list
 'bad_image_list' => 'Format je sledeći:
@@ -3311,8 +3340,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 +3414,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 +3607,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',
@@ -4084,9 +4111,9 @@ Možete da [[Special:EditWatchlist|koristite i običan uređivač]].',
 'version-poweredby-credits' => "Ovaj viki pokreće '''[//www.mediawiki.org/ Medijaviki]''', autorska prava © 2001-$1 $2.",
 'version-poweredby-others' => 'ostali',
 'version-credits-summary' => 'Želeli bismo da zahvalimo sledećim ljudima na njihovom doprinosu [[Special:Version|Medijavikiji]].',
-'version-license-info' => 'Medijaviki je slobodan softver; možete ga raspodeljivati i menjati pod uslovima GNU-ove opšte javne licence (OJL) koju je objavila Zadužbina za slobodan softver, bilo da je u pitanju drugo ili novije izdanje licence.
+'version-license-info' => 'Medijaviki je slobodan softver možete ga redistribuirati i/ili modifikovati pod uslovima GNU-ove opšte javne licence verzija 2 ili svake sledeće koju objavi Zadužbina za slobodan softver.
 
-Medijaviki se nudi u nadi da će biti od koristi, ali BEZ IKAKVE GARANCIJE; čak i bez podrazumevane garancije o PRODAJNOJ VREDNOSTI ili POGODNOSTI ZA ODREĐENE NAMENE. Pogledajte GNU-ovu opštu javnu licencu za više informacija.
+Medijaviki se redistribuirati u nadi da će biti od koristi, ali BEZ IKAKVE GARANCIJE čak i bez PODRAZUMEVANE GARANCIJE FUNKCIONALNOSTI ili PRIKLADNOSTI ZA ODREĐENEU NAMENU. Pogledajte GNU-ovu opštu javnu licencu za više informacija.
 
 Trebalo bi da ste primili [{{SERVER}}{{SCRIPTPATH}}/COPYING primerak GNU-ove opšte javne licence] zajedno s ovim programom. Ako niste, pišite na Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA ili [//www.gnu.org/licenses/old-licenses/gpl-2.0.html pročitajte ovde].',
 'version-software' => 'Instalirani softver',
@@ -4096,12 +4123,12 @@ 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:Redirect
+'redirect-legend' => 'Preusmeri na datoteku ili stranicu',
+'redirect-submit' => 'Idi',
+'redirect-value' => 'Vrednost:',
+'redirect-file' => 'Naziv datoteke',
+'redirect-not-exists' => 'Vrednost nije pronađen',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Pretraga duplikata',
@@ -4129,7 +4156,7 @@ Slike su prikazane u punoj veličini, a druge vrste datoteka se pokreću pomoću
 'specialpages-group-highuse' => 'Najčešće korišćene stranice',
 'specialpages-group-pages' => 'Spiskovi stranica',
 'specialpages-group-pagetools' => 'Alatke',
-'specialpages-group-wiki' => 'Podaci i alati enciklopedije',
+'specialpages-group-wiki' => 'Podaci i alati',
 'specialpages-group-redirects' => 'Preusmeravanje posebnih stranica',
 'specialpages-group-spam' => 'Alatke protiv nepoželjnih poruka',
 
@@ -4192,6 +4219,9 @@ Slike su prikazane u punoj veličini, a druge vrste datoteka se pokreću pomoću
 'htmlform-submit' => 'Pošalji',
 'htmlform-reset' => 'Vrati izmene',
 'htmlform-selectorother-other' => 'Drugo',
+'htmlform-no' => 'Ne',
+'htmlform-yes' => 'Da',
+'htmlform-chosen-placeholder' => 'Izaberite opciju',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 s podrškom pretrage celog teksta',
index 0b23f31..e18b92a 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',
@@ -348,7 +346,6 @@ $messages = array(
 'disclaimers' => 'Disclaimers',
 'disclaimerpage' => 'Project:Disclaimer gi ala',
 'edithelp' => 'Yepi nanga kenki',
-'edithelppage' => 'Help:Kenki',
 'helppage' => 'Help:San de',
 'mainpage' => 'Fesipapira',
 'mainpage-description' => 'Fesipapira',
@@ -638,17 +635,8 @@ A kan ben trowe efu dribi.
 'prevn' => '{{PLURAL:$1|$1}} di psa',
 'nextn' => '{{PLURAL:$1|$1}} trawan',
 'viewprevnext' => 'Luku ($1 {{int:pipe-separator}} $2) ($3).',
-'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 +930,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..75a3ab0 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',
@@ -285,7 +282,6 @@ $1',
 'disclaimers' => 'Begriepskläärenge',
 'disclaimerpage' => 'Project:Siede tou Begriepskläärenge',
 'edithelp' => 'Beoarbaidengshälpe',
-'edithelppage' => 'Help:Beoarbaidengshälpe',
 'helppage' => 'Help:Hälpe',
 'mainpage' => 'Haudsiede',
 'mainpage-description' => 'Haudsiede',
@@ -551,10 +547,8 @@ Muugelkerwiese hääst du dien Paaswoud al mäd Ärfoulch annerd of n näi tiede
 
 # Special:PasswordReset
 'passwordreset' => 'Paaswoud touräächsätte',
-'passwordreset-text' => 'Dit Formular uutfälle, uum per E-Mail ne Ärinnerenge tou do Anmäldeinformatione tou kriegen.',
 'passwordreset-legend' => 'Paaswoud touräächsätte',
 'passwordreset-disabled' => 'Dät Touräächsätten fon Paaswoude wuud in dissen Wiki deaktivierd.',
-'passwordreset-pretext' => '{{PLURAL:$1||Reek aan fon do foulgjende Doaten ien}}',
 'passwordreset-username' => 'Benutsernoome:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Ju E-Mail-Ättergjucht bekiekje?',
@@ -980,7 +974,6 @@ Staal deertruch sicher, dät ju Versionsgeskichte fon n Artikkel historisk akroa
 'searchmenu-legend' => 'Säikoptione',
 'searchmenu-exists' => "'''Dät rakt n Siede mäd Noome \"[[:\$1]]\" ap dissen Wiki'''",
 'searchmenu-new' => "'''Moak ju Siede „[[:$1]]“ in dissen Wiki.'''",
-'searchhelp-url' => 'Help:Hälpe',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Wies aal Sieden, do mäd dän Säikbegriep ounfange]]',
 'searchprofile-articles' => 'Inhooldssieden',
 'searchprofile-project' => 'Hälpe un Projektsieden',
@@ -1022,15 +1015,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 +1509,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 +1890,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 +2679,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 +2837,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 +3169,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..555e2ea 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',
@@ -370,7 +369,6 @@ $1',
 'disclaimers' => 'Bantahan',
 'disclaimerpage' => 'Project:Bantahan_umum',
 'edithelp' => 'Pitulung ngédit',
-'edithelppage' => 'Help:Ngédit',
 'helppage' => 'Help:Pitulung',
 'mainpage' => 'Tepas',
 'mainpage-description' => 'Tepas',
@@ -625,10 +623,8 @@ Bisa jadi anjeun geus ngaganti sandina atawa ménta sandi saheulaanan anu anyar.
 
 # Special:PasswordReset
 'passwordreset' => 'Setél ulang sandi',
-'passwordreset-text' => 'Lengkepan ieu formulir pikeun nampa surélék pangéling ngeunaan wincikan akun anjeun.',
 'passwordreset-legend' => 'Setél ulang sandi',
 'passwordreset-disabled' => 'Dina ieu wiki, sandi teu bisa disetél ulang.',
-'passwordreset-pretext' => '{{PLURAL:$1||Asupkeun salah sahiji data di handap ieu}}',
 'passwordreset-username' => 'Sandiasma:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Témbongkeun surat-é hasilna?',
@@ -1046,7 +1042,6 @@ Pastikeun yén ieu parobahan bisa miara jujutan kaca sagemblengna.',
 'searchmenu-legend' => 'Pilihan nyungsi',
 'searchmenu-exists' => "'''Dina wiki ieu geus aya kaca nu ngaranna \"[[:\$1]]\"'''",
 'searchmenu-new' => "'''Jieun kaca \"[[:\$1]]\" dina ieu wiki!'''",
-'searchhelp-url' => 'Help:Pitulung',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Sungsi kaca-kaca nu dimimitian ku ieu awalan]]',
 'searchprofile-articles' => 'Kaca eusi',
 'searchprofile-project' => 'Kaca Pitulung jeung Proyék',
@@ -1089,14 +1084,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 +1520,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 +1869,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 +2537,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 +2949,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 f101bf6..31bb768 100644 (file)
  * @author Fader
  * @author Fluff
  * @author GameOn
+ * @author Geitost
  * @author Greggegorius
  * @author Grillo
  * @author Habj
  * @author Habjchen
  * @author Hannibal
  * @author Jon Harald Søby
+ * @author Jopparn
  * @author Kaganer
  * @author LPfi
  * @author Lejonel
@@ -33,6 +35,7 @@
  * @author Mikez
  * @author NH
  * @author Najami
+ * @author Nemo bis
  * @author Nghtwlkr
  * @author Ozp
  * @author Per
@@ -428,6 +431,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}}',
@@ -509,6 +524,7 @@ $messages = array(
 'create-this-page' => 'Skapa denna sida',
 'delete' => 'Radera',
 'deletethispage' => 'Radera denna sida',
+'undeletethispage' => 'Återställ denna sida',
 'undelete_short' => 'Återställ {{PLURAL:$1|en version|$1 versioner}}',
 'viewdeleted_short' => 'Visa {{PLURAL:$1|en raderad redigering|$1 raderade redigeringar}}',
 'protect' => 'Skrivskydda',
@@ -562,7 +578,6 @@ $1',
 'disclaimers' => 'Förbehåll',
 'disclaimerpage' => 'Project:Allmänt förbehåll',
 'edithelp' => 'Redigeringshjälp',
-'edithelppage' => 'Help:Redigering',
 'helppage' => 'Help:Innehåll',
 'mainpage' => 'Huvudsida',
 'mainpage-description' => 'Huvudsida',
@@ -708,6 +723,8 @@ $2',
 'namespaceprotected' => "Du har inte behörighet att redigera sidor i namnrymden '''$1'''.",
 'customcssprotected' => 'Du har inte behörighet att redigera denna CSS-sidan eftersom den innehåller en annan användares personliga inställningar.',
 'customjsprotected' => 'Du har inte behörighet att redigera denna JavaScript-sidan eftersom den innehåller en annan användares personliga inställningar.',
+'mycustomcssprotected' => 'Du har inte rättigheten att redigera denna CSS-sida.',
+'mycustomjsprotected' => 'Du har inte rättigheten att redigera denna JavaScript-sida.',
 'ns-specialprotected' => 'Specialsidor kan inte redigeras.',
 'titleprotected' => 'Denna sidtitel har skyddats från att skapas av [[User:$1|$1]].
 Den uppgivna anledningen är "\'\'$2\'\'".',
@@ -733,9 +750,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.',
@@ -748,18 +774,38 @@ Glöm inte att justera dina [[Special:Preferences|{{SITENAME}}-inställningar]].
 'logout' => 'Logga ut',
 'userlogout' => 'Logga ut',
 'notloggedin' => 'Inte inloggad',
-'nologin' => "Har du inget användarkonto? '''$1'''.",
+'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.
@@ -809,7 +855,7 @@ Skriv in en adress med korrekt format eller töm fältet.',
 'cannotchangeemail' => 'E-post-adresser som är bundna till användarkonton kan inte ändras på denna wiki.',
 'emaildisabled' => 'Denna webbplats kan inte skicka e-post.',
 'accountcreated' => 'Användarkontot har skapats',
-'accountcreatedtext' => 'Användarkontot $1 har skapats.',
+'accountcreatedtext' => 'Användarkontot [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) har skapats.',
 'createaccount-title' => 'Konto skapat på {{SITENAME}}',
 'createaccount-text' => 'Någon har skapat ett konto åt din e-postadress på {{SITENAME}} ($4) med namnet "$2" och lösenordet "$3". Du bör nu logga in och ändra ditt lösenord.
 
@@ -843,14 +889,15 @@ 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-text-one' => 'Fyll i detta formulär för att återställa ditt lösenord.',
+'passwordreset-text-many' => '{{PLURAL:$1|Fyll i en av datafälten 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-emaildisabled' => 'E-postfunktioner har inaktiverats på denna wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Ange en av datadelarna nedan}}',
 'passwordreset-username' => 'Användarnamn:',
 'passwordreset-domain' => 'Domän:',
 'passwordreset-capture' => 'Visa resulterande e-post?',
@@ -873,7 +920,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,6 +1132,7 @@ 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',
@@ -1092,7 +1140,7 @@ Den finns redan.',
 '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.',
+Om du är inloggad kan du slå av den här varningen under "Redigering" i dina inställningar.',
 
 # Content models
 'content-model-wikitext' => 'wikitext',
@@ -1335,7 +1383,6 @@ Detaljer kan hittas i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'searchmenu-legend' => 'Sökalternativ',
 'searchmenu-exists' => "'''Det finns en sida med namnet \"[[:\$1]]\" på denna wiki.'''",
 'searchmenu-new' => "'''Skapa sidan \"[[:\$1]]\" på denna wiki!'''",
-'searchhelp-url' => 'Help:Innehåll',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Bläddra igenom sidor med detta prefix]]',
 'searchprofile-articles' => 'Innehållssidor',
 'searchprofile-project' => 'Hjälp- och projektsidor',
@@ -1522,6 +1569,8 @@ 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.',
+'userrights-removed-self' => 'Du tog bort dina egna rättigheter. Som sådan, kan du inte längre komma åt denna sida.',
 
 # Groups
 'group' => 'Grupp:',
@@ -1592,6 +1641,10 @@ Om du väljer att ange ditt riktiga namn, kommer det att användas för att till
 'right-editusercssjs' => 'Redigera andra användares CSS- och JS-filer',
 'right-editusercss' => 'Redigera andra användares CSS-filer',
 'right-edituserjs' => 'Redigera andra användares JS-filer',
+'right-editmyusercss' => 'Redigera din egen användares CSS-filer',
+'right-editmyuserjs' => 'Redigera din egen användares JavaScript-filer',
+'right-viewmywatchlist' => 'Visa din egen bevakningslista',
+'right-editmywatchlist' => 'Redigera din egen bevakningslista. Observera att en del åtgärder kommer fortfarande lägga till sidor även utan denna rättighet.',
 'right-rollback' => 'Rulla tillbaka den användare som senast redigerat en sida',
 'right-markbotedits' => 'Markera tillbakarullningar som robotändringar',
 'right-noratelimit' => 'Påverkas inte av hastighetsgränser',
@@ -1653,6 +1706,8 @@ Om du väljer att ange ditt riktiga namn, kommer det att användas för att till
 'action-userrights-interwiki' => 'ändra rättigheter för användare på andra wikier',
 'action-siteadmin' => 'låsa eller låsa upp databasen',
 'action-sendemail' => 'skicka e-post',
+'action-editmywatchlist' => 'redigera din bevakningslista',
+'action-viewmywatchlist' => 'visa din bevakningslista',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|ändring|ändringar}}',
@@ -1838,7 +1893,7 @@ $1',
 'upload-proto-error' => 'Felaktigt protokoll',
 'upload-proto-error-text' => 'Fjärruppladdning kräver URL:ar som börjar med <code>http://</code> eller <code>ftp://</code>.',
 'upload-file-error' => 'Internt fel',
-'upload-file-error-text' => 'Ett internt fel inträffade när en temporär fil skulle skapas på servern. Kontakta en [[Special:ListUsers/sysop|systemadministratör]].',
+'upload-file-error-text' => 'Ett internt fel inträffade när en temporär fil skulle skapas på servern. Kontakta en [[Special:ListUsers/sysop|administratör]].',
 'upload-misc-error' => 'Okänt uppladdningsfel',
 'upload-misc-error-text' => 'Ett okänt fel inträffade under uppladdningen.
 Kontrollera att URL:en giltig och försök igen.
@@ -2257,6 +2312,15 @@ Det krävs åtminstone en toppdomän, t.ex. "*.org".<br />
 'listusers-noresult' => 'Ingen användare hittades.',
 'listusers-blocked' => '(blockerad)',
 
+# Special:ActiveUsers
+'activeusers' => 'Lista över aktiva användare',
+'activeusers-intro' => 'Detta är en lista på användare som har haft någon form av aktivitet inom de senaste $1 {{PLURAL:$1|dygnet|dygnen}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|handling|handlingar}} {{PLURAL:$3|det senaste dygnet|de senaste $3 dygnen}}',
+'activeusers-from' => 'Visa användare från och med:',
+'activeusers-hidebots' => 'Göm botar',
+'activeusers-hidesysops' => 'Dölj administratörer',
+'activeusers-noresult' => 'Inga användare funna.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Behörigheter för användargrupper',
 'listgrouprights-summary' => 'Följande lista visar vilka användargrupper som är definierade på den här wikin och vilka behörigheter grupperna har.
@@ -2334,8 +2398,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}}.',
@@ -2375,7 +2439,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
@@ -2908,6 +2972,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',
@@ -3063,7 +3129,6 @@ Ger möjlighet att skriva en motivering i redigeringssammanfattningen',
 '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 */',
@@ -3234,11 +3299,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:
 
@@ -3267,7 +3346,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',
@@ -3445,7 +3524,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',
@@ -3858,16 +3937,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',
@@ -3960,6 +4044,7 @@ Bilder visas i full upplösning, andra filtyper öppnas direkt i de program som
 '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',
index 30279d0..513e1f4 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',
@@ -286,7 +298,7 @@ $messages = array(
 'vector-view-edit' => 'Hariri',
 'vector-view-history' => 'Fungua historia',
 'vector-view-view' => 'Soma',
-'vector-view-viewsource' => 'Kuonyesha kodi',
+'vector-view-viewsource' => 'Tazama msimbo',
 'actions' => 'Vitendo',
 'namespaces' => 'Maeneo ya wiki',
 'variants' => 'Vibadala',
@@ -366,7 +378,6 @@ $1',
 'disclaimers' => 'Kanusho',
 'disclaimerpage' => 'Project:Kanusho kwa jumla',
 'edithelp' => 'Usaidizi kwa uhariri',
-'edithelppage' => 'Help:Usaidizi kwa uhariri',
 'helppage' => 'Help:Yaliyomo',
 'mainpage' => 'Mwanzo',
 'mainpage-description' => 'Mwanzo',
@@ -396,9 +407,9 @@ Tazama [[Special:Version|ukurasa wa toleo]].',
 'youhavenewmessagesmulti' => 'Umepokea jumbe mpya kule $1',
 'editsection' => 'hariri',
 'editold' => 'hariri',
-'viewsourceold' => 'view source',
+'viewsourceold' => 'tazama msimbo',
 'editlink' => 'hariri',
-'viewsourcelink' => 'onyesha kodi za ukurasa',
+'viewsourcelink' => 'onesha msimbo wa ukurasa',
 'editsectionhint' => 'Hariri sehemu: $1',
 'toc' => 'Yaliyomo',
 'showtoc' => 'fichua',
@@ -420,7 +431,7 @@ Tazama [[Special:Version|ukurasa wa toleo]].',
 'sort-ascending' => 'Pangia kwa kupanda',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'Makala',
+'nstab-main' => 'Ukurasa',
 'nstab-user' => 'Ukurasa wa mtumiaji',
 'nstab-media' => 'Ukurasa wa faili',
 'nstab-special' => 'Ukurasa maalum',
@@ -495,7 +506,7 @@ Data za hapa haziwezi kunawirishwa kwa sasa.',
 'wrong_wfQuery_params' => 'Parameta za ulizio zilizoingizwa wfQuery() na zisizo sahihi ni<br />
 Kitenda: $1<br />
 Ulizio: $2',
-'viewsource' => 'Onyesha kodi za ukurasa',
+'viewsource' => 'Tazama msimbo',
 'viewsource-title' => 'Tazama chanzo cha $1',
 'actionthrottled' => 'Tendo limesimamishwa',
 'actionthrottledtext' => 'Ikiwa kama hatua ya kupambana na uharibifu, umefika kikomo katika kutenda jambo hili kwa mara nyingi mno tena kwa kipindi cha muda mfupi kama huu, na umevuka kiwango hiki.
@@ -530,7 +541,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 +560,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 +666,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?',
@@ -833,7 +848,7 @@ Ni maandiko yaliyopo ndani ya sanduku la juu '''tu''' ambayo yatahifadhiwa utaka
 'yourtext' => 'Maandishi yako',
 'storedversion' => 'Pitio lililohifadhiwa mwishoni',
 'nonunicodebrowser' => "'''Ilani: Kivinjari chako hakikubaliani na Unicode.''' 
-Ili uweze kuhariri kurasa sawasawa, herufi zisizo za ASCII zitaonekana katika sanduku la kuhariri kama kodi za hexadecimali.",
+Ili uweze kuhariri kurasa sawasawa, herufi zisizo za ASCII zitaonekana katika sanduku la kuhariri kama msimbo wa hexadecimali.",
 'editingold' => "'''ANGALIA: Unakuwa unahariri toleo la zamani la ukurasa huu.
 Ukiendelea kulihariri, mabadilisho yote yaliyofanywa tangu pale yatapotezwa.'''",
 'yourdiff' => 'Tofauti',
@@ -884,6 +899,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 +1008,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:',
@@ -1077,7 +1094,6 @@ Tazama [[Special:BlockList|IP block orodha ya uzuio wa IP]] kuona orodha ya zuio
 'searchmenu-legend' => 'Hitiari za kutafuta',
 'searchmenu-exists' => "'''Ukurasa wa \"[[:\$1]]\" upo kwenye wiki hii'''",
 'searchmenu-new' => "'''Anzisha ukurasa wa \"[[:\$1]]\" katika wiki hii!'''",
-'searchhelp-url' => 'Help:Yaliyomo',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Tafuta kurasa kwenye eneo hili la wiki]]',
 'searchprofile-articles' => 'Kurasa kwa kusudi ya wiki',
 'searchprofile-project' => 'Kurasa za msaada na za mradi',
@@ -1122,14 +1138,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',
@@ -1532,7 +1540,7 @@ Tazama kumbukumbu za kufuta faili lile kabla hujaendelea kulipakia upya.',
 'uploaddisabledtext' => 'Upakiaji wa mafaili umelemazwa.',
 'php-uploaddisabledtext' => 'Upakiaji wa mafaili umelemazwa katika PHP.
 Tafadhali utazame kipimo cha file_uploads.',
-'uploadscripted' => 'Faili hili lina HTML au kodi ambazo labda itaeleweka vibaya na kivinjari.',
+'uploadscripted' => 'Faili hili lina HTML au misimbo ambazo labda itaeleweka vibaya na kivinjari.',
 'uploadvirus' => 'Faili lina kirusi!
 Maelezo mengine: $1',
 'uploadjava' => 'Faili ZIP hili lina faili Java .class humo ndani.
@@ -1609,7 +1617,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>
@@ -1813,7 +1820,7 @@ Sasa unaelekeza kwa [[$2]].',
 'mostlinked' => 'Kurasa zinazoungwa kuliko zote',
 'mostlinkedcategories' => 'Jamii zinazoungwa kuliko zote',
 'mostlinkedtemplates' => 'Vigezo vinavyoungwa kuliko zote',
-'mostcategories' => 'Jamii ambazo hazitumiwi',
+'mostcategories' => 'Kurasa zenye jamii kuliko zote',
 'mostimages' => 'Mafaili yanayoungwa kuliko yote',
 'mostrevisions' => 'Kurasa zenye mapitio mengi kuliko zote',
 'prefixindex' => 'Kurasa zote zenye viambishi awali',
@@ -1915,6 +1922,15 @@ Itifaki zinazoungwa mkono: <code>$1</code> (usiongeza hizi unapotafuta).',
 'listusers-noresult' => 'Mtumiaji hakupatikana.',
 'listusers-blocked' => '(imezuiwa)',
 
+# Special:ActiveUsers
+'activeusers' => 'Orodha ya watumiaji hai',
+'activeusers-intro' => 'Hii ni orodha ya watumiaji walioshughulika jambo fulani ndani ya siku $1 {{PLURAL:$1|iliyopita|zilizopita}}.',
+'activeusers-count' => '{{PLURAL:$1|haririo|maharirio}} $1 katika siku $3 {{PLURAL:$3|iliyopita|zilizopita}}',
+'activeusers-from' => 'Onyesha watumiaji kuanzia:',
+'activeusers-hidebots' => 'Ficha boti',
+'activeusers-hidesysops' => 'Ficha wakabidhi',
+'activeusers-noresult' => 'Watumiaji hawakupatikana.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Wezo za kundi za watumiaji',
 'listgrouprights-summary' => 'Inafuata orodha ya kundi za watumiaji wa wiki hii, pamoja na maelezo ya wezo zao za kushughulika mambo.
@@ -1996,8 +2012,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}}.',
@@ -2166,7 +2182,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}}',
@@ -2196,7 +2212,7 @@ $1',
 'mycontris' => 'Michango',
 'contribsub2' => 'Kwa $1 ($2)',
 'nocontribs' => 'Mabadiliko yanayolingana na vigezo vilivyoulizwa hayakupatikana.',
-'uctop' => '(juu)',
+'uctop' => '(ya kisasa)',
 'month' => 'Kutoka mwezi (na zamani zaidi):',
 'year' => 'Kutoka mwakani (na zamani zaidi):',
 
@@ -2659,7 +2675,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',
@@ -3033,12 +3049,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.',
@@ -3123,6 +3133,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',
@@ -3180,12 +3192,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-centuries' => '$1 {{PLURAL:$1|century|karne}}',
+'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' => '{{PLURAL:$1|karne}} $1',
 
 );
index 03d6c19..ea15812 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ń',
@@ -302,7 +300,6 @@ $1',
 'disclaimers' => 'Prawne informacyje',
 'disclaimerpage' => 'Project:Prawne informacyje',
 'edithelp' => 'Půmoc we půmjyńańy',
-'edithelppage' => 'Help:Jak půmjyńać zajta',
 'helppage' => 'Help:Treść',
 'mainpage' => 'Przodńo zajta',
 'mainpage-description' => 'Przodńo zajta',
@@ -556,10 +553,8 @@ Możliwe co właśńy zmjyńiłżeś swoje hasło abo poprosiłżeś uo nowe tym
 
 # Special:PasswordReset
 'passwordreset' => 'Wyczyść hasło',
-'passwordreset-text' => 'Wypełnij formularz, aby otrzymać e‐mail z przypomnieniem danych Twojego konta.',
 'passwordreset-legend' => 'Wyczyść hasło',
 'passwordreset-disabled' => 'No tyj wiki zamkńynto resytowańy hasył.',
-'passwordreset-pretext' => '{{PLURAL:$1||Wćep jydną z danych}}',
 'passwordreset-username' => 'Mjano używacza:',
 'passwordreset-domain' => 'Domyna:',
 'passwordreset-capture' => 'Czy pokazywać treść wiadomości e‐mail?',
@@ -941,7 +936,6 @@ $1',
 'searchmenu-legend' => 'Uopcyje sznupańo',
 'searchmenu-exists' => "'''Ńy ma zajty uo mjańy \"[[:\$1]]\" na tyj wiki'''",
 'searchmenu-new' => "'''Stwůrz zajta „[[:$1|$1]]” na tyj wiki!'''",
-'searchhelp-url' => 'Help:Pomoc',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Przeglůndej zajty kere s anfanga majům tyn przedrostek]]',
 'searchprofile-articles' => 'Zajty',
 'searchprofile-project' => 'Zajty půmocy a projektu',
@@ -983,14 +977,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 +1679,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 +2366,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 +2480,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 +2772,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 ae64fbd..21856da 100644 (file)
@@ -20,6 +20,7 @@
  * @author Mayooranathan
  * @author Naveen
  * @author Planemad
+ * @author Sank
  * @author Shanmugamp7
  * @author Sodabottle
  * @author Sundar
@@ -31,6 +32,7 @@
  * @author Urhixidur
  * @author לערי ריינהארט
  * @author கோபி
+ * @author கௌசிக் பிரபு
  * @author செல்வா
  * @author மதனாஹரன்
  * @author බිඟුවා
@@ -161,7 +163,7 @@ $messages = array(
 'june' => 'ஜூன்',
 'july' => 'ஜூலை',
 'august' => 'ஆகஸ்ட்',
-'september' => 'à®\9aà¯\86பà¯\8dà®\9fà¯\86à®®à¯\8dபரà¯\8d',
+'september' => 'செப்டம்பர்',
 'october' => 'அக்டோபர்',
 'november' => 'நவம்பர்',
 'december' => 'டிசம்பர்',
@@ -214,6 +216,7 @@ $messages = array(
 'newwindow' => '(புதிய சாளரத்துள் திறக்கும்)',
 'cancel' => 'சேமிக்காமல் திரும்பு',
 'moredotdotdot' => 'மேலும்...',
+'morenotlisted' => 'மேலதிகமானவை பட்டியலிடப்படவில்லை',
 'mypage' => 'பக்கம்',
 'mytalk' => 'பேச்சு',
 'anontalk' => 'இந்த ஐ.பி. முகவரிக்கான பேச்சு',
@@ -237,7 +240,7 @@ $messages = array(
 'vector-action-protect' => 'காக்கவும்',
 'vector-action-undelete' => 'நீக்கத்தை நிறுத்து',
 'vector-action-unprotect' => 'காப்பை மாற்று',
-'vector-simplesearch-preference' => 'à®\9aாதாரண à®¤à¯\87à®\9fà¯\81தலà¯\8d à®ªà®\9fà¯\8dà®\9fà¯\88யதà¯\8dதà¯\88 à®\9aà¯\86யலà¯\8dபà®\9fà¯\81தà¯\8dதவà¯\81à®®à¯\8d (Vector தோல் மட்டும்)',
+'vector-simplesearch-preference' => 'à®\8eளிதாà®\95à¯\8dà®\95பà¯\8dபà®\9fà¯\8dà®\9f à®¤à¯\87à®\9fà¯\81தலà¯\8d à®ªà®\9fà¯\8dà®\9fà¯\88யà¯\88 à®\9aà¯\86யறà¯\8dபà®\9fà¯\81தà¯\8dதவà¯\81à®®à¯\8d (வà¯\86à®\95à¯\8dà®\9fà®°à¯\8d தோல் மட்டும்)',
 'vector-view-create' => 'உருவாக்கவும்',
 'vector-view-edit' => 'தொகு',
 'vector-view-history' => 'வரலாற்றைக் காட்டவும்',
@@ -324,7 +327,6 @@ $1',
 'disclaimers' => 'பொறுப்புத் துறப்புகள்',
 'disclaimerpage' => 'Project:பொதுவான பொறுப்புத் துறப்புகள்',
 'edithelp' => 'தொகுத்தலுக்கான உதவி',
-'edithelppage' => 'Help:ஒருவர் பக்கமொன்றைத் தொகுப்பது எப்படி?',
 'helppage' => 'Help:உதவி',
 'mainpage' => 'முதற் பக்கம்',
 'mainpage-description' => 'முதற் பக்கம்',
@@ -485,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' => 'நீங்கள் விக்கிகளில் கடவுச் சொற்களை மாற்ற முடியாது',
@@ -500,18 +511,36 @@ MySQL returned error "$3: $4".',
 '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-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}} தளத்துக்கான உங்கள் பயனர் கணக்கு உருவாக்கப்பட்டுள்ளது, ஆனால் நீங்கள் புகுபதிகை செய்யவில்லை. பயனர்களைப் புகுபதிகை செய்ய {{SITENAME}} தளம் ஞாபகிகளைப் (குக்கிகள்) பயன்படுத்துகிறது. நீங்கள் ஞாபகிகளைச் செயலற்றவையாக்கியுள்ளீர்கள். தயவுசெய்து அவற்றைச் செயற்படுத்தியப் பின் உங்கள் புதிய பயனர் பெயருடனும், கடவுச் சொல்லுடனும் புகுபதிகை செய்யுங்கள்.',
 'nocookieslogin' => '{{SITENAME}} தளம் பயனர்களைப் புகுபதிகை செய்வதற்கு ஞாபகிகளைப் (குக்கிகள்) பயன்படுத்துகிறது. நீங்கள் ஞாபகிகளைச் செயலிழக்கச் செய்துள்ளீர்கள். தயவுசெய்து அவற்றைச் செயற்பாடுள்ளதாக்கித் திரும்பவும் முயலுங்கள்.',
@@ -545,7 +574,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 கணக்குகள்}} உருவாக்கப்பட்டுள்ளது.  தற்போது இதுவே மிக அதிகமாக அனுமதிக்கப்பட்ட அளவாகும்.
 
@@ -595,10 +624,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' => 'விளைவு மின்னஞ்சலை காண்',
@@ -818,6 +845,7 @@ $1 எனும் பயனரையோ வேறு [[{{MediaWiki:Grouppage-sy
 இது நீக்கப்பட்டதாக இருக்கலாம்.',
 'edit-conflict' => 'முரண்பாடுகளைத் தொகுக்கவும்.',
 'edit-no-change' => 'வாசகங்களுக்கு எந்த மாற்றமும் செய்யப்படவில்லை என்பதனால் உங்கள் தொகுப்பு புறக்கணிக்கப்பட்டது.',
+'postedit-confirmation' => 'உங்களது தொகுப்பு சேமிக்கப்பட்டது.',
 'edit-already-exists' => 'புதிய பக்கமொன்றை உருவாக்க முடியாது.
 இப்பக்கம் ஏற்கனவே உள்ளது.',
 'defaultmessagetext' => 'இயல்பிருப்பு தகவல் உரை',
@@ -1058,7 +1086,6 @@ $1",
 'searchmenu-legend' => 'தேடல் விருப்பு',
 'searchmenu-exists' => "'''\"[[:\$1]]\" என்னும் பெயருடைய பக்கம் இந்த விக்கியில் உள்ளது'''",
 'searchmenu-new' => "'''\"[[:\$1]]\" பக்கத்தை இந்த விக்கியில் உருவாக்கவும்!'''",
-'searchhelp-url' => 'Help:உதவி',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|இந்த முன்னொட்டுடன் உலவித்தேடு]]',
 'searchprofile-articles' => 'உள்ளடக்கப் பக்கங்களின் பட்டியல்',
 'searchprofile-project' => 'உதவி மற்றும் திட்டப் பக்கங்கள்',
@@ -1082,7 +1109,7 @@ $1",
 'search-interwiki-default' => '$1 தளத்தின் முடிவுகள்:',
 'search-interwiki-more' => '(மேலும்)',
 'search-relatedarticle' => 'தொடர்புடையவை',
-'mwsuggest-disable' => 'AJAX பரிந்துரைகளை முடக்கு',
+'mwsuggest-disable' => 'தேடல் பரிந்துரைகளை முடக்கு',
 'searcheverything-enable' => 'அனைத்துப் பெயர்வெளிகளிலும் தேடவும்',
 'searchrelated' => 'தொடர்புடையவை',
 'searchall' => 'அனைத்தும்',
@@ -1103,6 +1130,7 @@ $1",
 'powersearch-togglenone' => 'ஏதுமில்லை',
 'search-external' => 'வெளித்தேடல்',
 'searchdisabled' => '{{SITENAME}} தளத்தின் தேடல் வசதிகள் தற்காலிகமாக முடக்கப்பட்டுள்ளது. அதுவரை நீங்கள் கீழேயுள்ள கூகிள் தேடலைப் பயன்படுத்தலாம். இது சில சமயம் இற்றைப்படுத்தப்படாததாய் இருக்கக்கூடும்.',
+'search-error' => 'தேடுகையில் ஒரு பிழை ஏற்பட்டுள்ளது:$1',
 
 # Preferences page
 'preferences' => 'விருப்பங்கள்',
@@ -1166,7 +1194,7 @@ $1",
 'timezoneregion-indian' => 'இந்தியப் பெருங்கடல்',
 'timezoneregion-pacific' => 'பசிபிக் பெருங்கடல்',
 'allowemail' => 'ஏனைய பயனர்களிடம் இருந்தான மின்னஞ்சல்களை அனுமதி',
-'prefs-searchoptions' => 'தà¯\87à®\9fà¯\81à®\95',
+'prefs-searchoptions' => 'தà¯\87à®\9fலà¯\8d',
 'prefs-namespaces' => 'பெயர்வெளிகள்',
 'defaultns' => 'அப்படியில்லையென்றால் இந்த பொயர்வெளிகளில் தேடவும்:',
 'default' => 'பொதுவானது',
@@ -1180,8 +1208,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' => 'மொழி:',
@@ -1926,6 +1954,15 @@ $1',
 'listusers-noresult' => 'ஒரு பயனரும் இல்லை.',
 'listusers-blocked' => '(தடை செய்யப்பட்டுள்ளது)',
 
+# Special:ActiveUsers
+'activeusers' => 'தொடர்பங்களிப்பாளர்களின் பட்டியல்',
+'activeusers-intro' => 'கடைசி $1 {{PLURAL:$1|நாள்|நாட்கள்}} ஏதேனும் செயலை செய்த பயனர்களின் பட்டியல் இது.',
+'activeusers-count' => '$1 {{PLURAL:$1|திருத்தம்|திருத்தங்கள்}} கடைசி {{PLURAL:$3|நாள்|$3 நாட்கள்}}',
+'activeusers-from' => 'பின்வரும் எழுத்துடன் தொடங்கும் பயனர்களைக் காட்டு:',
+'activeusers-hidebots' => 'தானியங்கிகளை மறை',
+'activeusers-hidesysops' => 'நிர்வாகிகளை மறை',
+'activeusers-noresult' => 'எந்தவொரு பயனர்களும் காணப்படவில்லை.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'பயனர் குழு உரிமைகள்',
 'listgrouprights-key' => '<span class="listgrouprights-granted">உரிமை வழங்கப்பட்டது</span>
@@ -2002,8 +2039,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 பக்கங்களைக்}} கொண்டுள்ளது.',
@@ -2232,7 +2269,7 @@ $1',
 'mycontris' => 'பங்களிப்புக்கள்',
 'contribsub2' => '$1 பயனரின் ($2)',
 'nocontribs' => 'இந்த நிபந்தனையுடன் ஒத்துப்போகும் வகையில் மாற்றங்களெதுவும் காணப்படவில்லை.',
-'uctop' => '(à®®à¯\87லà¯\8d)',
+'uctop' => '(தறà¯\8dபà¯\8bதà¯\88ய)',
 'month' => 'மாதம் உட்பட முந்திய:',
 'year' => 'ஆண்டு உட்பட முந்திய:',
 
@@ -2790,6 +2827,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 .',
@@ -2820,6 +2858,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' => 'முறை பின்வருமாறு:
 
@@ -2847,7 +2895,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'அகலம்',
 'exif-imagelength' => 'உயரம்',
 'exif-bitspersample' => 'ஒவ்வொரு உறுப்பின்படி பிட்கள்.',
@@ -3024,7 +3072,7 @@ $1',
 'exif-originalimageheight' => 'சரிசெய்யப்படும் முன் படத்தின் உயரம்',
 'exif-originalimagewidth' => 'சரிசெய்யப்படும் முன் படத்தின் அகலம்',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'சுருக்கப்படாத',
 
 'exif-copyrighted-true' => 'பதிப்புரிமைப்பட்டது',
@@ -3420,12 +3468,11 @@ $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-file' => 'கோப்பின் பெயர்',
+'redirect-not-exists' => 'மதிப்பு காணப்பெறவில்லை',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'நகல் கோப்புகளைத் தேடுக',
@@ -3452,7 +3499,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' => 'எரித கருவிகள்',
 
@@ -3472,14 +3519,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|மாற்றம்|மாற்றங்கள்}}',
 
@@ -3516,6 +3563,9 @@ $5
 'htmlform-submit' => 'சமர்ப்பி',
 'htmlform-reset' => 'மாற்றங்களை இல்லாது செய்',
 'htmlform-selectorother-other' => 'மற்றவை',
+'htmlform-no' => 'இல்லை',
+'htmlform-yes' => 'ஆம்',
+'htmlform-chosen-placeholder' => 'விருப்பத்தினைத் தேர்க',
 
 # SQLite database support
 'sqlite-has-fts' => '$1முழு-உரை தேடல் ஆதரவுடன்',
index 6fad2e8..34aca48 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' => 'ವೀಕ್ಷಣಾಪಟ್ಟಿಡ್ ಎನ್ನ ಸಂಪಾದನೆಲೆನ್ ತೊಜ್’ಪಾವೊಚಿ',
@@ -243,7 +241,6 @@ $messages = array(
 'disclaimers' => 'ಅಬಾಧ್ಯತೆಲು',
 'disclaimerpage' => 'Project:ಸಾಮಾನ್ಯ ಅಬಾಧ್ಯತೆಲು',
 'edithelp' => 'ಸಂಪಾದನೆ(ಎಡಿಟ್) ಮಲ್ಪೆರೆ ಸಹಾಯ',
-'edithelppage' => 'Help:ಸಂಪಾದನೆ',
 'helppage' => 'Help:ಪರಿವಿಡಿ',
 'mainpage' => 'ಮುಖ್ಯ ಪುಟ',
 'mainpage-description' => 'ಮುಖ್ಯ ಪುಟ',
@@ -565,7 +562,6 @@ $messages = array(
 'nextn' => 'ಬೊಕ್ಕದ {{PLURAL:$1|$1}}',
 'viewprevnext' => 'ತೂಲೆ ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-legend' => 'ನಾಡಾಟದ ಆಯ್ಕೆಲು',
-'searchhelp-url' => 'Help:ಪರಿವಿಡಿ',
 'searchprofile-articles' => 'ಲೇಖನ ಪುಟೊ',
 'searchprofile-images' => 'ಬಹುಮಾಧ್ಯಮ',
 'searchprofile-everything' => 'ಪ್ರತಿಯೊಂಜಿ',
@@ -777,7 +773,7 @@ $messages = array(
 # Special:ListGroupRights
 'listgrouprights-members' => '(ಸದಸ್ಯೆರ್ನ ಪಟ್ಟಿ)',
 
-# E-mail user
+# Email user
 'emailuser' => 'ಈ ಸದಸ್ಯೆರೆಗ್ ಇ-ಮೈಲ್ ಕಡಪುಡ್ಲೆ',
 
 # Watchlist
index 05f81b7..517b968 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' => 'ఎప్పటికీ వద్దు',
@@ -252,6 +251,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|వర్గం|వర్గాలు}}',
@@ -277,6 +288,7 @@ $messages = array(
 'newwindow' => '(కొత్త కిటికీలో వస్తుంది)',
 'cancel' => 'రద్దు',
 'moredotdotdot' => 'ఇంకా...',
+'morenotlisted' => 'చూపించబడనివి మరిన్ని...',
 'mypage' => 'పుట',
 'mytalk' => 'చర్చ',
 'anontalk' => 'ఈ ఐ.పి.కి సంబంధించిన చర్చ',
@@ -342,7 +354,7 @@ $messages = array(
 'talkpage' => 'ఈ పేజీని చర్చించండి',
 'talkpagelinktext' => 'చర్చ',
 'specialpage' => 'ప్రత్యేక పేజీ',
-'personaltools' => 'తన పనిముట్లు',
+'personaltools' => 'à°µà±\8dà°¯à°\95à±\8dతిà°\97à°¤ పనిముట్లు',
 'postcomment' => 'కొత్త విభాగం',
 'articlepage' => 'విషయపు పేజీని చూడండి',
 'talk' => 'చర్చ',
@@ -384,7 +396,6 @@ $1',
 'disclaimers' => 'అస్వీకారములు',
 'disclaimerpage' => 'Project:సాధారణ నిష్పూచీ',
 'edithelp' => 'దిద్దుబాటు సహాయం',
-'edithelppage' => 'Help:దిద్దుబాట్లు ఎలా చెయ్యాలి',
 'helppage' => 'Help:సూచిక',
 'mainpage' => 'మొదటి పేజీ',
 'mainpage-description' => 'తలపుట',
@@ -405,7 +416,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 +563,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 +586,42 @@ $2',
 'logout' => 'నిష్క్రమించు',
 'userlogout' => 'నిష్క్రమించు',
 'notloggedin' => 'లోనికి ప్రవేశించి లేరు',
-'nologin' => "ఖాతా లేదా? '''$1'''.",
+'userlogin-noaccount' => 'మీకు ఖాతా లేదా?',
+'userlogin-joinproject' => '{{SITENAME}}లో చేరండి',
+'nologin' => 'ఖాతా లేదా? $1.',
 'nologinlink' => 'ఖాతాని సృష్టించుకోండి',
 'createaccount' => 'ఖాతాని సృష్టించు',
-'gotaccount' => "ఇప్పటికే మీకు ఖాతా ఉందా? '''$1'''.",
+'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|పేజీ|పేజీలు}}',
 'badretype' => 'మీరు ఇచ్చిన రెండు సంకేతపదాలు ఒకదానితో మరొకటి సరిపోలడం లేదు.',
 'userexists' => 'ఇచ్చిన వాడుకరిపేరు ఇప్పటికే వాడుకలో ఉంది.
 వేరే పేరును ఎంచుకోండి.',
 'loginerror' => 'ప్రవేశంలో పొరపాటు',
+'createacct-error' => 'పద్దు తెరవడములో తప్పు',
 '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}} కూకీలను వాడుతుంది.
 మీరు కుకీలని అచేతనం చేసివున్నారు.
 వాటిని చేతనంచేసి ప్రయత్నించండి.',
@@ -615,8 +653,8 @@ $2',
 'blocked-mailpassword' => 'దిద్దుబాట్లు చెయ్యకుండా ఈ ఐపీఅడ్రసును నిరోధించాం. అంచేత, దుశ్చర్యల నివారణ కోసం గాను, మరచిపోయిన సంకేతపదాన్ని పొందే అంశాన్ని అనుమతించము.',
 'eauthentsent' => 'ఇచ్చిన ఈ-మెయిలు అడ్రసుకు ధృవీకరణ మెయిలు వెళ్ళింది.
 మరిన్ని మెయిళ్ళు పంపే ముందు, మీరు ఆ మెయిల్లో సూచించినట్లుగా చేసి, ఈ చిరునామా మీదేనని ధృవీకరించండి.',
-'throttled-mailpassword' => 'గడచిన {{PLURAL:$1|ఒక గంటలో|$1 గంటల్లో}} ఇప్పటికే ఒక సంకేతపదపు రిమైండరుని పంపించివున్నాం.
-à°¦à±\81à°¶à±\8dà°\9aà°°à±\8dయలనà±\81 à°¨à°¿à°µà°¾à°°à°¿à°\82à°\9aà±\87à°\82à°¦à±\81à°\95à±\81 à°\97ానà±\81, {{PLURAL:$1|à°\92à°\95 à°\97à°\82à°\9fà°\95à°¿|$1 à°\97à°\82à°\9fà°²à°\95à°¿}} à°\92à°\95à±\8dà°\95సారి à°®à°¾à°¤à±\8dà°°à°®à±\87 à°¸à°\82à°\95à±\87తపదపà±\81 à°°à°¿à°®à±\88à°\82à°¡à°°à±\81ని పంపిస్తాము.',
+'throttled-mailpassword' => 'గడచిన {{PLURAL:$1|ఒక గంటలో|$1 గంటల్లో}} ఇప్పటికే  దాటుమాట మార్చినట్లుగా ఒక మెయిల్  పంపించివున్నాం.
+à°¦à±\81à°¶à±\8dà°\9aà°°à±\8dయలనà±\81 à°¨à°¿à°µà°¾à°°à°¿à°\82à°\9aà±\87à°\82à°¦à±\81à°\95à±\81 à°\97ానà±\81, {{PLURAL:$1|à°\92à°\95 à°\97à°\82à°\9fà°\95à°¿|$1 à°\97à°\82à°\9fà°²à°\95à°¿}} à°\92à°\95à±\8dà°\95సారి à°®à°¾à°¤à±\8dà°°à°®à±\87 à°¦à°¾à°\9fà±\81మాà°\9f à°®à°¾à°°à±\8dà°ªà±\81 à°®à±\86యిలà±\8d పంపిస్తాము.',
 'mailerror' => 'మెయిలు పంపించడంలో లోపం: $1',
 'acct_creation_throttle_hit' => 'మీ ఐపీ చిరునామా వాడుతున్న ఈ వికీ సందర్శకులు గత ఒక్క రోజులో {{PLURAL:$1|1 ఖాతాని|$1 ఖాతాలను}} సృష్టించారు, ఈ కాల వ్యవధిలో అది గరిష్ఠ పరిమితి.
 అందువల్ల, ఈ ఐపీని వాడుతున్న సందర్శకులు ప్రస్తుతానికి ఇంక ఖాతాలని సృష్టించలేరు.',
@@ -666,10 +704,8 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'సంకేతపదాన్ని మార్చుకోండి',
-'passwordreset-text' => 'మీ ఖాతా వివరాలను గుర్తు చేసే ఈమెయిలు కోసం ఈ ఫారాన్ని పూర్తి చెయ్యండి.',
 'passwordreset-legend' => 'సంకేతపదాన్ని మార్చుకోండి',
 'passwordreset-disabled' => 'ఈ వికీలో సంకేతపదాల మార్పును అచేతనం చేసాం.',
-'passwordreset-pretext' => '{{PLURAL:$1||డేటా శకలాల్లోంచి ఒకదాన్ని ఇవ్వండి}}',
 'passwordreset-username' => 'వాడుకరి పేరు:',
 'passwordreset-domain' => 'డొమైన్:',
 'passwordreset-email' => 'ఈ-మెయిలు చిరునామా:',
@@ -701,6 +737,7 @@ $2
 'changeemail-oldemail' => 'ప్రస్తుత ఈ-మెయిలు చిరునామా:',
 'changeemail-newemail' => 'కొత్త ఈ-మెయిలు చిరునామా:',
 'changeemail-none' => '(ఏమీలేదు)',
+'changeemail-password' => 'మీ {{SITENAME}} సంకేతపదం:',
 'changeemail-submit' => 'ఈ-మెయిల్ మార్చు',
 'changeemail-cancel' => 'రద్దుచేయి',
 
@@ -719,7 +756,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 +779,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 నిరోధించారు.
 అందుకు ఇచ్చిన కారణం ఇదీ:
 
@@ -883,10 +920,13 @@ $2
 దీన్ని తొలగించినట్టున్నారు.',
 'edit-conflict' => 'మార్పు సంఘర్షణ.',
 'edit-no-change' => 'పాఠ్యంలో ఏమీ మార్పులు లేవు గనక, మీ మార్పుని పట్టించుకోవట్లేదు.',
+'postedit-confirmation' => 'మీ మార్పు భద్రమయ్యింది.',
 'edit-already-exists' => 'కొత్త పేజీని సృష్టించలేము.
 అది ఇప్పటికే ఉంది.',
 'defaultmessagetext' => 'అప్రమేయ సందేశపు పాఠ్యం',
 'invalid-content-data' => 'తప్పుడు విషయం',
+'editwarning-warning' => 'ఈ పేజీని వదిలివెళ్ళడం వల్ల మీరు చేసిన మార్పులను కోల్పోయే అవకాశం ఉంది.
+మీరు ప్రవేశించివుంటే, ఈ హెచ్చరికని మీ అభిరుచులలో "మరపులు" అనే విభాగంలో అచేతనం చేసుకోవచ్చు.',
 
 # Content models
 'content-model-wikitext' => 'వికీపాఠ్యం',
@@ -1115,7 +1155,6 @@ $1",
 'searchmenu-legend' => 'అన్వేషణ ఎంపికలు',
 'searchmenu-exists' => "'''ఈ వికీలో \"[[:\$1]]\" అనే పేజీ ఉంది'''",
 'searchmenu-new' => "'''ఈ వికీలో \"[[:\$1]]\" అనే పేరుతో పేజీని సృష్టించు!'''",
-'searchhelp-url' => 'Help:సూచిక',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ఈ ఉపసర్గ ఉన్న పేజీలను చూడండి]]',
 'searchprofile-articles' => 'విషయపు పేజీలు',
 'searchprofile-project' => 'సహాయం మరియు ప్రాజెక్టు పేజీలు',
@@ -1157,15 +1196,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 +1273,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' => 'ఈ వికీ లోని విషయపు పేజీలను చూపించడానికి మీ అభిమత వైవిధ్యం లేదా ఆర్ధోగ్రఫీ.',
@@ -1267,7 +1297,7 @@ $1",
 ఇతరులు మిమ్మల్ని సంప్రదించినప్పుడు మీ ఈ-మెయిలు చిరునామా బహిర్గతమవదు.',
 'prefs-help-email-required' => 'ఈ-మెయిలు చిరునామా తప్పనిసరి.',
 'prefs-info' => 'ప్రాథమిక సమాచారం',
-'prefs-i18n' => 'à°\85à°\82తరà±\8dà°\9cాతà±\80à°¯à±\80à°\95à°°à°£',
+'prefs-i18n' => 'అంతర్జాతీకరణ',
 'prefs-signature' => 'సంతకం',
 'prefs-dateformat' => 'తేదీ ఆకృతి',
 'prefs-timeoffset' => 'సమయ సవరణ',
@@ -1725,6 +1755,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 ను వెనక్కు తీసుకుపో',
@@ -1775,7 +1806,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'unusedtemplateswlh' => 'ఇతర లింకులు',
 
 # Random page
-'randompage' => 'యాధృచ్ఛిక పేజీ',
+'randompage' => 'యాదృచ్ఛిక పేజీ',
 'randompage-nopages' => 'ఈ క్రింది {{PLURAL:$2|పెరుబరిలో|పెరుబరులలో}} పేజీలు ఏమి లేవు:$1',
 
 # Random redirect
@@ -1832,6 +1863,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 సంచికలు}}',
@@ -1963,6 +1995,15 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'listusers-noresult' => 'వాడుకరి దొరకలేదు.',
 'listusers-blocked' => '(నిరోధించారు)',
 
+# Special:ActiveUsers
+'activeusers' => 'క్రియాశీల వాడుకరుల జాబితా',
+'activeusers-intro' => 'ఇది గత $1 {{PLURAL:$1|రోజులో|రోజులలో}} ఏదైనా కార్యకలాపం చేసిన వాడుకరుల జాబితా.',
+'activeusers-count' => 'గడచిన {{PLURAL:$3|ఒక రోజు|$3 రోజుల}}లో $1 {{PLURAL:$1|మార్పు|మార్పులు}}',
+'activeusers-from' => 'వాడుకరులను ఇక్కడ నుండి చూపించు:',
+'activeusers-hidebots' => 'బాట్లను దాచు',
+'activeusers-hidesysops' => 'నిర్వాహకులను దాచు',
+'activeusers-noresult' => 'వాడుకరులెవరూ లేరు.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'వాడుకరి గుంపుల హక్కులు',
 'listgrouprights-summary' => 'కింది జాబితాలో ఈ వికీలో నిర్వచించిన వాడుకరి గుంపులు, వాటికి సంబంధించిన హక్కులు ఉన్నాయి.
@@ -2038,8 +2079,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 పేజీలు ఉన్నాయి}}.',
@@ -2164,9 +2205,9 @@ $UNWATCHURL కి వెళ్ళండి.
 '''$1''' అనే పేరున్న ఈ పేజీకి ప్రస్తుతం ఈ రక్షణ ఉంది:",
 'protect-cascadeon' => 'ఈ పేజీ కాస్కేడింగు రక్షణలో ఉన్న ఈ కింది {{PLURAL:$1|పేజీకి|పేజీలకు}} జతచేయటం వలన, ప్రస్తుతం రక్షణలో ఉంది.  మీరు ఈ పేజీ యొక్క రక్షణ స్థాయిన మార్చవచ్చు, దాని వలన కాస్కేడింగు రక్షణకు ఎటువంటి సమస్య ఉండదు.',
 'protect-default' => 'అందరు వాడుకరులను అనుమతించు',
-'protect-fallback' => '"$1" à°\85à°¨à±\81మతి à°\85వసరà°\82',
+'protect-fallback' => '"$1" à°\85à°¨à±\81మతి à°\89à°¨à±\8dà°¨ à°µà°¾à°¡à±\81à°\95à°°à±\81లనà±\81 à°®à°¾à°¤à±\8dà°°à°®à±\87 à°\85à°¨à±\81మతిà°\82à°\9aà±\81',
 '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న కాలంచెల్లుతుంది',
@@ -2231,7 +2272,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|తొలగింపు చిట్టా]]ని చూడండి.",
@@ -2296,7 +2338,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',
@@ -2318,14 +2360,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' => 'వాడుకరిని ఈ-మెయిల్ చెయ్యకుండా నివారించు',
@@ -2347,7 +2389,7 @@ $UNWATCHURL కి వెళ్ళండి.
 'ipb-blockingself' => 'మిమ్మల్ని మీరే నిరోధించుకోబోతున్నారు! అదే మీ నిశ్చయమా?',
 'ipb-edit-dropdown' => 'నిరోధపు కారణాలను మార్చండి',
 'ipb-unblock-addr' => '$1 పై ఉన్న నిరోధాన్ని తొలగించండి',
-'ipb-unblock' => 'వాడుకరిపేరు లేక ఐపీ అడ్రసుపై ఉన్న నిరోధాన్ని తొలగించండి',
+'ipb-unblock' => 'వాడుకరి పేరుపై లేదా ఐపీ చిరునామాపై ఉన్న నిరోధాన్ని తొలగించండి',
 'ipb-blocklist' => 'అమల్లో ఉన్న నిరోధాలను చూపించు',
 'ipb-blocklist-contribs' => '$1 యొక్క మార్పులు-చేర్పులు',
 'unblockip' => 'సభ్యునిపై నిరోధాన్ని తొలగించు',
@@ -2744,6 +2786,8 @@ $UNWATCHURL కి వెళ్ళండి.
 'pageinfo-protect-cascading-yes' => 'అవును',
 'pageinfo-category-info' => 'వర్గపు సమాచారం',
 'pageinfo-category-pages' => 'పేజీల సంఖ్య',
+'pageinfo-category-subcats' => 'ఉపవర్గాల సంఖ్య',
+'pageinfo-category-files' => 'దస్త్రాల సంఖ్య',
 
 # Skin names
 'skinname-cologneblue' => 'కలోన్ నీలం',
@@ -2822,11 +2866,25 @@ $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|క్షణం|క్షణాల}} క్రితం',
+'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' => 'కింద తెలిపిన తీరులో కలపాలి:
 
@@ -2853,7 +2911,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'వెడల్పు',
 'exif-imagelength' => 'ఎత్తు',
 'exif-bitspersample' => 'ఒక్కో కాంపొనెంటుకు బిట్లు',
@@ -3019,7 +3077,7 @@ $1',
 'exif-originalimageheight' => 'కత్తిరించబడక ముందు బొమ్మ యొక్క ఎత్తు',
 'exif-originalimagewidth' => 'కత్తిరించబడక ముందు బొమ్మ యొక్క వెడల్పు',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'కుదించని',
 
 'exif-copyrighted-true' => 'నకలుహక్కులుకలది',
@@ -3355,8 +3413,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
@@ -3398,13 +3456,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' => 'ఫైళ్ల మారుప్రతుల కోసం వెతుకు',
@@ -3432,7 +3490,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' => 'స్పామ్ పనిముట్లు',
 
@@ -3473,6 +3531,7 @@ $5
 'compare-submit' => 'పోల్చిచూడు',
 'compare-invalid-title' => 'మీరు ఇచ్చిన శీర్షిక చెల్లనిది.',
 'compare-title-not-exists' => 'మీరు పేర్కొన్న శీర్షిక లేనే లేదు.',
+'compare-revision-not-exists' => 'మీరు పేర్కొన్న కూర్పు లేనే లేదు.',
 
 # Database error messages
 'dberr-header' => 'ఈ వికీ సమస్యాత్మకంగా ఉంది',
@@ -3494,13 +3553,15 @@ $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 à°ªà±\81à°\9fà°¨à±\81 à°¤à±\8aà°²à°\97à°¿à°\82à°\9aారà±\81',
+'logentry-delete-delete' => '$1 $3 à°ªà±\87à°\9cà±\80ని {{GENDER:$2|à°¤à±\8aà°²à°\97à°¿à°\82à°\9aారà±\81}}',
 'revdelete-content-hid' => 'కంటెంట్ దాచబడింది',
 'revdelete-summary-hid' => 'మార్పుల సారాంశాన్ని దాచారు',
 'revdelete-uname-hid' => 'వాడుకరి పేరుని దాచారు',
index 60926e3..0eaf692 100644 (file)
@@ -238,7 +238,6 @@ $messages = array(
 'disclaimers' => 'Avisu legál',
 'disclaimerpage' => 'Project:Avisu legál',
 'edithelp' => 'Ajuda kona-ba edita',
-'edithelppage' => 'Help:Edita',
 'helppage' => 'Help:Konteúdu',
 'mainpage' => 'Pájina Mahuluk',
 'mainpage-description' => 'Pájina Mahuluk',
@@ -377,7 +376,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 +406,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',
@@ -630,6 +631,10 @@ Ita-nia mudansa la armazenadu seidauk!",
 # Special:ListUsers
 'listusers-submit' => 'Hatudu',
 
+# Special:ActiveUsers
+'activeusers-hidebots' => 'Subar bot sira',
+'activeusers-hidesysops' => 'Subar administradór sira',
+
 # Special:ListGroupRights
 'listgrouprights-group' => 'Grupu',
 'listgrouprights-rights' => 'Priviléjiu',
@@ -643,7 +648,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',
@@ -667,6 +672,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',
@@ -713,7 +719,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)',
@@ -762,6 +768,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',
@@ -849,10 +856,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',
@@ -872,7 +876,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',
@@ -953,10 +957,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..c6c5991 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' => 'Ҳангоме ки хулосаи вироиш нанавиштаам юа ман ислоҳ бидеҳ',
@@ -305,7 +303,6 @@ $1',
 'disclaimers' => 'Такзибнома',
 'disclaimerpage' => 'Project:Такзибномаи умумӣ',
 'edithelp' => 'Роҳнамои вироиш',
-'edithelppage' => 'Help:Вироиш',
 'helppage' => 'Help:Мундариҷа',
 'mainpage' => 'Саҳифаи Аслӣ',
 'mainpage-description' => 'Саҳифаи Аслӣ',
@@ -829,7 +826,6 @@ $1',
 'searchmenu-legend' => 'Гузинаҳои ҷустуҷӯ',
 'searchmenu-exists' => "'''Саҳифае бо номи \"[[:\$1]]\" дар ин вики вуҷуд дорад.'''",
 'searchmenu-new' => "'''Эҷоди саҳифаи \"[[:\$1]]\" дар ин вики!'''",
-'searchhelp-url' => 'Help:Мундариҷа',
 'searchprofile-articles' => 'Саҳифаҳои мӯҳтаво',
 'searchprofile-project' => 'Саҳифаҳои роҳномо ва лоиҳа',
 'searchprofile-images' => 'Чандрасонаӣ',
@@ -864,14 +860,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 +1440,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 +2080,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Васеъӣ',
 'exif-imagelength' => 'Баландӣ',
 'exif-bitspersample' => 'Нуқта дар ҳар ҷузъ',
@@ -2206,7 +2194,7 @@ $1',
 'exif-gpsdatestamp' => 'Таърихи ҶПС',
 'exif-gpsdifferential' => 'Тасҳеҳи ҷузъии ҶПС',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ғайрифишурда',
 
 'exif-unknowndate' => 'Таърихи номаълум',
@@ -2507,15 +2495,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..4114ea1 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',
@@ -246,7 +244,6 @@ $1",
 'disclaimers' => 'Takzibnoma',
 'disclaimerpage' => 'Project:Takzibnomai umumī',
 'edithelp' => 'Rohnamoi viroiş',
-'edithelppage' => 'Help:Viroiş',
 'helppage' => 'Help:Mundariça',
 'mainpage' => 'Sahifai Aslī',
 'mainpage-description' => 'Sahifai Aslī',
@@ -704,7 +701,6 @@ Itminon hosil kuned, ki in taƣjir davomnokiji ta'rixiji sahifaro nigoh dorad.",
 'viewprevnext' => 'Namoiş ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-legend' => 'Guzinahoi çustuçū',
 'searchmenu-new' => "'''Eçodi sahifai \"[[:\$1]]\" dar in viki!'''",
-'searchhelp-url' => 'Help:Mundariça',
 'searchprofile-advanced' => 'Peşrafta',
 'searchprofile-articles-tooltip' => 'Çustuçū dar $1',
 'searchprofile-project-tooltip' => 'Çustuçū dar $1',
@@ -733,14 +729,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 +1263,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 +1859,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 +1973,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 +2268,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 8e619ae..23b125d 100644 (file)
@@ -21,6 +21,7 @@
  * @author Octahedron80
  * @author Passawuth
  * @author TMo3289
+ * @author Taweetham
  * @author Woraponboonkerd
  * @author לערי ריינהארט
  * @author จักรกฤช วงศ์สระหลวง (Jakkrit Vongsraluang) / PaePae
@@ -193,7 +194,7 @@ $dateFormats = array(
        'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
 );
 
-$linkTrail = '/^([a-z]+)(.*)\$/sD';
+$linkTrail = '/^([a-z]+)(.*)$/sD';
 
 $messages = array(
 # User preference toggles
@@ -222,7 +223,7 @@ $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' => 'ใช้คำสั่งวิกิที่ปรากฏในลายเซ็นนี้ (โดยไม่มีลิงก์อัตโนมัติ)',
@@ -304,6 +305,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|หมวดหมู่|หมวดหมู่}}',
@@ -385,6 +398,7 @@ $messages = array(
 'create-this-page' => 'สร้างหน้านี้',
 'delete' => 'ลบ',
 'deletethispage' => 'ลบหน้านี้',
+'undeletethispage' => 'กู้คืนหน้านี้',
 'undelete_short' => 'กู้คืน $1 การแก้ไข',
 'viewdeleted_short' => 'ดู $1 การแก้ไขที่ถูกลบ',
 'protect' => 'ล็อก',
@@ -438,7 +452,6 @@ $1',
 'disclaimers' => 'ข้อปฏิเสธความรับผิดชอบ',
 'disclaimerpage' => 'Project:ข้อปฏิเสธความรับผิดชอบทั่วไป',
 'edithelp' => 'คำอธิบายการแก้ไข',
-'edithelppage' => 'Help:การแก้ไข',
 'helppage' => 'Help:สารบัญ',
 'mainpage' => 'หน้าหลัก',
 'mainpage-description' => 'หน้าหลัก',
@@ -569,7 +582,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' => 'คุณสามารถดูและคัดลอกโค้ดหน้านี้ได้:',
@@ -584,6 +597,8 @@ $1',
 'namespaceprotected' => "คุณไม่มีสิทธิแก้ไขหน้าในเนมสเปซ '''$1'''",
 'customcssprotected' => 'คุณไม่มีสิทธิแก้ไขหน้าสไตล์ CSS นี้ เนื่องจากหน้านี้มีการตั้งค่าส่วนบุคคลของผู้ใช้อื่น',
 'customjsprotected' => 'คุณไม่มีสิทธิแก้ไขหน้าจาวาสคริปต์นี้ เนื่องจากหน้านี้มีการตั้งค่าส่วนบุคคลของผู้ใช้อื่น',
+'mycustomcssprotected' => 'คุณไม่ได้รับอนุญาตให้แก้ไขหน้าซีเอสเอสนี้',
+'mycustomjsprotected' => 'คุณไม่ได้รับอนุญาตให้แก้ไขหน้าจาวาสคริปต์นี้',
 'ns-specialprotected' => 'หน้าพิเศษไม่สามารถแก้ไขได้',
 'titleprotected' => "ชื่อเรื่องนี้ถูกป้องกันมิให้สร้างโดย [[User:$1|$1]] 
 เหตุผลที่ให้ไว้คือ ''$2''",
@@ -608,9 +623,18 @@ $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' => 'คุณไม่สามารถเปลี่ยนรหัสผ่านบนวิกินี้',
@@ -623,17 +647,37 @@ $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' => '$1 การแก้ไข',
+'createacct-benefit-body2' => '$1 หน้า',
+'createacct-benefit-body3' => '$1 ผู้ร่วมเขียน',
 'badretype' => 'รหัสผ่านที่ใส่ไม่ตรงกัน',
 'userexists' => 'ชื่อผู้ใช้ที่กรอกมีผู้อื่นใช้ไปแล้ว กรุณาเลือกชื่ออื่น',
 'loginerror' => 'ล็อกอินผิดพลาด',
+'createacct-error' => 'การสร้างบัญชีผิดพลาด',
 'createaccounterror' => 'ไม่สามารถสร้างบัญชีผู้ใช้: $1',
 'nocookiesnew' => 'ชื่อบัญชีผู้ใช้ได้ถูกสร้างขึ้นแล้ว แต่ยังไม่ได้ล็อกอินเข้าสู่ {{SITENAME}} เนื่องจากว่าไม่ได้เปิดใช้คุกกี้ ถ้าต้องการล็อกอินให้เปิดใช้งานคุกกี้และทำการล็อกอินโดยใส่ชื่อผู้ใช้พร้อมรหัสผ่าน',
 'nocookieslogin' => '{{SITENAME}} ใช้คุกกี้สำหรับการล็อกอิน ขณะนี้คุกกี้ของคุณไม่เปิดใช้งาน กรุณาเปิดใช้งานและลองอีกครั้ง',
@@ -678,7 +722,7 @@ $1',
 'cannotchangeemail' => 'ไม่สามารถเปลี่ยนที่อยู่อีเมลบนวิกินี้',
 'emaildisabled' => 'เว็บไซต์นี้ไม่สามารถส่งอีเมล',
 'accountcreated' => 'บัญชีถูกสร้างขึ้น',
-'accountcreatedtext' => 'à¸\9aัà¸\8dà¸\8aีà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\82อà¸\87 $1 ถูกสร้างขึ้นแล้ว',
+'accountcreatedtext' => 'à¸\9aัà¸\8dà¸\8aีà¸\9cูà¹\89à¹\83à¸\8aà¹\89สำหรัà¸\9a [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|à¸\9eูà¸\94à¸\84ุย]]) ถูกสร้างขึ้นแล้ว',
 'createaccount-title' => 'สร้างบัญชีสำหรับ {{SITENAME}}',
 'createaccount-text' => 'มีบางคนสร้างบัญชีโดยใช้ที่อยู่อีเมลของคุณบน {{SITENAME}} ($4) โดยใช้ชื่อ "$2" และรหัสผ่าน "$3" คุณควรล็อกอินเพื่อเปลี่ยนรหัสผ่านทันที
 
@@ -715,11 +759,14 @@ $1',
 
 # Special:PasswordReset
 'passwordreset' => 'ตั้งรหัสผ่านใหม่',
-'passwordreset-text' => 'กรอกแบบฟอร์มนี้เพื่อตั้งรหัสผ่านใหม่',
+'passwordreset-text-one' => 'กรอกแบบนี้เพื่อตั้งรหัสผ่านใหม่',
 '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) บัญชีผู้ใช้ดังกล่าวเกี่ยวข้องกับที่อยู่อีเมลนี้:
@@ -736,9 +783,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' => 'เปลี่ยนที่อยู่อีเมล',
@@ -945,9 +992,12 @@ $2
 เนื่องจากหน้านี้ถูกลบไปแล้ว',
 'edit-conflict' => 'แก้ชนกัน',
 'edit-no-change' => 'การแก้ไขของคุณถูกเพิกเฉย เพราะไม่มีการเปลี่ยนแปลงใด ๆ',
+'postedit-confirmation' => 'บันทึกการแก้ไขของคุณแล้ว',
 'edit-already-exists' => 'ไม่สามารถสร้างหน้าใหม่ได้
 เพราะมีหน้านี้แล้ว',
 'defaultmessagetext' => 'ข้อความสารโดยปริยาย',
+'invalid-content-data' => 'ข้อมูลเนื้อหาไม่ถูกต้อง',
+'content-not-allowed-here' => 'เนื้อหา "$1" ไม่อนุญาตในหน้า [[$2]]',
 'editwarning-warning' => 'การออกจากหน้านี้อาจทำให้ความเปลี่ยนแปลงที่คุณกระทำสูญหาย
 ถ้าคุณล็อกอินแล้ว คุณสามารถปิดคำเตือนนี้ได้ที่ส่วน "การแก้ไข" ในการตั้งค่าของคุณ',
 
@@ -992,7 +1042,7 @@ $2
 'revision-info' => 'รุ่นเมื่อ $1 โดย $2',
 'previousrevision' => '←รุ่นก่อนหน้า',
 'nextrevision' => 'รุ่นถัดไป→',
-'currentrevisionlink' => 'รุà¹\88à¸\99à¸\9bัà¸\88à¸\88ุà¸\9aัà¸\99',
+'currentrevisionlink' => 'รุà¹\88à¸\99ลà¹\88าสุà¸\94',
 'cur' => 'ป',
 'next' => 'ถัดไป',
 'last' => 'ก',
@@ -1182,7 +1232,6 @@ $1",
 'searchmenu-legend' => 'ตัวเลือกการค้นหา',
 'searchmenu-exists' => "'''มีหน้าชื่อ \"[[:\$1]]\" บนวิกินี้'''",
 'searchmenu-new' => "'''สร้างหน้า \"[[:\$1]]\" บนวิกินี้'''",
-'searchhelp-url' => 'Help:สารบัญ',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ค้นดูหน้าที่มีคำขึ้นต้นนี้]]',
 'searchprofile-articles' => 'หน้าเนื้อหา',
 'searchprofile-project' => 'คำอธิบายและหน้าโครงการ',
@@ -1436,6 +1485,8 @@ $1",
 'right-editusercssjs' => 'แก้ไขไฟล์ CSS และจาวาสคริปต์ของผู้ใช้อื่น',
 'right-editusercss' => 'แก้ไขไฟล์ CSS ของผู้ใช้อื่น',
 'right-edituserjs' => 'แก้ไขไฟล์จาวาสคริปต์ของผู้ใช้อื่น',
+'right-editmyusercss' => 'แก้ไขไฟล์ซีเอสเอสผู้ใช้ของคุณเอง',
+'right-editmyuserjs' => 'แก้ไขไฟล์จาวาสคริปต์ผู้ใช้ของคุณเอง',
 'right-rollback' => 'ย้อนการแก้ไขของผู้ใช้ล่าสุดที่แก้ไขหน้าเฉพาะอย่างรวดเร็ว',
 'right-markbotedits' => 'ทำเครื่องหมายการย้อนว่าเป็นการแก้ไขโดยบอต',
 'right-noratelimit' => 'ไม่ได้รับผลกระทบจากขีดจำกัดอัตรา',
@@ -1630,7 +1681,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' => 'กรุณาแก้ไขคำอธิบายไฟล์ด้านล่างนี้ แล้วลองใหม่อีกครั้ง',
@@ -2001,7 +2052,7 @@ $1',
 'showhideselectedlogentries' => 'แสดง/ซ่อนหน่วยปูมที่เลือก',
 
 # Special:AllPages
-'allpages' => 'à¸\97ุà¸\81หà¸\99à¹\89า',
+'allpages' => 'หà¸\99à¹\89าà¸\97ัà¹\89à¸\87หมà¸\94',
 'alphaindexline' => '$1 ถึง $2',
 'nextpage' => 'ถัดไป ($1)',
 'prevpage' => 'ก่อนหน้า ($1)',
@@ -2052,6 +2103,15 @@ $1',
 'listusers-noresult' => 'ไม่พบผู้ใช้',
 'listusers-blocked' => '(ถูกบล็อก)',
 
+# Special:ActiveUsers
+'activeusers' => 'รายการผู้ใช้ที่มีความเคลื่อนไหว',
+'activeusers-intro' => 'นี่คือรายการผู้ใช้ที่มีกิจกรรมใด ๆ ในช่วง $1 วันที่ผ่านมา',
+'activeusers-count' => '{{PLURAL:$1|ปฏิบัติการล่าสุด|ปฏิบัติการล่าสุด $1 รายการ}} ในช่วง $3 วันที่ผ่านมา',
+'activeusers-from' => 'แสดงผู้ใช้เริ่มจาก:',
+'activeusers-hidebots' => 'ซ่อนบอต',
+'activeusers-hidesysops' => 'ซ่อนผู้ดูแลระบบ',
+'activeusers-noresult' => 'ไม่พบผู้ใช้',
+
 # Special:ListGroupRights
 'listgrouprights' => 'สิทธิกลุ่มผู้ใช้',
 'listgrouprights-summary' => 'ด้านล่างเป็นรายการกลุ่มผู้ใช้ที่นิยามบนวิกินี้ และสิทธิการเข้าถึงที่เกี่ยวข้อง
@@ -2117,7 +2177,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' => 'เฝ้าดู',
@@ -2128,8 +2188,8 @@ $1',
 'notvisiblerev' => 'รุ่นล่าสุดโดยผู้ใช้อีกคนถูกลบแล้ว',
 'watchnochange' => 'ไม่มีการแก้ไขหน้าที่คุณเฝ้าดูในระยะเวลาที่แสดง',
 'watchlist-details' => 'มี $1 หน้าในรายการเฝ้าดูของคุณ ไม่รวมหน้าอภิปราย',
-'wlheader-enotif' => 'แจ้งเตือนผ่านอีเมลถูกเปิดใช้งาน',
-'wlheader-showupdated' => "หน้าที่มีการเปลี่ยนแปลงตั้งแต่การเข้าชมครั้งล่าสุดของคุณแสดงใน'''ตัวหนา'''",
+'wlheader-enotif' => 'การแจ้งเตือนผ่านอีเมลถูกเปิดใช้งาน',
+'wlheader-showupdated' => "หน้าที่มีการเปลี่ยนแปลงตั้งแต่การเข้าชมครั้งล่าสุดของคุณแสดงใน'''ตัวหนา'''",
 'watchmethod-recent' => 'ตรวจสอบการปรับปรุงล่าสุดกับหน้าเฝ้าดู',
 'watchmethod-list' => 'ตรวจสอบหน้าเฝ้าดูกับการแก้ไขล่าสุด',
 'watchlistcontains' => 'รายการเฝ้าดูของคุณมี $1 หน้า',
@@ -2376,7 +2436,7 @@ $1',
 'mycontris' => 'เรื่องที่เขียน',
 'contribsub2' => 'สำหรับ $1 ($2)',
 'nocontribs' => 'ไม่พบการเปลี่ยนแปลงตรงกับเงื่อนไขเหล่านี้',
-'uctop' => ' (บนสุด)',
+'uctop' => '(ปัจจุบัน)',
 'month' => 'จากเดือน (และก่อนหน้า):',
 'year' => 'จากปี (และก่อนหน้า):',
 
@@ -2499,7 +2559,8 @@ $1',
 'change-blocklink' => 'เปลี่ยนการบล็อก',
 'contribslink' => 'เรื่องที่เขียน',
 'emaillink' => 'ส่งอีเมล',
-'autoblocker' => 'ถูกบล็อกอัตโนมัติเนื่องจากเลขที่อยู่ไอพีของคุณล่าสุดถูกใช้โดย "[[User:$1|$1]]" เหตุผลที่ให้แก่การบล็อก $1 คือ: "$2"',
+'autoblocker' => 'ได้บล็อกอัตโนมัติเนื่องจากเลขที่อยู่ไอพีของคุณใช้โดย "[[User:$1|$1]]" เมื่อเร็ว ๆ นี้
+เหตุผลที่ให้แก่การบล็อก $1 คือ: "$2"',
 'blocklogpage' => 'ปูมการบล็อก',
 'blocklog-showlog' => 'ผู้ใช้นี้ถูกสกัดกั้นมาก่อน
 ปูมการสกัดกั้นแสดงไว้ด้านล่างนี้เพื่อการอ้างอิง:',
@@ -2679,8 +2740,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' => 'กรองตามสถานะที่เลือก:',
@@ -2743,6 +2804,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' => 'ปูมการนำเข้า',
@@ -2754,6 +2818,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' => 'หน้าผู้ใช้ของคุณ',
@@ -2831,7 +2899,6 @@ $1',
 'modern.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินโมเดิร์น */',
 'vector.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินเวกเตอร์ */',
 'print.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ข้อมูลส่งออกเป็นสิ่งพิมพ์ */',
-'handheld.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่อุปกรณ์เคลื่อนที่ โดยขึ้นอยู่กับสกินที่ตั้งค่าไว้ใน $wgHandheldStyle */',
 'noscript.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ปิดการใช้งานจาวาสคริปต์ */',
 'group-autoconfirmed.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ทั่วไปเท่านั้น */',
 'group-bot.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่บอตเท่านั้น */',
@@ -2929,6 +2996,8 @@ $1',
 'markedaspatrollederror' => 'ไม่สามารถทำเครื่องหมายว่าตรวจสอบแล้ว',
 'markedaspatrollederrortext' => 'คุณจำเป็นต้องระบุรุ่นการแก้ไขที่กำหนดว่าตรวจสอบแล้ว',
 'markedaspatrollederror-noautopatrol' => 'คุณไม่สามารถทำเครื่องหมายการแก้ไขของคุณเองว่าตรวจสอบแล้ว',
+'markedaspatrollednotify' => 'การเปลี่ยนแปลงไปยัง $1 ถูกทำเครื่องหมายว่าตรวจสอบแล้ว',
+'markedaspatrollederrornotify' => 'การทำเครื่องหมายว่าตรวจสอบแล้วล้มเหลว',
 
 # Patrol log
 'patrol-log-page' => 'ปูมการตรวจสอบ',
@@ -2992,11 +3061,25 @@ $1',
 'minutes' => '$1 นาที',
 'hours' => '$1 ชั่วโมง',
 'days' => '$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' => 'รูปแบบแสดงต่อไปนี้:
 
@@ -3023,7 +3106,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ความกว้าง',
 'exif-imagelength' => 'ความสูง',
 'exif-bitspersample' => 'บิต ต่อคอมโพเนนต์',
@@ -3137,6 +3220,7 @@ $1',
 'exif-gpsareainformation' => 'ชื่อของพื้นที่จีพีเอส',
 'exif-gpsdatestamp' => 'วันที่จีพีเอส',
 'exif-gpsdifferential' => 'การปรับแค่ข้อแตกต่างจีพีเอส',
+'exif-jpegfilecomment' => 'ความเห็นไฟล์ JPEG',
 'exif-keywords' => 'คำสำคัญ',
 'exif-objectname' => 'ชื่อเรื่องสั้น',
 'exif-headline' => 'พาดหัวข่าว',
@@ -3146,7 +3230,7 @@ $1',
 'exif-label' => 'ป้ายฉลาก',
 'exif-usageterms' => 'ข้อตกลงในการใช้งาน',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'ไม่ได้บีบอัด',
 
 'exif-unknowndate' => 'ไม่ทราบวัน',
@@ -3428,7 +3512,7 @@ $5
 
 # Auto-summaries
 'autosumm-blank' => 'ทำหน้าว่าง',
-'autosumm-replace' => "แทนทีข้อความทั้งหมดด้วย '$1'",
+'autosumm-replace' => "à¹\81à¸\97à¸\99à¸\97ีà¹\88à¸\82à¹\89อà¸\84วามà¸\97ัà¹\89à¸\87หมà¸\94à¸\94à¹\89วย '$1'",
 'autoredircomment' => 'เปลี่ยนทางไปที่ [[$1]]',
 'autosumm-new' => "หน้าที่ถูกสร้างด้วย '$1'",
 
@@ -3528,15 +3612,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' => 'ค้นหาไฟล์ที่ซ้ำกันตามค่าแฮช',
@@ -3625,6 +3700,8 @@ $5
 'htmlform-submit' => 'ส่งข้อมูล',
 'htmlform-reset' => 'ยกเลิกการเปลื่ยนแปลง',
 'htmlform-selectorother-other' => 'อื่น ๆ',
+'htmlform-no' => 'ไม่',
+'htmlform-yes' => 'ใช่',
 
 # SQLite database support
 'sqlite-has-fts' => 'รุ่น $1 พร้อมการสนับสนุนการค้นหาข้อความแบบเต็ม',
@@ -3659,27 +3736,35 @@ $5
 'logentry-newusers-newusers' => 'บัญชีผู้ใช้ $1 ถูกสร้างขึ้น',
 'logentry-newusers-create' => 'บัญชีผู้ใช้ $1 ถูกสร้างขึ้น',
 'logentry-newusers-create2' => 'บัญชีผู้ใช้ $3 ถูกสร้างขึ้นโดย $1',
-'logentry-newusers-autocreate' => 'บัญชี $1 ถูกสร้างขึ้นอัตโนมัติ',
+'logentry-newusers-autocreate' => 'บัญชีผู้ใช้ $1 ถูกสร้างขึ้นอัตโนมัติ',
 '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..e15047b 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',
@@ -278,7 +276,6 @@ $1',
 'disclaimers' => 'Jogapkärçilikden boýun gaçyrma',
 'disclaimerpage' => 'Project:Umumy jogapkärçilikden boýun gaçyrma',
 'edithelp' => 'Nähili redaktirlenýär?',
-'edithelppage' => 'Help:Redaktirleme',
 'helppage' => 'Help:Içindäkiler',
 'mainpage' => 'Baş Sahypa',
 'mainpage-description' => 'Baş Sahypa',
@@ -300,9 +297,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',
@@ -967,7 +964,6 @@ Nawigasiýa çykgytlaryny ulanmaklygyň bu sütüni başky ýagdaýyna getirjekd
 'searchmenu-legend' => 'Gözleg opsiýalary',
 'searchmenu-exists' => "'''Bu wikide \"[[:\$1]]\" atly sahypa bar'''",
 'searchmenu-new' => "'''Bu wikide \"[[:\$1]]\" sahypasyny döret!'''",
-'searchhelp-url' => 'Help:Içindäkiler',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Şu prefiksli sahypalara göz aýla]]',
 'searchprofile-articles' => 'Mazmunly sahypalar',
 'searchprofile-project' => 'Ýardam we Taslama sahypalary',
@@ -1012,14 +1008,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 +1472,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 +1848,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 +2603,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 +2719,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 +3038,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..89bb024 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',
@@ -255,6 +254,18 @@ $messages = array(
 'oct' => 'Okt',
 'nov' => 'Nob',
 'dec' => 'Dis',
+'january-date' => '$1 Enero',
+'february-date' => '$1 Pebrero',
+'march-date' => '$1 Marso',
+'april-date' => '$1 Abril',
+'may-date' => '$1 Mayo',
+'june-date' => '$1 Hunyo',
+'july-date' => '$1 Hulyo',
+'august-date' => '$1 Agosto',
+'september-date' => '$1 Setyembre',
+'october-date' => '$1 Oktubre',
+'november-date' => '$1 Nobyembre',
+'december-date' => '$1 Disyembre',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorya|Mga kategorya}}',
@@ -306,7 +317,7 @@ $messages = array(
 'vector-action-protect' => 'Ipagsanggalang',
 'vector-action-undelete' => 'Alisin ang pagbubura',
 'vector-action-unprotect' => 'Baguhin ang pagsasanggalang',
-'vector-simplesearch-preference' => 'Paganahin ang pinainam na mga mungkahi sa paghahanap (pabalat na Vector lang)',
+'vector-simplesearch-preference' => 'Paganahin ang pinainam na bar ng paghahanap (pabalat na Vector lang)',
 'vector-view-create' => 'Likhain',
 'vector-view-edit' => 'Baguhin',
 'vector-view-history' => 'Tingnan ang kasaysayan',
@@ -316,6 +327,7 @@ $messages = array(
 'namespaces' => 'Mga ngalan-espasyo',
 'variants' => 'Naiiba pa',
 
+'navigation-heading' => 'Menu ng paglilibot',
 'errorpagetitle' => 'Pagkakamali',
 'returnto' => 'Bumalik sa $1.',
 'tagline' => 'Mula sa {{SITENAME}}',
@@ -349,7 +361,7 @@ $messages = array(
 'talkpagelinktext' => 'Usapan',
 'specialpage' => 'Natatanging pahina',
 'personaltools' => 'Mga kagamitang pansarili',
-'postcomment' => 'Bagong seksyon',
+'postcomment' => 'Bagong seksiyon',
 'articlepage' => 'Tingnan ang pahina ng nilalaman',
 'talk' => 'Usapan',
 'views' => 'Mga anyo',
@@ -390,7 +402,6 @@ $1',
 'disclaimers' => 'Mga pagtatanggi',
 'disclaimerpage' => 'Project:Pangkalahatang pagtatanggi',
 'edithelp' => 'Tulong sa pagbabago',
-'edithelppage' => 'Help:Pagbabago',
 'helppage' => 'Help:Mga nilalaman',
 'mainpage' => 'Unang Pahina',
 'mainpage-description' => 'Unang Pahina',
@@ -473,10 +484,10 @@ Matatagpuan ang isang tala ng mga tamang natatanging pahina sa [[Special:Special
 
 # General errors
 'error' => 'Kamalian',
-'databaseerror' => 'Kamalian sa kalipunan ng dato',
-'dberrortext' => 'Naganap ang isang pagkakamali sa pag-uusisa na pampalaugnayan sa kalipunan ng dato.
+'databaseerror' => 'Kamalian sa kalipunan ng datos',
+'dberrortext' => 'Naganap ang isang pagkakamali sa pag-uusisa na pampalaugnayan sa kalipunan ng datos.
 Maaaring magpahiwatig ito ng isang surot sa loob ng sopwer.
-Ang huling tinangkang pag-uusisa sa kalipunan ng dato ay:
+Ang huling tinangkang pag-uusisa sa kalipunan ng datos ay:
 <blockquote><code>$1</code></blockquote>
 magmula sa loob ng tungkuling "<code>$2</code>".
 Nagbalik ang kalipunan ng dato ng kamalian na "<samp>$3: $4</samp>".',
@@ -538,14 +549,16 @@ Pakisubok na lang ulit pagkaraan ng kaunting mga minuto.",
 'viewyourtext' => "Matitingnan at makukopya mo ang pinagmulan ng '''mga pagbabago''' papunta sa pahinang ito:",
 'protectedinterface' => "Nagbibigay ang pahinang ito ng tekstong panghangganan (''interface'') para sa sopwer, at ikinandado para maiwasan ang pangaabuso.",
 'editinginterface' => "'''Babala:''' Binabago mo ang isang pahinang ginagamit sa pagbibigay ng tekstong panghangganan para sa sopwer.
-Makakaapekto ang mga pagbago sa pahinang ito sa anyo ng hangganang (''interface'') pangtagagamit na para sa ibang mga tagagamit.
-Para sa mga salinwika, paki isang-alang-alang o konsiderahin ang paggamit ng [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], ang proyektong panglokalisasyon ng MediaWiki.",
+Makaaapekto ang mga pagbago sa pahinang ito sa anyo ng hangganang (''interface'') pantagagamit na para sa ibang mga tagagamit sa wiking ito.
+Upang magdagag o magbago ng mga salinwika, isaaalang-alang na lang po ang paggamit ng [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], ang proyekto para sa lokalisasyon ng MediaWiki.",
 'sqlhidden' => '(nakatago ang tanong ng SQL)',
 'cascadeprotected' => 'Nakasanggalang ang pahinang ito mula sa mga pagbabago, dahil kabilang ito sa sumusunod na {{PLURAL:$1|pahinang|mga pahinang}} nakasanggalang sa pamamagitan ng binuhay na opsyong "nahuhulog" (kumakaskada):
 $2',
 'namespaceprotected' => "Wala kang pahintulot na magbago ng mga pahinang nasa ngalan-espasyong '''$1'''.",
 'customcssprotected' => 'Wala kang pahintulot na baguhin ang pahina ng CSS na ito, dahil naglalaman ito ng mga katakdaang pansarili ng ibang tagagamit.',
 'customjsprotected' => 'Wala kang pahintulot na baguhin ang pahina ng JavaScript na ito, dahil naglalaman ito ng mga katakdaang pansarili ng ibang tagagamit.',
+'mycustomcssprotected' => 'Wala kang pahintulot na baguhin itong pahinang CSS.',
+'mycustomjsprotected' => 'Wala kang pahintulot na baguhin itong pahinang JavaScript.',
 'ns-specialprotected' => 'Hindi pwedeng baguhin ang mga natatanging pahina.',
 'titleprotected' => "Nakasanggalang ang pamagat na ito mula sa paglikha ni [[User:$1|$1]].
 Ang ibinigay na dahilan ay ''$2''.",
@@ -572,8 +585,12 @@ Tandaan na may ilang pahinang maaaring magpatuloy na nagpapakitang parang nakala
 Huwag kalimutang baguhin ang iyong [[Special:Preferences|mga kagustuhan sa {{SITENAME}}]].',
 'yourname' => 'Bansag:',
 'yourpassword' => 'Hudyat:',
+'userlogin-yourpassword' => 'Hudyat',
+'userlogin-yourpassword-ph' => 'Ipasok ang iyong hudyat',
 'yourpasswordagain' => 'Hudyat mo uli:',
+'createacct-yourpasswordagain' => 'Tiyakin ang hudyat',
 'remembermypassword' => 'Tandaan ang paglagda ko sa kompyuter na ito (pinakamarami na ang $1 {{PLURAL:$1|araw|mga araw}})',
+'userlogin-remembermypassword' => 'Panatilihin akong nakalagda',
 'securelogin-stick-https' => 'Manatiling konektado sa HTTPS matapos lumagda',
 'yourdomainname' => 'Dominyo mo:',
 'password-change-forbidden' => 'Hindi mo maaaring palitan ang mga hudyat sa wiking ito.',
@@ -586,14 +603,19 @@ Huwag kalimutang baguhin ang iyong [[Special:Preferences|mga kagustuhan sa {{SIT
 'logout' => 'Umalis sa pagkakalagda',
 'userlogout' => 'Umalis sa pagkakalagda',
 'notloggedin' => 'Hindi nakalagda',
+'userlogin-noaccount' => 'Wala ka pa bang kuwenta?',
+'userlogin-joinproject' => 'Sumali sa {{SITENAME}}',
 'nologin' => 'Wala ka pang kuwenta? $1.',
 'nologinlink' => 'Lumikha ng kuwenta',
 'createaccount' => 'Lumikha ng kuwenta',
 'gotaccount' => 'May kuwenta ka na ba? $1.',
 'gotaccountlink' => 'Lumagda',
 'userlogin-resetlink' => 'Nakalimutan mo ang iyong mga detalyeng panglagda?',
-'createaccountmail' => 'sa pamamagitan ng e-liham',
+'createacct-emailrequired' => 'Direksiyong e-liham:',
+'createaccountmail' => 'Gumamit ng pansamantalang walang-piling hudyat at ipadala ito sa direksiyong e-liham na nakasaad sa ibaba',
+'createacct-realname' => 'Tunay na pangalan (maaaring wala)',
 'createaccountreason' => 'Dahilan:',
+'createacct-reason' => 'Dahilan',
 'badretype' => 'Hindi magkatugma ang ipinasok mong mga hudyat.',
 'userexists' => 'May gumagamit na ng ipinasok na bansag.
 Pumili po ng ibang pangalan.',
@@ -659,7 +681,7 @@ Pakipasok ang isang may mahusay na anyong adres o paki-iwang walang laman na lan
 'cannotchangeemail' => 'Hindi maaaring baguhin ang mga direksiyong e-liham sa wiking ito.',
 'emaildisabled' => 'Ang sityong ito ay hindi makapagpapadala ng mga e-liham.',
 'accountcreated' => 'Nilikha na ang kuwenta',
-'accountcreatedtext' => 'Nilikha na ang kuwentang tagagamit para kay $1.',
+'accountcreatedtext' => 'Nilikha na ang kuwenta ng tagagamit para kay [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]).',
 'createaccount-title' => 'Paglikha ng kuwenta para sa {{SITENAME}}',
 'createaccount-text' => 'May lumikha ng kuwenta para sa iyong adres ng e-liham sa {{SITENAME}} ($4) na pinangalanang "$2", na may hudyat na "$3".
 Dapat kang tumala at baguhin ang hudyat mo ngayon.
@@ -697,10 +719,8 @@ Maaaring matagumpay mo nang nabago ang iyong hudyat o nakahiling na ng isang bag
 
 # Special:PasswordReset
 'passwordreset' => 'Muling pagtatakda ng hudyat',
-'passwordreset-text' => 'Punuin ang pormularyong ito upang makatanggap ng isang pampaalalang e-liham ng iyong mga detalye ng akawnt.',
 'passwordreset-legend' => 'Itakdang muli ang hudyat',
 'passwordreset-disabled' => 'Hindi pinagagana sa wiking ito ang muling mga pagtatakda ng hudyat.',
-'passwordreset-pretext' => '{{PLURAL:$1| | Ipasok ang isa sa mga piraso ng datos sa ibaba}}',
 'passwordreset-username' => 'Pangalan ng tagagamit:',
 'passwordreset-domain' => 'Nasasakupan:',
 'passwordreset-capture' => 'Tingnan ang lumabas na e-liham?',
@@ -907,8 +927,8 @@ Nangangako ka rin sa amin na ikaw ang mismong sumulat nito, o sinipi/kinopya mo
 '''HUWAG MAGTALA NG AKDANG NAKAKARAPATANG-ARI (NAKAKOPIRAYT) NA HINDI MUNA HUMIHINGI NG PAHINTULOT!'''",
 'longpageerror' => "'''Kamalian: May haba na {{PLURAL:$1|isang kilobyte|$1 mga kilobyte}} ang ipinasa mong teksto, na mas mahaba kaysa sa pinakamataas na nakatakdang halaga na {{PLURAL:$2|isang kilobyte|$2 mga kilobyte}}.''' 
 Hindi ito masasagip.",
-'readonlywarning' => "'''BABALA: Ikinandado ang kalipunan ng dato para sa gawaing pampagpapanatili, kaya't hindi mo pa masasagip ang mga pagbabagong ginawa mo ngayon.
-Maaaring ibigin mong gupitin at idikit ang teksto patungo sa isang talaksang pangteksto at sagipin ito mamaya.'''
+'readonlywarning' => "'''BABALA: Ikinandado ang kalipunan ng datos para sa gawaing pampagpapanatili, kaya't hindi mo pa masasagip ang mga pagbabagong ginawa mo ngayon.'''
+Maaaring ibigin mong gupitin at idikit ang teksto patungo sa isang talaksang panteksto at sagipin ito mamaya.
 
 Nagbigay ng ganitong paliwanag ang tagapangasiwang nagkandado nito: $1",
 'protectedpagewarning' => "'''Babala: Ikinandado ang pahinang ito upang mga tagagamit lamang na may karapatan ng tagapangasiwa ang makakapagbago nito.'''
@@ -950,6 +970,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',
@@ -1188,7 +1210,6 @@ Matatagpuan ang mga detalye sa loob ng [{{fullurl:{{#Special:Log}}/delete|page={
 'searchmenu-legend' => 'Mga pagpipilian para sa paghahanap',
 'searchmenu-exists' => "'''Mayroong pahinang may pangalang \"[[:\$1]]\" dito sa wiking ito'''",
 'searchmenu-new' => "'''Likhain ang pahinang \"[[:\$1]]\" sa wiking ito!'''",
-'searchhelp-url' => 'Help:Nilalaman',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Tingnan-tingnan ang mga pahinang may ganitong unahan/unlapi]]',
 'searchprofile-articles' => 'Mga pahina ng nilalaman',
 'searchprofile-project' => 'Mga pahina ng Tulong at Proyekto',
@@ -1210,7 +1231,7 @@ Matatagpuan ang mga detalye sa loob ng [{{fullurl:{{#Special:Log}}/delete|page={
 'search-interwiki-default' => '$1 mga resulta:',
 'search-interwiki-more' => '(mas marami pa)',
 'search-relatedarticle' => 'Kaugnay',
-'mwsuggest-disable' => 'Huwag paganahin ang mga mungkahi ng AJAX',
+'mwsuggest-disable' => 'Huwag paganahin ang mga mungkahi sa paghahanap',
 'searcheverything-enable' => 'Maghanap sa lahat ng ngalan-espasyo:',
 'searchrelated' => 'kaugnay',
 'searchall' => 'lahat',
@@ -1231,15 +1252,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',
@@ -1317,8 +1329,8 @@ Hindi ito maibabalik sa dating gawi.',
 'prefs-textboxsize' => 'Sukat ng bintana ng pagbabago',
 'youremail' => 'E-liham:',
 'username' => '{{GENDER:$1|Bansag}}:',
-'uid' => 'ID ng tagagamit:',
-'prefs-memberingroups' => 'Kasapi ng {{PLURAL:$1|na pangkat|na mga pangkat}}:',
+'uid' => 'ID ng {{GENDER:$1|tagagamit}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Kasapi}} ng {{PLURAL:$1|na pangkat|na mga pangkat}}:',
 'prefs-memberingroups-type' => '$1',
 'prefs-registration' => 'Oras ng pagtatala:',
 'prefs-registration-date-time' => '$1',
@@ -1797,7 +1809,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>
@@ -1926,13 +1937,13 @@ Marahil ay naisa mong baguhin ang paglalarawan doon sa [$2 pahina ng paglalarawa
 'randompage-nopages' => 'Walang mga pahina sa sumusunod na {{PLURAL:$2|ngalan-espasyo|mga ngalan-espasyo}}: $1.',
 
 # Random redirect
-'randomredirect' => 'Alinmang panuto',
-'randomredirect-nopages' => 'Walang mga panuto sa pangalan-espasyong "$1".',
+'randomredirect' => 'Pagkargang walang-pili',
+'randomredirect-nopages' => 'Walang mga pagkarga sa ngalan-espasyong "$1".',
 
 # Statistics
 'statistics' => 'Mga estadistika',
 'statistics-header-pages' => 'Mga estadistika ng pahina',
-'statistics-header-edits' => 'Baguhin ang mga estadistika',
+'statistics-header-edits' => 'Mga estadistika sa mga pagbabago',
 'statistics-header-views' => 'Tingnan ang mga estadistika',
 'statistics-header-users' => 'Mga estadistika sa mga tagagamit',
 'statistics-header-hooks' => 'Ibang mga estadistika',
@@ -1942,7 +1953,7 @@ Marahil ay naisa mong baguhin ang paglalarawan doon sa [$2 pahina ng paglalarawa
 'statistics-files' => 'Ikinargang mga talaksan',
 'statistics-edits' => 'Naihanda na ang mga pagbabago ng pahina mula sa {{SITENAME}}',
 'statistics-edits-average' => 'Karaniwang pagbabago sa bawat pahina',
-'statistics-views-total' => 'Kalahatang pagdayo',
+'statistics-views-total' => 'Kabuuan ng mga pagtanaw',
 'statistics-views-total-desc' => 'Hindi kabilang ang mga pagtanaw sa mga pahinang hindi umiiral at mga pahinang natatangi',
 'statistics-views-peredit' => 'Pagtingin sa bawat pagbabago',
 'statistics-users' => 'Mga nakatalang [[Special:ListUsers|tagagamit]]',
@@ -2176,7 +2187,7 @@ Ang ipinasok mong direksiyong e-liham sa [[Special:Preferences|iyong mga kagustu
 'emailmessage' => 'Mensahe:',
 'emailsend' => 'Ipadala',
 'emailccme' => 'Padalhan ako ng sipi ng aking mensahe sa pamamagitan ng e-liham.',
-'emailccsubject' => 'Kopya ng iyong mensahe sa $1: $2',
+'emailccsubject' => 'Kopya ng iyong mensahe kay $1: $2',
 'emailsent' => 'Naipadala na ang e-liham',
 'emailsenttext' => 'Naipadala na ang mensahe ng iyong e-liham.',
 'emailuserfooter' => 'Ipinadala ang e-liham na ito ni $1 para kay $2 sa pamamagitan ng tungkuling "Magpadala ng e-liham" na nasa {{SITENAME}}.',
@@ -2207,8 +2218,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.',
@@ -2330,6 +2341,7 @@ Tingnan ang [[Special:ProtectedPages|talaan ng pinuprutektahang mga pahina]] par
 'prot_1movedto2' => 'Inilipat ang [[$1]] patungo sa [[$2]]',
 'protect-badnamespace-title' => 'Hindi mapupruteksiyunang puwang ng pangalan',
 'protect-badnamespace-text' => 'Hindi mapupruteksiyunan ang mga pahinang nasa puwang na pampangalang ito.',
+'protect-norestrictiontypes-title' => 'Pahinang hindi maipasanggalang',
 'protect-legend' => 'Tiyakin ang panananggalang',
 'protectcomment' => 'Dahilan:',
 'protectexpiry' => 'Magtatapos sa:',
@@ -2346,7 +2358,7 @@ Narito ang pangkasalukuyang mga pagtatakda para sa pahinang '''$1''':",
 'protect-cascadeon' => 'Kasalukuyang nakasanggalang na ang pahinang ito dahil kabilang/kasama ito sa sumusunod na {{PLURAL:$1|pahinang may|mga pahinang may}} buhay/umiiral na baita-baitang na mga panananggalang.
 Maaari mong baguhin ang antas ng panananggalang ng pahina, ngunit hindi ito makakaapekto sa baita-baitang na panananggalang.',
 'protect-default' => 'Pahintulutan ang lahat ng mga tagagamit',
-'protect-fallback' => 'Nangangailangan ng kapahintulutang "$1"',
+'protect-fallback' => 'Pahintulutan ang mga tagagamit lamang na may pahintulot na "$1"',
 'protect-level-autoconfirmed' => 'Hadlangan ang bago at hindi nagpapatalang mga tagagamit',
 'protect-level-sysop' => "Mga tagapangasiwa (''sysop'') lamang",
 'protect-summary-cascade' => 'baita-baitang',
@@ -2449,7 +2461,7 @@ $1',
 'mycontris' => 'Mga ambag',
 'contribsub2' => 'Para kay $1 ($2)',
 'nocontribs' => 'Walang pagbabagong nakita sa binigay na kondisyon.',
-'uctop' => ' (itaas)',
+'uctop' => '(kasalukuyan)',
 'month' => 'Mula sa buwan (at nauna):',
 'year' => 'Mula sa taon (at nauna):',
 
@@ -2924,17 +2936,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 +2949,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 +3016,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 +3110,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 +3185,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 +3378,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 +3910,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..464792a 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,21 @@ $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 +367,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 +383,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 +508,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' => "''Дыггәт! Шымә нафко позулмуш быә сәһифон бәрпа кардеон пидә.'''
@@ -591,7 +590,6 @@ $messages = array(
 'searchmenu-legend' => 'Бо нәве кукон',
 'searchmenu-exists' => "'''Бы вики-нәхшәдә һесте сәһифә «[[:$1]]»'''",
 'searchmenu-new' => "'''Сәһифә офәјеј «[[:$1]]» бә ым вики-нахшәдә!'''",
-'searchhelp-url' => 'Help:Мындәриҹот',
 'searchprofile-articles' => 'Әсосә сәһифон',
 'searchprofile-project' => 'Че араијшон ијән нахшон сәһифон',
 'searchprofile-images' => 'Мултимедијә',
@@ -602,7 +600,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 +662,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 +778,7 @@ $messages = array(
 # Special:ListGroupRights
 'listgrouprights-members' => '(иштирокәкон сијоһи)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Номә бә иштирокәкә',
 
 # Watchlist
@@ -824,7 +822,7 @@ $messages = array(
 'contributions-title' => 'Иштирокәкә гәнҹ $1',
 'mycontris' => 'Гәнҹ',
 'contribsub2' => 'Гәнҹ $1 ($2)',
-'uctop' => '(оÑ\85онÓ\99ни)',
+'uctop' => '(еÑ\81Ó\99Ñ\82нÓ\99)',
 'month' => 'Че мангику (һәнијән рә):',
 'year' => 'Че сорику (һәнијән рә):',
 
@@ -866,7 +864,7 @@ $messages = array(
 'blocklink' => 'Бә гырд гәтеј',
 'unblocklink' => 'Ошко кардеј',
 'change-blocklink' => 'Блок быә ҹо дәгиш кардеј',
-'contribslink' => 'Комәкон',
+'contribslink' => 'Koməqon',
 'blocklogpage' => 'Блок быәјон',
 'blocklogentry' => 'бастәше [[$1]] бә ын мыддәт $2 $3',
 'block-log-flags-nocreate' => 'нујә иштирокәкон ғејд карде ғәдәғәне',
@@ -911,24 +909,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 +991,7 @@ $messages = array(
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Һовужи',
 'exif-imagelength' => 'Былынди',
 'exif-source' => 'Сәвон',
@@ -1007,7 +1005,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 +1028,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..a34e438 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',
@@ -245,7 +243,6 @@ $messages = array(
 'disclaimers' => 'Ol toksave bilong lo',
 'disclaimerpage' => 'Project:Ol tok warn long lo',
 'edithelp' => 'Halivim mi long pasin bilong wokim senis',
-'edithelppage' => 'Help:Senisim',
 'mainpage' => 'Fran Pes',
 'mainpage-description' => 'Fran Pes',
 'portal' => 'Bung ples',
@@ -397,9 +394,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 +608,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 +637,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 +799,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 +852,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..600b051 100644 (file)
  * @author Bilalokms
  * @author Bombola
  * @author Cekli829
+ * @author Coolland
  * @author Dbl2010
  * @author Don Alessandro
  * @author Emperyan
  * @author Erdemaslancan
  * @author Erkan Yilmaz
  * @author Fryed-peach
+ * @author Geitost
  * @author Goktr001
+ * @author Gorizon
  * @author Hanberke
  * @author Hcagri
  * @author Hedda Gabler
@@ -38,6 +41,7 @@
  * @author Mskyrider
  * @author Myildirim2007
  * @author Nazif İLBEK
+ * @author Nemo bis
  * @author Reedy
  * @author Runningfridgesrule
  * @author Sadrettin
@@ -377,8 +381,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 +395,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',
@@ -456,6 +459,18 @@ $messages = array(
 'oct' => 'Eki',
 'nov' => 'Kas',
 'dec' => 'Ara',
+'january-date' => '$1 Ocak',
+'february-date' => '$1 Şubat',
+'march-date' => '$1 Mart',
+'april-date' => '$1 Nisan',
+'may-date' => '$1 Mayıs',
+'june-date' => '$1 Haziran',
+'july-date' => '$1 Temmuz',
+'august-date' => '$1 Ağustos',
+'september-date' => '$1 Eylül',
+'october-date' => '$1 Ekim',
+'november-date' => '$1 Kasım',
+'december-date' => '$1 Aralık',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategori|Kategoriler}}',
@@ -589,7 +604,6 @@ $1',
 'disclaimers' => 'Sorumluluk reddi',
 'disclaimerpage' => 'Project:Genel sorumluluk reddi',
 'edithelp' => 'Nasıl değiştirilir?',
-'edithelppage' => 'Help:Sayfa nasıl değiştirilir',
 'helppage' => 'Help:İçindekiler',
 'mainpage' => 'Ana Sayfa',
 'mainpage-description' => 'Ana sayfa',
@@ -612,8 +626,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.",
@@ -755,9 +769,18 @@ Tarayıcınızın önbelleğini temizleyene kadar bazı sayfalar sanki hâlâ ot
 'welcomecreation-msg' => 'Hesabınız açıldı.
 [[Special:Preferences|{{SITENAME}} tercihlerinizi]] değiştirmeyi unutmayın.',
 'yourname' => 'Kullanıcı adı:',
+'userlogin-yourname' => 'Kullanıcı adı',
+'userlogin-yourname-ph' => 'Kullanıcı adı girin',
 'yourpassword' => 'Parola:',
+'userlogin-yourpassword' => 'Parola',
+'userlogin-yourpassword-ph' => 'Parolanızı girin',
+'createacct-yourpassword-ph' => 'Bir parola girin',
 'yourpasswordagain' => 'Parolayı yeniden girin:',
+'createacct-yourpasswordagain' => 'Parolayı onayla',
+'createacct-yourpasswordagain-ph' => 'Parolayı yeniden girin',
 'remembermypassword' => 'Girişimi bu tarayıcıda hatırla (en fazla $1 {{PLURAL:$1|gün|gün}} için)',
+'userlogin-remembermypassword' => 'Oturumumu sürekli açık tut',
+'userlogin-signwithsecure' => 'Güvenli bağlantı kullanın',
 'securelogin-stick-https' => "Giriş yaptıktan sonra HTTPS'e bağlı kal",
 'yourdomainname' => 'Alan adınız:',
 'password-change-forbidden' => 'Bu vikide parolanızı değiştiremezsiniz.',
@@ -770,18 +793,38 @@ Tarayıcınızın önbelleğini temizleyene kadar bazı sayfalar sanki hâlâ ot
 'logout' => 'Oturumu kapat',
 'userlogout' => 'Oturumu kapat',
 'notloggedin' => 'Oturum açık değil',
+'userlogin-noaccount' => 'Bir hesabınız yok mu?',
+'userlogin-joinproject' => '{{SITENAME}} sitesine katılın',
 'nologin' => 'Bir hesabınız yok mu? $1.',
 'nologinlink' => 'Hesap oluşturun',
 'createaccount' => 'Hesap oluştur',
 'gotaccount' => 'Zaten bir hesabınız var mı? $1.',
 'gotaccountlink' => 'Oturum açın',
 'userlogin-resetlink' => 'Giriş bilgilerinizi mi unuttunuz?',
+'userlogin-resetpassword-link' => 'Parolanızı sıfırlayın',
+'helplogin-url' => 'Help:Oturum açma',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Oturum açma konusunda yardım alın]]',
+'createacct-join' => 'Aşağıya bilgilerinizi girin.',
+'createacct-emailrequired' => 'E-posta adresi',
+'createacct-emailoptional' => 'E-posta adresi (isteğe bağlı)',
+'createacct-email-ph' => 'E-posta adresinizi girin',
 'createaccountmail' => 'Geçici bir rastgele şifre kullan ve şifreyi aşağıda belirtilen e-posta adresine gönder',
+'createacct-realname' => 'Gerçek adı (isteğe bağlı)',
 'createaccountreason' => 'Sebep:',
+'createacct-reason' => 'Gerekçe',
+'createacct-reason-ph' => 'Neden başka bir hesap oluşturuyorsunuz',
+'createacct-captcha' => 'Güvenlik kontrolü',
+'createacct-imgcaptcha-ph' => 'Yukarıda gördüğünüz metni girin',
+'createacct-submit' => 'Hesabınızı oluşturun',
+'createacct-benefit-heading' => '{{SITENAME}} sizin gibi insanlar tarafından oluşturulur.',
+'createacct-benefit-body1' => '{{PLURAL:$1|düzenleme|düzenleme}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|sayfa|sayfa}}',
+'createacct-benefit-body3' => 'en son {{PLURAL:$1|katkıda bulunan|katkıda bulunan}}',
 'badretype' => 'Girdiğiniz şifreler birbirleriyle uyuşmuyor.',
 'userexists' => 'Girdiğiniz kullanıcı adı zaten kullanımda.
 Lütfen farklı bir kullanıcı adı seçiniz.',
 'loginerror' => 'Oturum açma hatası.',
+'createacct-error' => 'Hesap oluşturma hatası',
 'createaccounterror' => 'Hesap oluşturulamıyor: $1',
 'nocookiesnew' => 'Kullanıcı hesabı oluşturuldu ama oturum açamadınız.
 Oturum açmak için {{SITENAME}} çerezleri kullanır.
@@ -815,8 +858,7 @@ Parola değişimini siz istemediyseniz veya parolanızı hatırladıysanız ve a
 'blocked-mailpassword' => 'Siteye erişiminiz engellenmiş olduğundan, yeni şifre gönderilme işlemi yapılamamaktadır.',
 'eauthentsent' => 'Kaydedilen adrese onay kodu içeren bir e-posta gönderildi.
 E-postadaki yönerge uygulanıp adresin size ait olduğu onaylanmadıkça başka e-posta gönderilmeyecek.',
-'throttled-mailpassword' => 'Parola hatırlatıcı son {{PLURAL:$1|bir saat|$1 saat}} içinde zaten gönderildi.
-Hizmeti kötüye kullanmayı önlemek için, her {{PLURAL:$1|bir saatte|$1 saatte}} sadece bir parola hatırlatıcısı gönderilecektir.',
+'throttled-mailpassword' => 'Bir parola sıfırlama e-postası son {{PLURAL:$1|bir saat|$1 saat}} içinde zaten gönderildi. Hizmeti kötüye kullanmayı önlemek için, her {{PLURAL:$1|bir saatte|$1 saatte}} sadece bir parola sıfırlama e-postası gönderilecektir.',
 'mailerror' => 'E-posta gönderim hatası: $1',
 'acct_creation_throttle_hit' => 'Sizin IP adresinizi kullanarak bu vikiyi ziyaret edenler son günde {{PLURAL:$1|1 hesap|$1 hesap}} oluşturdu, bu sayı bu zaman aralığında izin verilen azami sayıdır.
 Sonuç olarak, bu IP adresini kullanan ziyaretçiler şu anda daha fazla hesap açamazlar.',
@@ -870,10 +912,9 @@ 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-text-one' => 'Parolanızı sıfırlamak için bu formu doldurun.',
 '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?',
@@ -895,9 +936,9 @@ $2
 Bu geçici parola ile giriş yapın ve yeni bir şifre seçin. Bu talep bir başkasına aitse veya şifrenizi hatırladıysanız ve artık şifrenizi değiştirmek istemiyorsanız; bu iletiyi önemsemeyerek eski şifrenizi kullanmaya devam edebilirsiniz.',
 'passwordreset-emailelement' => 'Kullanıcı adı: $1
 Geçici şifre: $2',
-'passwordreset-emailsent' => 'Hatırlatma e-postası gönderildi.',
-'passwordreset-emailsent-capture' => 'Aşağıda gözüktüğü gibi bir hatırlatma e-postası gönderilmiştir.',
-'passwordreset-emailerror-capture' => 'Aşağıda gözüktüğü gibi bir hatırlatma e-postası oluşturulmuştur ancak $1 adlı kullanıcıya gönderilememiştir.',
+'passwordreset-emailsent' => 'Parola sıfırlama e-postası gönderildi.',
+'passwordreset-emailsent-capture' => 'Aşağıda gözüktüğü gibi bir parola sıfırlama e-postası gönderildi.',
+'passwordreset-emailerror-capture' => 'Aşağıda gözüktüğü gibi bir parola sıfırlama e-postası oluşturuldu ancak {{GENDER:$2|kullanıcıya}} gönderme işlemi başarısız oldu: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'E-posta adresini değiştir',
@@ -1019,7 +1060,7 @@ Son engelleme günlüğü girdisi referans için aşağıda sağlanmıştır:',
 '''Henüz kaydedilmedi!'''",
 'sitejspreview' => "'''Sadece kullanıcı JavaScript kod dosyanızın önizlemesini görüyorsunuz.''' 
 '''Henüz kaydedilmedi!'''",
-'userinvalidcssjstitle' => "''Uyarı:''' \"\$1\" adıyla bir tema yoktur. tema-adı.css ve .js dosyalarının adları küçük harf ile yazması gerek, yani {{ns:user}}:Temel/'''V'''ector.css değil, {{ns:user}}:Temel/'''v'''ector.css.",
+'userinvalidcssjstitle' => '\'\'\'Uyarı:\'\'\' "$1" adında bir tema yoktur. Özel .css ve .js sayfalarının adlarını küçük harf ile yazın, örneğin;  "{{ns:user}}:Örnek/Vector.css" yerine "{{ns:user}}:Örnek/vector.css" yazın.',
 'updated' => '(Güncellendi)',
 'note' => "'''Not: '''",
 'previewnote' => "'''Bunun yalnızca bir ön izleme olduğunu unutmayın.'''
@@ -1049,8 +1090,8 @@ Sizin değişiklikleriniz alta gösterilmiştir. Son değişiklerinizi yazının
 'storedversion' => 'Kaydedilmiş metin',
 'nonunicodebrowser' => "'''UYARI: Tarayıcınız unicode uyumlu değil.
 Sayfaları güvenle değiştirmenize izin vermek için: ASCII olmayan karakterler değiştirme kutusunda onaltılık kodlar olarak görünecektir.'''",
-'editingold' => "'''DİKKAT: Sayfanın eski bir sürümünde değişiklik yapmaktasınız.
-Kaydettiğinizde bu tarihli sürümden günümüze kadar olan değişiklikler yok olacaktır.'''",
+'editingold' => "'''Uyarı: Sayfanın eski bir sürümünde değişiklik yapmaktasınız.'''
+Kaydettiğinizde bu tarihli sürümden günümüze kadar olan değişiklikler yok olacaktır.",
 'yourdiff' => 'Karşılaştırma',
 'copyrightwarning' => "'''Lütfen dikkat:''' {{SITENAME}} sitesine yapılan bütün katkılar $2 sözleşmesi kapsamındadır (ayrıntılar için $1'a bakınız).
 Yaptığınız katkının başka katılımcılar tarafından acımasızca değiştirilmesini ve sınırsızca başka yerlere dağıtılmasını istemiyorsanız, katkıda bulunmayınız.<br />
@@ -1098,11 +1139,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',
@@ -1338,7 +1382,6 @@ Gezinti bağlantılarının bu sütunu sıfırlayacağını unutmayın.',
 'searchmenu-legend' => 'Arama seçenekleri',
 'searchmenu-exists' => "'''Bu vikide \"[[:\$1]]\" adında bir sayfa mevcut'''",
 'searchmenu-new' => "'''Bu vikide \"[[:\$1]]\" sayfasını oluştur!'''",
-'searchhelp-url' => 'Help:İçindekiler',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Bu ön ekle sayfalara göz at]]',
 'searchprofile-articles' => 'İçerik sayfaları',
 'searchprofile-project' => 'Yardım ve proje sayfaları',
@@ -1381,15 +1424,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',
@@ -1845,7 +1879,7 @@ $1',
 'upload-proto-error-text' => "Uzaktan yükleme, <code>http://</code> veya <code>ftp://</code> ile başlayan URL'ler gerektirmektedir.",
 'upload-file-error' => 'Dahili hata',
 'upload-file-error-text' => 'Sunucuda geçici dosya oluşturma girişimi sırasında bir iç hata meydana geldi.
-Lütfen bir [[Special:ListUsers/sysop|yonetici]]yle iletişime geçin.',
+Lütfen bir [[Special:ListUsers/sysop|hizmetli]]ler iletişime geçin.',
 'upload-misc-error' => 'Bilinmeyen yükleme hatası',
 'upload-misc-error-text' => 'Yükleme sırasında bilinmeyen bir hata meydana geldi.
 Lütfen bağlantının geçerli ve ulaşılabilir olduğunu doğrulayın ve yeniden deneyin.
@@ -1912,7 +1946,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 +2340,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 bildirimi etkin.',
+'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 +3111,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
@@ -3159,11 +3188,25 @@ Bunu çalıştırmak, sisteminizi tehlikeye atabilir.",
 'minutes' => '{{PLURAL:$1|$1 dakika|$1 dakika}}',
 'hours' => '{{PLURAL:$1|$1 saat|$1 saat}}',
 'days' => '{{PLURAL:$1|$1 gün|$1 gün}}',
+'weeks' => '{{PLURAL: $1|$1 hafta|$1 hafta}}',
 'months' => '{{PLURAL:$1|$1 ay|$1 ay}}',
 'years' => '{{PLURAL:$1|$1 yıl|$1 yıl}}',
 '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 +3238,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 +3403,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,12 +3837,11 @@ 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:Redirect
+'redirect-submit' => 'Git',
+'redirect-value' => 'Değer:',
+'redirect-user' => 'Kullanıcı kimliği',
+'redirect-file' => 'Dosya adı',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Benzer dosyaları ara',
@@ -3890,6 +3932,8 @@ Resimler tam çözünürlükte görüntülenir, diğer dosya tipleri ilgili prog
 'htmlform-submit' => 'Gönder',
 'htmlform-reset' => 'Değişiklikleri geri al',
 'htmlform-selectorother-other' => 'Diğer',
+'htmlform-no' => 'Hayır',
+'htmlform-yes' => 'Evet',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 tam-metin arama desteği ile',
@@ -3914,10 +3958,10 @@ Resimler tam çözünürlükte görüntülenir, diğer dosya tipleri ilgili prog
 'logentry-move-move-noredirect' => '$1 $3 sayfasını $4 sayfasına yönlendirme olmaksızın taşıdı',
 'logentry-move-move_redir' => '$1 $3 sayfasını $4 sayfasına yönlendirme üzerinden taşıdı',
 'logentry-patrol-patrol-auto' => '$1 $3 sayfasını $4 sürümü ile kontrol etti',
-'logentry-newusers-newusers' => 'Kullanıcı hesabı $1 oluşturdu',
-'logentry-newusers-create' => 'Kullanıcı hesabı $1 oluşturdu',
-'logentry-newusers-create2' => '$1 kullanıcı hesabı oluşturdu $3',
-'logentry-newusers-autocreate' => '$1 hesabı otomatik olarak oluşturuldu',
+'logentry-newusers-newusers' => 'Kullanıcı hesabı $1 {{GENDER:$2|oluşturuldu}}',
+'logentry-newusers-create' => 'Kullanıcı hesabı $1 {{GENDER:$2|oluşturuldu}}',
+'logentry-newusers-create2' => '$3 kullanıcı hesabı $1 tarafından {{GENDER:$2|oluşturuldu}}',
+'logentry-newusers-autocreate' => '$1 kullanıcı hesabı otomatik olarak {{GENDER:$2|oluşturuldu}}',
 'rightsnone' => '(hiçbiri)',
 
 # Feedback
index 6208505..6e6ce4e 100644 (file)
@@ -167,7 +167,6 @@ $messages = array(
 'disclaimers' => 'Disclaimers',
 'disclaimerpage' => 'Project: Disclaimer gawonoyo',
 'edithelp' => 'Editing help',
-'edithelppage' => 'Help:Mşaḥlaf',
 'helppage' => 'Help: Ḥbişoṭo',
 'mainpage' => 'Faṭo rişoyto',
 'mainpage-description' => 'Faṭo rişoyto',
@@ -400,7 +399,6 @@ Legend: '''({{int:cur}})''' = difference with latest revision, '''({{int:last}})
 'searchmenu-legend' => '3ayar duKruxyo',
 'searchmenu-exists' => "'''Kito Faṭo herke Işma \"[[:\$1]]\"yo'''",
 'searchmenu-new' => 'Kṭaw iFaṭaṭe "[[:$1]]" buWiki.',
-'searchhelp-url' => 'Help: Ḥbişoṭo',
 'searchprofile-articles' => 'Faṭoṭe daḤbişoṭo',
 'searchprofile-project' => 'Faṭoṭe du3udrono u daProjat',
 'searchprofile-images' => 'Multimediya',
@@ -457,7 +455,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 +592,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 +800,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 +822,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..dae353e 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',
@@ -226,7 +224,6 @@ $messages = array(
 'disclaimers' => 'Swi alanandzu',
 'disclaimerpage' => 'Project:Swithsuxa nadzu hikuangara',
 'edithelp' => 'Mpfuno hi ta mindzulamiso',
-'edithelppage' => 'Help:Mindzulamiso',
 'helppage' => 'Help:Leswinga ndzeni',
 'mainpage' => 'Tlukankulu',
 'mainpage-description' => 'Tluka-Nkulu',
@@ -514,7 +511,6 @@ Swihlamuseri: '''({{int:sweswi}})''' = kuhambana na ndzulamiso wa sweswinyana, '
 'viewprevnext' => 'Vona ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''Tluka leri vuriwaka \"[[:\$1]]\" ikhale ririkona eka wiki leyi.'''",
 'searchmenu-new' => "'''Tumbuluxa tluka ra \"[[:\$1]]\" eka wiki leyi!'''",
-'searchhelp-url' => 'Help:Leswinga ndzeni',
 'searchprofile-articles' => 'Matluka lama tsariweke',
 'searchprofile-project' => 'Mpfuno na matluka ya phurojeki',
 'searchprofile-images' => 'Tifayili ta mfpumawulo na swifaniso',
@@ -696,7 +692,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..1a4b04b 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' => 'Бервакытта да',
@@ -451,7 +451,6 @@ $1',
 'disclaimers' => 'Җаваплылыктан баш тарту',
 'disclaimerpage' => 'Project:Җаваплылыктан баш тарту',
 'edithelp' => 'Үзгәртү буенча ярдәм',
-'edithelppage' => 'Help:Үзгәртү',
 'helppage' => 'Help:Эчтәлек',
 'mainpage' => 'Баш бит',
 'mainpage-description' => 'Баш бит',
@@ -711,10 +710,8 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Серсүзне бетерү',
-'passwordreset-text' => 'Сезнең хисап язмасының параметрлары турында хат алыр өчен, түбәндәгеләрне тутырыгыз',
 'passwordreset-legend' => 'Серсүзне яңадан кую',
 'passwordreset-disabled' => 'Бу викида серсүз бетереп булмый',
-'passwordreset-pretext' => '{{PLURAL:$1||Түбәндә күрсәтелгән мәгълүматларның бер өлешен языгыз}}',
 'passwordreset-username' => 'Кулланучы исеме:',
 'passwordreset-domain' => 'Домен:',
 'passwordreset-capture' => 'Килеп чыккан хатны күрсәтелсенме?',
@@ -952,6 +949,8 @@ $2
 'edit-no-change' => 'Текстта үзгәешләр ясалмау сәбәпле, сезнең үзгәртү кире кагыла.',
 'edit-already-exists' => 'Яңа бит төзеп булмый.
 Ул инде бар.',
+'editwarning-warning' => 'Башка биткә күчү вакытында бу мәкаләгә керткән үзгәрешләр югалырга мөмкин.
+Әгәрдә сез теркәлгән булсагыз, бу искәрмәне сез «Көйләнмәләрем» өлешендә үзгәртә аласыз.',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Игътибар:''' бу биттә хәтерне еш кулланучы функцияләр артык күп.
@@ -1127,7 +1126,6 @@ $1",
 'searchmenu-legend' => 'Эзләү көйләнмәләре',
 'searchmenu-exists' => "'''Бу вики-проекта «[[:$1]]» исемле бит бар инде'''",
 'searchmenu-new' => "'''«[[:$1]]»  исемле яңа бит ясау'''",
-'searchhelp-url' => 'Help:Эчтәлек',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Бу префикслы битләрне күрсәтү]]',
 'searchprofile-articles' => 'Төп битләр',
 'searchprofile-project' => 'Ярдәм һәм проектлар бите',
@@ -1169,14 +1167,6 @@ $1",
 'powersearch-togglenone' => 'Бирни дә юк',
 'search-external' => 'Тышкы эзләү',
 
-# Quickbar
-'qbsettings' => 'Күчешләр аслыгы',
-'qbsettings-none' => 'Күрсәтмәү',
-'qbsettings-fixedleft' => 'Сулда күчерелмәс',
-'qbsettings-fixedright' => 'Уңда күчерелмәс',
-'qbsettings-floatingleft' => 'Сулда йөзмә',
-'qbsettings-floatingright' => 'Уңда йөзмә',
-
 # Preferences page
 'preferences' => 'Көйләнмәләр',
 'mypreferences' => 'Көйләнмәләр',
@@ -1911,7 +1901,7 @@ $1',
 'blanknamespace' => '(Төп)',
 
 # Contributions
-'contributions' => '{{GENDER:$1|Кулланучының} кертеме',
+'contributions' => '{{GENDER:$1|Кулланучының}} кертеме',
 'contributions-title' => '$1 исемле кулланучының кертеме',
 'mycontris' => 'Кертем',
 'contribsub2' => '$1 ($2) өчен',
@@ -2161,14 +2151,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 +2226,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Киңлек',
 'exif-imagelength' => 'Биеклек',
 'exif-imagedescription' => 'Рәсемнең исеме',
@@ -2448,11 +2436,6 @@ $1',
 'version-software-product' => 'Продукт',
 'version-software-version' => 'Версия',
 
-# Special:FilePath
-'filepath' => 'Файлга юл',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Күчү',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Бер үк файлларны эзләү',
 'fileduplicatesearch-submit' => 'Эзләү',
index 826d833..63642e4 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ü',
@@ -331,7 +329,6 @@ $1',
 'disclaimers' => 'Cawaplılıqtan baş tartu',
 'disclaimerpage' => 'Project:Cawaplılıqtan baş tartu',
 'edithelp' => 'Üzgärtü buyınça yärdäm',
-'edithelppage' => 'Help:Üzgärtü',
 'helppage' => 'Help:Eçtälek',
 'mainpage' => 'Baş bit',
 'mainpage-description' => 'Baş bit',
@@ -899,7 +896,6 @@ Sez idaräçe bulu säbäple, [$1 yäşerelgän yuramanı qarıy alasız]",
 'viewprevnext' => 'Kürsätelüe: ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-legend' => 'Ezläw köylänmäläre',
 'searchmenu-new' => "'''«[[:$1]]»  isemle yaña bit yasaw'''",
-'searchhelp-url' => 'Help:Eçtälek',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Bu prefikslı bitlärne kürsätü]]',
 'searchprofile-articles' => 'Töp bitlär',
 'searchprofile-project' => 'Yärdäm häm proyektlar bite',
@@ -940,14 +936,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 +1881,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 +1953,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 +2121,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..9383dc2 100644 (file)
@@ -23,57 +23,72 @@ $namespaceNames = array(
        NS_SPECIAL          => 'Тускай',
        NS_TALK             => 'Чугаа',
        NS_USER             => 'Aжыглакчы',
-       NS_USER_TALK        => 'Aжыглакчы_чугаазы',
-       NS_PROJECT_TALK     => '$1_чугаазы',
+       NS_USER_TALK        => 'Aжыглакчы_чугаа',
+       NS_PROJECT_TALK     => '$1_чугаа',
        NS_FILE             => 'Файл',
-       NS_FILE_TALK        => 'Файл_чугаазы',
+       NS_FILE_TALK        => 'Файл_чугаа',
        NS_MEDIAWIKI        => 'МедиаВики',
-       NS_MEDIAWIKI_TALK   => 'МедиаВики_чугаазы',
+       NS_MEDIAWIKI_TALK   => 'МедиаВики_чугаа',
        NS_TEMPLATE         => 'Майык',
-       NS_TEMPLATE_TALK    => 'Майык_чугаазы',
+       NS_TEMPLATE_TALK    => 'Майык_чугаа',
        NS_HELP             => 'Дуза',
-       NS_HELP_TALK        => 'Дуза_чугаазы',
-       NS_CATEGORY         => 'Ð\9aаÑ\82егоÑ\80иÑ\8f',
-       NS_CATEGORY_TALK    => 'Ð\9aаÑ\82егоÑ\80иÑ\8f\87Ñ\83гаазÑ\8b',
+       NS_HELP_TALK        => 'Дуза_чугаа',
+       NS_CATEGORY         => 'Ð\90ңгÑ\8bлал',
+       NS_CATEGORY_TALK    => 'Ð\90ңгÑ\8bлал_Ñ\87Ñ\83гаа',
 );
 
+$namespaceAliases = array(
+       'Aжыглакчы_чугаазы'  => NS_USER_TALK,
+       '$1_чугаазы'         => NS_PROJECT_TALK,
+       'Файл_чугаазы'       => NS_FILE_TALK,
+       'МедиаВики_чугаазы'  => NS_MEDIAWIKI_TALK,
+       'Майык_чугаазы'      => NS_TEMPLATE_TALK,
+       'Дуза_чугаазы'       => NS_HELP_TALK,
+       'Категория'          => NS_CATEGORY,
+       'Категория_чугаазы'  => NS_CATEGORY_TALK,
+);
 
 $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' ),
@@ -289,7 +304,6 @@ $messages = array(
 'disclaimers' => 'Ажыглаар харысаалгазын чөрчүүрү (ойталаары)',
 'disclaimerpage' => 'Project:Ажыглаар харысаалгазын ойталаары',
 'edithelp' => 'Эдеринге дуза',
-'edithelppage' => 'Help:Эдери',
 'helppage' => 'Help:Допчузу',
 'mainpage' => 'Кол Арын',
 'mainpage-description' => 'Кол Арын',
@@ -404,7 +418,7 @@ $messages = array(
 'login-abort-generic' => 'Системаже таптыг эвес кирип тур силер',
 'loginlanguagelabel' => 'Дыл: $1',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'PHP-ниң mail() ажыл-чорудулгазында билбес алдаг бар.',
 
 # Change password dialog
@@ -592,7 +606,6 @@ Please check if you want to create/edit this page.',
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) көөрү',
 'searchmenu-exists' => "'''Бо викиде \"[[:\$1]]\" деп арын бар.'''",
 'searchmenu-new' => "'''Бо викиде «[[:$1]]» арынны чогаадыры'''",
-'searchhelp-url' => 'Help:Допчузу',
 'searchprofile-articles' => 'үндезин арыннар',
 'searchprofile-project' => 'Төлевилел биле дуза арыннары',
 'searchprofile-images' => 'Мультимедиа',
@@ -950,7 +963,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 +1207,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 +1269,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 +1347,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 74e0783..7c16f4a 100644 (file)
@@ -23,8 +23,8 @@ $namespaceNames = array(
        NS_USER             => 'Викиавтор',
        NS_USER_TALK        => 'Викиавтор_сярысь_вераськон',
        NS_PROJECT_TALK     => '$1_сярысь_вераськон',
-       NS_FILE             => 'СÑ\83Ñ\80ед',
-       NS_FILE_TALK        => 'СÑ\83Ñ\80ед_сярысь_вераськон',
+       NS_FILE             => 'Файл',
+       NS_FILE_TALK        => 'Файл_сярысь_вераськон',
        NS_MEDIAWIKI        => 'MediaWiki',
        NS_MEDIAWIKI_TALK   => 'MediaWiki_сярысь_вераськон',
        NS_TEMPLATE         => 'Шаблон',
@@ -35,6 +35,11 @@ $namespaceNames = array(
        NS_CATEGORY_TALK    => 'Категория_сярысь_вераськон',
 );
 
+$namespaceAliases = array(
+       'Суред'                  => NS_FILE,
+       'Суред_сярысь_вераськон' => NS_FILE_TALK,
+);
+
 // Remove Russian aliases
 $namespaceGenderAliases = array();
 
index ec55bcb..fc92446 100644 (file)
@@ -22,17 +22,27 @@ $namespaceNames = array(
        NS_SPECIAL          => 'ئالاھىدە',
        NS_TALK             => 'مۇنازىرە',
        NS_USER             => 'ئىشلەتكۈچى',
-       NS_USER_TALK        => 'ئىشلەتكۈچى مۇنازىرىسى',
-       NS_PROJECT_TALK     => 'مۇنازىرىسى$1',
+       NS_USER_TALK        => 'ئىشلەتكۈچى_مۇنازىرىسى',
+       NS_PROJECT_TALK     => '$1مۇنازىرىسى',
        NS_FILE             => 'ھۆججەت',
-       NS_FILE_TALK        => 'ھۆججەت مۇنازىرىسى',
-       NS_MEDIAWIKI_TALK   => 'MediaWiki مۇنازىرىسى',
+       NS_FILE_TALK        => 'ھۆججەت_مۇنازىرىسى',
+       NS_MEDIAWIKI_TALK   => 'MediaWiki_مۇنازىرىسى',
        NS_TEMPLATE         => 'قېلىپ',
-       NS_TEMPLATE_TALK    => 'قېلىپ مۇنازىرىسى',
+       NS_TEMPLATE_TALK    => 'قېلىپ_مۇنازىرىسى',
        NS_HELP             => 'ياردەم',
-       NS_HELP_TALK        => 'ياردەم مۇنازىرىسى',
+       NS_HELP_TALK        => 'ياردەم_مۇنازىرىسى',
        NS_CATEGORY         => 'تۈر',
-       NS_CATEGORY_TALK    => 'تۈر مۇنازىرىسى',
+       NS_CATEGORY_TALK    => 'تۈر_مۇنازىرىسى',
+);
+
+$namespaceAliases = array(
+       'مۇنازىرىسى$1' => NS_PROJECT_TALK,
+);
+
+$specialPageAliases = array(
+       'Allmessages'               => array( 'بارلىق_خەۋەرلەر' ),
+       'Allpages'                  => array( 'بارلىق_بەتلەر' ),
+       'Ancientpages'              => array( 'كونا_بەتلەر' ),
 );
 
 $messages = array(
@@ -66,9 +76,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' => 'ئۈزۈندە كىرگۈزمىگەندە مېنى ئەسكەرت',
@@ -283,7 +290,6 @@ $1',
 'disclaimers' => 'جاۋابكارلىقنى كەچۈرۈم قىلىش باياناتى',
 'disclaimerpage' => 'Project:ئادەتتىكى جاۋابكارلىقنى كەچۈرۈم قىلىش باياناتى',
 'edithelp' => 'تەھرىرلەش ياردىمى',
-'edithelppage' => 'Help:تەھرىرلەۋاتىدۇ',
 'helppage' => 'Help:مەزمۇنلار',
 'mainpage' => 'باش بەت',
 'mainpage-description' => 'باش بەت',
@@ -614,10 +620,8 @@ cookies نى قوزغاتقانلىقىڭىزنى جەزملەڭ، بۇ بەتن
 
 # Special:PasswordReset
 'passwordreset' => 'ئىمنى ئەسلىگە قايتۇرماق',
-'passwordreset-text' => 'بۇ جەدۋەل تاماملانسا ھېسابات تەپسىلاتىڭىزنى ئېلخەتىڭىزدە تاپشۇرۇۋالىسىز.',
 'passwordreset-legend' => 'ئىمنى ئەسلىگە قايتۇرماق',
 'passwordreset-disabled' => 'بۇ ۋىكىدا ئىمنى ئەسلىگە قايتۇرۇش چەكلەنگەن.',
-'passwordreset-pretext' => '{{PLURAL:$1||تۆۋەندىكى سانلىق مەلۇماتتىن بىرنى كىرگۈزۈڭ}}',
 'passwordreset-username' => 'ئىشلەتكۈچى ئاتى:',
 'passwordreset-domain' => 'دائىرە:',
 'passwordreset-capture' => 'ھاسىل قىلىنغان ئېلخەتنى كۆرسىتەمدۇ؟',
@@ -1112,7 +1116,6 @@ $1",
 'searchmenu-legend' => 'ئىزدەش تاللانما',
 'searchmenu-exists' => "'''بۇ wiki دا  \"[[:\$1]]\" ئاتلىق بەت بار '''",
 'searchmenu-new' => "'''بۇ wiki دا  \"[[:\$1]]\" ئاتلىق بەت قۇر!'''",
-'searchhelp-url' => 'Help:مەزمۇنلار',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1| بۇنى ئالدى قوشۇلغۇچى قىلغان بەتكە كۆز يۈگۈرت ]]',
 'searchprofile-articles' => 'مەزمۇن بېتى',
 'searchprofile-project' => 'ياردەم ۋە قۇرۇلۇش بەتلەر',
@@ -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 905fffb..b8c712a 100644 (file)
@@ -22,6 +22,7 @@
  * @author DixonD
  * @author Dubyk
  * @author EugeneZelenko
+ * @author Geitost
  * @author Gucci Mane Burrr
  * @author Gutsul (Gutsul.ua at Google Mail)
  * @author Ickis
  * @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 +311,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:' ),
@@ -463,6 +466,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|Категорія|Категорії}}',
@@ -547,6 +562,7 @@ $messages = array(
 'create-this-page' => 'Створити цю сторінку',
 'delete' => 'Вилучити',
 'deletethispage' => 'Вилучити цю сторінку',
+'undeletethispage' => 'Відновити цю сторінку',
 'undelete_short' => 'Відновити $1 {{PLURAL:$1|редагування|редагування|редагувань}}',
 'viewdeleted_short' => 'Переглянути {{PLURAL:$1|одне вилучене редагування|$1 вилучених редагування|$1 вилучених редагувань}}',
 'protect' => 'Захистити',
@@ -556,7 +572,7 @@ $messages = array(
 'unprotectthispage' => 'Зміна захисту цієї сторінки',
 'newpage' => 'Нова сторінка',
 'talkpage' => 'Обговорити цю сторінку',
-'talkpagelinktext' => 'Ð\9eбговорення',
+'talkpagelinktext' => 'обговорення',
 'specialpage' => 'Спеціальна сторінка',
 'personaltools' => 'Особисті інструменти',
 'postcomment' => 'Новий розділ',
@@ -600,7 +616,6 @@ $1',
 'disclaimers' => 'Відмова від відповідальності',
 'disclaimerpage' => 'Project:Відмова від відповідальності',
 'edithelp' => 'Довідка про редагування',
-'edithelppage' => 'Help:Редагування',
 'helppage' => 'Help:Довідка',
 'mainpage' => 'Головна сторінка',
 'mainpage-description' => 'Головна сторінка',
@@ -749,6 +764,8 @@ $1',
 'namespaceprotected' => 'У вас нема дозволу редагувати сторінки в просторі назв «$1».',
 'customcssprotected' => 'У вас немає прав на редагування цієї CSS-сторінки, так як вона містить особисті налаштування іншого користувача.',
 'customjsprotected' => 'У вас немає дозволу на редагування цієї JavaScript-сторінки, так як вона містить особисті налаштування іншого користувача.',
+'mycustomcssprotected' => 'У вас немає прав для редагування цієї CSS сторінки.',
+'mycustomjsprotected' => 'Ви не маєте дозволу для редагування цієї сторінки JavaScript.',
 'ns-specialprotected' => 'Спеціальні сторінки не можна редагувати.',
 'titleprotected' => "Створення сторінки з такою назвою було заборонене користувачем [[User:$1|$1]].
 Зазначена наступна причина: ''$2''.",
@@ -772,9 +789,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' => 'Ви не можна змінити пароль на цій вікі.',
@@ -787,18 +813,38 @@ $1',
 'logout' => 'Вихід із системи',
 'userlogout' => 'Вихід із системи',
 'notloggedin' => 'Ви не ввійшли до системи',
-'nologin' => "Ви ще не зареєструвались? '''$1'''.",
+'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}} використовує куки для входу до системи.
@@ -843,8 +889,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-адреси не можуть на цей момент створювати нових облікових записів.',
@@ -857,7 +903,7 @@ $1',
 'cannotchangeemail' => 'У цій вікі не можна міняти свою адресу ел. пошти.',
 'emaildisabled' => 'Цей сайт не може надіслати електронні листи.',
 'accountcreated' => 'Обліковий запис створено.',
-'accountcreatedtext' => 'Ð\9eблÑ\96ковий Ð·Ð°Ð¿Ð¸Ñ\81 Ð´Ð»Ñ\8f $1 Ñ\81Ñ\82воÑ\80ено.',
+'accountcreatedtext' => 'Ð\9eблÑ\96ковий Ð·Ð°Ð¿Ð¸Ñ\81 ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87а Ð´Ð»Ñ\8f [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|обговоÑ\80еннÑ\8f]]) Ð±Ñ\83в Ñ\81Ñ\82воÑ\80ений.',
 'createaccount-title' => 'Створення облікового запису для {{SITENAME}}',
 'createaccount-text' => 'Хтось створив обліковий запис «$2» на сервері проекту {{SITENAME}} ($4) з паролем «$3», зазначивши вашу адресу електронної пошти. Вам слід зайти і змінити пароль.
 
@@ -870,7 +916,7 @@ $1',
 'suspicious-userlogout' => 'Ваш запит на завершення сеанса відхилений, оскільки він схожий на запит, відправлений зіпсованим веб-оглядачем або кешуючим проксі-сервером.',
 
 # Email sending
-'php-mail-error-unknown' => 'Невідома помилка в PHP-mail() функції',
+'php-mail-error-unknown' => 'Невідома помилка в PHP-функції mail()',
 'user-mail-no-addy' => 'Спроба надсилання електронної пошти без зазначеної адреси електронної пошти.',
 'user-mail-no-body' => 'Спроба надіслати електронного листа з порожнім або надто коротким вмістом.',
 
@@ -891,13 +937,15 @@ $1',
 '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' => 'Продивитись результуючий електронний лист?',
@@ -908,7 +956,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,7 +968,7 @@ $2
 Тимчасовий пароль: $2",
 'passwordreset-emailsent' => 'Електронний лист для відновлення пароля відправлений.',
 'passwordreset-emailsent-capture' => 'Електронний лист скидання паролю було надіслано, як показано нижче.',
-'passwordreset-emailerror-capture' => 'Електронний лист для відновлення пароля мав бути надісланий, як показано нижче, але його надсилання користувачеві $1 не вдалося.',
+'passwordreset-emailerror-capture' => 'Електронний лист для відновлення пароля мав бути надісланий, як показано нижче, але його надсилання {{GENDER:$2|користувачеві|користувачці}} $1 не вдалося.',
 
 # Special:ChangeEmail
 'changeemail' => 'Змінити адресу електронної пошти',
@@ -1139,6 +1187,7 @@ $2
 Імовірно, вона була вилучена.',
 'edit-conflict' => 'Конфлікт редагувань.',
 'edit-no-change' => 'Ваше редагування відхилене, оскільки в тексті не було зроблено змін.',
+'postedit-confirmation' => 'Ваше редагування збережено',
 'edit-already-exists' => 'Неможливо створити нову сторінку.
 Вона вже існує.',
 'defaultmessagetext' => 'Текст «за замовчування»',
@@ -1146,7 +1195,7 @@ $2
 'invalid-content-data' => 'Неприпустимі дані',
 'content-not-allowed-here' => 'Вміст «$1» недопустимий на сторінці [[$2]]',
 'editwarning-warning' => 'Перехід на іншу сторінку призведе до втрати ваших змін.
-Якщо ви ввійшли до системи, то ви можете відключити це попередження в розділі «{{int:prefs-editing}}» ваших налаштувань.',
+Якщо ви ввійшли до системи, то ви можете відключити це попередження в розділі «Редагування» ваших налаштувань.',
 
 # Content models
 'content-model-wikitext' => 'вікітекст',
@@ -1389,7 +1438,6 @@ $1",
 'searchmenu-legend' => 'Параметри пошуку',
 'searchmenu-exists' => "'''У цій вікі є сторінка з назвою «[[:$1]]»'''",
 'searchmenu-new' => "'''Створити сторінку «[[:$1]]» у цій вікі!'''",
-'searchhelp-url' => 'Help:Довідка',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Показати сторінки з цим префіксом]]',
 'searchprofile-articles' => 'Статті',
 'searchprofile-project' => 'Сторінки довідки і проекту',
@@ -1430,6 +1478,7 @@ $1",
 'powersearch-togglenone' => 'Жодний',
 'search-external' => 'Зовнішній пошук',
 'searchdisabled' => '<p>Вибачте, повнотекстовий пошук тимчасово недоступний через перевантаження сервера; передбачається, що ця функція буде знову включена після установки нового обладнання. Поки що ми пропонуємо вам скористатися Google чи Yahoo!:</p>',
+'search-error' => 'Сталася помилка під час пошуку:$1',
 
 # Preferences page
 'preferences' => 'Налаштування',
@@ -1578,6 +1627,8 @@ $1",
 'userrights-changeable-col' => 'Групи, які ви можете змінити',
 'userrights-unchangeable-col' => 'Групи, які ви не можете змінити',
 'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => 'Конфлікт прав користувача! Будь ласка, застосуйте зміни знову.',
+'userrights-removed-self' => 'Ви успішно позбавили себе власних прав. Через це Ви більше не маєте доступу до цієї сторінки.',
 
 # Groups
 'group' => 'Група:',
@@ -1648,6 +1699,10 @@ $1",
 'right-editusercssjs' => 'Редагування CSS- і JS-файлів інших користувачів',
 'right-editusercss' => 'Редагування CSS-файлів інших користувачів',
 'right-edituserjs' => 'Редагування JS-файлів інших користувачів',
+'right-editmyusercss' => 'Редагування власних CSS-файлів користувача',
+'right-editmyuserjs' => 'Редагування власних JavaScript-файлів користувача',
+'right-viewmywatchlist' => 'Переглядати власний список спостереження',
+'right-editmywatchlist' => 'Редагувати власний список спостереження. Зверніть увагу, що деякі дії будуть додавати сторінки навіть без такого права.',
 'right-rollback' => 'Швидкий відкіт редагувань останнього користувача, який редагував сторінку',
 'right-markbotedits' => 'Позначення відкинутих редагувань як редагування бота',
 'right-noratelimit' => 'Нема обмежень за швидкістю',
@@ -1709,6 +1764,8 @@ $1",
 'action-userrights-interwiki' => 'зміну прав користувачів у інших вікі',
 'action-siteadmin' => 'блокування і розблоковування баз даних',
 'action-sendemail' => 'відправка електронної пошти',
+'action-editmywatchlist' => 'редагування Вашого списку спостереження',
+'action-viewmywatchlist' => 'перегляд власного списку спостереження',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|зміна|зміни|змін}}',
@@ -1905,7 +1962,7 @@ $1',
 'upload-file-error' => 'Внутрішня помилка',
 'upload-file-error-text' => 'Сталася внутрішня помилка при спробі створити тимчасовий файл на сервері. Будь-ласка, зверніться до [[Special:ListUsers/sysop|адміністратора]].',
 'upload-misc-error' => 'Невідома помилка завантаження',
-'upload-misc-error-text' => 'Невідома помилка завантаження. Будь-ласка, перевірте, що вказана адреса вірна й спробуйте ще. Якщо проблема виникає знову, зверніться до системного адміністратора.',
+'upload-misc-error-text' => 'Невідома помилка завантаження. Будь-ласка, перевірте, що вказана адреса вірна й спробуйте ще. Якщо проблема виникає знову, зверніться до [[Special:ListUsers/sysop|адміністратора]].',
 'upload-too-many-redirects' => 'URL містить надто багато перенаправлень',
 'upload-unknown-size' => 'Невідомий розмір',
 'upload-http-error' => 'Відбулася помилка HTTP: $1',
@@ -2206,7 +2263,7 @@ $1',
 'wantedpages' => 'Необхідні статті',
 'wantedpages-badtitle' => 'Неправильний заголовок у результатах запиту: $1',
 'wantedfiles' => 'Необхідні файли',
-'wantedfiletext-cat' => 'Наступні файли використовують, але вони не існують. У цей список можуть помилково потрапити файли, що знаходяться на зовнішніх сховищах. Такі хибні моменти помічаються <del>перекреслюванням</del>. Крім того, сторінки, що використовують неіснуюч файли, перелічені в [[:$1]].',
+'wantedfiletext-cat' => 'Наступні файли використовують, але вони не існують. У цей список можуть помилково потрапити файли, що знаходяться на зовнішніх сховищах. Такі хибні моменти помічаються <del>перекреслюванням</del>. Крім того, сторінки, що використовують неіснуючі файли, перелічені в [[:$1]].',
 'wantedfiletext-nocat' => 'Наступні файли використовують, але вони не існують. У цей список можуть помилково потрапити файли, що знаходяться на зовнішніх сховищах. Такі хибні моменти помічаються <del>перекреслюванням</del>.',
 'wantedtemplates' => 'Необхідні шаблони',
 'mostlinked' => 'Сторінки, на які найбільше посилань',
@@ -2325,6 +2382,15 @@ $1',
 'listusers-noresult' => 'Не знайдено користувачів.',
 'listusers-blocked' => '({{GENDER:$1|заблокований|заблокована|заблокований}})',
 
+# Special:ActiveUsers
+'activeusers' => 'Список активних користувачів',
+'activeusers-intro' => 'Це список користувачів, які здійснювали які-небудь дії за {{PLURAL:$1|останній $1 день|останні $1 дні|останні $1 днів}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|дія|дії|дій}} за {{PLURAL:$3|останній $3 день|останні $3 дні|останні $3 днів}}',
+'activeusers-from' => 'Показувати користувачів, починаючи з:',
+'activeusers-hidebots' => 'Приховати ботів',
+'activeusers-hidesysops' => 'Приховати адміністраторів',
+'activeusers-noresult' => 'Не знайдено користувачів.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Права груп користувачів',
 'listgrouprights-summary' => 'Нижче наведений список груп користувачів у цій вікі і права для кожної групи.
@@ -2396,7 +2462,7 @@ $1',
 'addedwatchtext' => "Сторінку «[[:$1]]» додано до вашого [[Special:Watchlist|списку спостереження]].
 Подальші редагування цієї сторінки (та пов'язаної з нею сторінки обговорення) відображатимуться в цьому списку.",
 'removewatch' => 'Видалити зі списку спостереження',
-'removedwatchtext' => 'Сторінка «[[:$1]]» вилучена з вашого [[Special:Watchlist|списку спостереження]].',
+'removedwatchtext' => 'Сторінку «[[:$1]]» вилучено з вашого [[Special:Watchlist|списку спостереження]].',
 'watch' => 'Спостерігати',
 'watchthispage' => 'Спостерігати за цією сторінкою',
 'unwatch' => 'Скас. спостереження',
@@ -2405,8 +2471,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|сторінку|сторінки|сторінок}}.',
@@ -2652,7 +2718,7 @@ $1',
 'mycontris' => 'Внесок',
 'contribsub2' => 'Внесок $1 ($2)',
 'nocontribs' => 'Редагувань, що задовольняють заданим умовам не знайдено.',
-'uctop' => ' (остання)',
+'uctop' => '(поточна)',
 'month' => 'До місяця (включно):',
 'year' => 'До року (включно):',
 
@@ -2814,21 +2880,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' => 'Базу даних заблоковано',
@@ -2975,6 +3042,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' => 'Не вдалося створити тимчасовий файл мініатюри',
@@ -3139,7 +3208,6 @@ $1',
 '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-код буде використаний тільки для ботів */',
@@ -3315,11 +3383,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' => 'Формат має бути наступним:
 
@@ -3329,8 +3411,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',
@@ -3399,7 +3479,7 @@ Variants for Chinese language
 'metadata-langitem' => "'''$2:''' $1",
 'metadata-langitem-default' => '$1',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Ширина',
 'exif-imagelength' => 'Висота',
 'exif-bitspersample' => 'Глибина кольору',
@@ -3592,7 +3672,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, факсове кодування',
@@ -4108,12 +4188,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' => 'Пошук файлів-дублікатів',
@@ -4204,6 +4289,9 @@ MediaWiki поширюється в надії, що вона буде кори
 'htmlform-submit' => 'Відправити',
 'htmlform-reset' => 'Відкотити зміни',
 'htmlform-selectorother-other' => 'Інше',
+'htmlform-no' => 'Ні',
+'htmlform-yes' => 'Так',
+'htmlform-chosen-placeholder' => 'Виберіть параметр',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 з підтримкою повнотекстового пошуку',
@@ -4235,11 +4323,11 @@ MediaWiki поширюється в надії, що вона буде кори
 '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' => 'СÑ\82воÑ\80ено Ð¾Ð±Ð»Ñ\96ковий Ð·Ð°Ð¿Ð¸Ñ\81 $1',
-'logentry-newusers-create' => '$1 — створено обліковий запис',
+'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..b0622ee 100644 (file)
@@ -11,6 +11,7 @@
  * @author Istabani
  * @author Meno25
  * @author Muhammad Shuaib
+ * @author Noor2020
  * @author O.bangash
  * @author Rachitrali
  * @author Reedy
@@ -27,17 +28,17 @@ $fallback8bitEncoding = 'windows-1256';
 $rtl = true;
 
 $namespaceNames = array(
-       NS_MEDIA            => 'زریعہ',
+       NS_MEDIA            => 'وسیط',
        NS_SPECIAL          => 'خاص',
        NS_MAIN             => '',
        NS_TALK             => 'تبادلۂ_خیال',
        NS_USER             => 'صارف',
        NS_USER_TALK        => 'تبادلۂ_خیال_صارف',
        NS_PROJECT_TALK     => 'تبادلۂ_خیال_$1',
-       NS_FILE             => 'تصویر',
-       NS_FILE_TALK        => 'تبادلۂ_خیال_تصویر',
-       NS_MEDIAWIKI        => 'میڈیاوکی',
-       NS_MEDIAWIKI_TALK   => 'تبادلۂ_خیال_میڈیاوکی',
+       NS_FILE             => 'ملف',
+       NS_FILE_TALK        => 'تبادلۂ_خیال_ملف',
+       NS_MEDIAWIKI        => 'میڈیاویکی',
+       NS_MEDIAWIKI_TALK   => 'تبادلۂ_خیال_میڈیاویکی',
        NS_TEMPLATE         => 'سانچہ',
        NS_TEMPLATE_TALK    => 'تبادلۂ_خیال_سانچہ',
        NS_HELP             => 'معاونت',
@@ -46,6 +47,14 @@ $namespaceNames = array(
        NS_CATEGORY_TALK    => 'تبادلۂ_خیال_زمرہ',
 );
 
+$namespaceAliases = array(
+       'زریعہ'            => NS_MEDIA,
+       'تصویر'            => NS_FILE,
+       'تبادلۂ_خیال_تصویر'   => NS_FILE_TALK,
+       'میڈیاوکی'          => NS_MEDIAWIKI,
+       'تبادلۂ_خیال_میڈیاوکی' => NS_MEDIAWIKI_TALK,
+);
+
 $specialPageAliases = array(
        'Activeusers'               => array( 'متحرک_صارفین' ),
        'Allmessages'               => array( 'تمام_پیغامات' ),
@@ -53,13 +62,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 +86,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 +103,7 @@ $specialPageAliases = array(
        'Mypage'                    => array( 'میرا_صفحہ' ),
        'Mytalk'                    => array( 'میری_گفتگو' ),
        'Myuploads'                 => array( 'میرے_زبراثقالات' ),
-       'Newimages'                 => array( 'جدید_املاف،_جدید_تصاویر' ),
+       'Newimages'                 => array( 'جدید_املاف', 'جدید_تصاویر' ),
        'Newpages'                  => array( 'جدید_صفحات' ),
        'PermanentLink'             => array( 'مستقل_ربط' ),
        'Popularpages'              => array( 'مقبول_صفحات' ),
@@ -102,7 +111,7 @@ $specialPageAliases = array(
        'Prefixindex'               => array( 'اشاریہ_سابقہ' ),
        'Protectedpages'            => array( 'محفوظ_صفحات' ),
        'Protectedtitles'           => array( 'محفوظ_عناوین' ),
-       'Randompage'                => array( 'تصادف،_تصادفی_مقالہ' ),
+       'Randompage'                => array( 'تصادف', 'تصادفی_مقالہ' ),
        'Randomredirect'            => array( 'تصادفی_رجوع_مکرر' ),
        'Recentchanges'             => array( 'حالیہ_تبدیلیاں' ),
        'Recentchangeslinked'       => array( 'متعلقہ_تبدیلیاں' ),
@@ -112,12 +121,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 +136,7 @@ $specialPageAliases = array(
        'Version'                   => array( 'اخراجہ' ),
        'Wantedcategories'          => array( 'مطلوب_زمرہ_جات' ),
        'Wantedfiles'               => array( 'مطلوب_املاف' ),
-       'Wantedpages'               => array( 'مطلوب_صفحات،_شکستہ_روابط' ),
+       'Wantedpages'               => array( 'مطلوب_صفحات', 'شکستہ_روابط' ),
        'Wantedtemplates'           => array( 'مطلوب_سانچے' ),
        'Watchlist'                 => array( 'زیر_نظر_فہرست' ),
        'Whatlinkshere'             => array( 'یہاں_کس_کا_رابطہ' ),
@@ -139,9 +148,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 +197,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 +209,7 @@ $messages = array(
 'tog-ccmeonemails' => 'دیگر صارفین کو ارسال کردہ برقی خطوط کی نقول مجھے ارسال کریں۔',
 'tog-diffonly' => 'مختلفات کے نیچے صفحے کی مشمولات مت دکھاؤ',
 'tog-showhiddencats' => 'پوشیدہ زمرہ جات دکھاؤ',
+'tog-useeditwarning' => 'خبردار مجھے جب میں غیر محفوظ کردہ تبدیلیوں کے ساتھ ایک ترمیم کے صفحے کو چھوڑ دو',
 
 'underline-always' => 'ہمیشہ',
 'underline-never' => 'کبھی نہیں',
@@ -268,7 +277,7 @@ $messages = array(
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|زمرہ|زمرہ جات}}',
 'category_header' => 'زمرہ "$1" میں مضامین',
-'subcategories' => 'Ø°Û\8cÙ\84Û\8c Ø°مرہ جات',
+'subcategories' => 'Ø°Û\8cÙ\84Û\8c Ø²مرہ جات',
 'category-media-header' => 'زمرہ "$1" میں وسیط',
 'category-empty' => '‘‘اِس زمرہ میں ابھی کوئی صفحات یا وسیط موجود نہیں.’’',
 'hidden-categories' => '{{PLURAL:$1|پوشیدہ زمرہ|پوشیدہ زمرہ جات}}',
@@ -309,7 +318,7 @@ $messages = array(
 'vector-view-create' => 'تخلیق',
 'vector-view-edit' => 'ترمیم',
 'vector-view-history' => 'تاریخ',
-'vector-view-view' => 'Ù¾Ú\91Ú¾Û\8cÚº',
+'vector-view-view' => 'Ù\85طاÙ\84عÛ\81',
 'vector-view-viewsource' => 'مسودہ',
 'actions' => 'ایکشنز',
 'namespaces' => 'جائے نام',
@@ -377,7 +386,7 @@ $1',
 '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' => 'تعارف {{SITENAME}}',
 'aboutpage' => 'Project:تعارف',
 'copyright' => 'تمام مواد $1 کے تحت میسر ہے۔',
 'copyrightpage' => '{{ns:project}}:حقوق تصانیف',
@@ -386,7 +395,6 @@ $1',
 'disclaimers' => 'اعلانات',
 'disclaimerpage' => 'Project:عام اعلان',
 'edithelp' => 'معاونت براۓ ترمیم',
-'edithelppage' => 'Help:ترمیم',
 'helppage' => 'Help:فہرست',
 'mainpage' => 'صفحہ اول',
 'mainpage-description' => 'صفحہ اول',
@@ -539,7 +547,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 +569,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}} کوکیز استعمال کرتا ہے.
@@ -781,6 +805,7 @@ $1 نے پابندی لگائی تھی.
 لگتا ہے یہ حذف ہوچکا ہے.',
 'edit-conflict' => 'تنازعۂ تدوین.',
 'edit-no-change' => 'آپ کی تدوین کو نظرانداز کردیا گیا، کیونکہ متن میں کوئی تبدیلی نہیں ہوئی تھی.',
+'postedit-confirmation' => 'آپ کی ترمیم محفوظ ہوگئی۔',
 'edit-already-exists' => 'نیا صفحہ تخلیق نہیں کیا جاسکتا.
 یہ پہلے سے موجود ہے.',
 
@@ -904,7 +929,6 @@ $1",
 'searchmenu-legend' => 'اختیاراتِ تلاش',
 'searchmenu-exists' => "'''اِس ویکی پر \"[[:\$1]]\" نامی ایک صفحہ موجود ہے'''",
 'searchmenu-new' => "'''اِس ویکی پر صفحہ \"[[:\$1]]\" تخلیق کیجئے!'''",
-'searchhelp-url' => 'Help:فہرست',
 'searchprofile-articles' => 'مشمولاتی صفحات',
 'searchprofile-project' => 'صفحاتِ مدد و منصوبہ',
 'searchprofile-images' => 'کثیرالوسیط',
@@ -914,7 +938,7 @@ $1",
 'searchprofile-project-tooltip' => '$1 میں تلاش',
 'searchprofile-images-tooltip' => 'تلاش برائے ملفات',
 'searchprofile-everything-tooltip' => ' تلاش تمام مشمولات (بشمول تبادلۂ خیال صفحات) میں',
-'searchprofile-advanced-tooltip' => 'اپنی پسند کے فضائے نام میں تلاش',
+'searchprofile-advanced-tooltip' => 'اپنی پسند کے جائے نام میں تلاش',
 'search-result-size' => '$1 ({{PLURAL:$2|1 لفظ|$2 الفاظ}})',
 'search-result-category-size' => '{{PLURAL:$1|1 رُکن|$1 اراکین}} ({{PLURAL:$2|1 ذیلی زمرہ|$2 ذیلی زمرہ جات}}, {{PLURAL:$3|1 ملف|$3 ملفات}})',
 'search-result-score' => 'توافق: $1%',
@@ -944,10 +968,6 @@ $1",
 آپ فی الحال گوگل کے ذریعے تلاش کرسکتے ہیں.
 یاد رکھئے کہ اُن کے {{SITENAME}} اشاریے ممکناً پرانے ہوسکتے ہیں.',
 
-# Quickbar
-'qbsettings' => 'فوری‌بار',
-'qbsettings-none' => 'ہیچ',
-
 # Preferences page
 'preferences' => 'ترجیحات',
 'mypreferences' => 'میری ترجیہات',
@@ -1140,7 +1160,7 @@ HTML tags جانچئے.',
 'recentchangeslinked-page' => 'صفحۂ منصوبہ دیکھئے',
 
 # Upload
-'upload' => 'Ù\81ائÙ\84 Ø¨Ú¾Û\8cجÛ\8cÚº',
+'upload' => 'Ù\81ائÙ\84 Ø§Ø«Ù\82اÙ\84',
 'uploadbtn' => 'زبراثقال ملف (اپ لوڈ فائل)',
 'reuploaddesc' => 'زبراثقال ورقہ (فارم) کیجانب واپس۔',
 'uploadnologin' => 'آپ داخل شدہ حالت میں نہیں',
@@ -1389,7 +1409,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 
 'sp-contributions-newbies' => 'صرف نئے کھاتوں کے مساہمات دکھاؤ',
 'sp-contributions-blocklog' => 'نوشتۂ پابندی',
-'sp-contributions-uploads' => 'آپÙ\84Ù\88Ú\88',
+'sp-contributions-uploads' => 'اثÙ\82اÙ\84ات',
 'sp-contributions-logs' => 'نوشتہ جات',
 'sp-contributions-talk' => 'گفتگو',
 'sp-contributions-userrights' => 'صارف کے حقوق کا انتظام',
@@ -1399,7 +1419,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'sp-contributions-submit' => 'تلاش',
 
 # What links here
-'whatlinkshere' => 'ادھر کس کا جوڑ ہے',
+'whatlinkshere' => 'ادھر کونسا ربط ہے',
 'whatlinkshere-title' => '"$1" سے مربوط صفحات',
 'whatlinkshere-page' => 'صفحہ:',
 'linkshere' => "'''[[:$1]]''' سے درج ذیل صفحات مربوط ہیں:",
@@ -1407,7 +1427,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'isredirect' => 'لوٹایا گیا صفحہ',
 'istemplate' => 'شامل شدہ',
 'isimage' => 'ربطِ ملف',
-'whatlinkshere-links' => 'روابط',
+'whatlinkshere-links' => 'روابط ←',
 'whatlinkshere-hideredirs' => 'رجوع مکررات $1',
 'whatlinkshere-hidetrans' => 'تضمینات',
 'whatlinkshere-hidelinks' => 'روابط $1',
@@ -1534,7 +1554,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'tooltip-ca-nstab-category' => 'زمرہ‌جاتی صفحہ دیکھئے',
 'tooltip-minoredit' => 'اِس تدوین کو بطورِ معمولی ترمیم نشانزد کیجئے',
 'tooltip-save' => 'تبدیلیاں محفوظ کیجئے',
-'tooltip-preview' => 'برائے مہربانی! محفوظ کرنے سے پہلے تبدیلیوں کا پیشمنظر دیکھئے',
+'tooltip-preview' => 'برائے مہربانی! محفوظ کرنے سے پہلے تبدیلیوں کا پیش منظر دیکھيے',
 'tooltip-diff' => 'دیکھئے کہ اپنے متن میں کیا تبدیلیاں کیں',
 'tooltip-compareselectedversions' => 'اِس صفحہ کی دو منتخب نظرثانیوں میں فرق دیکھئے',
 'tooltip-watch' => 'اِس صفحہ کو اپنی زیرِنظرفہرست میں شامل کریں',
@@ -1567,6 +1587,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 b3c6d2e..0e08d1d 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,11 +117,11 @@ $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)',
-'tog-rememberpassword' => 'Hisob ma’lumotlarim ushbu brauzerda eslab qolinsin (ko‘pi bilan $1 {{PLURAL:$1|kunga|kunga}})',
+'tog-rememberpassword' => 'Hisob ma’lumotlarim ushbu brauzerda eslab qolinsin (ko‘pi bilan $1 kunga)',
 'tog-watchcreations' => 'Men yaratgan sahifalarni va yuklagan fayllarni kuzatuv roʻyxatimga qoʻsh',
 'tog-watchdefault' => 'Men tahrirlagan sahifa va fayllarni kuzatuv roʻyxatimga qoʻsh',
 'tog-watchmoves' => 'Men koʻchirgan sahifa va fayllarni kuzatuv roʻyxatimga qoʻsh',
@@ -126,14 +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-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',
@@ -142,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-noconvertlink' => 'Sarlavhani oʻzgartirish havolasini oʻchirib qoʻyish',
+'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',
@@ -346,7 +351,6 @@ $1',
 'disclaimers' => 'Ogohlantirishlar',
 'disclaimerpage' => 'Project:Umumiy ogohlantirish',
 'edithelp' => 'Tahrirlash yordami',
-'edithelppage' => 'Help:Tahrirlash',
 'helppage' => 'Help:Mundarija',
 'mainpage' => 'Bosh sahifa',
 'mainpage-description' => 'Bosh sahifa',
@@ -361,18 +365,18 @@ $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',
 'youhavenewmessages' => 'Sizga $1 keldi ($2).',
 'newmessageslink' => 'yangi xabarlar',
 'newmessagesdifflink' => 'soʻnggi oʻzgarish',
-'youhavenewmessagesfromusers' => 'Siz {{PLURAL:$3|$3 ta foydalanuvchidan}} $1 oldingiz ($2).',
+'youhavenewmessagesfromusers' => 'Siz {{PLURAL:$3|boshqa foydalanuvchidan|$3 ta foydalanuvchidan}} $1 oldingiz ($2).',
 'youhavenewmessagesmanyusers' => "Siz ko'p foydalanuvchilardan $1 oldingiz ($2).",
 'newmessageslinkplural' => '{{PLURAL:$1|yangi xabar|yangi xabarlar}}',
-'newmessagesdifflinkplural' => "oxirgi {{PLURAL:$1|o'zgarish|o'zgarishlar}}",
+'newmessagesdifflinkplural' => 'oxirgi {{PLURAL:$1|oʻzgarish|oʻzgarishlar}}',
 'youhavenewmessagesmulti' => 'Siz $1ga yangi xat oldingiz',
 'editsection' => 'tahrirlash',
 'editold' => 'tahrirlash',
@@ -383,21 +387,21 @@ $1',
 'toc' => 'Mundarija',
 'showtoc' => 'koʻrsatish',
 'hidetoc' => 'yashirish',
-'collapsible-collapse' => "Yig'ish",
+'collapsible-collapse' => 'Yigʻish',
 'collapsible-expand' => 'Yoyish',
-'thisisdeleted' => "$1ni ko'rib chiqasizmi yoki tiklaysizmi?",
-'viewdeleted' => "$1ni ko'rib chiqasizmi?",
-'restorelink' => "{{PLURAL:$1|o'chirilgan tahrir|$1 ta o'chirilgan tahrirlar}}ni",
+'thisisdeleted' => '$1ni koʻrib chiqasizmi yoki tiklaysizmi?',
+'viewdeleted' => '$1ni koʻrib chiqasizmi?',
+'restorelink' => '{{PLURAL:$1|Oʻchirilgan tahrir|$1 ta oʻchirilgan tahrirlar}}',
 'feedlinks' => "Ko'rinishida:",
 'feed-invalid' => "Obuna uchun no'tog'ri turdagi kanal",
-'feed-unavailable' => "Sindikatsiya tasmalariga yo'lashning imkoni yo'q",
+'feed-unavailable' => 'Sindikatsiya tasmalariga yoʻlash imkoni yoʻq',
 'site-rss-feed' => '$1 — RSS-tasmasi',
 'site-atom-feed' => '$1 — Atom-tasma',
 'page-rss-feed' => '"$1" — RSS-tasmasi',
 'page-atom-feed' => '«$1» — Atom-lenta',
 'red-link-title' => '$1 (sahifa yaratilmagan)',
-'sort-descending' => "Kamayish bo'yicha tartiblash",
-'sort-ascending' => "O'sish bo'yicha tartiblash",
+'sort-descending' => 'Kamayish boʻyicha tartiblash',
+'sort-ascending' => 'Oʻsish boʻyicha tartiblash',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Maqola',
@@ -425,19 +429,19 @@ $1',
 'internalerror_info' => 'Ichki xato: $1',
 'badtitle' => 'Notoʻgʻri sarlavha',
 'viewsource' => 'Manbasini koʻrish',
-'viewsource-title' => "$1 sahifasining manbasini ko'rish",
-'actionthrottled' => "Tezlik bo'yicha cheklov",
+'viewsource-title' => '$1 sahifasining manbasini koʻrish',
+'actionthrottled' => 'Tezlik cheklovi',
 '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.',
 'ns-specialprotected' => '"{{ns:special}}" nomfazosi sahifalari tahrirlanishi mumkin emas.',
 'exception-nologin' => "Siz tizimda o'zingizni tanishtirmadingiz",
-'exception-nologin-text' => "Bu sahifani ko'rish yoki so'ralgan amalni bajarish uchun o'zingizni tizimda tanitishingiz zarur.",
+'exception-nologin-text' => 'Bu sahifani koʻrish yoki soʻralgan amalni bajarish uchun tizimga kirishingiz lozim.',
 
 # Virus scanner
 'virus-badscanner' => "Moslamada xato. Noma'lum virus aniqlovchi: ''$1''",
@@ -449,11 +453,18 @@ 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',
+'yourname' => 'Foydalanuvchi nomi:',
+'userlogin-yourname' => 'Foydalanuvchi nomi',
+'userlogin-yourname-ph' => 'Foydalanuvchi nomingizni kiriting',
+'yourpassword' => 'Maxfiy soʻz:',
+'createacct-yourpassword-ph' => 'Maxfiy soʻzni kiriting',
 'yourpasswordagain' => 'Maxfiy so‘zni qayta kiriting:',
+'createacct-yourpasswordagain' => 'Maxfiy soʻzni tasdiqlang',
+'createacct-yourpasswordagain-ph' => 'Maxfiy soʻzni yana bir bor 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",
+'userlogin-remembermypassword' => 'Yodda tut',
+'userlogin-signwithsecure' => 'Himoyalangan holda kirish',
+'securelogin-stick-https' => 'Kirgandan keyin HTTPS boʻyicha ulanishni davom ettirish',
 'yourdomainname' => 'Sizning domeningiz:',
 'password-change-forbidden' => 'Siz bu vikida maxfiy soʻzni oʻzgartira olmaysiz.',
 'login' => 'Kirish',
@@ -464,28 +475,41 @@ Shuni e'tiborga olingki, ayrim sahifalar siz brauzeringiz keshini tozalamaguning
 'logout' => 'Chiqish',
 'userlogout' => 'Chiqish',
 'notloggedin' => 'Siz tizimga kirmagansiz',
+'userlogin-noaccount' => 'Hisobingiz yoʻqmi?',
+'userlogin-joinproject' => '{{SITENAME}}ga aʼzo boʻlish',
 'nologin' => "Hisobingiz yoʻqmi? '''$1'''.",
 'nologinlink' => 'Hisob yaratish',
 'createaccount' => 'Hisob yaratish',
 'gotaccount' => "Hisobingiz bormi? '''$1'''.",
 'gotaccountlink' => 'Kirish',
 'userlogin-resetlink' => 'Kirish maʻlumotlaringiz esdan chiqdimi?',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Kirish uchun yordam]]',
+'createacct-join' => 'Maʼlumotlaringizni quyiga yozing',
+'createacct-emailoptional' => 'Elektron pochta manzili (majburiy emas)',
+'createacct-email-ph' => 'Elektron pochtangiz manzilini kiriting',
 'createaccountmail' => "E-mail orqali maxfiy so'zni jo'natish",
 'createaccountreason' => 'Sabab:',
+'createacct-captcha' => 'Xavfsizlik tekshiruvi',
+'createacct-imgcaptcha-ph' => 'Yuqoridagi yozuvni bu yerga kiriting',
+'createacct-submit' => 'Hisob yaratish',
+'createacct-benefit-heading' => '{{SITENAME}} Sizga oʻxshagan odamlar tomonidan yaratiladi',
+'createacct-benefit-body1' => 'tahrirlar soni',
+'createacct-benefit-body2' => 'maqolalar soni',
+'createacct-benefit-body3' => 'soʻnggi paytdagi ishtirokchilar soni',
 'badretype' => "Siz tomondan kiritilgan maxfiy so'zlar mos kelmayapti.",
 'loginerror' => 'Foydalanuvchini aniqlashda xatolik',
-'createaccounterror' => "Hisob yozuvini yaratishning iloji yo'q: $1",
+'createaccounterror' => 'Hisob yozuvi yaratishning iloji yoʻq: $1',
 'loginsuccesstitle' => 'Kirish muvaffaqiyatli amalga oshdi',
 'loginsuccess' => "'''{{SITENAME}}ga \"\$1\" foydalanuvchi nomi bilan kirdingiz.'''",
 'nosuchusershort' => '"$1" ismli foydalanuvchi yoʻq.
 Ism yozilishini tekshirib koʻring.',
 'nouserspecified' => "Siz foydalanuvchining ismini ko'rsatishingiz lozim.",
-'login-userblocked' => "Bu foydalanuvchi muhosara qilingan. Tizimga kirishga ruxsat yo'q.",
+'login-userblocked' => 'Bu foydalanuvchi chetlatilgan. Tizimga kirishga ruxsat yoʻq.',
 'wrongpassword' => 'Kiritgan mahfiy soʻzingiz notoʻgʻri. Iltimos, qaytadan kiritib koʻring.',
-'wrongpasswordempty' => "Iltimos, bo'sh bo'lmagan maxfiy so'z kiriting.",
-'mailmypassword' => "Elektron pochta orqali yangi maxfiy so'zni jo'natish",
+'wrongpasswordempty' => 'Maxfiy soʻz koʻrsatilmagan. Qaytadan urinib koʻring.',
+'mailmypassword' => 'Yangi maxfiy soʻzni elektron pochta orqali 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',
@@ -504,7 +528,9 @@ Ism yozilishini tekshirib koʻring.',
 'resetpass-submit-cancel' => 'Bekor',
 
 # Special:PasswordReset
-'passwordreset-legend' => "Maxfiy so'zni yo'q qilish",
+'passwordreset' => 'Maxfiy soʻzni tashlash',
+'passwordreset-text-one' => 'Mahfiy soʻzni tashlash uchun ushbu oynalarni toʻltiring.',
+'passwordreset-legend' => 'Maxfiy soʻzni tashlash',
 'passwordreset-username' => 'Foydalanuvchi nomi:',
 'passwordreset-domain' => 'Domen:',
 'passwordreset-email' => 'Elektron pochta manzili:',
@@ -516,7 +542,7 @@ Vaqtinchalik maxfiy so'z: $2",
 'changeemail-header' => "Elektron pochta manzilini o'zgaritish",
 'changeemail-oldemail' => 'Joriy elektron pochta manzili',
 'changeemail-newemail' => 'Elektron pochtaning yangi manzili',
-'changeemail-none' => "(yo'q)",
+'changeemail-none' => '(yoʻq)',
 'changeemail-submit' => "Manzilni o'zgartirish",
 'changeemail-cancel' => 'Bekor',
 
@@ -531,7 +557,7 @@ Vaqtinchalik maxfiy so'z: $2",
 'extlink_tip' => 'Tashqi ishorat (http:// prefiksini unutmang)',
 'headline_sample' => 'Sarlavha',
 'headline_tip' => '2-darajadagi sarlavha',
-'nowiki_sample' => "Bu yerga formatlash zarur bo'lmagan matnni qo'ying",
+'nowiki_sample' => 'Bu yerga formatlash zarur boʻlmagan matnni qoʻying',
 'nowiki_tip' => "Viki-formatlashga e'tibor qilmaslik",
 'image_tip' => 'Qoʻshilgan tasvir',
 'media_tip' => 'Faylga havola',
@@ -546,14 +572,14 @@ Vaqtinchalik maxfiy so'z: $2",
 'savearticle' => 'Saqlash',
 'preview' => 'Ko‘rib chiqish',
 'showpreview' => 'Ko‘rib chiqish',
-'showlivepreview' => "Tezkor ko'rib chiqish",
+'showlivepreview' => 'Tezkor koʻrib chiqish',
 'showdiff' => 'O‘zgarishlarni ko‘rsatish',
 'anoneditwarning' => "'''Diqqat:''' Siz tizimga kirmagansiz. Ushbu sahifa tarixida Sizning IP manzilingiz yozib qolinadi.",
 'missingcommenttext' => 'Iltimos sharh qoldiring.',
-'summary-preview' => "Tavsif shunday bo'ladi:",
-'subject-preview' => "Sarlavha shunday bo'ladi:",
+'summary-preview' => 'Tavsif bunday koʻrinishda boʻladi:',
+'subject-preview' => 'Sarlavha bunday koʻrinishda 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''.
 
@@ -562,17 +588,16 @@ 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.",
-'nosuchsectiontitle' => "Bo'limni topishning iloji yo'q",
-'nosuchsectiontext' => "Siz mavjud bo'lmagan bo'limni sharhlamoqchi bo'ldingiz.
-Siz sharhlamoqchi bo'lgan bo'lim o'chirilgan yoki boshqa sarlavhaga jildirilgan bo'lishi mumkin.",
+'whitelistedittext' => 'Siz sahifalarni oʻzgartirish uchun $1.',
+'nosuchsectiontitle' => 'Boʻlimni topishni iloji yoʻq',
+'nosuchsectiontext' => 'Siz mavjud boʻlmagan boʻlimni tahrirlamoqchi boʻldingiz. Ushbu boʻlim Siz bu sahifani koʻrayotgan mahalda koʻchirilgan yoki yoʻqotilgan boʻlishi mumkin.',
 'loginreqtitle' => 'Shaxsiyatni aniqlash talab etiladi',
 'loginreqlink' => 'Kirish',
-'loginreqpagetext' => "Boshqa sahifalarni ko'rish uchun $1",
-'accmailtitle' => "Mahfiy so'z jo'natildi.",
+'loginreqpagetext' => 'Boshqa sahifalarni koʻrish uchun $1',
+'accmailtitle' => 'Maxfiy soʻz joʻnatildi',
 'newarticle' => '(Yangi)',
 'newarticletext' => "Bu sahifa hali mavjud emas.
 Sahifani yaratish uchun quyida matn kiritishingiz mumkin (qoʻshimcha axborot uchun [[{{MediaWiki:Helppage}}|yordam sahifasini]] koʻring).
@@ -593,7 +618,9 @@ Agar siz anonim ishtirokchi boʻlsangiz va siz oʻzingizga yoʻnaltirilmagan xab
 'continue-editing' => 'tahrirlashni davom ettirish',
 'editing' => '$1 tahrirlanmoqda',
 'creating' => '«$1» sahifasini yaratish',
-'editingsection' => '$1 (boʻlim) tahrirlanmoqda',
+'editingsection' => '$1 tahrirlanmoqda (boʻlim)',
+'editingcomment' => '$1 tahrirlanmoqda (yangi mavzu)',
+'editconflict' => 'Tahrirlash toʻqnashuvi: $1',
 'copyrightwarning' => "Iltimos, {{SITENAME}}ga yuklangan har qanday axborot $2 ostida tarqatilishiga diqqat qiling (batafsil ma'lumot uchun $1ni ko'ring).
 Agar yozganlaringiz keyinchalik tahrir qilinishi va qayta tarqatilishiga rozi bo'lmasangiz, u holda bu yerga yozmang.<br />
 Siz shuningdek bu yozganlaringiz sizniki yoki erkin litsenziya ostida ekanligini va'da qilmoqdasiz.
@@ -607,11 +634,11 @@ Bundan tashqari, siz ushbu ma'lumotlarni o'zingiz yozgan bo'lishingiz yoki ruxsa
 'template-protected' => '(himoyalangan)',
 'template-semiprotected' => '(yarim-himoyalangan)',
 'hiddencategories' => 'Ushbu sahifa {{PLURAL:$1|1 yashirin turkum|$1 yashirin turkumlar}}ga kiradi:',
-'nocreatetext' => 'Ushbu saytda yangi sahifalar yaratish taqiqlagan.
+'nocreatetext' => 'Ushbu saytda yangi sahifalar yaratish taʼqiqlagan.
 Ortga qaytib, mavjud sahifani tahrirlashingiz yoki [[Special:UserLogin|tizimga kirishingiz]] mumkin.',
-'nocreate-loggedin' => "Sizda yangi sahifalar yaratishga ruxsat yo'q.",
-'sectioneditnotsupported-title' => "Bo'limlarni tahrirlash imkoniyati yo'q",
-'sectioneditnotsupported-text' => "Ushbu sahifada bo'limlarni tahrirlash imkoniyati yo'q.",
+'nocreate-loggedin' => 'Sizda yangi sahifalar yaratishga ruxsat yoʻq.',
+'sectioneditnotsupported-title' => 'Boʻlimlarni tahrirlash imkoniyati yoʻq',
+'sectioneditnotsupported-text' => 'Ushbu sahifada boʻlimlarni tahrirlash imkoniyati yoʻq.',
 'permissionserrors' => 'Ruxsat huquqida xato',
 '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.'''
@@ -620,8 +647,9 @@ Bu sahifani yaratishda davom etishdan avval uning nega avval yoʻqotilgani bilan
 Qulaylik uchun quyida yoʻqotilish qaydlari keltirilgan:",
 'moveddeleted-notice' => 'Bu sahifa oʻchirilgan.
 Maʼlumot uchun quyida oʻchirish va qayta nomlash jurnallaridan mos yozuvlar keltirilgan.',
-'log-fulllog' => "Qaydlarni to'liq ko'rish",
-'edit-conflict' => "Tashrirlash to'qnashuvi.",
+'log-fulllog' => 'Qaydlarni toʻliq koʻrish',
+'edit-conflict' => 'Tahrirlash toʻqnashuvi.',
+'postedit-confirmation' => 'Tahriringiz saqlandi.',
 'defaultmessagetext' => "Boshlang'ich matn",
 
 # Parser/template warnings
@@ -673,7 +701,7 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'revdelete-hide-text' => 'Sahifaning ushbu versiyasi matnini yashirish',
 'revdelete-radio-same' => "(o'zgartirilmasin)",
 'revdelete-radio-set' => 'Ha',
-'revdelete-radio-unset' => "Yo'q",
+'revdelete-radio-unset' => 'Yoʻq',
 'revdelete-log' => 'Sabab:',
 'revdel-restore' => "Ko'rinuvchanlikni o'zgartirish",
 'revdel-restore-deleted' => "o'chirilgan versiyalar",
@@ -687,7 +715,7 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'mergehistory-from' => 'Manba sahifa:',
 'mergehistory-into' => "Mo'ljal sahifa:",
 'mergehistory-list' => 'Birlashtiriladigan tahrirlar tarixi',
-'mergehistory-go' => "Birlashtiriladigan tahrirlarni ko'rsatish",
+'mergehistory-go' => 'Birlashtiriladigan tahrirlarni koʻrsatish',
 'mergehistory-submit' => 'Tahrirlarni birlashtirish',
 'mergehistory-reason' => 'Sabab:',
 
@@ -703,14 +731,14 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'difference-multipage' => '(Sahifalar orasidagi farq)',
 'lineno' => 'Qator $1:',
 'compareselectedversions' => 'Tanlangan versiyalarni solishtir',
-'showhideselectedversions' => "Tanlangan versiyalarni ko'rsatish/yashirish",
+'showhideselectedversions' => 'Tanlangan versiyalarni koʻrsatish/yashirish',
 'editundo' => 'qaytarish',
-'diff-multi' => "({{PLURAL:$2|$2 ta foydalanuvching}} {{PLURAL:$1|$1 ta oraliq versiyasi|$1 ta oraliq versiyalari}} ko'rsatilmadi)",
+'diff-multi' => '({{PLURAL:$2|Bitta foydalanuvchining|$2 ta foydalanuvchining}} {{PLURAL:$1|bitta oraliq versiyasi|$1 ta oraliq versiyalari}} koʻrsatilmadi)',
 
 # 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",
@@ -722,22 +750,21 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'nextn' => 'keyingi {{PLURAL:$1|$1}}',
 'prevn-title' => 'Avvalgi $1 {{PLURAL:$1|natija|natijalar}}',
 'nextn-title' => 'Keyingi $1 {{PLURAL:$1|natija|natijalar}}',
-'shown-title' => 'Sahifada $1 ta {{PLURAL:$1|natija}} koʻrsatish',
+'shown-title' => 'Sahifada $1 ta natija koʻrsatish',
 'viewprevnext' => 'Koʻrish ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-legend' => 'Qidiruv shartlari',
 'searchmenu-exists' => "'''Ushbu vikida \"[[:\$1]]\" nomli sahifa mavjud.'''",
 'searchmenu-new' => "'''Ushbu vikida \"[[:\$1]]\" sahifasini yarat!'''",
-'searchhelp-url' => 'Help:Mundarija',
-'searchmenu-prefix' => "[[Special:PrefixIndex/$1|Ushbu prefiks mavjud bo'lgan sahifalarni ko'rsatish]]",
+'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Shu prefiksli 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',
-'searchprofile-everything-tooltip' => "Barcha sahifalardan (munozara sahifalarini qo'shgan holda) qidirish",
+'searchprofile-everything-tooltip' => 'Barcha sahifalardan qidirish (munozara sahifalarinidan ham)',
 'searchprofile-advanced-tooltip' => 'Belgilangan nomfazolardan qidirish',
 'search-result-size' => '$1 ({{PLURAL:$2|1 ta soʻz|$2 ta soʻz}})',
 'search-result-category-size' => "$1 {{PLURAL:$1|a'zo|a'zolar}} ($2 {{PLURAL:$2|ostturkum|ostturkumlar}}, $3 {{PLURAL:$3|fayl|fayllar}}).",
@@ -753,7 +780,7 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'searcheverything-enable' => 'Barcha nomfazolarda qidir',
 'searchrelated' => 'bogʻlangan',
 'searchall' => 'barchasi',
-'showingresults' => "Quyida №'''$2'''dan boshlab '''$1''' ta {{PLURAL:$1|natija}} ko'rsatildi.",
+'showingresults' => "Quyida №'''$2'''dan boshlab {{PLURAL:$1|'''bitta''' natija|'''$1''' ta natija}} koʻrsatilgan.",
 'showingresultsnum' => "Quyida №'''$2'''dan boshlab '''$1''' ta {{PLURAL:$1|natija}} ko'rsatildi.",
 'showingresultsheader' => "$4 uchun {{PLURAL:$5|'''$3'''dan '''$1''' natija|'''$3'''dan '''$1 - $2''' natijalar}}",
 'search-nonefound' => 'Talabga javob beradigan natija topilmadi.',
@@ -770,7 +797,7 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 # 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',
@@ -782,13 +809,13 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'prefs-user-pages' => 'Foydalanuvchi sahifalari',
 'prefs-personal' => 'Shaxsiy ma’lumotlar',
 'prefs-rc' => 'Yangi o‘zgartirishlar',
-'prefs-watchlist' => "Kuzatuv ro'yxati",
+'prefs-watchlist' => 'Kuzatuv roʻyxati',
 'prefs-watchlist-days' => 'Kunlar soni:',
 'prefs-watchlist-days-max' => 'Eng ko‘pi bilan $1 {{PLURAL:$1|kun}}',
 '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',
@@ -800,10 +827,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-disabled' => "O'chirib qo'yilgan",
-'recentchangesdays-max' => 'Eng koʻpi $1 kun',
-'recentchangescount' => 'Sukut boʻyicha koʻrsatiladigan tahrirlar soni',
+'stub-threshold' => '<a href="#" class="stub">Chala maqolalarga ishorat</a> keltirish uchun pastki chegara (baytlarda):',
+'stub-threshold-disabled' => 'Oʻchirib qoʻyilgan',
+'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:',
@@ -826,38 +855,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-realname' => 'Haqiqiy ism (majburiy emas).
+Agar keltirsangiz, undan sahifa kim tomonidan tahrirlanganini 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ʻ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',
@@ -872,6 +901,7 @@ Agar siz uni ko'rsatsangiz, undan sahifa tahriri kim tomonidan kiritilganligini
 'prefs-diffs' => 'Versiyalar farqi',
 
 # User rights
+'userrights-user-editname' => 'Foydalanuvchi nomingizni kiriting:',
 'editusergroup' => 'Foydalanuvchi guruxlarni taxrirlash',
 'userrights-groupsmember' => 'Aʼzolik:',
 'userrights-groupsmember-auto' => "Noaniq a'zo",
@@ -921,32 +951,33 @@ Agar siz uni ko'rsatsangiz, undan sahifa tahriri kim tomonidan kiritilganligini
 'action-sendemail' => "elektron xatlar jo'natish",
 
 # Recent changes
-'nchanges' => "$1 {{PLURAL:$1|o'zgarish|o'zgarishlar}}",
+'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',
 'recentchanges-label-unpatrolled' => 'Bu tahrir hali tekshirilmagan',
-'rcnote' => "Quyida $4 soat $5 ga koʻra oxirgi '''$2''' kun davomida sodir boʻlgan {{PLURAL:$1|'''1''' oʻzgarish|'''$1''' oʻzgarishlar}} koʻrsatilgan.",
+'rcnote' => "Quyida $4, $5 koʻra oxirgi '''$2''' kun ichida sodir boʻlgan {{PLURAL:$1|'''bitta''' oʻzgarish|'''$1''' ta oʻzgarish}} koʻrsatilgan.",
 'rcnotefrom' => "Quyida <strong>$2</strong> dan (<strong>$1</strong> gacha) bo'lgan o'zgarishlar keltirilgan.",
 'rclistfrom' => '$1 dan boshlab yangi oʻzgarishlarni koʻrsat.',
 'rcshowhideminor' => 'Kichik tahrirlarni $1',
-'rcshowhidebots' => '$1 ta bot',
-'rcshowhideliu' => 'Ro‘yxatdan o‘tgan foydalanuvchilar: $1 ta',
-'rcshowhideanons' => 'Anonim foydalanuvchilar: $1 ta',
+'rcshowhidebots' => 'Botlarni $1',
+'rcshowhideliu' => 'Roʻyxatdan oʻtgan foydalanuvchilarni $1',
+'rcshowhideanons' => 'Anonim foydalanuvchilarni $1',
 'rcshowhidepatr' => 'Tekshirilgan tahrirlarni $1',
-'rcshowhidemine' => "O'z tahrirlarimni $1",
-'rclinks' => 'Oxirgi $2 kun ichida sodir boʻlgan $1 oʻzgarishlar koʻrsatildi.<br />$3',
+'rcshowhidemine' => 'Oʻz tahrirlarimni $1',
+'rclinks' => 'Oxirgi $2 kun ichida sodir boʻlgan $1 ta oʻzgarish 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',
@@ -959,7 +990,7 @@ Agar siz uni ko'rsatsangiz, undan sahifa tahriri kim tomonidan kiritilganligini
 'recentchangeslinked-noresult' => 'Berilgan davrda bogʻlangan sahifalarda oʻzgarishlar boʻlmagan.',
 'recentchangeslinked-summary' => "Ushbu maxsus sahifa unga bogʻlangan sahifalardagi soʻnggi oʻzgarishlarni koʻrsatadi. [[Special:Watchlist|Kuzatuv roʻyxatingizdagi]] sahifalar '''qalin''' qilib koʻrsatilgan.",
 'recentchangeslinked-page' => 'Sahifa nomi:',
-'recentchangeslinked-to' => "Teskarisiga, ko'rsatilgan sahifaga yo'naltirilgan sahifalardagi o'zgarishlarni ko'rish",
+'recentchangeslinked-to' => 'Koʻrsatilgan sahifaga bogʻlangan sahifalardagi oʻzgarishlarni koʻrish',
 
 # Upload
 'upload' => 'Fayl yuklash',
@@ -1001,7 +1032,7 @@ Agar siz uni ko'rsatsangiz, undan sahifa tahriri kim tomonidan kiritilganligini
 'filehist-datetime' => 'Sana/Vaqt',
 'filehist-thumb' => 'Miniatura',
 'filehist-thumbtext' => '$1 dagi versiya uchun tasvir',
-'filehist-nothumb' => "Miniatura yo'q",
+'filehist-nothumb' => 'Miniatyurasi yoʻq',
 'filehist-user' => 'Foydalanuvchi',
 'filehist-dimensions' => 'Oʻlchamlari',
 'filehist-filesize' => 'Fayl hajmi',
@@ -1034,7 +1065,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',
 
@@ -1090,7 +1132,7 @@ Uning [$2 fayl tavsifi sahifasidan] olingan tavsifi quyida keltirilgan.',
 'allpages-hide-redirects' => 'Yoʻnaltirishlarni yashirish',
 
 # SpecialCachedPage
-'cachedspecial-refresh-now' => "Oxirgi versiyasini ko'rish",
+'cachedspecial-refresh-now' => 'Oxirgi versiyasini koʻrish',
 
 # Special:Categories
 'categories' => 'Turkumlar',
@@ -1119,6 +1161,13 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'listusers-noresult' => 'Foydalanuvchilar topilmadi.',
 'listusers-blocked' => '(chetlashtirilgan)',
 
+# Special:ActiveUsers
+'activeusers' => 'Faol foydalanuvchilar roʻyxati',
+'activeusers-from' => 'Quyidagidan boshlanuvchi foydalanuvchilarni koʻrsatish:',
+'activeusers-hidebots' => 'Botlarni yashirish',
+'activeusers-hidesysops' => 'Maʼmurlarni yashirish',
+'activeusers-noresult' => 'Foydalanuvchilar topilmadi.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Foydalanuvchilar guruhi huquqlari',
 'listgrouprights-group' => 'Guruh',
@@ -1158,13 +1207,11 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Watchlist
 'watchlist' => 'Kuzatuv roʻyxatim',
 'mywatchlist' => 'Kuzatuv roʻyxatim',
-'watchlistfor2' => '$1 $2 uchun',
-'nowatchlist' => "Kuzatuv ro'yxatingizda hech narsa yo'q.",
+'watchlistfor2' => '$1 uchun $2',
+'nowatchlist' => 'Kuzatuv roʻyxatingizda hech nima yoʻq.',
 'watchnologin' => "Siz tizimda o'zingizni tanishtirmadingiz",
 'addwatch' => "Kuzatuv ro'yxatiga qo'shish",
-'addedwatchtext' => "\"[[:\$1]]\" sahifasi sizning [[Special:Watchlist|kuzatuv ro'yxatingizga]] qo'shildi. Bu sahifada va unga mos munozara sahifasida bo'ladigan kelajakdagi o'zgarishlar bu yerda ro'yxatga olinadi, hamda bu sahifa topish qulay bo'lishi uchun [[Special:RecentChanges|yangi o'zgarishlar ro'yxati]]da '''qalin''' harflar bilan ko'rsatiladi.
-
-Agar siz bu sahifani kuzatuv ro'yxatingizdan o'chirmoqchi bo'lsangiz \"Kuzatmaslik\" yozuvini bosing.",
+'addedwatchtext' => '"[[:$1]]" sahifasi sizning [[Special:Watchlist|kuzatuv roʻyxatingizga]] qoʻshildi. Bu sahifada va uning munozara sahifasida boʻladigan oʻzgarishlar u yerda koʻrsatiladi.',
 'removewatch' => "Kuzatuv ro'yxatidan o'chirish",
 'removedwatchtext' => '"[[:$1]]" sahifasi [[Special:Watchlist|kuzatuv roʻyxatingizdan]] oʻchirildi.',
 'watch' => 'Kuzatish',
@@ -1172,17 +1219,17 @@ Agar siz bu sahifani kuzatuv ro'yxatingizdan o'chirmoqchi bo'lsangiz \"Kuzatmasl
 'unwatch' => 'Kuzatmaslik',
 'unwatchthispage' => "Kuzatuvni to'xtatish",
 'notanarticle' => 'Maqola emas',
-'watchlist-details' => "Sizning kuzatuv ro'yxatingizda $1 {{PLURAL:$1|ta sahifa}} (munozara sahifalarini hisobga olmaganda)",
+'watchlist-details' => 'Sizning kuzatuv roʻyxatingizda hozirda {{PLURAL:$1|bitta sahifa|$1ta sahifa}} mavjud (munozara sahifalarini hisobga olmaganda).',
 'wlnote' => "Below {{PLURAL:$1|is the last change|are the last '''$1''' changes}} in the last {{PLURAL:$2|hour|'''$2''' hours}}, as of $3, $4.",
 'wlshowlast' => 'Oxirgi $1 soatdagi $2 kundagi tahrirlarni ko‘rsatish. $3 tahrirlarni ko‘rsatish',
-'watchlist-options' => "Kuzatuv ro'yxati moslamalari",
+'watchlist-options' => 'Kuzatuv roʻyxati moslamalari',
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Kuzatish...',
 'unwatching' => "Kuzatuv ro'yxatidan o'chirish...",
 
 'enotif_mailer' => "{{SITENAME}} Pochta orqali e'lon qilish xizmati",
-'enotif_reset' => "Hamma sahifalarni ko'rib chiqilgan deb belgilash",
+'enotif_reset' => 'Hamma sahifalarni koʻrib chiqilgan deb belgilash',
 'enotif_impersonal_salutation' => '{{SITENAME}} ishtirokchisi',
 'enotif_subject_deleted' => '{{SITENAME}} loyihasining $1 nomli sahifasi foydalanuvchi {{gender:$2|$2}} tomonidan o‘chirildi',
 'enotif_subject_created' => '{{SITENAME}} loyihasining $1 nomli sahifasi foydalanuvchi {{gender:$2|$2}} tomonidan yaratildi',
@@ -1194,8 +1241,8 @@ Agar siz bu sahifani kuzatuv ro'yxatingizdan o'chirmoqchi bo'lsangiz \"Kuzatmasl
 'enotif_body_intro_moved' => '{{SITENAME}} loyihasining $1 nomli sahifasi $PAGEEDITDATEda foydalanuvchi {{gender:$2|$2}} tomonidan qayta nomlandi, joriy variantini ko‘rish uchun $3 ga qarang.',
 'enotif_body_intro_restored' => '{{SITENAME}} loyihasining $1 nomli sahifasi $PAGEEDITDATEda foydalanuvchi {{gender:$2|$2}} tomonidan tiklandi, joriy variantini ko‘rish uchun $3 ga qarang.',
 'enotif_body_intro_changed' => '{{SITENAME}} loyihasining $1 nomli sahifasi $PAGEEDITDATEda foydalanuvchi {{gender:$2|$2}} tomonidan o‘zgartirildi, joriy variantini ko‘rish uchun $3 ga qarang.',
-'enotif_lastvisited' => "Oxirgi tashrifingizdan buyon sodir bo'lgan barcha o'zgarishlarni ko'rish uchun $1 ga qarang.",
-'enotif_lastdiff' => "O'zgarishlar bilan tanishish uchun $1 ga qarang.",
+'enotif_lastvisited' => 'Oxirgi tashrifingizdan keyin sodir boʻlgan barcha oʻzgarishlarni koʻrish uchun $1 ga qarang.',
+'enotif_lastdiff' => 'Oʻzgarishlar bilan tanishish uchun $1 ga qarang.',
 'enotif_anon_editor' => 'anonim foydalanuvchi $1',
 'enotif_body' => 'Hurmatli $WATCHINGUSERNAME,
 
@@ -1250,7 +1297,7 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 'rollback' => 'Oʻzgarishlarni eski holiga keltirish',
 'rollback_short' => 'Eski holiga keltirish',
 'rollbacklink' => 'eski holiga keltirish',
-'rollbacklinkcount' => '$1 {{PLURAL:$1| ta tahrir}}ni eski holiga keltirish',
+'rollbacklinkcount' => '$1 ta tahrirni ortga qaytarish',
 'rollbacklinkcount-morethan' => '$1 {{PLURAL:$1| tadan koʻp tahrir}}ni eski holiga keltirish',
 'rollbackfailed' => 'Eski holiga keltirishda xatolik',
 'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|munozara]]) tahrirlari [[User:$1|$1]] versiyasiga qaytarildi',
@@ -1295,26 +1342,26 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 'restriction-level-all' => 'barcha darajalar',
 
 # Undelete
-'undelete' => "O'chirilgan sahifalarni ko'rish",
-'undeletepage' => "O'chirilgan sahifalarni ko'rish va tiklash",
-'viewdeletedpage' => "O'chirilgan sahifalarni ko'rish",
+'undelete' => 'Oʻchirilgan sahifalarni koʻrish',
+'undeletepage' => 'Oʻchirilgan sahifalarni koʻrish va tiklash',
+'viewdeletedpage' => 'Oʻchirilgan sahifalarni koʻrish',
 'undelete-nodiff' => 'Oldingi versiya topilmadi.',
 'undeletebtn' => 'Tiklash',
 'undeletelink' => 'ko‘rib chiqish/tiklash',
-'undeleteviewlink' => "ko'rib chiqish",
+'undeleteviewlink' => 'koʻrib chiqish',
 'undeletereset' => 'Tozalash',
 'undeleteinvert' => 'Tanlash tartibini almashtirish',
 'undeletecomment' => 'Sabab:',
 'undelete-search-title' => "O'chirilgan sahifalarni qidirish",
 'undelete-search-box' => "O'chirilgan sahifalarni qidirish",
-'undelete-search-prefix' => "Bundan boshlangan sahifalarni ko'rsatish:",
+'undelete-search-prefix' => 'Bundan boshlangan sahifalarni koʻrsatish:',
 'undelete-search-submit' => 'Qidirish',
 'undelete-show-file-submit' => 'Ha',
 
 # Namespace form on various pages
 'namespace' => 'Nomfazo:',
 'invert' => 'Tanlash tartibini almashtirish',
-'namespace_association' => "Bog'liq nomfazo",
+'namespace_association' => 'Bogʻliq nomfazo',
 'blanknamespace' => '(asosiy)',
 
 # Contributions
@@ -1322,8 +1369,8 @@ 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",
-'uctop' => '(oxirgi)',
+'nocontribs' => 'Belgilangan shartlarga muvofiq oʻzgarishlar topilmadi',
+'uctop' => '(joriy)',
 'month' => 'Oydan (va avvalroq)',
 'year' => 'Yildan (va avvalroq)',
 
@@ -1338,7 +1385,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
@@ -1415,7 +1462,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.',
@@ -1426,6 +1473,7 @@ 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ʻyxatingizga qoʻshish',
 'movepagebtn' => 'Sahifani koʻchirish',
 'pagemovedsub' => 'Sahifa qayta nomlandi',
 'movepage-moved' => '\'\'\'"$1" nomli sahifa "$2" nomli sahifaga koʻchirildi\'\'\'',
@@ -1434,7 +1482,7 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 'movetalk' => 'Mos munozara sahifasini qayta nomlash',
 'movelogpage' => 'Koʻchirish qaydlari',
 'movesubpage' => '{{PLURAL:$1|Ostsahifa|Ostsahifalar}}',
-'movesubpagetext' => 'Ushbu sahifada $1 {{PLURAL:$1| ta ostsahifa}} mavjud.',
+'movesubpagetext' => 'Ushbu sahifaning $1 ta ostsahifasi bor.',
 'movenosubpage' => 'Bu sahifa ostsahifalarga ega emas.',
 'movereason' => 'Sabab:',
 'revertmove' => 'qaytarish',
@@ -1447,7 +1495,7 @@ Umumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumi
 'export' => 'Sahifalar eksporti',
 'export-submit' => 'Eksport',
 'export-addcattext' => "Shu turkumdan sahifalarni qo'shish:",
-'export-addcat' => "Qo'shish",
+'export-addcat' => 'Qoʻshish',
 'export-addnstext' => "Shu nomfazodan sahifalarni qo'shish:",
 'export-addns' => "Qo'shish",
 'export-download' => 'Fayl sifatida saqlash',
@@ -1477,23 +1525,23 @@ Umumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumi
 'tooltip-pt-mytalk' => 'Suhbat sahifangiz',
 'tooltip-pt-anontalk' => 'Bu ip manzildan amalga oshirilgan tahrirlar munozarasi',
 'tooltip-pt-preferences' => 'Moslamalaringiz',
-'tooltip-pt-watchlist' => "Siz kuzatib borayotgan sahifalar ro'yxati.",
+'tooltip-pt-watchlist' => 'Siz kuzatib borayotgan sahifalardagi oʻzgarishlar roʻyxati',
 'tooltip-pt-mycontris' => 'Hissalaringiz roʻyxati',
 'tooltip-pt-login' => 'Bu majburiyat mavjud bo‘lmasa-da, kirishingiz taklif qilinadi.',
 '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',
 'tooltip-ca-undelete' => "Bu sahifa o'chirilmasdan oldin qilingan tahrirlarni tiklash",
 'tooltip-ca-move' => 'Bu sahifani koʻchir',
-'tooltip-ca-watch' => "Bu sahifani kuzatuv ro'yxatingizga qo'shish",
-'tooltip-ca-unwatch' => "Bu sahifani kuzatuv ro'yxatingizga o'chirish",
+'tooltip-ca-watch' => 'Bu sahifani kuzatuv roʻyxatingizga qoʻshish',
+'tooltip-ca-unwatch' => 'Bu sahifani kuzatuv roʻyxatingizdan oʻchirish',
 'tooltip-search' => '{{SITENAME}}dan qidirish',
 'tooltip-search-go' => 'Xuddi shu nomli sahifa bor boʻlsa, uni och',
 'tooltip-search-fulltext' => 'Sahifalarda ushbu matnni izlash',
@@ -1505,11 +1553,11 @@ Umumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumi
 'tooltip-n-recentchanges' => 'Wikidagi eng so‘nggi o‘zgartirishlar ro‘yxati',
 'tooltip-n-randompage' => 'Tasodifiy sahifani yuklash',
 'tooltip-n-help' => 'O‘rganish uchun manzil',
-'tooltip-t-whatlinkshere' => "Bu sahifaga bog'langan sahifalar ro'yxati",
-'tooltip-t-recentchangeslinked' => "Bu sahifa bog'langan sahifalardagi yangi o'zgarishlar",
+'tooltip-t-whatlinkshere' => 'Ushbu sahifaga bogʻlangan sahifalar roʻyxati',
+'tooltip-t-recentchangeslinked' => 'Bu sahifaga bogʻlangan sahifalardagi yangi oʻzgarishlar',
 'tooltip-feed-rss' => "Bu sahifa uchun RSS ta'minot",
 'tooltip-feed-atom' => "Bu sahifa uchun Atom ta'minot",
-'tooltip-t-contributions' => "Bu foydalanuvchinig qo'shgan hissasini ko'rish",
+'tooltip-t-contributions' => 'Bu foydalanuvchinig qoʻshgan hissasini koʻrish',
 'tooltip-t-emailuser' => 'Ushbu foydalanuvchiga xat jo‘natish',
 'tooltip-t-upload' => 'Rasmlar yoki media fayllar yuklash',
 'tooltip-t-specialpages' => 'Maxsus sahifalar ro‘yxati',
@@ -1527,10 +1575,10 @@ Umumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumi
 'tooltip-ca-nstab-category' => 'Turkum sahifasini koʻrish',
 'tooltip-minoredit' => 'Kichik o‘zgartirish sifatida belgilash',
 'tooltip-save' => 'Oʻzgarishlarni saqlash',
-'tooltip-preview' => "O'zgarishlarni saqlash. Iltimos saqlashdan oldin uni ishlating!",
-'tooltip-diff' => "Matnga qanday o'zgarishlar kiritganligingizni ko'rish.",
-'tooltip-compareselectedversions' => "Bu sahifaning ikki tanlangan versiyalari o'rtasidagi farqni ko'rish.",
-'tooltip-watch' => 'Ushbu sahifani kuzatuv ro‘yxatingizga qo‘shish',
+'tooltip-preview' => 'Oʻzgarishlarni koʻrib chiqish; Iltimos, saqlashdan oldin undan foydalaning!',
+'tooltip-diff' => 'Matnga qanday oʻzgarishlar kiritganligingizni koʻrish.',
+'tooltip-compareselectedversions' => 'Bu sahifaning ikki tanlangan versiyalari orasidagi farqni koʻrish.',
+'tooltip-watch' => 'Ushbu sahifani kuzatuv roʻyxatingizga qoʻshish',
 'tooltip-recreate' => "Bu sahifani u o'chirilgan bo'lishiga qaramasdan qayta yaratish",
 'tooltip-summary' => 'Qisqa mazmun kiriting',
 
@@ -1549,7 +1597,7 @@ Umumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumi
 'pageinfo-redirectsto' => 'Qayta yoʻnaltirish',
 
 # Skin names
-'skinname-cologneblue' => "Kyolncha sog'inch",
+'skinname-cologneblue' => 'Kyolncha sogʻinch',
 'skinname-modern' => 'Zamonaviy',
 'skinname-vector' => 'Vektor',
 
@@ -1578,7 +1626,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',
@@ -1641,7 +1689,7 @@ Umumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumi
 'size-bytes' => '$1 bayt',
 
 # Watchlist editing tools
-'watchlisttools-view' => "Muhim o'zgarishlarni ko'rish",
+'watchlisttools-view' => 'Mos oʻzgarishlar',
 'watchlisttools-edit' => 'Kuzatuv roʻyxatimni koʻrish/oʻzgartirish',
 'watchlisttools-raw' => 'Kuzatuv roʻyxatimni tahrirlash',
 
@@ -1658,14 +1706,16 @@ 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',
 'htmlform-selectorother-other' => 'Boshqa',
 
 # New logging system
+'logentry-delete-delete' => '$1 $3 sahifasini {{GENDER:$2|oʻchirdi}}',
 'logentry-move-move' => '$1 $3 sahifasini $4ga koʻchirdi',
+'logentry-move-move-noredirect' => '$1 $3 sahifasini $4ga {{GENDER:$2|koʻchirdi}}',
 'logentry-patrol-patrol-auto' => '$1 $3 sahifasining $4 versiyasini avtomatik patrulladi',
 'logentry-newusers-newusers' => '$1 hisob yozuvi yaratildi',
 'logentry-newusers-create' => '$1 hisob yozuvi yaratildi',
index c1070f0..2d5df65 100644 (file)
@@ -13,6 +13,8 @@
  * @author Frigotoni
  * @author GatoSelvadego
  * @author Kaganer
+ * @author Malafaya
+ * @author Nemo bis
  * @author Nick1915
  * @author Omnipaedista
  * @author OrbiliusMagister
@@ -396,7 +398,6 @@ $1',
 'disclaimers' => 'Avertense',
 'disclaimerpage' => 'Project:Avertense xenerali',
 'edithelp' => 'Guida',
-'edithelppage' => 'Help:Modifega',
 'helppage' => 'Help:Ajuto',
 'mainpage' => 'Pajina prinsipałe',
 'mainpage-description' => 'Pajina prinsipałe',
@@ -573,10 +574,13 @@ Nó desmentegarte de personałixare łe [[Special:Preferences|prefarense de {{SI
 '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' => 'Tiente in mente chi son',
-'userlogin-signwithsecure' => 'Entra con un server seguro',
+'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.',
@@ -597,13 +601,30 @@ Nó desmentegarte de personałixare łe [[Special:Preferences|prefarense de {{SI
 '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.",
@@ -635,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.",
@@ -682,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?',
@@ -700,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',
@@ -1160,7 +1181,6 @@ I detaji i pol esar catai inte'l [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'searchmenu-legend' => 'Opzion de riserca',
 'searchmenu-exists' => 'Su sto sito ghe xe na pagina che se ciama "[[:$1]]"',
 'searchmenu-new' => "'''Crèa la pagina \"[[:\$1]]\" su sta wiki!'''",
-'searchhelp-url' => 'Help:Ajuto',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Varda tute le pagine che taca co ste létere]]',
 'searchprofile-articles' => 'Pagine de contenuti',
 'searchprofile-project' => 'Pagine de progeto e de ajuto',
@@ -1182,7 +1202,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',
@@ -1202,6 +1222,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à.)',
+'search-error' => 'Se gà verifegà un eror durante la riserca: $1',
 
 # Preferences page
 'preferences' => 'Prefarense',
@@ -1234,7 +1255,7 @@ Prova a métarghe \"all:\" davanti al testo che te serchi par vardar in tuti i n
 'saveprefs' => 'Salva le preferense',
 'resetprefs' => 'Reinposta le preferense',
 'restoreprefs' => 'Ripristina le inpostassion predefinìe',
-'prefs-editing' => 'Dimension de la casela de modifica',
+'prefs-editing' => 'Canbiamento',
 'prefs-edit-boxsize' => 'Dimension de la finestra de modìfega.',
 'rows' => 'Righe:',
 'columns' => 'Cołone:',
@@ -1343,6 +1364,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:',
@@ -1486,7 +1508,7 @@ Co qualcheduni te scrivarà, nol vedarà mia el to indirizo.',
 'recentchanges-label-bot' => 'Sta modifica el la ga fata un bot',
 'recentchanges-label-unpatrolled' => 'Sta modifica no la xe stà gnancora verificà',
 'rcnote' => "Qua soto se vede {{PLURAL:$1|l'ultimo canbiamento|i ultimi '''$1''' canbiamenti}} {{PLURAL:$2|in te l'ultimo zorno|in tei ultimi '''$2''' zorni}}, fin a le $5 del $4.",
-'rcnotefrom' => " Qui di seguito sono elencate le modifiche da '''$2''' (fino a '''$1''').",
+'rcnotefrom' => "Qui di seguito sono elencate le modifiche da '''$2''' (fino a '''$1''').",
 'rclistfrom' => 'Fà védar i canbiamenti fati dal $1',
 'rcshowhideminor' => '$1 i canbiamenti picenini',
 'rcshowhidebots' => '$1 i bot',
@@ -1894,6 +1916,7 @@ Vien considerae pàjine de dixanbiguasion tute cuełe che łe ga drento i modeł
 
 '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à',
 
@@ -2059,6 +2082,15 @@ Xe nesesario almanco un dominio de primo liveło, tipo "*.org".<br />
 'listusers-noresult' => 'Nissun utente el risponde ai criteri inpostà.',
 'listusers-blocked' => '(blocà)',
 
+# Special:ActiveUsers
+'activeusers' => 'Lista dei utenti ativi',
+'activeusers-intro' => 'Sta qua xe la lista dei utenti che ga fato calcossa {{PLURAL:$1|sto ultimo zorno|sti ultimi $1 zorni}}.',
+'activeusers-count' => "$1 {{PLURAL:$1|asion}} {{PLURAL:$3|inte'l ultimo xorno|inte i ultimi $3 xorni}}",
+'activeusers-from' => 'Fà védar i utenti a partir da:',
+'activeusers-hidebots' => 'Scondi i bot',
+'activeusers-hidesysops' => 'Scondi i aministradori',
+'activeusers-noresult' => 'Nissun utente catà.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Diriti dei grupi utenti',
 'listgrouprights-summary' => 'Sta qua la xe na lista dei grupi de utenti definìi su sta wiki, coi diriti asocià a ognuno.
@@ -2136,8 +2168,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}}.',
@@ -2536,6 +2568,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à',
@@ -2882,6 +2915,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}})',
@@ -2985,11 +3019,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:
 
@@ -3017,7 +3065,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',
@@ -3195,7 +3243,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',
@@ -3607,12 +3655,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à',
@@ -3704,6 +3757,7 @@ Le imagini le vien mostrà a la risoluzion pi granda che se pol, par i altri tip
 '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',
@@ -3712,15 +3766,15 @@ Le imagini le vien mostrà a la risoluzion pi granda che se pol, par i altri tip
 # New logging system
 '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 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-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',
@@ -3729,20 +3783,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
index 6647ce6..16d7b5b 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',
@@ -329,7 +327,6 @@ $1",
 'disclaimers' => 'Pučind vastusenpidandaspäi',
 'disclaimerpage' => 'Project:Pučind vastusenpidandaspäi',
 'edithelp' => 'Abu redaktiruindas',
-'edithelppage' => 'Help:Abu redaktiruindas',
 'helppage' => 'Help:südäiolend',
 'mainpage' => 'Pälehtpol’',
 'mainpage-description' => 'Pälehtpol’',
@@ -929,7 +926,6 @@ Tö ei voigoi kävutada sidä.',
 'searchmenu-legend' => 'Ecindan järgendused',
 'searchmenu-exists' => "'''Neciš Wikiš om jo lehtpol' ningoižen nimenke: \"[[:\$1]]\"'''",
 'searchmenu-new' => "'''Säta lehtpol' \"[[:\$1]]\" neciš Wikiš!'''",
-'searchhelp-url' => 'Help:Südäiolend',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ozutada kaik lehtpoled necen prefiksanke]]',
 'searchprofile-articles' => 'Südäimištlehtpoled',
 'searchprofile-project' => 'Abun da projektoiden lehtpoled',
@@ -974,14 +970,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 +1397,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 +1736,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 +2358,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 +2435,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 +2460,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 +2592,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 +2940,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 24cbba7..847cbcd 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' ),
@@ -320,8 +343,8 @@ $messages = array(
 'tog-watchmoves' => 'Tự động theo dõi các trang và tập tin tôi di chuyển',
 'tog-watchdeletion' => 'Tự động theo dõi các trang và tập tin tôi xóa',
 'tog-minordefault' => 'Mặc định đánh dấu tất cả sửa đổi của tôi là sửa đổi nhỏ',
-'tog-previewontop' => 'Hiển thị phần xem thử nằm trên hộp sửa đổi',
-'tog-previewonfirst' => 'Hiện xem thử tại lần sửa đầu tiên',
+'tog-previewontop' => 'Hiển thị phần xem trước nằm trên hộp sửa đổi',
+'tog-previewonfirst' => 'Hiện xem trước tại lần sửa đầu tiên',
 'tog-nocache' => 'Không lưu trang trong bộ nhớ đệm trình duyệt',
 'tog-enotifwatchlistpages' => 'Gửi thư cho tôi khi có thay đổi tại trang hoặc tập tin tôi theo dõi',
 'tog-enotifusertalkpages' => 'Gửi thư cho tôi khi có thay đổi tại trang thảo luận của tôi',
@@ -331,7 +354,7 @@ $messages = array(
 '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-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-uselivepreview' => 'Xem trước 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',
 'tog-watchlisthideown' => 'Ẩn các sửa đổi của tôi khỏi danh sách theo dõi',
 'tog-watchlisthidebots' => 'Ẩn các sửa đổi của robot khỏi danh sách theo dõi',
@@ -408,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}}',
@@ -489,6 +524,7 @@ $messages = array(
 'create-this-page' => 'Tạo trang này',
 'delete' => 'Xóa',
 'deletethispage' => 'Xóa trang này',
+'undeletethispage' => 'Phục hồi trang này',
 'undelete_short' => 'Phục hồi {{PLURAL:$1|một sửa đổi|$1 sửa đổi}}',
 'viewdeleted_short' => 'Xem {{PLURAL:$1|sửa đổi|$1 sửa đổi}} đã xóa',
 'protect' => 'Khóa',
@@ -542,14 +578,13 @@ $1',
 'disclaimers' => 'Phủ nhận',
 'disclaimerpage' => 'Project:Phủ nhận chung',
 'edithelp' => 'Trợ giúp sửa đổi',
-'edithelppage' => 'Help:Sửa đổi',
 'helppage' => 'Help:Nội dung',
 'mainpage' => 'Trang Chính',
 'mainpage-description' => 'Trang Chính',
 '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',
@@ -686,6 +721,8 @@ $2',
 'namespaceprotected' => "Bạn không có quyền sửa các trang trong không gian tên '''$1'''.",
 'customcssprotected' => 'Bạn không có quyền sửa đổi trang CSS này vì nó chứa các tùy chọn cá nhân của một thành viên khác.',
 'customjsprotected' => 'Bạn không có quyền sửa đổi trang JavaScript này vì nó chứa các tùy chọn cá nhân của một thành viên khác.',
+'mycustomcssprotected' => 'Bạn không có quyền sửa đổi trang CSS này.',
+'mycustomjsprotected' => 'Bạn không có quyền sửa đổi trang JavaScript này.',
 'ns-specialprotected' => 'Không thể sửa chữa các trang trong không gian tên {{ns:special}}.',
 'titleprotected' => "Tựa đề này đã bị [[User:$1|$1]] khóa không cho tạo ra.
 Lý do được cung cấp là ''$2''.",
@@ -710,9 +747,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.',
@@ -725,18 +771,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.',
@@ -764,7 +830,7 @@ 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 $1 giờ đồng hồ một lần.',
 'mailerror' => 'Lỗi gửi thư : $1',
@@ -778,7 +844,7 @@ Hãy nhập một địa chỉ có định dạng đúng hoặc bỏ trống ô
 'cannotchangeemail' => 'Không có thể thay đổi địa chỉ thư điện tử của các tài khoản trên wiki này.',
 'emaildisabled' => 'Website này không thể gửi thư điện tử.',
 'accountcreated' => 'Mở tài khoản thành công',
-'accountcreatedtext' => 'Tài khoản thành viên cho $1 đã được mở.',
+'accountcreatedtext' => 'Tài khoản thành viên cho [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|thảo luận]]) đã được mở.',
 'createaccount-title' => 'Tài khoản mới tại {{SITENAME}}',
 'createaccount-text' => 'Ai đó đã tạo một tài khoản với tên $2 tại {{SITENAME}} ($4). Mật khẩu của "$2" là "$3". Bạn nên đăng nhập và đổi mật khẩu ngay bây giờ.
 
@@ -812,13 +878,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',
@@ -849,7 +917,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ử',
@@ -890,8 +958,8 @@ Mật khẩu tạm: $2',
 'watchthis' => 'Theo dõi trang này',
 'savearticle' => 'Lưu trang',
 'preview' => 'Xem trước',
-'showpreview' => 'Xem thử',
-'showlivepreview' => 'Xem thử nhanh',
+'showpreview' => 'Xem trước',
+'showlivepreview' => 'Xem trước nhanh',
 'showdiff' => 'Xem thay đổi',
 'anoneditwarning' => "'''Cảnh báo:''' Bạn chưa đăng nhập. Địa chỉ IP của bạn sẽ được ghi lại trong lịch sử sửa đổi của trang.",
 'anonpreviewwarning' => "''Bạn chưa đăng nhập. Khi lưu trang này, địa chỉ IP của bạn sẽ được ghi vào lịch sử trang.''",
@@ -972,14 +1040,14 @@ Xem chi tiết trong [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'usercsspreview' => "'''Hãy nhớ rằng bạn chỉ đang xem thử trang CSS cá nhân của bạn.
 Nó chưa được lưu!'''",
 'userjspreview' => "'''Nhớ rằng bạn chỉ đang kiểm thử/xem thử trang JavaScript, nó chưa được lưu!'''",
-'sitecsspreview' => "'''Nhớ rằng bạn chỉ đang xem thử bản CSS này.'''
+'sitecsspreview' => "'''Nhớ rằng bạn chỉ đang xem trước bản CSS này.'''
 '''Nó chưa được lưu!'''",
-'sitejspreview' => "'''Nhớ rằng bạn chỉ đang kiểm thử/xem thử bản JavaScript này.
+'sitejspreview' => "'''Nhớ rằng bạn chỉ đang xem trước bản JavaScript này.
 '''Nó chưa được lưu!'''",
 'userinvalidcssjstitle' => "'''Cảnh báo:''' Không có skin “$1”. Hãy nhớ rằng các trang .css và .js tùy chỉnh sử dụng tiêu đề chữ thường, như {{ns:user}}:Ví&nbsp;dụ/vector.css chứ không phải {{ns:user}}:Ví&nbsp;dụ/Vector.css.",
 'updated' => '(Cập nhật)',
 'note' => "'''Ghi chú:'''",
-'previewnote' => "'''Đây chỉ mới là xem thử.'''
+'previewnote' => "'''Đây chỉ mới là bản xem trước.'''
 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.',
@@ -1057,6 +1125,7 @@ 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',
@@ -1064,7 +1133,7 @@ Nó đã tồn tại.',
 '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 “{{int:prefs-editing}}” trong tùy chọn cá nhâ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',
@@ -1305,7 +1374,6 @@ Xem chi tiết trong [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'searchmenu-legend' => 'Tùy chọn tìm kiếm',
 'searchmenu-exists' => "* Trang '''[[$1]]'''",
 'searchmenu-new' => "'''Tạo trang “[[:$1]]” trên wiki này!'''",
-'searchhelp-url' => 'Help:Nội dung',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Duyệt các trang với tiền tố này]]',
 'searchprofile-articles' => 'Trang nội dung',
 'searchprofile-project' => 'Trang trợ giúp và trang dự án',
@@ -1356,7 +1424,7 @@ Xem chi tiết trong [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'prefsnologintext' => 'Bạn phải <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} đăng nhập]</span> để thiết lập tùy chọn cá nhân.',
 'changepassword' => 'Đổi mật khẩu',
 'prefs-skin' => 'Hình dạng',
-'skin-preview' => 'Xem thử',
+'skin-preview' => 'Xem trước',
 'datedefault' => 'Không quan tâm',
 'prefs-beta' => 'Tính năng beta',
 'prefs-datetime' => 'Ngày tháng',
@@ -1491,6 +1559,8 @@ 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.',
+'userrights-removed-self' => 'Bạn đã loại bỏ quyền của chính mình nên không còn truy cập được trang này.',
 
 # Groups
 'group' => 'Nhóm:',
@@ -1560,7 +1630,11 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao c
 'right-editinterface' => 'Sửa giao diện người dùng',
 'right-editusercssjs' => 'Sửa tập tin CSS và JS của người dùng khác',
 'right-editusercss' => 'Sửa tập tin CSS của người dùng khác',
-'right-edituserjs' => 'Sửa tập tin JS của người dùng khác',
+'right-edituserjs' => 'Sửa đổi tập tin JavaScript của người dùng khác',
+'right-editmyusercss' => 'Sửa đổi tập tin CSS cá nhân của mình',
+'right-editmyuserjs' => 'Sửa đổi tập tin JavaScript cá nhân của mình',
+'right-viewmywatchlist' => 'Xem danh sách theo dõi của mình',
+'right-editmywatchlist' => 'Sửa đổi danh sách theo dõi của mình – một số tác vụ có thể thêm trang vào danh sách bất chấp quyền này',
 'right-rollback' => 'Nhanh chóng lùi tất cả sửa đổi của người dùng cuối cùng sửa đổi trang nào đó',
 'right-markbotedits' => 'Đánh dấu sửa đổi phục hồi là sửa đổi bot',
 'right-noratelimit' => 'Không bị ảnh hưởng bởi mức giới hạn tần suất sử dụng',
@@ -1622,6 +1696,8 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao c
 'action-userrights-interwiki' => 'sửa đổi quyền của người dùng tại wiki khác',
 'action-siteadmin' => 'khóa hoặc mở khóa cơ sở dữ liệu',
 'action-sendemail' => 'gửi thư điện tử',
+'action-editmywatchlist' => 'sửa đổi danh sách theo dõi của mình',
+'action-viewmywatchlist' => 'xem danh sách theo dõi của mình',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|thay đổi|thay đổi}}',
@@ -1812,7 +1888,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.',
@@ -2224,6 +2300,15 @@ Xem thêm [[Special:WantedCategories|thể loại cần thiết]].',
 'listusers-noresult' => 'Không thấy thành viên.',
 'listusers-blocked' => '(bị cấm)',
 
+# Special:ActiveUsers
+'activeusers' => 'Danh sách thành viên tích cực',
+'activeusers-intro' => 'Dánh sách này liệt kê các thành viên đã hoạt động cách nào đó trong $1 ngày qua.',
+'activeusers-count' => '$1 tác vụ trong {{PLURAL:$3|ngày|$3 ngày}} qua',
+'activeusers-from' => 'Hiển thị thành viên bắt đầu từ:',
+'activeusers-hidebots' => 'Ẩn robot',
+'activeusers-hidesysops' => 'Ẩn bảo quản viên',
+'activeusers-noresult' => 'Không thấy thành viên.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'Nhóm thành viên',
 'listgrouprights-summary' => 'Dưới đây là danh sách nhóm thành viên được định nghĩa tại wiki này, với mức độ truy cập của từng nhóm.
@@ -2301,8 +2386,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}}.',
@@ -2550,7 +2635,7 @@ $1',
 'mycontris' => 'Đóng góp',
 'contribsub2' => 'Của $1 ($2)',
 'nocontribs' => 'Không tìm thấy thay đổi nào khớp với yêu cầu.',
-'uctop' => '(mới nhất)',
+'uctop' => '(hiện tại)',
 'month' => 'Từ tháng (trở về trước):',
 'year' => 'Từ năm (trở về trước):',
 
@@ -2783,7 +2868,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',
@@ -2874,6 +2959,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',
@@ -3027,7 +3114,6 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
 '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 */',
@@ -3170,7 +3256,7 @@ Nếu thực thi nó máy tính của bạn có thể bị tiếm quyền.",
 'svg-long-desc-animated' => 'tập tin hình động SVG, $1×$2 điểm ảnh trên danh nghĩa, kích thước: $3',
 'svg-long-error' => 'Tập tin SVG có lỗi: $1',
 'show-big-image' => 'Độ phân giải tối đa',
-'show-big-image-preview' => 'Kích thước của ảnh xem thử: $1.',
+'show-big-image-preview' => 'Kích thước của hình xem trước: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Độ phân giải|Các độ phân giải}} khác: $1.',
 'show-big-image-size' => '$1×$2 điểm ảnh',
 'file-info-gif-looped' => 'có lặp',
@@ -3203,11 +3289,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:
 
@@ -3216,8 +3316,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ể',
@@ -3277,7 +3375,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',
@@ -3457,7 +3555,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',
@@ -3820,7 +3918,7 @@ Xin hãy xác nhận bạn thực sự muốn tạo lại trang này.",
 # Live preview
 'livepreview-loading' => 'Đang tải…',
 'livepreview-ready' => 'Đang tải… Xong!',
-'livepreview-failed' => 'Không thể xem thử trực tiếp! Hãy dùng thử chế độ xem thử thông thường.',
+'livepreview-failed' => 'Không thể xem trước trực tiếp! Hãy dùng thử chế độ xem trước thông thường.',
 'livepreview-error' => 'Không thể kết nối: $1 “$2”. Hãy dùng thử chế độ xem thử thông thường.',
 
 # Friendlier slave lag warnings
@@ -3942,12 +4040,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',
@@ -4038,6 +4141,9 @@ 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',
index 926cb12..f757a10 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',
@@ -242,7 +239,6 @@ $1",
 'disclaimers' => 'Imbräsum',
 'disclaimerpage' => 'Project:Imbräsum',
 'edithelp' => 'Hilfe dsum beärbâdn',
-'edithelppage' => 'Help:Beärbâdn',
 'helppage' => 'Help:Inhalds-fârdsajchnis',
 'mainpage' => 'Haubdsajdn',
 'mainpage-description' => 'Haubdsajdn',
@@ -483,14 +479,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 +642,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,26 +864,11 @@ 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. */',
 
 # Scripts
 'common.js' => '/* Des folchende JavaScript wird fir ale benudsâr glôôdn un fir ale sajdn, dii se ôôgugn. */',
@@ -935,7 +908,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..ec64fa0 100644 (file)
@@ -7,6 +7,8 @@
  * @ingroup Language
  * @file
  *
+ * @author Geitost
+ * @author Iketsi
  * @author Kaganer
  * @author Malafaya
  * @author Reedy
@@ -118,7 +120,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Klänedön redakamis pezepöl in lised votükamas nulik.',
 'tog-newpageshidepatrolled' => 'Klänedön padis pezepöl in lised padas nulik',
 'tog-extendwatchlist' => 'Stäänükön galädalisedi ad jonön votükamis tefik valik, e no te nulikünos',
-'tog-usenewrc' => 'Gebön votükamis nulik patik (me JavaScript)',
+'tog-usenewrc' => 'Grupön votükamis pado in votukäms nulik e galädalised (me JavaScript)',
 'tog-numberheadings' => 'Givön itjäfidiko nümis dilädatiädes',
 'tog-showtoolbar' => 'Jonön redakamastumemi (JavaScript)',
 'tog-editondblclick' => 'Dälön redakön padis pö drän telik mugaknopa (JavaScript)',
@@ -126,23 +128,21 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Dälön redakami diläda me klik mugaknopa detik su dilädatiäds (JavaScript)',
 'tog-showtoc' => 'Jonön ninädalisedi (su pads labü diläds plu 3)',
 'tog-rememberpassword' => 'Dakipolös nunädamanünis obik in bevüresodatävöm at (muiko {{PLURAL:$1|del|dels}} $1)',
-'tog-watchcreations' => 'Läükön padis fa ob pejafölis lä galädalised obik',
-'tog-watchdefault' => 'Läükön padis fa ob peredakölis la galädalised obik',
-'tog-watchmoves' => 'Läükön padis fa ob petopätükölis lä galädalised obik',
-'tog-watchdeletion' => 'Läükön padis fa ob pemoükölis lä galädalised obik',
+'tog-watchcreations' => 'Läükön padis fa ob pejafölis e ragivis fa ob pelöpükölis lä galädalised obik',
+'tog-watchdefault' => 'Läükön padis e ragivis fa ob peredakölis la galädalised obik',
+'tog-watchmoves' => 'Läükön padis e ragivis fa ob petopätükölis lä galädalised obik',
+'tog-watchdeletion' => 'Läükön padis e ragivis fa ob pemoükölis lä galädalised obik',
 'tog-minordefault' => 'Bepenön redakamis no pebepenölis valikis asä pülikis',
 'tog-previewontop' => 'Jonön büologedi bü redakaspad',
 'tog-previewonfirst' => 'Jonön büologedi pö redakam balid',
 'tog-nocache' => 'Nejäfidükön el "cache" padas in bevüresodatävöm',
-'tog-enotifwatchlistpages' => 'Sedön obe penedi leäktronik ven ek votükon padi se galädalised obik',
+'tog-enotifwatchlistpages' => 'Sedön obe penedi leäktronik ven ek votükon padi u ragivi se galädalised obik',
 'tog-enotifusertalkpages' => 'Sedön obe penedi leäktronik ven gebanapad obik pavotükon',
-'tog-enotifminoredits' => 'Sedön obe penedi leäktronik igo pö padavotükams pülik',
+'tog-enotifminoredits' => 'Sedön obe penedi leäktronik igo pö votükams pülik padas e ragivas',
 'tog-enotifrevealaddr' => 'Jonön ladeti leäktronik oba in nunapeneds.',
 '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',
@@ -215,6 +215,18 @@ $messages = array(
 'oct' => 'tob',
 'nov' => 'nov',
 'dec' => 'dek',
+'january-date' => 'yanul $1',
+'february-date' => 'febul $1',
+'march-date' => 'mäzul $1',
+'april-date' => 'prilul $1',
+'may-date' => 'mayul $1',
+'june-date' => 'yunul $1',
+'july-date' => 'yulul $1',
+'august-date' => 'gustul $1',
+'september-date' => 'setul $1',
+'october-date' => 'tobul $1',
+'november-date' => 'novul $1',
+'december-date' => 'dekul $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Klad|Klads}}',
@@ -231,14 +243,16 @@ $messages = array(
 'category-file-count' => '{{PLURAL:$2|Klad at labon te ragivi sököl.|{{PLURAL:$1|Ragiv sököl binon |Ragivs sököl $1 binons}} in klad at, se $2.}}',
 'category-file-count-limited' => '{{PLURAL:$1|Ragiv sököl binon|Ragivs sököl $1 binons}} in klad at.',
 'listingcontinuesabbrev' => '(fov.)',
+'index-category' => 'Pads mafädanumöls',
+'noindex-category' => 'Pads nemafädanumöls',
 
 'about' => 'Tefü',
 'article' => 'Ninädapad',
 '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',
@@ -289,6 +303,7 @@ $messages = array(
 'create-this-page' => 'Jafön padi at',
 'delete' => 'Moükön',
 'deletethispage' => 'Moükolös padi at',
+'undeletethispage' => 'Sämoükön padi at',
 'undelete_short' => 'Sädunön moükami {{PLURAL:$1|redakama bal|redakamas $1}}',
 'viewdeleted_short' => 'Logön {{PLURAL:$1|redakami pemoüköl bal|redakamis pemoüköls $1}}',
 'protect' => 'Jelön',
@@ -335,7 +350,6 @@ $messages = array(
 'disclaimers' => 'Nuneds',
 'disclaimerpage' => 'Project:Gididimiedükam valemik',
 'edithelp' => 'Redakamayuf',
-'edithelppage' => 'Help:Redakam',
 'helppage' => 'Help:Ninäd',
 'mainpage' => 'Cifapad',
 'mainpage-description' => 'Cifapad',
@@ -360,6 +374,7 @@ $messages = array(
 'youhavenewmessagesfromusers' => 'Labol $1 de {{PLURAL:$3|geban votik|gebans $3}} ($2).',
 'youhavenewmessagesmanyusers' => 'Labol $1 de gebans mödik ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|nuni nulik|nunis nulik}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|votükam|votükams}} lätik',
 'youhavenewmessagesmulti' => 'Labol nunis nulik su $1',
 'editsection' => 'redakön',
 'editold' => 'redakön',
@@ -408,9 +423,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“
@@ -444,6 +459,7 @@ Atos kösömiko jenon sekü difa- u jenotemayüm dädik (o.b. lü pad pemoüköl
 'badarticleerror' => 'Dun at no kanon paledunön su pad at.',
 'cannotdelete' => 'No emögos ad moükön padi u ragivi: "$1".
 Ba ya pemoükon fa geban votik.',
+'cannotdelete-title' => 'No kanoy moükön padi: "$1"',
 'badtitle' => 'Tiäd badik',
 'badtitletext' => 'Padatiäd peflagöl äbinon nelonöfik, vägik, u ba yüm bevüpükik u bevüvükik dädik. Mögos, das ninädon malati(s), kel(s) no dalon(s) pagebön ad jafön tiädis.',
 'perfcached' => 'Nüns sököl ekömons se el caché e ba no binons anuik. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
@@ -453,20 +469,22 @@ Ba ya pemoükon fa geban votik.',
 Dun: $1<br />
 Beg: $2',
 'viewsource' => 'Logön fonäti',
+'viewsource-title' => 'Logön fonäti pada: "$1"',
 'actionthrottled' => 'Dun pemiedükon',
 'actionthrottledtext' => 'Ad tadunön reklamami itjäfidik (el „spam“), dunot at no padälon tu suvo dü brefüp. Ya erivol miedi gretikün. Steifülolös nogna pos minuts anik.',
 'protectedpagetext' => 'Pad at pejelon ad neletön redakami.',
 'viewsourcetext' => 'Kanol logön e kopiedön fonätakoti pada at:',
 'protectedinterface' => 'Pad at jafon vödemis sitanünas, ed anu pelökofärmükon ad vitön migebis.',
-'editinginterface' => "'''Nuned:''' Anu redakol padi, kel labükon vödemis bevüik pro programem.
+'editinginterface' => "'''Nuned:''' redakol padi, kel labükon vödemis bevüik pro programem.
 Votükams pada at oflunons logoti gebanasita pro gebans votik.
-Ad tradutön vödemis, demolös gebi ela [//translatewiki.net/wiki/Main_Page?setlang=vo translatewiki.net]: topükamaproyeg ela MediaWiki.",
+Ad läükön u votükön tradutodis pro els wiki valik, demolös gebi ela [//translatewiki.net/?setlang=vo translatewiki.net]: topükamaproyeg ela MediaWiki.",
 'sqlhidden' => '(SQL beg peklänedon)',
 'cascadeprotected' => 'Pad at pejelon ta redakam, bi pakeninükon fa {{PLURAL:$1|pad|pads}} sököl, kels pejelons ma „jänajel“: $2',
 'namespaceprotected' => "No dalol redakön padis in nemaspad: '''$1'''.",
 'ns-specialprotected' => 'Pads patik no kanons paredakön.',
 'titleprotected' => "Jaf tiäda at penemögükon fa geban: [[User:$1|$1]].
 Kod binon: ''$2''.",
+'exception-nologin' => 'No enunädol oli',
 
 # Virus scanner
 'virus-badscanner' => "Parametem badik: program tavirudik nesevädik: ''$1''",
@@ -478,11 +496,20 @@ Kod binon: ''$2''.",
 
 Kanol laigebön {{SITENAME}} nennemiko, u kanol <span class='plainlinks'>[$1 nunädön oli dönu]</span> me gebananem ot u gebenanem votik.
 Küpälolös, das pads anik ba nog pojenons äsva no esenunädol oli, jüs uklinükol memi no laidüpik bevüresodanaföma olik.",
+'welcomeuser' => 'Benokömö, o $1!',
 'yourname' => 'Gebananem:',
+'userlogin-yourname' => 'Gebananem',
+'userlogin-yourname-ph' => 'Penolös gebananemi olik',
 'yourpassword' => 'Letavöd:',
+'userlogin-yourpassword' => 'Letavöd',
+'userlogin-yourpassword-ph' => 'Penolös letavödi olik',
+'createacct-yourpassword-ph' => 'Penolös letavödi',
 'yourpasswordagain' => 'Klavolös dönu letavödi:',
+'createacct-yourpasswordagain' => 'Fümedolös letavödi',
+'createacct-yourpasswordagain-ph' => 'Penolös letavödi dönu',
 'remembermypassword' => 'Dakipolöd ninädamanünis obik in nünöm at (muiko {{PLURAL:$1|del|dels}} $1)',
 'yourdomainname' => 'Domen olik:',
+'password-change-forbidden' => 'No kanol votükön letavödis su el wiki at.',
 'externaldberror' => 'U ejenon fümükamapöl plödik nünödema, u no dalol atimükön kali plödik ola.',
 'login' => 'Nunädolös obi',
 'nav-login-createaccount' => 'Nunädön oki / jafön kali',
@@ -492,13 +519,20 @@ Küpälolös, das pads anik ba nog pojenons äsva no esenunädol oli, jüs uklin
 'logout' => 'Senunädön oki',
 'userlogout' => 'Senunädön oki',
 'notloggedin' => 'No enunädol oli',
-'nologin' => "No labol-li kali? '''$1'''.",
+'userlogin-noaccount' => 'No labol-li kali?',
+'userlogin-joinproject' => 'Sogolös oki lä {{SITENAME}}',
+'nologin' => 'No labol-li kali? $1.',
 'nologinlink' => 'Jafolös bali',
 'createaccount' => 'Jafön kali',
 'gotaccount' => "Ya labol-li kali? '''$1'''.",
 'gotaccountlink' => 'Nunädolös obi',
+'userlogin-resetlink' => 'Eglömol-li nünis kala olik?',
 'createaccountmail' => 'me pot leäktronik',
 'createaccountreason' => 'Kod:',
+'createacct-reason' => 'Kod',
+'createacct-submit' => 'Jafön kali olik',
+'createacct-benefit-body1' => '{{PLURAL:$1|redakam|redakams}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pad|pads}}',
 'badretype' => 'Letavöds fa ol pepenöls no leigons.',
 'userexists' => 'Gebananem at ya pagebon.
 Välolös, begö! nemi votik.',
@@ -570,10 +604,17 @@ Ba ya evotükol benosekiko letavödi olik, u ya ebegol benosekiko letavödi nela
 'passwordreset' => 'Dönuvälön letavödi',
 'passwordreset-legend' => 'Dönuvälön letavödi',
 'passwordreset-username' => 'Gebananem:',
+'passwordreset-domain' => 'Domen:',
 'passwordreset-email' => 'Ladet leäktronik:',
 
 # Special:ChangeEmail
+'changeemail' => 'Votükön ladeti leäktronik',
+'changeemail-header' => 'Votükön ladeti leäktronik kala',
+'changeemail-oldemail' => 'Ladet leäktronik anuik:',
+'changeemail-newemail' => 'Ladet leäktronik nulik:',
 'changeemail-none' => '(nonik)',
+'changeemail-password' => 'Letavöd olik su {{SITENAME}}:',
+'changeemail-submit' => 'Votükön ladeti leäktronik',
 'changeemail-cancel' => 'Stöpädön',
 
 # Edit page toolbar
@@ -643,7 +684,7 @@ Ladet-IP olik binon $3, e nüm blokama at binon #$5. Mäniotolös nünis löpik
 'nosuchsectiontitle' => 'Diläd no petuvöl',
 'nosuchsectiontext' => 'Esteifülol ad redakön dilädi no dabinöli.',
 'loginreqtitle' => 'Nunädam Paflagon',
-'loginreqlink' => 'ninädolös obi',
+'loginreqlink' => 'nunädolös obi',
 'loginreqpagetext' => 'Mutol $1 ad logön padis votik.',
 'accmailtitle' => 'Letavöd pesedon.',
 'accmailtext' => "Letavöd fädik pro [[User talk:$1|$1]] pasedon lü $2.
@@ -656,6 +697,8 @@ If binol is pölo, välolös knopi: '''geikön''' bevüresodatävöma olik.",
 'anontalkpagetext' => "----''Bespikapad at duton lü geban nennemik, kel no nog ejafon kali, u no vilon labön u gebön oni. Sekü atos pemütobs ad gebön ladeti-IP ad dientifükön gebani at. Ladets-IP kanons pagebön fa gebans difik. If binol geban nennemik e cedol, das küpets netefik pelüodükons ole, [[Special:UserLogin|jafolös, begö! kali]], u [[Special:UserLogin|nunädolös oli]] ad vitön kofudi ko gebans nennemik votik.''",
 'noarticletext' => 'Atimo no dabinon vödem su pad at.
 Kanol [[Special:Search/{{PAGENAME}}|sukön padatiädi at]] su pads votik, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sukön in jenotaliseds tefik] u [{{fullurl:{{FULLPAGENAME}}|action=edit}} redakön padi at]</span>.',
+'noarticletext-nopermission' => 'Atimo no dabinon vödem su pad at.
+Kanol [[Special:Search/{{PAGENAME}}|sukön padatiädi at]] su pads votik u <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sukön in jenotaliseds tefik], ab no labol gitätis ad jafön padi at.',
 'userpage-userdoesnotexist' => 'Gebanakal: "<nowiki>$1</nowiki>" no peregistaron. Fümükolös, va vilol jäfön/redakön padi at.',
 'userpage-userdoesnotexist-view' => 'Gebenakal: "$1" no peregistaron.',
 'clearyourcache' => "'''Prudö!''' Pos dakip buükamas, mögos, das ozesüdos ad nedemön memi nelaidüpik bevüresodatävöma ad logön votükamis.
@@ -672,7 +715,9 @@ Kanol [[Special:Search/{{PAGENAME}}|sukön padatiädi at]] su pads votik, <span
 Memolös, das pads: .css e .js mutons labön tiädi minudik: {{ns:user}}:Foo/vector.css, no {{ns:user}}:Foo/Vector.css.",
 'updated' => '(peatimükon)',
 'note' => "'''Penet:'''",
-'previewnote' => "'''Is pajonon te büologed; votükams no nog pedakipons!'''",
+'previewnote' => "'''Memolös, das is pajonon te büologed.'''
+Votükams olik no nog pedakipons!",
+'continue-editing' => 'Golön ad spadäd redakama',
 'previewconflict' => 'Büologed at jonon vödemi in redakamaspad löpik soäsä opubon if odakipol oni.',
 'session_fail_preview' => "'''Pidö! No emögos ad lasumön votükamis olik kodü per redakamanünodas.<br />Steifülolös dönu. If no oplöpol, tän senunädolös e genunädolös oli, e steifülolös nogna.'''",
 'session_fail_preview_html' => "'''Liedo no eplöpos ad zepön redakami olik kodü per nünodas.'''
@@ -728,10 +773,10 @@ Kanol redakön padi dabinöl, u [[Special:UserLogin|nunädön oli u jafön kali]
 'permissionserrors' => 'Dälapöls',
 'permissionserrorstext' => 'No dalol dunön atosi sekü {{PLURAL:$1|kod|kods}} sököl:',
 'permissionserrorstext-withaction' => 'No dalol $2, sekü {{PLURAL:$1|kod|kods}} sököl:',
-'recreate-moveddeleted-warn' => "'''NUNED: Dönujafol padi pemoüköl.'''
+'recreate-moveddeleted-warn' => "'''Nuned: Dönujafol padi büiko pemoüköl.'''
 
 Vätälolös, va binos pötik ad lairedakön padi at.
-Jenotalised moükama pada at pajonon is as yuf.",
+Jenotalised moükama e topätükama pada at pajonon is as yuf:",
 'moveddeleted-notice' => 'Pad at pemoükon.
 Jenotems moükamas e topätükamas pada palisedon dono.',
 'edit-hook-aborted' => 'Redakam pestöpädon fa huköm.
@@ -740,9 +785,14 @@ No enunon kodi.',
 Jiniko pemoükon.',
 'edit-conflict' => 'Redakamakonflit.',
 'edit-no-change' => 'Redakam olik penedemon, bi vödemivotükams nonik pedunons.',
+'postedit-confirmation' => 'Redakam olik pedakipolon.',
 'edit-already-exists' => 'No kanoy jafön padi nulik.
 On ya dabinon.',
 
+# Content models
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
+
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Nuned: Pad at vokon „parser“-sekätis tusuvo.
 
@@ -839,6 +889,7 @@ Ninäd peklänedöl at binon ye nog lügolovik guvanes votik vüka: {{SITENAME}}
 'logdelete-success' => 'Logov jenotaliseda pelonon benosekiko.',
 'revdel-restore' => 'Votükön logovi',
 'revdel-restore-deleted' => 'revids pemoüköl',
+'revdel-restore-visible' => 'revids logädik',
 'pagehist' => 'Padajenotem',
 'deletedhist' => 'Jenotem pemoüköl',
 'revdelete-otherreason' => 'Kod votik/zuik:',
@@ -908,11 +959,10 @@ Kontrololös, va votükam at okipon fovöfi padajenotema.',
 'searchmenu-legend' => 'Sukaparamets',
 'searchmenu-exists' => "'''Dabinon pad labü nem: \"[[:\$1]]\" su vük at'''",
 'searchmenu-new' => "'''Jafolös padi: \"[[:\$1]]\" su vük at!'''",
-'searchhelp-url' => 'Help:Ninäd',
 '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 +980,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 +1000,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.',
@@ -969,6 +1011,7 @@ Kontrololös, va votükam at okipon fovöfi padajenotema.',
 'skin-preview' => 'Büologed',
 'datedefault' => 'Buükam nonik',
 'prefs-datetime' => 'Dät e Tim',
+'prefs-user-pages' => 'Gebanapads',
 'prefs-personal' => 'Gebananüns',
 'prefs-rc' => 'Votükams nulik',
 'prefs-watchlist' => 'Galädalised',
@@ -1017,9 +1060,10 @@ 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}}:',
+'prefs-registration' => 'Tim registarama:',
 'yourrealname' => 'Nem jenöfik *:',
 'yourlanguage' => 'Pük:',
 'yournick' => 'Dispenäd nulik:',
@@ -1031,8 +1075,7 @@ Muton labön {{PLURAL:$1|malati|malatis}} läs $1.',
 'gender-female' => 'Vomik',
 'email' => 'Ladet leäktronik',
 'prefs-help-realname' => 'Nem jenöfik no binon zesüdik. If vilol givön oni, pogebon ad dasevön vobi olik.',
-'prefs-help-email' => 'Ladet leäktronik no peflagon, ab dälon sedi letavöda nulik ole üf glömol letavödi olik.
-Dalol i dälön votikanes kosikön ko ol yufü gebana- u bespikapad olik nes sävilupol dientifi olik.',
+'prefs-help-email' => 'Ladet leäktronik no peflagon, ab dälon sedi letavöda nulik ole üf glömol letavödi olik.',
 'prefs-help-email-required' => 'Ladet leäktronik paflagon.',
 'prefs-info' => 'Nüns stabik',
 'prefs-signature' => 'Dispenäd',
@@ -1193,6 +1236,7 @@ Dalol i dälön votikanes kosikön ko ol yufü gebana- u bespikapad olik nes sä
 'recentchanges-label-newpage' => 'Redakam at päjafon pad nulik',
 'recentchanges-label-minor' => 'Atos binon redakam pülik',
 'recentchanges-label-bot' => 'Redakam at pädunon fa el bot',
+'recentchanges-label-unpatrolled' => 'Redakam at no nog pekontrolon',
 'rcnote' => "Dono {{PLURAL:$1|binon votükam '''1'''|binons votükams '''$1'''}} lätikün {{PLURAL:$2|dela|delas '''$2'''}} lätikün, pänumädöls tü $5, $4.",
 'rcnotefrom' => "Is palisedons votükams sis '''$2''' (jü '''$1''').",
 'rclistfrom' => 'Jonön votükamis nulik, primölo tü düp $1',
@@ -1347,6 +1391,7 @@ Klikolös tiädi padüla ad votükön sökaleodi at.',
 'listfiles_search_for' => 'Sukön ragivanemi:',
 'imgfile' => 'ragiv',
 'listfiles' => 'Ragivalised',
+'listfiles_thumb' => 'Magodil',
 'listfiles_date' => 'Dät',
 'listfiles_name' => 'Nem',
 'listfiles_user' => 'Geban',
@@ -1377,8 +1422,11 @@ Lised dono jonon {{PLURAL:$1|padayümi balid|padayümis balid $1}} te lü ragiv
 [[Special:WhatLinksHere/$2|Lised lölöfik]] gebidon.',
 'nolinkstoimage' => 'Pads nonik peyümons ad ragiv at.',
 'morelinkstoimage' => 'Logolös [[Special:WhatLinksHere/$1|yümis pluik]] ad ragiv at.',
+'linkstoimage-redirect' => '$1 (lüodükam ragiva) $2',
 'duplicatesoffile' => '{{Plural:$1|Ragiv fovik leigon|Ragivs fovik $1 leigons}} ko ragiv at ([[Special:FileDuplicateSearch/$2|nüns pluik]]):',
 'sharedupload' => 'Ragiv at binon se $1 e kanon pagebön fa proyegs votik.',
+'sharedupload-desc-here' => 'Ragiv at kömon de $1 e kanon pagebön fa proyegs votik.
+Bepenot su [$2 pad bepenota ragiva] onik pajonon dono.',
 'uploadnewversion-linktext' => 'Löpükön fomami nulik ragiva at',
 'shared-repo-from' => 'se $1',
 
@@ -1462,6 +1510,8 @@ Primanünods: ninädasot/donasot, a.s. <code>image/jpeg</code>.',
 Sötons plao payümon lü yeged pötik.<br />
 Pad palelogon telplänovapad if gebon samafomoti, lü kel payümon pad [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop-submit' => 'Golön',
+
 'doubleredirects' => 'Lüodüköms telik',
 'doubleredirectstext' => 'Kedet alik labon yümis lü lüodüköm balid e telid, ed i kedeti balid vödema lüodüköma telid, kel nomiko ninädon padi, ko kel lüodüköm balid söton payümön.',
 'double-redirect-fixed-move' => 'Pad: [[$1]] petopätükon, anu binon lüodüköm lü pad: [[$2]]',
@@ -1551,7 +1601,7 @@ Pad palelogon telplänovapad if gebon samafomoti, lü kel payümon pad [[MediaWi
 'specialloguserlabel' => 'Geban:',
 'speciallogtitlelabel' => 'Lükömöp (tiäd u geban):',
 'log' => 'Jenotaliseds',
-'all-logs-page' => 'Jenotaliseds valik',
+'all-logs-page' => 'Jenotaliseds notidik valik',
 'alllogstext' => 'Kobojonam jenotalisedas gebidik valik in {{SITENAME}}.
 Ad brefükam lisedi, kanol välön lisedasoti, gebananemi, u padi tefik.',
 'logempty' => 'No dabinons notets in jenotalised at.',
@@ -1590,7 +1640,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 +1701,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 +1723,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.',
@@ -1731,7 +1781,8 @@ Küpets e yuf pluik:
 'delete-legend' => 'Moükön',
 'historywarning' => 'Nuned: pad, keli vilol moükön, labon jenotemi:',
 'confirmdeletetext' => 'Primikol ad moükön laidüpiko padi u magodi sa jenotem valik ona. Fümedolös, das desinol ad dunön atosi, das suemol sekis, e das dunol atosi bai [[{{MediaWiki:Policy-url}}]].',
-'actioncomplete' => 'Peledunon',
+'actioncomplete' => 'Dunot eplöpon',
+'actionfailed' => 'Dunot eneplöpon',
 'deletedtext' => 'Pad: "$1" pemoükon;
 $2 jonon moükamis nulik.',
 'dellogpage' => 'Jenotalised moükamas',
@@ -1884,12 +1935,12 @@ $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)',
+'uctop' => '(anuik)',
 'month' => 'De mul (e büiks):',
 'year' => 'De yel (e büiks):',
 
@@ -1898,6 +1949,7 @@ $1',
 'sp-contributions-newbies-title' => 'Gebanakeblünots pro kals nulik',
 'sp-contributions-blocklog' => 'Jenotalised blokamas',
 'sp-contributions-deleted' => 'gebanakeblünots pemoüköl',
+'sp-contributions-uploads' => 'löpükams',
 'sp-contributions-logs' => 'jenotaliseds',
 'sp-contributions-talk' => 'bespik',
 'sp-contributions-userrights' => 'guvam gebanagitätas',
@@ -1922,7 +1974,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
@@ -1955,10 +2007,12 @@ $1',
 'ipbhidename' => 'Klänedön gebananemi se redakams e liseds',
 'ipbwatchuser' => 'Galädon gebana- e bespikapadis gebana at',
 'ipb-change-block' => 'Dönublokön gebani me paramets at',
+'ipb-confirm' => 'Fümedön blokami',
 'badipaddress' => 'Ladet-IP no lonöfon',
 'blockipsuccesssub' => 'Blokam eplöpon',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] peblokon.
-<br />Logolös [[Special:BlockList|lisedi ladetas-IP pebloköl]] ad vestigön blokamis.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] peblokon.<br />
+Logolös [[Special:BlockList|lisedi blokamas]] ad vestigön blokamis.',
+'ipb-blockingself' => 'Oblokön oli it! Fümol-li, das vilol dunön atosi?',
 'ipb-edit-dropdown' => 'Redakön kodis blokama',
 'ipb-unblock-addr' => 'Säblokön eli $1',
 'ipb-unblock' => 'Säblokön gebananemi u ladeti-IP',
@@ -1970,6 +2024,7 @@ $1',
 'unblocked' => '[[User:$1|$1]] pesäblokon',
 'unblocked-range' => '$1 pesäblokon',
 'unblocked-id' => 'Blokam: $1 pesädunon',
+'blocklist' => 'Gebans pebloköl',
 'ipblocklist' => 'Gebans pebloköl',
 'ipblocklist-legend' => 'Tuvön gebani pebloköl',
 'blocklist-reason' => 'Kod',
@@ -2041,16 +2096,19 @@ No glömolös ad [[Special:UnlockDB|maifükön oni]] ven ufinükol vobi olik.',
 'unlockdbsuccesstext' => 'Nünodem pemaifükon.',
 'lockfilenotwritable' => 'Ragiv lökofärmükamas no votükovon. Ad lökofärmükön u maifükön nünodemi, ragiv at muton binön votükovik (dub dünanünöm).',
 'databasenotlocked' => 'Vük at no pefärmükon.',
+'lockedbyandtime' => '(fa {{GENDER:$1|$1}} tü $2 düp $3)',
 
 # Move page
 'move-page' => 'Topätükön padi: $1',
 'move-page-legend' => 'Topätükolöd padi',
-'movepagetext' => "Me fomet at kanoy votükön padanemi, ottimo feapladölo jenotemi lölöfik ona disi nem nulik. Tiäd büik ovedon lüodüköm lü tiäd nulik. Yüms lü padatiäd büik no povotükons; kontrolös dabini lüodükömas telik u dädikas. Gididol ad garanön, das yüms blebons lüodükön lü pads, lü kels mutons lüodükön.
+'movepagetext' => "Me fomet at kanoy votükön padanemi, ottimo feapladölo jenotemi lölöfik ona disi nem nulik. Tiäd büik ovedon lüodüköm lü tiäd nulik. Yüms lü padatiäd büik no povotükons; kontrolös dabini [[Special:DoubleRedirects|lüodükömas telik]] u [[Special:BrokenRedirects|dädikas]]. Gididol ad garanön, das yüms blebons lüodükön lü pads, lü kels mutons lüodükön.
 
-Küpälolös, das pad '''no''' potopätükon if ya dabinon pad labü tiäd nulik, bisä vagon u binon lüodüköm e no labon jenotemi. Atos sinifon, das, if pölol, nog kanol gepladön padi usio, kö äbinon büo, e das no kanol pladön padi nulik sui pad ya dabinöl.
+Küpälolös, das pad '''no''' potopätükon if ya dabinon pad labü tiäd nulik, bisä vagon u binon lüodüköm e no labon jenotemi.
+Atos sinifon, das, if pölol, nog kanol gepladön padi usio, kö äbinon büo, e das no kanol pladön padi nulik sui pad ya dabinöl.
 
-<b>NUNED!</b>
-Votükam at kanon binön mu staböfik ä no paspetöl pö pad pöpedik. Suemolös, begö! gudiko sekis duna at büä ofövol oni.",
+'''Nuned!'''
+Votükam at kanon binön mu staböfik ä no paspetöl pö pad pöpedik;
+suemolös, begö! gudiko sekis duna at büä ofövol oni.",
 'movepagetalktext' => "Bespikapad tefik potopätükön itjäfidiko kobü pad at '''pläsif:'''
 * bespikapad no vägik labü tiäd nulik ya dabinon, u
 * vagükol anu bokili dono.
@@ -2259,6 +2317,7 @@ Dakipolös oni su nünöm olik e löpükolös oni isio.',
 'tooltip-rollback' => '„Sädunön vali“ sädunon redakami(s) pada at fa keblünan lätik me klik bal mugaparata.',
 'tooltip-undo' => '"Sädunön bali" sädunon redakami at e maifükön redakamafometi as büologed.
 Dälon läükami koda.',
+'tooltip-summary' => 'Penolös pläni brefik',
 
 # Stylesheets
 'common.css' => '/** El CSS isio peplädöl pogebon pro padafomäts valik */',
@@ -2290,7 +2349,9 @@ 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',
+'pageinfo-contentpage-yes' => 'Si',
+'pageinfo-protect-cascading-yes' => 'Si',
 
 # Patrolling
 'markaspatrolleddiff' => 'Zepön',
@@ -2333,6 +2394,7 @@ If ojäfidükol oni, nünömasit olik ba podämükon.",
 'file-info-size' => '$1 × $2 pixel, ragivagret: $3, pated MIME: $4',
 'file-nohires' => 'Gretot gudikum no pagebidon.',
 'svg-long-desc' => 'ragiv in fomät: SVG, magodaziöbs $1 × $2, gretot: $3',
+'svg-long-error' => "Ragiv 'SVG' ne lonöfon: $1",
 'show-big-image' => 'Gretot gudikün',
 
 # Special:NewFiles
@@ -2352,6 +2414,23 @@ If ojäfidükol oni, nünömasit olik ba podämükon.",
 'minutes' => '{{PLURAL:$1|minut 1|minuts $1}}',
 'hours' => '{{PLURAL:$1|düp 1|düps $1}}',
 'days' => '{{PLURAL:$1|del 1|dels $1}}',
+'months' => '{{PLURAL:$1|mul $1|muls $1}}',
+'years' => '{{PLURAL:$1|yel $1|yels $1}}',
+'ago' => 'bü $1',
+'just-now' => 'anu',
+
+# Human-readable timestamps
+'hours-ago' => 'bü {{PLURAL:$1|düp|düps}} $1',
+'minutes-ago' => 'bü {{PLURAL:$1|minut|minuts}} $1',
+'seconds-ago' => 'bü {{PLURAL:$1|sekun|sekuns}} $1',
+'monday-at' => 'Tü mudel düp $1',
+'tuesday-at' => 'Tü tudel düp $1',
+'wednesday-at' => 'Tü vedel düp $1',
+'thursday-at' => 'Tü dödel düp $1',
+'friday-at' => 'Tü fridel düp $1',
+'saturday-at' => 'Tü zädel düp $1',
+'sunday-at' => 'Tü sudel düp $1',
+'yesterday-at' => 'Ädelo düp $1',
 
 # Bad image list
 'bad_image_list' => 'Fomät pabevobon ön mod soik:
@@ -2379,7 +2458,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',
@@ -2488,10 +2567,11 @@ Nünabinets votik poklänedons.
 'exif-gpsareainformation' => 'Nem topäda: GPS',
 'exif-gpsdatestamp' => 'Dät ela GPS',
 'exif-source' => 'Fonät',
+'exif-writer' => 'Penan',
 'exif-languagecode' => 'Pük',
 'exif-iimcategory' => 'Klad',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'No pekobopedöl',
 
 'exif-unknowndate' => 'Dät nesevädik',
@@ -2604,10 +2684,18 @@ Nünabinets votik poklänedons.
 'exif-gpsspeed-m' => 'Liöls a düp',
 'exif-gpsspeed-n' => 'Snobs',
 
+# Pseudotags used for GPSDestDistanceRef
+'exif-gpsdestdistance-k' => 'Milmets',
+'exif-gpsdestdistance-m' => 'Liöls',
+
 # Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
 'exif-gpsdirection-t' => 'Lüod veratik',
 'exif-gpsdirection-m' => 'Lüod magnetik',
 
+'exif-dc-date' => 'Dät(s)',
+'exif-dc-publisher' => 'Püban',
+
+'exif-iimcategory-spo' => 'Spots',
 'exif-iimcategory-wea' => 'Stom',
 
 # External editor support
@@ -2740,16 +2828,14 @@ Kanol i [[Special:EditWatchlist|gebön redakametodi kösömik]].',
 'version-hook-subscribedby' => 'Pagebon fa',
 'version-version' => '(Fomam $1)',
 'version-license' => 'Dälazöt',
+'version-poweredby-others' => 'votikans',
 'version-software' => 'Programs pestitöl',
 '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:Redirect
+'redirect-submit' => 'Golön',
+'redirect-file' => 'Ragivanem',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Sukön ragivis petelüköl',
@@ -2784,6 +2870,7 @@ Magods pajonons ma fomät gudikün, ragivasots votik pamaifükons stedöfo kobü
 'intentionallyblankpage' => 'Pad at pevagükon desino',
 
 # Special:Tags
+'tag-filter' => '[[Special:Tags|Sul]] ninädapenetas:',
 'tag-filter-submit' => 'Sul',
 'tags-display-header' => 'Logot in votükamaliseds',
 'tags-edit' => 'redakön',
@@ -2808,14 +2895,30 @@ Magods pajonons ma fomät gudikün, ragivasots votik pamaifükons stedöfo kobü
 'htmlform-submit' => 'Sedön',
 'htmlform-reset' => 'Sädunön votükamis',
 'htmlform-selectorother-other' => 'Votik',
+'htmlform-no' => 'Nö',
+'htmlform-yes' => 'Si',
 
 # New logging system
 'revdelete-restricted' => 'miedükams pelonöfükons pro guvans',
 'revdelete-unrestricted' => 'miedükams pro guvans pemoükons',
 'rightsnone' => '(nonik)',
 
+# Feedback
+'feedback-subject' => 'Yegäd:',
+
 # Search suggestions
 'searchsuggest-search' => 'Suk',
 'searchsuggest-containing' => 'ninädöl...',
 
+# Durations
+'duration-seconds' => '{{PLURAL:$1|sekun|sekuns}} $1',
+'duration-minutes' => '{{PLURAL:$1|minut|minuts}} $1',
+'duration-hours' => '{{PLURAL:$1|düp|düps}} $1',
+'duration-days' => '{{PLURAL:$1|del|dels}} $1',
+'duration-weeks' => '{{PLURAL:$1|vig|vigs}} $1',
+'duration-years' => '{{PLURAL:$1|yel|yels}} $1',
+'duration-decades' => '{{PLURAL:$1|degyel|degyels}} $1',
+'duration-centuries' => '{{PLURAL:$1|tumyel|tumyels}} $1',
+'duration-millennia' => '{{PLURAL:$1|milyel|milyels}} $1',
+
 );
index 6ca447b..35d6407 100644 (file)
@@ -166,7 +166,6 @@ $messages = array(
 'disclaimers' => 'Ceeltümin vassamizõõ',
 'disclaimerpage' => 'Project:Ceeltümin vassamizõõ',
 'edithelp' => 'Muutuzavid',
-'edithelppage' => 'Help:Kui muuttaa cülciä',
 'helppage' => 'Help:Sisälto',
 'mainpage' => 'Esicülci',
 'mainpage-description' => 'Esicülci',
@@ -404,9 +403,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 +599,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 +886,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 +930,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..d36e457 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',
@@ -281,7 +280,6 @@ $1",
 'disclaimers' => 'Hoiatuisi',
 'disclaimerpage' => 'Project:Üledseq hoiatusõq',
 'edithelp' => 'Toimõndamisoppus',
-'edithelppage' => 'Help:Kuis_artiklit_toimõndaq',
 'helppage' => 'Help:Oppus',
 'mainpage' => 'Pääleht',
 'mainpage-description' => 'Pääleht',
@@ -776,7 +774,6 @@ Lisateedüst või ollaq [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAME
 'shown-title' => 'Näütäq lehe kotsilõ $1 {{PLURAL:$1|tulõmus|tulõmust}}',
 'viewprevnext' => 'Näütäq ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-new' => "'''Luuq leht päälkiräga \"[[:\$1]]\".'''",
-'searchhelp-url' => 'Help:Oppus',
 'searchprofile-articles' => 'Sisuleheq',
 'searchprofile-project' => 'Abi- ja projektileheq',
 'searchprofile-images' => 'Multimeediä',
@@ -814,14 +811,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 +1319,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 +1812,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 +1880,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 +1994,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 +2223,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..ab4eae0 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',
@@ -306,7 +305,6 @@ $1",
 'currentevents' => 'Actouwålités',
 'currentevents-url' => 'Project:Actouwålités',
 'edithelp' => 'Aidance',
-'edithelppage' => 'Help:Kimint candjî ene pådje',
 'helppage' => 'Help:Aidance',
 'mainpage' => 'Mwaisse pådje',
 'mainpage-description' => 'Mwaisse pådje',
@@ -514,10 +512,8 @@ Motoit ki vos l' avoz ddja candjî ou ridmandé on novea scret timporaire.",
 
 # Special:PasswordReset
 'passwordreset' => "Rifé l' sicret",
-'passwordreset-text' => 'Completez cisse formulrece ci po rçure èn emile ki dene les detays do conte da vosse.',
 'passwordreset-legend' => "Rifé l' sicret",
 'passwordreset-disabled' => "Li rfijhaedje di screts a stî dismetou so ç' wiki ci.",
-'passwordreset-pretext' => '{{PLURAL:$1||Dinez onk des elemints di dnêyes shuvants}}',
 'passwordreset-username' => "No d' elodjaedje:",
 'passwordreset-domain' => 'Dominne:',
 'passwordreset-capture' => "Vey li messaedje di l' emile?",
@@ -711,6 +707,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.
@@ -817,7 +815,6 @@ Les ôtes manaedjeus so {{SITENAME}} pôront todi vey li contnou catchî eyet l'
 'searchmenu-legend' => 'Tchuzes di cweraedje',
 'searchmenu-exists' => "'''Gn a ddja ene pådje lomêye « [[:$1]] » so ç' wiki ci'''",
 'searchmenu-new' => "'''Ahiver l' pådje \"[[:\$1]]\" so ç' wiki ci!'''",
-'searchhelp-url' => 'Help:Aidance',
 'searchprofile-articles' => 'Pådjes di contnou',
 'searchprofile-project' => "Pådjes d' aidance et do pordjet",
 'searchprofile-images' => 'Multimedia',
@@ -855,15 +852,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 +1460,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 +2039,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 +2256,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 cd26458..11156a3 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',
@@ -308,7 +307,6 @@ $1',
 'disclaimers' => 'Mga Disclaimer',
 'disclaimerpage' => 'Project:Kasahiran nga disclaimer',
 'edithelp' => 'Bulig hin pagliwat',
-'edithelppage' => 'Help:Pagliwat',
 'helppage' => 'Help:Sulod',
 'mainpage' => 'Syahan nga Pakli',
 'mainpage-description' => 'Syahan nga Pakli',
@@ -451,6 +449,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.',
@@ -462,6 +463,7 @@ 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.',
 
@@ -478,12 +480,22 @@ Puydi ka magpadayon paggamit hin {{SITENAME}} nga diri magpapakilala, o puydi ka
 '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}}.",
@@ -492,18 +504,37 @@ Ayaw kalimti pagbalyo han imo [[Special:Preferences|{{SITENAME}} preperensya]].'
 '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.',
@@ -564,7 +595,6 @@ Ikaw in naglalog-in yana...',
 
 # Special:PasswordReset
 'passwordreset' => 'igreset an tigaman-hit-pagsulod',
-'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:',
@@ -576,7 +606,7 @@ Ikaw in naglalog-in yana...',
 Temporaryo nga tigaman han pagsakob: $2',
 'passwordreset-emailsent' => 'Ginpadangat an password reset email.',
 'passwordreset-emailsent-capture' => 'Ginpadangat an password reset email, nga ginpakita ha ubos.',
-'passwordreset-emailerror-capture' => 'Ginhimo an password reset email, kun diin nakikita ha ubos, pero pakyas an pagpadara: $1',
+'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',
@@ -705,8 +735,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',
@@ -736,12 +771,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',
@@ -810,7 +851,6 @@ Diri mo ini malalabtan.',
 'searchmenu-legend' => 'Mga pagpipilian han pamiling',
 'searchmenu-exists' => "'''May-ada pakli nga nakangaran hin \"[[:\$1]]\" hini nga wiki.'''",
 'searchmenu-new' => "'''Himoa an pakli \"[[:\$1]]\" hini nga wiki!'''",
-'searchhelp-url' => 'Help:Sulod',
 'searchprofile-articles' => 'Mga unod nga pakli',
 'searchprofile-project' => 'Mga Bulig ngan Proyekto nga pakli',
 'searchprofile-images' => 'Multimedia',
@@ -847,14 +887,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',
@@ -1011,6 +1043,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',
@@ -1019,6 +1052,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
@@ -1213,7 +1247,6 @@ $1',
 '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',
-'http-host-unreachable' => 'Diri nakakaabot ha URL.',
 
 # 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',
@@ -1433,6 +1466,12 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'listusers-noresult' => 'Waray gumaramit nga nahiagian.',
 'listusers-blocked' => '(ginpugngan)',
 
+# Special:ActiveUsers
+'activeusers' => 'Taramdan hin mga gumaramit nga nanggigios',
+'activeusers-hidebots' => 'Igtago an mga bot',
+'activeusers-hidesysops' => 'Igtago an mga magdudumara',
+'activeusers-noresult' => 'Waray gumaramit nga nahiagian.',
+
 # Special:ListGroupRights
 'listgrouprights-group' => 'Hugpo',
 'listgrouprights-rights' => 'Mga katungod',
@@ -1980,7 +2019,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',
@@ -2240,11 +2279,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',
index 3ab6639..2d95cc7 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',
@@ -311,7 +309,6 @@ $1',
 'disclaimers' => 'Ay aartu',
 'disclaimerpage' => 'Project:Aartu yu daj',
 'edithelp' => 'Ndimbal',
-'edithelppage' => 'Help:Nooy soppee aw xët',
 'helppage' => 'Help:Ndimbal',
 'mainpage' => 'Xëtu Njëlbéen',
 'mainpage-description' => 'Xët wu njëkk',
@@ -882,7 +879,6 @@ Soo jëfandikoo lëkkalekaayu joow yi day neenal boyot yi nga jotoon a fal.',
 'searchmenu-legend' => 'Tànneefi ceet',
 'searchmenu-exists' => "'''wenn xët wu tudd « [[:$1]] » moo am ci bii wiki'''",
 'searchmenu-new' => "'''Sosal xët wii di « [[:$1|$1]] » ci bii wiki !'''",
-'searchhelp-url' => 'Help:Ndimbal',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Xoolal xët wi tambalee nii]]',
 'searchprofile-articles' => 'Xëti ëmbiit',
 'searchprofile-project' => 'Xëti Ndimbal ak Sémb',
@@ -924,14 +920,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 +1592,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 +2046,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 +2114,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 fe51e6e..9bf0c26 100644 (file)
@@ -247,7 +247,6 @@ $1',
 'disclaimers' => '免责声明',
 'disclaimerpage' => 'Project:免责声明',
 'edithelp' => '编辑帮助',
-'edithelppage' => 'Help:如何编辑页面',
 'helppage' => 'Help:目录',
 'mainpage' => '封面',
 'mainpage-description' => '封面',
@@ -857,7 +856,6 @@ $1",
 'searchmenu-legend' => '搜索选项',
 'searchmenu-exists' => "'''垃拉箇只wiki高头已经有只页面叫“[[:$1]]”哉'''",
 'searchmenu-new' => "'''垃拉该wiki里向新建页面“[[:$1]]”!'''",
-'searchhelp-url' => 'Help:目录',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|浏览带箇只前缀个页面]]',
 'searchprofile-articles' => '内容页面',
 'searchprofile-project' => '帮助搭仔项目页面',
@@ -1474,8 +1472,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' => '台湾',
@@ -1503,7 +1499,7 @@ Variants for Chinese language
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-artist' => '作者',
 
 'exif-componentsconfiguration-0' => '弗存在',
@@ -1575,11 +1571,6 @@ Variants for Chinese language
 # Special:Version
 'version' => '版本',
 
-# Special:FilePath
-'filepath' => '文件路径',
-'filepath-page' => '文件:',
-'filepath-submit' => '路径',
-
 # Special:SpecialPages
 'specialpages' => '特殊页面',
 
index a575bf4..814eeb0 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' => 'Учр-утх хоосн бәәхлә медүлх',
@@ -289,7 +287,6 @@ $1',
 'disclaimers' => 'Дааврас эс зөвшәрлһн',
 'disclaimerpage' => 'Project:Даарас эс зөвшәрлһн',
 'edithelp' => 'Чикллһнә дөң',
-'edithelppage' => 'Help:Чикллһн',
 'helppage' => 'Help:Һарг',
 'mainpage' => 'Нүр халх',
 'mainpage-description' => 'Нүр халх',
@@ -604,9 +601,6 @@ $1',
 'powersearch-field' => 'Хәәх',
 'powersearch-togglenone' => 'Уга',
 
-# Quickbar
-'qbsettings' => 'Ормин самбр',
-
 # Preferences page
 'preferences' => 'Дурллһн',
 'mypreferences' => 'Көгүд',
@@ -858,7 +852,7 @@ $1',
 # Special:ListGroupRights
 'listgrouprights-members' => '(мөчүдин сеткүл)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Энд E-mail йовулх',
 
 # Watchlist
@@ -1156,7 +1150,7 @@ $2 шидрә һарһлһна төлә хәләтн.',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Өргн',
 'exif-imagelength' => 'Өндр',
 'exif-bitspersample' => 'Өңгин гүн',
@@ -1234,11 +1228,6 @@ $2 шидрә һарһлһна төлә хәләтн.',
 'version-software-product' => 'Һарц',
 'version-software-version' => 'Һарц',
 
-# Special:FilePath
-'filepath' => 'Боомгд хаалһ',
-'filepath-page' => 'Боомг:',
-'filepath-submit' => 'Орх',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Боомгин нерн:',
 'fileduplicatesearch-submit' => 'Хәәх',
index 2deb341..10968f8 100644 (file)
@@ -190,7 +190,6 @@ $messages = array(
 'disclaimers' => 'გამამინჯალაშ ვარება',
 'disclaimerpage' => 'Project:გამამინჯალაშ ვარება',
 'edithelp' => 'მოხვარა რედაქტირაფას',
-'edithelppage' => 'Help:ტექსტიშ რედაქტირაფა',
 'helppage' => 'Help:დინორე',
 'mainpage' => 'დუდხასჷლა',
 'mainpage-description' => 'დუდხასჷლა',
@@ -411,7 +410,6 @@ $messages = array(
 'viewprevnext' => 'ქოძირ  ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => 'თე ვიკის "[[:$1]]" ჯოხოთ ხასჷლა რე',
 'searchmenu-new' => "''ქჷდარსხი \"[[:\$1]]\" ხასჷლა თე ვიკის'''",
-'searchhelp-url' => 'Help:მოხვარა',
 'searchprofile-articles' => 'სტატიეფი',
 'searchprofile-project' => 'მოხვარაშ დო პროექტიშ ხასჷლეფი',
 'searchprofile-images' => 'მულტიმედია',
@@ -606,7 +604,7 @@ $messages = array(
 # Special:ListGroupRights
 'listgrouprights-members' => '(მაკათურეფიშ ერკებული)',
 
-# E-mail user
+# Email user
 'emailuser' => 'მიდუჯღონით ელ.ფოშტა ათე მახვარებუს',
 
 # Watchlist
@@ -882,7 +880,7 @@ $messages = array(
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'სიგანე',
 'exif-imagelength' => 'სიმაღალე',
 
index 8a7c25b..3fec8c9 100644 (file)
@@ -224,12 +224,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' => '×\91×\90× ×\95צ×\98 ×\96×\99×\9a ×\9e×\99×\98 ×\9c×\99×\99×\95×\95 ×¤×\90ר×\90×\95×\99ס×\93×\99×\92×¢ ×\95×\95×\99×\99×\96×\95× ×\92 (JavaScript) (עקספ×\99רענ×\9e×¢×\98ל)',
+'tog-uselivepreview' => '×\91×\90× ×\99צ×\98 ×\96×\99×\9a ×\9e×\99×\98 ×\92×\99×\9b×¢ ×¤×\90ר×\90×\95×\99ס×\93×\99×\92×¢ ×\95×\95×\99×\99×\96×\95× ×\92 (JavaScript) (עקספער×\99×\9e×¢× ×\98×\90ל)',
 'tog-forceeditsummary' => 'ווארן מיך ווען איך לייג א ליידיג קורץ ווארט ענדערונג',
 'tog-watchlisthideown' => 'באהאלט מיינע ענדערונגען פון דער אויפפאסן ליסטע',
 'tog-watchlisthidebots' => 'באהאלט באט עדיטס פון אויפפאסן ליסטע',
@@ -241,6 +237,7 @@ $messages = array(
 'tog-diffonly' => 'ווייז נישט אינהאלט אונטער די דיפערענץ',
 'tog-showhiddencats' => 'ווײַז באהאלטענע קאטעגאריעס',
 'tog-norollbackdiff' => 'היפט איבער ווײַזן אונטערשייד נאכן אויספֿירן א צוריקדריי',
+'tog-useeditwarning' => 'שטעלן א ווארענונג ווען איך לאז איבער א רעדאקטירונג בלאט מיט נישט אויפגעהיטענע ענדערונגען',
 
 'underline-always' => 'אייביג',
 'underline-never' => 'קיינמאל',
@@ -304,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|קאַטעגאָריע|קאַטעגאָריעס}}',
@@ -339,7 +348,7 @@ $messages = array(
 
 # Cologne Blue skin
 'qbfind' => 'טרעף',
-'qbbrowse' => '×\91×\9c×¢×\98ער×\98',
+'qbbrowse' => '×\91×\9c×¢×\98ער×\9f',
 'qbedit' => 'ענדערן',
 'qbpageoptions' => 'דער בלאט',
 'qbmyoptions' => 'מיינע בלעטער',
@@ -439,7 +448,6 @@ $1',
 'disclaimers' => 'געזעצליכע אויפֿקלערונג',
 'disclaimerpage' => 'Project:קלארשטעלונג',
 'edithelp' => 'הילף וויאזוי צו ענדערן',
-'edithelppage' => 'Help:ענדערן',
 'helppage' => 'Help:אינהאַלט',
 'mainpage' => 'הויפט זייט',
 'mainpage-description' => 'הויפט זייט',
@@ -614,9 +622,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' => 'איר קען נישט ענדערן פאסווערטער אויף דער וויקי.',
@@ -629,18 +646,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|רעדאַקטירונג|$1 רעדאַקטירונגען}}',
+'createacct-benefit-body2' => '$1 {{PLURAL:$1|בלאַט|בלעטער}}',
+'createacct-benefit-body3' => 'לעצטיקע {{PLURAL:$1|בײַשטײַערער}}',
 'badretype' => 'די פאסווערטער וואס איר האט אריינגעלייגט זענען נישט אייניג.',
 'userexists' => 'דער באַניצער נאָמען איז שוין געניצט.
 ביטע קלײַבט אױס אַן אַנדער נאָמען.',
 'loginerror' => 'לאגירן פֿעלער',
+'createacct-error' => 'קאנטע שאפן פעלער',
 'createaccounterror' => 'האט נישט געקענט שאַפֿן קאנטע: $1',
 'nocookiesnew' => 'די באניצער קאנטע איז באשאפן, אבער איר זענט נישט אריינלאגירט.
 {{SITENAME}} ניצט קיכלעך אריינצולאגירן באניצער.
@@ -697,7 +734,8 @@ $2',
 'cannotchangeemail' => "מ'קען נישט ענדערן קאנטע ע־פאסט אדרעסן אין דער וויקי.",
 'emaildisabled' => 'דאס וועבזייטל קען נישט שיקן ע־בריוון.',
 'accountcreated' => 'די קאָנטע איז באַשאַפֿן',
-'accountcreatedtext' => 'די באניצער קאנטע פאר $1 איז באַשאַפֿן געווארן.',
+'accountcreatedtext' => 'די באניצער קאנטע פאר [[{{ns:User}}:$1|$1]] 
+([[{{ns:User talk}}:$1|שמועס]])  איז באַשאַפֿן געווארן.',
 'createaccount-title' => 'קאנטע באשאפֿן אין {{SITENAME}}',
 'createaccount-text' => 'עמעצער האט באשאפֿן א קאנטע פֿאר אייער ע-פאסט אדרעס אין {{SITENAME}} ($4) מיטן נאמען "$2" און  פאסווארט "$3". איר דארפט אצינד איינלאגירן און ענדערן דאס פאסווארט.
 
@@ -734,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' => 'זען  דעם געשיקטן ע־בריוו?',
@@ -766,7 +803,7 @@ $2
 פראוויזארישער פּאַראָל: $2',
 'passwordreset-emailsent' => "מ'האט געשיקט א פאסווארט צוריקשטעלן ע-פּאָסט.",
 'passwordreset-emailsent-capture' => 'מען האט געשיקט א פאסווארט צוריקשטעלן בליצבריוו, וואס ווערט געוויזן אונטן.',
-'passwordreset-emailerror-capture' => 'מען האט געשאפן א פאסווארט צוריקשטעלן בליצבריוו, וואס ווערט געוויזן אונטן, אבער שיקן צום באניצער איז דורכגעפאלן: $1',
+'passwordreset-emailerror-capture' => 'מען האט געשאפן א פאסווארט צוריקשטעלן בליצבריוו, וואס ווערט געוויזן אונטן, אבער שיקן צום {{GENDER:$2|באניצער}}איז דורכגעפאלן: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'ענדערן ע-פּאָסט אַדרעס',
@@ -817,7 +854,7 @@ $2
 'missingcommentheader' => "'''דערמאַנונג:''' איר האט נישט אַרײַנגעשטעלט א טעמע/קעפל פאר דער אנמערקונג. אויב וועט איר דרוקן נאכאמאל אויפן \"{{int:savearticle}}\", וועט אייער ענדערונג ווערן אפגעהיטן אן דעם.",
 'summary-preview' => 'סך-הכל פאראויסדיגע ווייזונג:',
 'subject-preview' => 'טעמע/קעפל פאראויסדיגע ווייזונג:',
-'blockedtitle' => 'באנוצער איז בלאקירט',
+'blockedtitle' => 'באַניצער איז בלאקירט',
 'blockedtext' => '\'\'\'אייער באניצער נאמען אדער IP אדרעס איז געווארן בלאקירט.\'\'\'
 
 דעם בלאק האט $1 געמאכט פון וועגן \'\'$2\'\'.
@@ -981,12 +1018,15 @@ $2
 ס'ווייזט אויס אז ער איז אויסגעמעקט.",
 'edit-conflict' => 'רעדאקטירן קאנפֿליקט.',
 'edit-no-change' => "מ'האט איגנארירט אײַער רעדאַקטירונג, ווײַל קיין שום ענדערונג איז נישט געמאַכט צום טעקסט.",
-'edit-already-exists' => 'נישט מעגליך צו שאַפֿן נייע בלאט.
+'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' => 'וויקיטעקסט',
@@ -1011,6 +1051,7 @@ $2
 'node-count-exceeded-warning' => 'קנופנצאל אויפן בלאט צו הויך',
 'expansion-depth-exceeded-category' => "בלעטער וואו מ'האט אריבערגעשטיגן די פארברייטערונג טיף",
 'expansion-depth-exceeded-warning' => 'בלאט גייט אריבער דער פארברייטערונג טיף',
+'parser-unstrip-loop-warning' => 'פעטליע געטראפֿן',
 'converter-manual-rule-error' => 'געטראפן א גרײַז אין האנטלעכן שפראך־קאנווערטירן כלל',
 
 # "Undo" feature
@@ -1224,7 +1265,6 @@ $1",
 'searchmenu-legend' => 'זוכן ברירות',
 'searchmenu-exists' => "'''ס'איז פֿאַראַן א בלאַט מיטן נאמען \"[[:\$1]]\" אין דער וויקי'''",
 'searchmenu-new' => "'''באַשאַפֿן דעם בלאַט \"[[:\$1]]\" אויף דער וויקי'''",
-'searchhelp-url' => 'Help:אינהאַלט',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|בלעטערן בלעטער מיט דעם פרעפֿיקס]]',
 'searchprofile-articles' => 'אינהאלט בלעטער',
 'searchprofile-project' => 'הילף און פראיעקט בלעטער',
@@ -1268,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' => 'פרעפֿערענצן',
@@ -1292,7 +1324,7 @@ $1",
 'prefs-datetime' => 'דאטום און צייט',
 'prefs-labs' => 'לאַבאראַטאריע מעגלעכקייטן',
 'prefs-user-pages' => 'באניצער בלעטער',
-'prefs-personal' => '×\91×\90Ö·× ×\95צער פראָפֿיל',
+'prefs-personal' => '×\91×\90Ö·× ×\99צער פראָפֿיל',
 'prefs-rc' => 'לעצטע ענדערונגען',
 'prefs-watchlist' => 'אויפפאסונג ליסטע',
 'prefs-watchlist-days' => 'טעג צו ווייזן אין דער אויפפאסונג ליסטע:',
@@ -1396,9 +1428,9 @@ $1",
 'email-address-validity-invalid' => 'לייגט אַרײַן א גילטיקן ע־פאסט אַדרעס',
 
 # User rights
-'userrights' => 'באנוצער רעכטן פארוואלטערשאפט',
+'userrights' => 'באַניצער רעכטן פֿאַרוואַלטערשאפט',
 'userrights-lookup-user' => 'פֿאַרוואַלטן באניצער גרופעס',
-'userrights-user-editname' => 'לייגט אריין א באנוצער-נאמען:',
+'userrights-user-editname' => 'לייגט אריין א באַניצער-נאמען:',
 'editusergroup' => 'רעדאַגירן באַניצער גרופּעס',
 'editinguser' => "ענדערן באַניצער רעכטן פון באַניצער '''[[User:$1|$1]]'''   $2",
 'userrights-editusergroup' => 'רעדאַקטירן באַניצער גרופעס',
@@ -1477,6 +1509,7 @@ $1",
 'right-block' => 'בלאקירן אַנדערע באַניצער פֿון רעדאַקטירן',
 'right-blockemail' => 'בלאקירן א באַניצער פֿון שיקן ע־פאסט',
 'right-hideuser' => 'בלאקירן באַניצער־נאָמען און פֿאַרבארגן אים',
+'right-ipblock-exempt' => 'ארומגיין IP בלאקן, אויטאבלאקן און גרייך־בלאקן',
 'right-unblockself' => 'זיך אליין אויפֿשפאַרן',
 'right-protect' => 'ענדערן שוץ ניוואען און רעדאַגירן געשיצטע בלעטער',
 'right-editprotected' => 'רעדאַגירן געשיצטע בלעטער (אָן קאַסקאַדן שוץ)',
@@ -1484,6 +1517,7 @@ $1",
 'right-editusercssjs' => 'רעדאַקטירן אַנדערע באַניצערס CSS און JS טעקעס',
 'right-editusercss' => 'רעדאַקטירן אַנדערע באַניצערס CSS טעקעס',
 'right-edituserjs' => 'רעדאַקטירן אַנדערע באַניצערס JS טעקעס',
+'right-editmyusercss' => 'רעדאקטירע אײַערע אייגענע באניצער CSS טעקעס',
 'right-rollback' => 'גיך צוריקדרייען די רעדאַקטירונגען פונעם לעצטן באַניצער וואס האט רעדאַקטירט א געוויסן בלאַט',
 'right-markbotedits' => 'מאַרקירן צוריקגעזעצטע רעדאַגירונגען ווי באט רעדאַגירונגען',
 'right-noratelimit' => 'נישט ווערן באַגרענעצט דורך לימיטאַציע',
@@ -1562,7 +1596,7 @@ $1",
 'rcshowhideminor' => '$1 מינערדיגע ענדערונגען',
 'rcshowhidebots' => '$1 ראבאטן',
 'rcshowhideliu' => '$1 אײַנגעשריבענע באַניצערס',
-'rcshowhideanons' => '$1 ×\90Ö·× ×\90ָנ×\99×\9e×¢ ×\91×\90Ö·× ×\95צערס',
+'rcshowhideanons' => '$1 ×\90Ö·× ×\90ָנ×\99×\9e×¢ ×\91×\90Ö·× ×\99צער',
 'rcshowhidepatr' => '$1 פאַטראלירטע ענדערונגען',
 'rcshowhidemine' => '$1 מײַנע רעדאַקטירוננגען',
 'rclinks' => 'װײַזן די לעצטע $1 ענדערונגען אין די לעצטע $2 טעג.<br />$3',
@@ -1728,6 +1762,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".',
@@ -1744,7 +1779,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־קאנטראלירונג.',
@@ -1774,7 +1813,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>
@@ -1924,6 +1962,9 @@ $1",
 'disambiguationspage' => 'Template:באדייטן',
 'disambiguations-text' => "די קומענדיגע בלעטער פארבינדן צו א '''באדייטן בלאט'''. זיי ברויכן ענדערשט פֿארבינדן צו דעם רעלעוואנטן טעמע בלאט.<br />א בלאט ווערט פאררעכענט פאר א באדײַטן בלאט אויב ער באניצט זיך מיט א מוסטער וואס איז פארבינדען פון [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'בלעטער מיט א בלאט אייגנשאפט',
+'pageswithprop-legend' => 'בלעטער מיט א בלאט אייגנשאפט',
+'pageswithprop-text' => 'דער בלאט האלט א רשימה פון בלעטער וואס ניצן א געוויסע בלאט אייגנשאפט.',
 'pageswithprop-prop' => 'אייגנשאפט נאמען:',
 'pageswithprop-submit' => 'גייט',
 
@@ -2083,6 +2124,15 @@ $1",
 'listusers-noresult' => 'קיין באניצער נישט געטראפֿן.',
 'listusers-blocked' => '(בלאקירט)',
 
+# Special:ActiveUsers
+'activeusers' => 'ליסטע פֿון אַקטיווע באַניצער',
+'activeusers-intro' => 'דאָס איז א ליסטע פֿון באַניצער וואָס זענען געווען אַקטיוו אינערהאָלב  $1 {{PLURAL:$1|דעם לעצטן טאָג|די לעצטע $1 טעג}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|פעולה|פעולות}} אין  {{PLURAL:$3|דעם לעצטן טאָג|די לעצטע $3 טעג}}',
+'activeusers-from' => 'ווײַזן באַניצער אָנהייבנדיג פון:',
+'activeusers-hidebots' => 'באַהאַלטן באטן',
+'activeusers-hidesysops' => 'באַהאַלטן סיסאפן',
+'activeusers-noresult' => 'קיין באניצער נישט געטראפֿן.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'באַניצער גרופע רעכטן',
 'listgrouprights-summary' => "פֿאלגנד איז א רשימה פֿון באַניצער גרופעס דעפֿינירט אויף דער דאָזיקער וויקי, מיט זײַערע אַסאציאירטע צוטריט רעכטן.
@@ -2162,8 +2212,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 בלעטער}}.',
@@ -2405,7 +2455,7 @@ $1',
 'mycontris' => 'בײַשטײַערונגען',
 'contribsub2' => 'וועגן $1 ($2)',
 'nocontribs' => 'נישט געטראפן קיין ענדערונגען צוזאמעגעפאסט מיט די קריטעריעס.',
-'uctop' => '(×\9cעצ×\98×¢)',
+'uctop' => '(×\9c×\95×\99פֿ×\99ק)',
 'month' => 'ביז חודש:',
 'year' => 'ביז יאר:',
 
@@ -3075,7 +3125,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ברייט',
 'exif-imagelength' => 'הייך',
 'exif-bitspersample' => 'ביטס פער באשטאנדטייל',
@@ -3104,7 +3154,7 @@ $1',
 'exif-compressedbitsperpixel' => 'בילד צוזאמקוועטשן מאוד',
 'exif-pixelydimension' => 'בילד ברייט',
 'exif-pixelxdimension' => 'בילד הייך',
-'exif-usercomment' => '×\91×\90× ×\95צער קאמענטורן',
+'exif-usercomment' => '×\91×\90× ×\99צער קאמענטורן',
 'exif-relatedsoundfile' => 'פֿאַרבונדענע אוידיאָ טעקע',
 'exif-datetimeoriginal' => 'דאטום און צייט פון דאַטן באשאפונג',
 'exif-datetimedigitized' => 'דאטום און צייט פון דיזשיטייזונג',
@@ -3227,7 +3277,7 @@ $1',
 'exif-intellectualgenre' => 'ארט  איינהייט',
 'exif-subjectnewscode' => 'טעמע קאד',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'אומ-צאמגעקוועטשט',
 
 'exif-copyrighted-true' => 'געשיצט מיט קאפירעכט',
@@ -3464,7 +3514,7 @@ $5
 
 # Delete conflict
 'deletedwhileediting' => 'ווארענונג: דער בלאט איז געווארן אויסגעמעקט נאכדעם וואס איר האט אנגעהויבן רעדאקטירן!',
-'confirmrecreate' => "באנוצער [[User:$1|$1]] ([[User talk:$1|רעדן]]) האט אויסגעמעקט דעם בלאט נאכדעם וואס איר האט אנגעהויבן דאס צו ענדערן, אלס אנגעבליכער סיבה:
+'confirmrecreate' => "באַניצער [[User:$1|$1]] ([[User talk:$1|רעדן]]) האט אויסגעמעקט דעם בלאט נאכדעם וואס איר האט אנגעהויבן דאס צו ענדערן, אלס אָנגעבליכער סיבה:
 :'''$2'''
 ביטע באשטעטיגט אז איר ווילט טאקע צוריקשטעלן דעם בלאט.",
 'recreate' => 'שאַפֿן פֿונדאסניי',
@@ -3602,17 +3652,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' => 'זוכן דופליקאטע טעקעס באזירט אויף האש־ווערטן.',
@@ -3700,6 +3746,8 @@ $5
 'htmlform-submit' => 'אײַנגעבן',
 'htmlform-reset' => 'צוריקשטעלן ענדערונגען',
 'htmlform-selectorother-other' => 'אַנדער',
+'htmlform-no' => 'ניין',
+'htmlform-yes' => 'יא',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 מיט פולן-טעקסט זוכן שטיץ',
index 47d8d0f..cfcb9c0 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á',
@@ -161,6 +160,18 @@ $messages = array(
 'oct' => 'Oṣù 10',
 'nov' => 'Oṣù 11',
 'dec' => 'Oṣù 12',
+'january-date' => '$1 Oṣù Kínní',
+'february-date' => '$1 Oṣù Kejì',
+'march-date' => '$1 Oṣù Kẹta',
+'april-date' => '$1 Oṣù Kẹrin',
+'may-date' => '$1 Oṣù Kàrún',
+'june-date' => '$1 Oṣù Kẹfà',
+'july-date' => '$1 Oṣù Keje',
+'august-date' => '$1 Oṣù Kẹjọ',
+'september-date' => '$1 Oṣù Kẹ̀sán',
+'october-date' => '$1 Oṣù Kẹ̀wá',
+'november-date' => '$1 Oṣù Kọkànlá',
+'december-date' => '$1 Oṣù Kejìlá',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Ẹ̀ka|Àwọn ẹ̀ka}}',
@@ -186,6 +197,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í',
@@ -241,6 +253,7 @@ $messages = array(
 'create-this-page' => "Ṣè'dá ojúewé yìí",
 'delete' => 'Ìparẹ́',
 'deletethispage' => 'Pa ojúewé yi rẹ́',
+'undeletethispage' => 'Mú ìparẹ́ kúrò fún ojúewé yìí',
 'undelete_short' => 'Ìdápadà ìparẹ́ {{PLURAL:$1|àtúnṣe kan|àwọn àtúnṣe $1}}',
 'viewdeleted_short' => 'Ìwòran {{PLURAL:$1|àtúnṣe ajẹ́píparẹ́ kan|àwọn àtúnṣe ajẹ́píparẹ́ $1}}',
 'protect' => 'Àbò',
@@ -294,7 +307,6 @@ $1',
 'disclaimers' => 'Ikìlọ̀',
 'disclaimerpage' => 'Project:Ìkìlọ̀ gbogbo',
 'edithelp' => 'Ìrànlọ́wọ́ fún àtúnṣe',
-'edithelppage' => 'Help:Àtúnṣe',
 'helppage' => 'Help:Àwon àkóónú',
 'mainpage' => 'Ojúewé Àkọ́kọ́',
 'mainpage-description' => 'Ojúewé Àkọ́kọ́',
@@ -443,6 +455,8 @@ Láti ṣ'àfikún tàbí ṣ'àyípadà àwọn ìyédèpadà fún gbogbo àw
 'namespaceprotected' => "A kò gbàyín ní ààyè láti ṣ'àtúnṣe àwọn ojúewé tó wà nínú orúkọàyè '''$1'''.",
 'customcssprotected' => 'Ẹ kò ní ìyọ̀nda láti ṣàtúnṣe ojúewé CSS yìí nítorípé ó ní àwọn ìtòjọ oníṣe ẹlòmíràn.',
 'customjsprotected' => 'Ẹ kò ní ìyọ̀nda láti ṣàtúnṣe ojúewé JavaScript yìí nítorípé ó ní àwọn ìtòjọ oníṣe ẹlòmíràn.',
+'mycustomcssprotected' => 'Ẹ kò ní ìyọ̀nda láti ṣàtúnṣe ojúewé CSS yìí.',
+'mycustomjsprotected' => 'Ẹ kò ní ìyọ̀nda láti ṣàtúnṣe ojúewé JavaScript yìí.',
 'ns-specialprotected' => 'Àtúnṣe kò ṣe é ṣe sí àwọn ojúewé pàtàkì.',
 'titleprotected' => "[[User:$1|$1]] ti dínà sí dídá àkọlé yìí. Ìdí rẹ̀ ni pé ''$2''.",
 'filereadonlyerror' => 'Àtúnṣe kò ṣe é ṣe sí fáìlì "$1" nítorípé ibi-àkójọ fáìlì "$2" jẹ́ fún wíwò nìkàn.
@@ -467,9 +481,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' => 'Fi mí sí ìwọlé',
+'userlogin-signwithsecure' => 'Lo ìsopọ̀ ẹ̀rọ 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 +505,38 @@ 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',
+'userlogin-resetpassword-link' => 'Ìtúntò ọ̀rọ̀ìpamọ́ yín',
+'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-reason-ph' => 'Ìdí tí ẹ ṣe fẹ́ dá àkópamọ́ míràn',
+'createacct-captcha' => 'Àyẹ̀wò àbò',
+'createacct-imgcaptcha-ph' => 'Ẹ kọ ìkọ̀rọ̀ tí ẹ rí lókè',
+'createacct-submit' => 'Ìdá àkópamọ́ yín',
+'createacct-benefit-heading' => 'Àwọn ènìyàn bíi yín ni wọ́n dá {{SITENAME}}.',
+'createacct-benefit-body1' => '{{PLURAL:$1|àtúnṣe|àwọn àtúnṣe}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|ojúewé|àwọn ojúewé}}',
+'createacct-benefit-body3' => ' {{PLURAL:$1|olùkópa|Àwọn olùkópa}} aṣẹ̀ṣẹ̀ṣe',
 '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 +580,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ìí.',
@@ -552,7 +595,7 @@ E-mail kankan kò ní jẹ́ fífiránṣẹ́ fún ìkankan nínú àwọn ìn
 'cannotchangeemail' => 'Àwọn àdírẹ́sì e-mail àpamọ́ kò ṣe é yípadà lórí wiki yìí.',
 'emaildisabled' => 'Ibiìtàkùn yìí kò le fi e-mail ránṣẹ́.',
 'accountcreated' => 'Ẹ ti fi orúkọ sílẹ̀',
-'accountcreatedtext' => "A ti ṣ'èdá àkópamọ́ oniṣe fún $1.",
+'accountcreatedtext' => 'Àkópamọ́ oniṣe fún [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|ọ̀rọ̀]]) ti jẹ́ dídá.',
 'createaccount-title' => 'Ìforúkọ sílẹ̀ fún {{SITENAME}}',
 'createaccount-text' => 'Ẹnìkan dá àpamọ́ kan fún àdírẹ́sì e-mail yín sórí {{SITENAME}} ($4) tóún jẹ́ "$2", pẹ̀kú ọ̀rọ̀ìpamọ́ \'\'$3\'\'.
 Ẹ gbọ́dọ̀ wọlé kí ẹ sì ṣàyípadà ọ́rọ́ìpamọ́ yín nísinsìyí.
@@ -568,6 +611,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,10 +633,9 @@ 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-legend' => 'Ìtúntò ọ̀rọ̀ìpamọ́',
 'passwordreset-disabled' => 'Ìdálẹ́kun ìtúntò ọ̀rọ̀ìpamọ́ lórí wiki yìí.',
-'passwordreset-pretext' => '{{PLURAL:$1||Ẹ kọ ìkan nínú àwọn wẹ́wẹ́ dátà ìsàlẹ̀}}',
+'passwordreset-emaildisabled' => 'Ìdálẹ́kun lílo email lórí wiki yìí.',
 'passwordreset-username' => 'Orúkọ oníṣe:',
 'passwordreset-domain' => 'Àbùgbé:',
 'passwordreset-capture' => 'Wo e-mail tí yíò jáde?',
@@ -836,12 +879,15 @@ Kò ṣe àlàyé kankan.',
 Ó dà bíi pé a ti paárẹ́.',
 'edit-conflict' => 'Ìtakora áwọn àtúnṣe',
 'edit-no-change' => 'A ṣe àìkàsí àtúnṣe yín, nítorípé ìkọ̀wé kò ní àtúnṣe kankan.',
+'postedit-confirmation' => 'Àtúnṣe yín ti jẹ́ gbígbépamọ́.',
 'edit-already-exists' => "A kò le è ṣè'dá ojúewé tuntun.
 Ó pilẹ̀ ti wà.",
 'defaultmessagetext' => 'Ìkọ ìránṣẹ́ àtìbẹ̀rẹ̀',
 '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',
@@ -1085,7 +1131,6 @@ Kò ṣe é bòmọ́lẹ̀.',
 'searchmenu-legend' => 'Àwọn àṣàyàn àwáàrí',
 'searchmenu-exists' => "'''Ojúewé tó ún jẹ́ \"[[:\$1]]\" wà lórí wiki yìí'''",
 'searchmenu-new' => "'''Dá ojúewé \"[[:\$1]]\" sí orí wiki yìí!'''",
-'searchhelp-url' => 'Help:Àwon àkóónú',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ẹ lọ sí àwọn ojúewé tí wọ́n ní àsopọ̀ yìí]]',
 'searchprofile-articles' => 'Àwọn ojúewé Àkóónú',
 'searchprofile-project' => 'Àwọn ojúewé Ìrànwọ́ àti Iṣẹ́-ọwọ́',
@@ -1130,15 +1175,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 +1729,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 +2137,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ú.',
@@ -2980,6 +3015,16 @@ Tí ẹ bá jẹ́ ó ṣiṣẹ́, ẹ̀rọ sístẹ́mù yín le kó sí ewu.
 'ago' => '$1 sẹ́yìn',
 'just-now' => 'nísinsìnyí',
 
+# Human-readable timestamps
+'monday-at' => 'Ọjọ́ajé ní ago $1',
+'tuesday-at' => 'Ọjọ́ìṣẹ́gun ní ago $1',
+'wednesday-at' => 'Ọjọ́rú ní ago $1',
+'thursday-at' => 'Ọjọ́bọ̀ ní ago $1',
+'friday-at' => 'Ọjọ́ẹtì ní ago $1',
+'saturday-at' => 'Ọjọ́àbámẹ́ta ní ago $1',
+'sunday-at' => 'Ọjọ́àìkú ní ago $1',
+'yesterday-at' => 'Àná ní ago $1',
+
 # Bad image list
 'bad_image_list' => 'Onírú jẹ́ gẹ́gẹ́ bíi àtèlé yìí:
 Àwọn ohun àkójọ nìkan (àwọn ìlà tí wọ́n bẹ̀rẹ̀ pẹ̀lú *) ni wọ́n jẹ́ gbígbérò.
@@ -3008,7 +3053,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 +3174,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 +3471,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..e79fbf2 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' => '永不',
@@ -471,7 +473,6 @@ $1',
 'disclaimers' => '免責聲明',
 'disclaimerpage' => 'Project:一般免責聲明',
 'edithelp' => '編輯協助',
-'edithelppage' => 'Help:編輯',
 'helppage' => 'Help:目錄',
 'mainpage' => '頭版',
 'mainpage-description' => '頭版',
@@ -826,7 +827,7 @@ $1',
 '''佢嘅內容重未儲存!'''",
 'userinvalidcssjstitle' => "'''警告:''' 無叫做 \"\$1\" 嘅畫面。請記住自訂介面的 .css 和 .js 頁面時應使用細楷,例如:{{ns:user}}:Foo/vector.css 而唔係 {{ns:user}}:Foo/Vector.css 。",
 'updated' => '(己更新)',
-'note' => "'''留意:'''",
+'note' => "'''留意'''",
 'previewnote' => "'''請記住呢個只係預覽。'''
 更改嘅内容重未儲存!",
 'previewconflict' => '呢個預覽係反映如果你選擇儲存嘅話,嘅上面嘅文字編輯區裏面嘅字會儲存落嚟。',
@@ -903,6 +904,8 @@ $1',
 'edit-no-change' => '你嘅編輯已經略過,因為文字無改過。',
 'edit-already-exists' => '唔可以開一新版。
 佢已經存在。',
+'editwarning-warning' => '離開呢一版會令到你嘅修改唔見咗。
+你可以響你嘅喜好設定嘅"{{int:prefs-editing}}"小節度停用呢個警告。',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => '警告: 呢一版有太多耗費嘅語法功能呼叫。
@@ -1120,7 +1123,6 @@ $1",
 'searchmenu-legend' => '搵嘢選項',
 'searchmenu-exists' => "'''響呢個wiki度有一版叫做\"[[:\$1]]\"。'''",
 'searchmenu-new' => "'''響呢個wiki度開呢版\"[[:\$1]]\"!'''",
-'searchhelp-url' => 'Help:目錄',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|去睇以呢個做開頭嘅版]]',
 'searchprofile-articles' => '內容頁',
 'searchprofile-project' => '幫手同計劃頁',
@@ -1162,14 +1164,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 +1193,7 @@ $1",
 'resetprefs' => '清除未保存嘅更改',
 'restoreprefs' => '恢復全部預設設定',
 'prefs-editing' => '編輯中',
-'prefs-edit-boxsize' => '編框大細',
+'prefs-edit-boxsize' => '編框大細',
 'rows' => '列:',
 'columns' => '行:',
 'searchresultshead' => '搵嘢',
@@ -1242,7 +1236,7 @@ $1",
 'prefs-common-css-js' => '共有嘅CSS同埋JavaScript畀所有畫面用:',
 'prefs-reset-intro' => '你可以用呢版去重設你嘅喜好設定到網站預設值。呢個動作無得番轉頭。',
 'prefs-emailconfirm-label' => '電郵確認:',
-'prefs-textboxsize' => '編輯窗大細',
+'prefs-textboxsize' => '編寫框大細',
 'youremail' => '電郵:',
 'username' => '用戶名:',
 'uid' => '用戶 ID:',
@@ -1644,7 +1638,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 +2010,8 @@ Template:搞清楚',
 'notvisiblerev' => '上次由唔同用戶嘅修訂已經刪除咗',
 'watchnochange' => '響顯示嘅時間之內,你所監視嘅頁面並無任何嘅更改。',
 'watchlist-details' => '唔計討論頁,有 $1 版響你個監視清單度。',
-'wlheader-enotif' => '電子郵件通知已經啟用。',
-'wlheader-showupdated' => "'''粗體字'''嘅頁響你上次嚟之後被人改過",
+'wlheader-enotif' => '電子郵件通知已經啟用。',
+'wlheader-showupdated' => "'''粗體字'''嘅頁響你上次嚟之後被人改過",
 'watchmethod-recent' => '睇緊最近修改中有邊頁監視緊',
 'watchmethod-list' => '睇緊被監視頁有乜新修改',
 'watchlistcontains' => '你嘅監視清單裏面有$1頁。',
@@ -2644,27 +2637,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 +2675,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 +2748,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 +2793,7 @@ Variants for Chinese language
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => '闊',
 'exif-imagelength' => '高',
 'exif-bitspersample' => '每部位位元數',
@@ -2934,7 +2909,7 @@ Variants for Chinese language
 'exif-gpsdifferential' => 'GPS 差動修正',
 'exif-objectname' => '短標題',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => '未壓過',
 
 'exif-unknowndate' => '未知日期',
@@ -3262,12 +3237,6 @@ MediaWiki是基於使用目的而加以發佈,但係就唔會負上任何嘅
 'version-software-product' => '產品',
 'version-software-version' => '版本',
 
-# Special:FilePath
-'filepath' => '檔案路徑',
-'filepath-page' => '檔名:',
-'filepath-submit' => '去',
-'filepath-summary' => '呢個特別頁拎一個檔案嘅完整路徑。圖像會以完整嘅解像度顯示,其它嘅檔案類型會以同佢哋關聯咗嘅程式啟動。',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => '㨂重覆檔案',
 'fileduplicatesearch-summary' => '用重覆檔案嘅切細值去搵個檔案係唔係重覆。',
index 2715b8f..6bad14b 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',
@@ -283,7 +281,6 @@ $1",
 'disclaimers' => 'Voebehoud',
 'disclaimerpage' => 'Project:Alhemeên voebehoud',
 'edithelp' => "Ulpe bie't bewerken",
-'edithelppage' => 'Help:Bewerken',
 'helppage' => 'Help:Inoud',
 'mainpage' => 'Vòblad',
 'mainpage-description' => 'Vòblad',
@@ -811,7 +808,6 @@ Zurg da je bie deêze wiezigieng de heschiedenisdeurloôpendeid van de pagina be
 'viewprevnext' => 'Bekiek ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''Er is 'n pagina genaemd \"[[:\$1]]\" op deêze wiki.'''",
 'searchmenu-new' => "'''De pagina \"[[:\$1]]\" anmaek'n op deêze wiki.'''",
-'searchhelp-url' => 'Help:Inoud',
 'searchprofile-articles' => "Inhoudelike pagina's",
 'searchprofile-project' => "Hilp- en projectpagina's",
 'searchprofile-images' => 'Multimedia',
@@ -842,14 +838,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 915e905..ea95e64 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 M13253
  * @author Makecat
  * @author Mark85296341
  * @author MarkAHershberger
  * @author O
  * @author Onecountry
  * @author PhiLiP
+ * @author Qiyue2001
  * @author Shinjiman
  * @author Shirayuki
  * @author Shizhao
  * @author Simon Shek
+ * @author Slboat
+ * @author Stevenliuyi
  * @author Supaiku
  * @author Tommyang
  * @author Waihorace
@@ -59,6 +66,7 @@
  * @author Wrightbus
  * @author Xiaomingyan
  * @author Yfdyh000
+ * @author 乌拉跨氪
  * @author 燃玉
  * @author 阿pp
  */
@@ -377,7 +385,7 @@ $messages = array(
 'tog-enotifrevealaddr' => '在通知电子邮件中显示我的电子邮件地址',
 'tog-shownumberswatching' => '显示监视用户数',
 'tog-oldsig' => '当前签名:',
-'tog-fancysig' => '将签名以wiki文本对待(不产生自动链接)',
+'tog-fancysig' => '将签名视为维基代码(不自动生成链接)',
 'tog-showjumplinks' => '启用“跳转到”访问链接',
 'tog-uselivepreview' => '使用实时预览(需要JavaScript)(实验功能)',
 'tog-forceeditsummary' => '未输入编辑摘要时提醒我',
@@ -399,7 +407,7 @@ $messages = array(
 'underline-default' => '皮肤或浏览器默认设置',
 
 # Font style option in Special:Preferences
-'editfont-style' => '编辑区字体样式:',
+'editfont-style' => '编辑区中的字体样式:',
 'editfont-default' => '浏览器默认',
 'editfont-monospace' => '等宽字体',
 'editfont-sansserif' => '无衬线字体',
@@ -456,6 +464,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个分类',
@@ -466,10 +486,10 @@ $messages = array(
 'hidden-categories' => '$1个隐藏分类',
 'hidden-category-category' => '隐藏分类',
 'category-subcat-count' => '{{PLURAL:$2|本分类只有下列一个子分类。|本分类包含下列$1个子分类,共$2个子分类。}}',
-'category-subcat-count-limited' => '本分类包含下列$1个子分类。',
+'category-subcat-count-limited' => '本分类包含下列{{PLURAL:$1|subcategory|$1个子分类}}。',
 'category-article-count' => '{{PLURAL:$2|本分类只有下列一个页面。|本分类包含下列$1个页面,共有$2个页面。}}',
 'category-article-count-limited' => '本分类包含下列$1个页面。',
-'category-file-count' => '{{PLURAL:$2|本分类只有下列文件。|本分类包含下列$1个文件,共$2个文件。}}',
+'category-file-count' => '{{PLURAL:$2|本分类只包含以下文件。|以下{{PLURAL:$1|文件|$1个文件}}在本分类中,共$2个文件。}}',
 'category-file-count-limited' => '本分类包含下列$1个文件。',
 'listingcontinuesabbrev' => '续',
 'index-category' => '允许索引的页面',
@@ -478,10 +498,10 @@ $messages = array(
 
 'about' => '关于',
 'article' => '内容页面',
-'newwindow' => 'ï¼\88å°\86äº\8e新窗口中打开)',
+'newwindow' => 'ï¼\88å\9c¨新窗口中打开)',
 'cancel' => '取消',
 'moredotdotdot' => '更多',
-'morenotlisted' => 'æ\9b´å¤\9aæ\9cªè¢«å\88\97å\87ºç\9a\84模æ\9d¿...',
+'morenotlisted' => 'æ\9b´å¤\9a模æ\9d¿æ\9cªå\88\97å\87º...',
 'mypage' => '页面',
 'mytalk' => '讨论',
 'anontalk' => '该IP地址的讨论',
@@ -492,7 +512,7 @@ $messages = array(
 'qbfind' => '查找',
 'qbbrowse' => '浏览',
 'qbedit' => '编辑',
-'qbpageoptions' => '页面选项',
+'qbpageoptions' => '此页',
 'qbmyoptions' => '我的页面',
 'qbspecialpages' => '特殊页面',
 'faq' => '常见问题',
@@ -516,7 +536,7 @@ $messages = array(
 'variants' => '变换',
 
 'navigation-heading' => '导航菜单',
-'errorpagetitle' => '错误',
+'errorpagetitle' => '出错',
 'returnto' => '返回到$1。',
 'tagline' => '来自{{SITENAME}}',
 'help' => '帮助',
@@ -537,6 +557,7 @@ $messages = array(
 'create-this-page' => '创建本页',
 'delete' => '删除',
 'deletethispage' => '删除本页',
+'undeletethispage' => '撤消删除此页',
 'undelete_short' => '恢复$1个被删除的编辑',
 'viewdeleted_short' => '查看$1个被删除的编辑',
 'protect' => '保护',
@@ -576,7 +597,7 @@ $messages = array(
 请稍等片刻后再次尝试访问本页面。
 
 $1',
-'pool-timeout' => '等待锁超时',
+'pool-timeout' => '等待锁超时',
 'pool-queuefull' => '请求队列已满',
 'pool-errorunknown' => '未知错误',
 
@@ -590,18 +611,17 @@ $1',
 'disclaimers' => '免责声明',
 'disclaimerpage' => 'Project:免责声明',
 'edithelp' => '编辑帮助',
-'edithelppage' => 'Help:编辑',
 'helppage' => 'Help:目录',
 'mainpage' => '首页',
 'mainpage-description' => '首页',
-'policy-url' => 'Project:æ\94¿ç­\96',
+'policy-url' => 'Project:æ\96¹é\92\88ä¸\8eæ\8c\87å¼\95',
 'portal' => '社区专页',
 'portal-url' => 'Project:社区专页',
-'privacy' => '隐私政策',
+'privacy' => 'é\9a\90ç§\81æ\9d\83æ\94¿ç­\96',
 'privacypage' => 'Project:隐私权政策',
 
 'badaccess' => '权限错误',
-'badaccess-group0' => '你被禁止执行你刚才请求的操作。',
+'badaccess-group0' => '你被禁止执行你请求的操作。',
 'badaccess-groups' => '您刚才请求的操作只有{{PLURAL:$2|这个用户组|以下用户组}}中的用户才能使用: $1',
 
 'versionrequired' => '需要版本为$1的MediaWiki',
@@ -615,7 +635,7 @@ $1',
 'newmessagesdifflink' => '最后更改',
 'youhavenewmessagesfromusers' => '你有来自{{PLURAL:$3|其他用户|$3个用户}}的$1($2)。',
 'youhavenewmessagesmanyusers' => '你有来自多个用户的$1($2)。',
-'newmessageslinkplural' => '{{PLURAL:$1|一条新信息|新信息}}',
+'newmessageslinkplural' => '{{PLURAL:$1|新信息}}',
 'newmessagesdifflinkplural' => '最后{{PLURAL:$1|更改}}',
 'youhavenewmessagesmulti' => '你在$1有新信息',
 'editsection' => '编辑',
@@ -623,7 +643,7 @@ $1',
 'viewsourceold' => '查看源代码',
 'editlink' => '编辑',
 'viewsourcelink' => '查看源代码',
-'editsectionhint' => '编辑章节:$1',
+'editsectionhint' => '编辑段落:$1',
 'toc' => '目录',
 'showtoc' => '显示',
 'hidetoc' => '隐藏',
@@ -636,7 +656,7 @@ $1',
 'feed-invalid' => '无效的订阅类型。',
 'feed-unavailable' => '不提供联合订阅源',
 'site-rss-feed' => '$1的RSS订阅',
-'site-atom-feed' => '$1的Atom',
+'site-atom-feed' => '$1的Atom订阅',
 'page-rss-feed' => '“$1”的RSS订阅',
 'page-atom-feed' => '“$1”的Atom订阅',
 'red-link-title' => '$1(页面不存在)',
@@ -645,7 +665,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' => '项目页面',
@@ -687,9 +707,9 @@ $1',
 这通常是由于点击了链向旧有差异或历史的链接,而原有修订已被删除导致的。
 
 如果情况不是这样,您可能找到了软件的一个内部错误。请记录下URL地址,并向[[Special:ListUsers/sysop|管理员]]报告。',
-'missingarticle-rev' => '(修订版本编号:$1)',
+'missingarticle-rev' => '(版本#:$1)',
 'missingarticle-diff' => '(差异:$1,$2)',
-'readonly_lag' => '从数据库服务器正在从主服务器上更新,数据库已被自动锁定',
+'readonly_lag' => '附属数据库服务器正在将缓存更新到主服务器上,数据库已被自动锁定',
 'internalerror' => '内部错误',
 'internalerror_info' => '内部错误:$1',
 'fileappenderrorread' => '当附加时无法读取"$1"。',
@@ -707,7 +727,7 @@ $1',
 它可能已被其他人删除了。',
 'cannotdelete-title' => '无法删除“$1”',
 'delete-hook-aborted' => '删除被扩展钩子取消。钩子并没有给出解释。',
-'badtitle' => '错误标题',
+'badtitle' => '错误标题',
 'badtitletext' => '所请求页面的标题是无效的、不存在,跨语言或跨wiki链接的标题错误。它可能包含一个或更多的不能用于标题的字符。',
 'perfcached' => '下列数据已缓存,但可能已过时。最高{{PLURAL:$1|一个结果|$1个结果}}在缓存中可用。',
 'perfcachedts' => '下列数据已缓存,最后更新于$1。缓存中最多可有{{PLURAL:$4|1个结果|$4个结果}}。',
@@ -734,7 +754,9 @@ $2',
 'namespaceprotected' => "您没有权限编辑'''$1'''名字空间内的页面。",
 'customcssprotected' => '您没有权限编辑此CSS页面,因为它包含另一位用户的个人设置。',
 'customjsprotected' => '您没有权限编辑此JavaScript页面,因为它包含另一位用户的个人设置。',
-'ns-specialprotected' => '您不能编辑特殊页面。',
+'mycustomcssprotected' => '您没有权限编辑这个 CSS 页面。',
+'mycustomjsprotected' => '您没有权限编辑这个 JavaScript 页面。',
+'ns-specialprotected' => '特殊页面不可编辑。',
 'titleprotected' => '此标题已被[[User:$1|$1]]保护以防止创建。理由是“$2”。',
 'filereadonlyerror' => '因为媒体库$2处于只读模式而无法修改文件$1。
 
@@ -754,38 +776,67 @@ $2',
 
 您可以继续以匿名方式使用{{SITENAME}},或再次以相同或不同用户身份<span class='plainlinks'>[$1 登录]</span>。请注意一些页面可能仍然显示您为登录状态,直到您清空您的浏览器缓存为止。",
 'welcomeuser' => '欢迎,$1!',
-'welcomecreation-msg' => '你的账户已创建。请不要忘记更改你的[[Special:Preferences|{{SITENAME}}系统设置]]。',
+'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}}。',
+'loginprompt' => '你必须启用Cookie才能登录{{SITENAME}}。',
 'userlogin' => '登录/创建账户',
 'userloginnocreate' => '登录',
 'logout' => '退出',
 'userlogout' => '退出',
 'notloggedin' => '未登录',
+'userlogin-noaccount' => '没有账户?',
+'userlogin-joinproject' => '加入{{SITENAME}}',
 'nologin' => '没有账户?$1。',
 'nologinlink' => '创建账户',
 'createaccount' => '创建账户',
 'gotaccount' => '已经拥有账户?请$1。',
 'gotaccountlink' => '登录',
-'userlogin-resetlink' => '忘记了你的登录信息?',
+'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 +845,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”。
@@ -824,7 +875,7 @@ $2',
 'cannotchangeemail' => '本wiki不允许对账户的电子邮件地址进行更改。',
 'emaildisabled' => '此站点不能发送电子邮件。',
 'accountcreated' => '已建立账户',
-'accountcreatedtext' => '$1的账户已经被创建。',
+'accountcreatedtext' => '[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]])的账户已创建。',
 'createaccount-title' => '在{{SITENAME}}中创建新账户',
 'createaccount-text' => '有人在{{SITENAME}}中利用您的邮箱创建了一个名为 "$2" 的新帐户($4),密码是 "$3" 。您应该立即登录并更改密码。
 
@@ -856,13 +907,15 @@ $2',
 'resetpass-submit-cancel' => '取消',
 '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' => '此wiki已经禁用密码重置。',
-'passwordreset-pretext' => '{{PLURAL:$1||输入下面的数据项之一}}',
+'passwordreset-disabled' => '此Wiki已经禁用密码重置。',
+'passwordreset-emaildisabled' => '此Wiki上无法使用邮件功能。',
 'passwordreset-username' => '用户名:',
 'passwordreset-domain' => '域:',
 'passwordreset-capture' => '查看生成的电子邮件吗?',
@@ -883,12 +936,12 @@ $2
 临时密码:$2',
 'passwordreset-emailsent' => '密码重置邮件已发送。',
 'passwordreset-emailsent-capture' => '密码重设电子邮件已发送,并在下面显示。',
-'passwordreset-emailerror-capture' => '生成的密码重设电子邮件如下所示,但发送失败:$1',
+'passwordreset-emailerror-capture' => '重置密码邮件已生成,但是无法向{{GENDER:$2|下列用户}} 发送:$1',
 
 # Special:ChangeEmail
 'changeemail' => '更改电子邮件地址',
 'changeemail-header' => '更改帐户的电子邮件地址',
-'changeemail-text' => 'å®\8cæ\88\90æ­¤çª\97ä½\93可以更改您的电子邮件地址。您将需要输入您的密码以确认此更改。',
+'changeemail-text' => 'å¡«å\86\99此表å\8d\95可以更改您的电子邮件地址。您将需要输入您的密码以确认此更改。',
 'changeemail-no-info' => '
 您必须登录以直接访问本页。',
 'changeemail-oldemail' => '当前电子邮件地址:',
@@ -959,7 +1012,7 @@ $2
 请注意,只有当你在[[Special:Preferences|系统设置]]确认了电子邮件地址且未被禁止使用“电邮联系”功能时,才可以使用它。
 
 你当前的IP地址是$3,该封禁ID是#$5。请在你的询问中包含上面的所有信息。",
-'blockednoreason' => 'æ\97 给出原因',
+'blockednoreason' => 'æ\9cª给出原因',
 'whitelistedittext' => '您必须先$1才可编辑页面。',
 'confirmedittext' => '你必须确认你的电子邮件地址才能编辑页面。请通过[[Special:Preferences|系统设置]]设置并确认你的电子邮件地址。',
 'nosuchsectiontitle' => '没有这个段落',
@@ -969,7 +1022,7 @@ $2
 'loginreqlink' => '登录',
 'loginreqpagetext' => '您必须$1才能查看其它页面。',
 'accmailtitle' => '密码已寄出',
-'accmailtext' => "'$1'的密码已经被发送到$2。",
+'accmailtext' => "'[[User talk:$1|$1]]'的随机密码已经发送到$2。这个账户的密码可在登陆后的'[[Special:ChangePassword|更改密码]]'''页面中更改。",
 'newarticle' => '(新页面)',
 'newarticletext' => '您进入了一个尚未创建的页面。
 要创建该页面,请在下面的编辑框中输入内容(详情参见[[{{MediaWiki:Helppage}}|帮助页]])。
@@ -999,7 +1052,7 @@ $2
 'userinvalidcssjstitle' => "'''警告:''' 不存在皮肤\"\$1\"。注意自定义的 .css 和 .js 页要使用小写标题,例如,{{ns:user}}:Foo/vector.css 不同于 {{ns:user}}:Foo/Vector.css。",
 'updated' => '(已更新)',
 'note' => "'''注意:'''",
-'previewnote' => "'''请记住这仅为预览。'''您的更改还未保存!",
+'previewnote' => "'''请记住这只是预览。'''你的更改还没有保存!",
 'continue-editing' => '往编辑框',
 'previewconflict' => '该预览反映了上面文字编辑区中的文字在你保存后的显示状况。',
 'session_fail_preview' => "'''对不起!由于会话数据丢失,我们无法处理你的编辑。'''请重试。如果仍然失败,请尝试[[Special:UserLogout|退出登录]]后重新登录。",
@@ -1014,7 +1067,7 @@ $2
 'edit_form_incomplete' => "'''编辑表格的某些部分没有到达服务器,请检查你的编辑是否完整并重试。'''",
 'editing' => '编辑“$1”',
 'creating' => '创建 $1',
-'editingsection' => '编辑“$1”(段落)',
+'editingsection' => '编辑“$1(段落)”',
 'editingcomment' => '编辑“$1”(新段落)',
 'editconflict' => '编辑冲突:$1',
 'explainconflict' => "其他用户在你开始编辑后更改了该页面。上面的文字区含有该页面当前的文字。下面的文字区显示你的更改。你必须把你的更改合并至现有文字。'''只有'''当你单击“{{int:savearticle}}”后,上面的文字区中的文字才会被保存。",
@@ -1057,7 +1110,7 @@ $2
 'permissionserrorstext-withaction' => '因为以下{{PLURAL:$1|原因}},你没有权限$2:',
 'recreate-moveddeleted-warn' => "'''警告:你正在重新创建曾经被删除的页面。'''
 
-你应该考虑继续编辑本页是否合适。这里提供本页的删除和移动记录以供参考:",
+你应该考虑继续编辑本页是否合适。这里提供本页的删除和移动日志以供参考:",
 'moveddeleted-notice' => '本页面已被删除。下面提供本页的删除和移动日志以供参考。',
 'log-fulllog' => '查看完整日志',
 'edit-hook-aborted' => '编辑被hook指令取消。
@@ -1066,13 +1119,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}}”节中关闭此警告。',
+'editwarning-warning' => '离开这个页面会令您遗失之前的所有更改。若您已经登入,您可在您参数设置的“编辑”节中关闭此警告。',
 
 # Content models
 'content-model-wikitext' => 'wiki语法',
@@ -1088,8 +1142,7 @@ $2
 'post-expand-template-inclusion-warning' => '警告:包含模板大小过大。
 一些模板将不会包含。',
 'post-expand-template-inclusion-category' => '模板包含上限已经超过的页面',
-'post-expand-template-argument-warning' => '警告:这个页面有最少一个模参数有过大扩展大小。
-这些参数会被略过。',
+'post-expand-template-argument-warning' => "'''警告:'''本页面包含至少一个模板参数有过大扩展大小。这些参数会被略过。",
 'post-expand-template-argument-category' => '包含着略过模板参数的页面',
 'parser-template-loop-warning' => '检查到模板循环:[[$1]]',
 'parser-template-recursion-depth-warning' => '模板递归深度越限($1)',
@@ -1134,7 +1187,7 @@ $3的理由是''$2''",
 'history-fieldset-title' => '浏览历史',
 'history-show-deleted' => '仅被删除的',
 'histfirst' => '最早',
-'histlast' => '最',
+'histlast' => '最',
 'historysize' => '($1字节)',
 'historyempty' => '(空)',
 
@@ -1150,7 +1203,7 @@ $3的理由是''$2''",
 'rev-deleted-user' => '(用户名被删除)',
 'rev-deleted-event' => '(日志条目被删除)',
 'rev-deleted-user-contribs' => '[用户名或IP地址被删除 - 编辑在贡献中隐藏]',
-'rev-deleted-text-permission' => "本页面版本已被'''删除'''。详情请见[{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} 删除日志]。",
+'rev-deleted-text-permission' => "本页面版本已被'''删除'''。详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。",
 'rev-deleted-text-unhide' => "本页面版本已被'''删除'''。详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。如果你想继续操作,你仍然可以[$1 查看本版本]。",
 'rev-suppressed-text-unhide' => "该页面修订已经被'''监督隐藏'''。在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到详细的信息。如果您想继续的话,您可以仍然[$1 去查看这次修订]。",
 'rev-deleted-text-view' => "本页面版本已被'''删除'''。你可以查看它,详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。",
@@ -1177,9 +1230,9 @@ $3的理由是''$2''",
 'revdelete-show-file-submit' => '是',
 'revdelete-selected' => "'''选取'''[[:$1]]'''的$2次修订:'''",
 'logdelete-selected' => "'''{{PLURAL:$1|选取的日志项目}}:'''",
-'revdelete-text' => "'''删除的修订仍将显示在页面历史中, 但它们的文本内容已不能被公众访问。'''
-在{{SITENAME}}的其他管理员将仍能访问隐藏的内容并通过与此相同的界面恢复删除,除非站点工作者进行了一些附加的限制。",
-'revdelete-confirm' => '请确认您肯定去做的话,您就要明白到后果,以及这个程序符合[[{{MediaWiki:Policy-url}}|政策]]。',
+'revdelete-text' => "'''删除的版本仍将显示在页面历史及日志中,但公众已不能访问其文本内容。'''
+在{{SITENAME}}的其他管理员将仍能访问隐藏的内容并通过该界面恢复删除的版本,除非进行了额外限制。",
+'revdelete-confirm' => '请确认该操作,明白其后果,并确保该操作符合[[{{MediaWiki:Policy-url}}|方针]]。',
 'revdelete-suppress-text' => "阻止应该'''只'''在以下情形使用:
 *潜在的诽谤信息
 *不合适的个人信息
@@ -1197,7 +1250,7 @@ $3的理由是''$2''",
 'revdelete-suppress' => '同时阻止管理员与其他用户查看数据',
 'revdelete-unsuppress' => '在已恢复的修订中移除限制',
 'revdelete-log' => '原因:',
-'revdelete-submit' => '应用于选中的{{PLURAL:$1|修订}}',
+'revdelete-submit' => '应用于选中的{{PLURAL:$1|版本}}',
 'revdelete-success' => "'''修订的可见性已经成功更新。'''",
 'revdelete-failure' => "'''修订的可见性无法更新:'''
 $1",
@@ -1223,7 +1276,7 @@ $1",
 'revdelete-otherreason' => '其他/附加原因:',
 'revdelete-reasonotherlist' => '其他原因',
 'revdelete-edit-reasonlist' => '编辑删除埋由',
-'revdelete-offender' => '修订版本编辑者:',
+'revdelete-offender' => '版本作者:',
 
 # Suppression log
 'suppressionlog' => '监督日志',
@@ -1294,7 +1347,6 @@ $1",
 'searchmenu-legend' => '搜索选项',
 'searchmenu-exists' => "'''本wiki上有名为“[[:$1]]”的页面。'''",
 'searchmenu-new' => "'''在本wiki上新建名为“[[:$1]]”的页面!'''",
-'searchhelp-url' => 'Help:目录',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|去浏览以此为首的页面]]',
 'searchprofile-articles' => '内容页面',
 'searchprofile-project' => '帮助和项目页面',
@@ -1318,7 +1370,7 @@ $1",
 'search-relatedarticle' => '相关',
 'mwsuggest-disable' => '禁用AJAX建议',
 'searcheverything-enable' => '在所有名字空间中搜索',
-'searchrelated' => '相关页面',
+'searchrelated' => '相关',
 'searchall' => '所有',
 'showingresults' => "下面显示从第'''$2'''条结果开始的'''$1'''条结果。",
 'showingresultsnum' => "下面显示从第'''$2'''条结果开始的'''$3'''条结果。",
@@ -1328,17 +1380,18 @@ $1",
 'powersearch' => '高级搜索',
 'powersearch-legend' => '高级搜索',
 'powersearch-ns' => '在以下的名字空间中搜索:',
-'powersearch-redir' => '重定向页列表',
+'powersearch-redir' => '列出重定向页',
 'powersearch-field' => '搜索',
 'powersearch-togglelabel' => '选择:',
 'powersearch-toggleall' => '全选',
 'powersearch-togglenone' => '全不选',
 'search-external' => '外部搜索',
 'searchdisabled' => '{{SITENAME}}的搜索已被禁用。您可以暂时使用Google进行搜索,须注意他们索引的{{SITENAME}}内容可能会过时。',
+'search-error' => '搜索时发生错误:$1',
 
 # Preferences page
 'preferences' => '设置',
-'mypreferences' => '系统设置',
+'mypreferences' => '设置',
 'prefs-edits' => '编辑数:',
 'prefsnologin' => '未登录',
 'prefsnologintext' => '您必须先<span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} 登录]</span>才能设置个人参数。',
@@ -1430,8 +1483,8 @@ $1",
 'prefs-help-gender' => '选填项目。使软件使用正确的性别称呼。该信息将会公开。',
 'email' => '电子邮件',
 'prefs-help-realname' => '真实姓名是选填项目。如果你选择提供它,它将会用于贡献署名。',
-'prefs-help-email' => '电子邮件地址是选填项目。但是在你忘记密码需要重置密码时需要电子邮件地址。',
-'prefs-help-email-others' => '你亦å\8f¯ä»¥é\80\89æ\8b©è®©å\85¶ä»\96ç\94¨æ\88·é\80\9aè¿\87ä½ ç\9a\84ç\94¨æ\88·é¡µæ\88\96讨论页上的链接用电子邮件联系你。其他用户联系你时你的电子邮件地址不会显示。',
+'prefs-help-email' => '电子邮件地址是选填项目,但是当你忘记密码需要重置密码时需要该项信息。',
+'prefs-help-email-others' => 'ä½ ä¹\9få\8f¯ä»¥é\80\89æ\8b©è®©å\85¶ä»\96ç\94¨æ\88·é\80\9aè¿\87ä½ ç\9a\84ç\94¨æ\88·æ\88\96讨论页é\9d¢上的链接用电子邮件联系你。其他用户联系你时你的电子邮件地址不会显示。',
 'prefs-help-email-required' => '电子邮件地址是必填项目。',
 'prefs-info' => '基本信息',
 'prefs-i18n' => '界面语言',
@@ -1473,6 +1526,8 @@ $1",
 'userrights-notallowed' => '你的账户没有权限添加或删除用户权限。',
 'userrights-changeable-col' => '你可以更改的用户组',
 'userrights-unchangeable-col' => '你不能更改的用户组',
+'userrights-conflict' => '用户权限冲突 !请重新应用您的更改。',
+'userrights-removed-self' => '您已成功删除您自己的权利。因此,您不再能够访问此页。',
 
 # Groups
 'group' => '用户组:',
@@ -1543,6 +1598,10 @@ $1",
 'right-editusercssjs' => '编辑其他用户的CSS和JavaScript文件',
 'right-editusercss' => '编辑其他用户的CSS文件',
 'right-edituserjs' => '编辑其他用户的JavaScript文件',
+'right-editmyusercss' => '编辑您自己的用户 CSS 文件',
+'right-editmyuserjs' => '编辑您自己的用户 JavaScript 文件',
+'right-viewmywatchlist' => '查看你的监视列表',
+'right-editmywatchlist' => '编辑您的监视列表。请注意即使没有这种权利,某些操作仍将添加页面。',
 'right-rollback' => '快速回退最后编辑特定页面的用户的编辑',
 'right-markbotedits' => '标记回退编辑为机器人编辑',
 'right-noratelimit' => '不受速率限制影响',
@@ -1604,25 +1663,27 @@ $1",
 'action-userrights-interwiki' => '编辑其它wiki的用户的用户权限',
 'action-siteadmin' => '锁定或解锁数据库',
 'action-sendemail' => '电邮联系其他用户',
+'action-editmywatchlist' => '编辑你的监视列表',
+'action-viewmywatchlist' => '查看你的监视列表',
 
 # Recent changes
-'nchanges' => '$1更改',
+'nchanges' => '$1更改',
 'recentchanges' => '最近更改',
 'recentchanges-legend' => '最近更改选项',
 'recentchanges-summary' => '在此页面上跟踪维基的更改。',
-'recentchanges-feed-description' => '跟踪订阅本wiki的最近更改。',
+'recentchanges-feed-description' => '用这个源跟踪本wiki的最近更改。',
 'recentchanges-label-newpage' => '这次编辑建立了一个新页面',
 'recentchanges-label-minor' => '这是一个小编辑',
 'recentchanges-label-bot' => '这次编辑是由机器人进行',
 'recentchanges-label-unpatrolled' => '该编辑尚未巡查',
-'rcnote' => "下面是最后'''$2'''天的最后'''$1'''个更改,截至$4 $5。",
+'rcnote' => "下面是过去'''$2'''天的最后'''$1'''个更改,截至$4 $5。",
 'rcnotefrom' => "下面是自'''$2'''起的更改(最多显示'''$1'''个)。",
 'rclistfrom' => '显示自$1起的新更改',
 'rcshowhideminor' => '$1小编辑',
 'rcshowhidebots' => '$1机器人的编辑',
 'rcshowhideliu' => '$1登录用户的编辑',
 'rcshowhideanons' => '$1匿名用户的编辑',
-'rcshowhidepatr' => '$1å·¡æ\9f¥è¿\87的编辑',
+'rcshowhidepatr' => '$1已巡æ\9f¥的编辑',
 'rcshowhidemine' => '$1我的编辑',
 'rclinks' => '显示最后$2天的最后$1个更改<br />$3',
 'diff' => '差异',
@@ -1636,7 +1697,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 "',
@@ -1658,7 +1719,7 @@ $1",
 'reuploaddesc' => '取消上传并返回上传表单',
 'upload-tryagain' => '提交修改后的文件描述',
 'uploadnologin' => '未登录',
-'uploadnologintext' => '您必须先[[Special:UserLogin|登录]]才能上传文件。',
+'uploadnologintext' => '您必须先$1才能上传文件。',
 'upload_directory_missing' => '上传目录($1)遗失,不能由网页服务器建立。',
 'upload_directory_read_only' => '上传目录($1)不存在或无写权限。',
 'uploaderror' => '上传错误',
@@ -1676,7 +1737,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' => '摘要:',
@@ -2007,12 +2068,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' => '提交',
@@ -2023,17 +2084,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字节',
@@ -2053,10 +2114,10 @@ $1',
 'uncategorizedimages' => '未归类文件',
 'uncategorizedtemplates' => '未归类模板',
 'unusedcategories' => '未使用分类',
-'unusedimages' => '未使用图像',
+'unusedimages' => '未使用文件',
 'popularpages' => '热点页面',
 'wantedcategories' => '需要的分类',
-'wantedpages' => '待撰页面',
+'wantedpages' => '需要的页面',
 'wantedpages-badtitle' => '在结果组上的无效标题:$1',
 'wantedfiles' => '需要的文件',
 'wantedfiletext-cat' => '下列被使用的文件并不存在。已列出可能存在外部媒体库中的文件。任何此类误报将被<del>剔除</del>。此外,[[:$1]]列出列出了嵌入不存在文件的页面。',
@@ -2087,10 +2148,10 @@ $1',
 'listusers-editsonly' => '只显示有编辑的用户',
 'listusers-creationsort' => '按建立日期排序',
 'usereditcount' => '$1次编辑',
-'usercreated' => '$1 $2{{GENDER:$3|创建}}',
+'usercreated' => '{{GENDER:$3|创建}}于$1 $2',
 'newpages' => '新页面',
 'newpages-username' => '用户名:',
-'ancientpages' => '最页面',
+'ancientpages' => '最页面',
 'move' => '移动',
 'movethispage' => '移动本页',
 'unusedimagestext' => '下列文件已存在,但并未插入任何页面。
@@ -2107,7 +2168,7 @@ $1',
 
 # Book sources
 'booksources' => '网络书源',
-'booksources-search-legend' => '搜索网络书源',
+'booksources-search-legend' => '搜索图书来源',
 'booksources-isbn' => 'ISBN:',
 'booksources-go' => '提交',
 'booksources-text' => '以下是一些网络书店的链接列表,其中可能有您要找的书籍的更多信息:',
@@ -2176,6 +2237,15 @@ $1',
 'listusers-noresult' => '找不到用户。',
 'listusers-blocked' => '(已封禁)',
 
+# Special:ActiveUsers
+'activeusers' => '活跃用户列表',
+'activeusers-intro' => '这个列表列出了最近$1天进行过操作的用户。',
+'activeusers-count' => '最近$3天内有$1次编辑',
+'activeusers-from' => '显示用户开始于:',
+'activeusers-hidebots' => '隐藏机器人',
+'activeusers-hidesysops' => '隐藏管理员',
+'activeusers-noresult' => '找不到用户。',
+
 # Special:ListGroupRights
 'listgrouprights' => '用户组权限',
 'listgrouprights-summary' => '以下面是一个在这个维基中所定义出来的用户权限列表,以及它们的访问权。
@@ -2251,14 +2321,14 @@ $1',
 'notvisiblerev' => '上次由不同用户所作的修订版本已经删除',
 'watchnochange' => '在显示的时间段内您所监视的页面没有更改。',
 'watchlist-details' => '不计讨论页面,你的监视列表中有$1个页面。',
-'wlheader-enotif' => '* 已经启动电子邮件通知功能。',
-'wlheader-showupdated' => "*你上次访问后更改的页面以'''粗体'''显示",
+'wlheader-enotif' => '已启用电子邮件通知',
+'wlheader-showupdated' => "你上次访问后更改的页面以'''粗体'''显示",
 'watchmethod-recent' => '检查被监视页面的最近编辑',
 'watchmethod-list' => '查看监视页中的最新修改',
 'watchlistcontains' => '您的监视列表包含$1个页面。',
 'iteminvalidname' => "页面'$1'错误,无效命名...",
 'wlnote' => "下面是最后'''$2'''小时的最后'''$1'''个更改,截至$3 $4。",
-'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
@@ -2278,9 +2348,9 @@ $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_body_intro_changed' => '{{SITENAME}}页面$1已于$PAGEEDITDATE被$2{{GENDER:$2|更改}},请浏览 $3 查看当前版本。',
+'enotif_lastvisited' => '请浏览 $1 查看你上次访问后的所有更改。',
+'enotif_lastdiff' => '请浏览 $1 查看该更改。',
 'enotif_anon_editor' => '匿名用户$1',
 'enotif_body' => '亲爱的$WATCHINGUSERNAME:
 
@@ -2488,7 +2558,7 @@ $1',
 'mycontris' => '贡献',
 'contribsub2' => '$1的贡献($2)',
 'nocontribs' => '没有找到符合特征的更改。',
-'uctop' => '(最后更改)',
+'uctop' => '(当前)',
 'month' => '截止月份:',
 'year' => '截止年份:',
 
@@ -2507,7 +2577,7 @@ $1',
 最近的封锁日志项目在下面提供以便参考:',
 'sp-contributions-search' => '搜索贡献',
 'sp-contributions-username' => 'IP地址或用户名:',
-'sp-contributions-toponly' => '只显示最后修订版本的编辑',
+'sp-contributions-toponly' => '仅显示最后版本的编辑',
 'sp-contributions-submit' => '搜索',
 
 # What links here
@@ -2517,13 +2587,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个文件链接',
@@ -2806,7 +2876,9 @@ $1被封禁的理由是:“$2”',
 # 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' => '无法创建临时缩略图文件',
@@ -2889,7 +2961,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' => '退出登录',
@@ -2929,7 +3001,7 @@ $1被封禁的理由是:“$2”',
 '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' => '查看系统信息',
@@ -2937,7 +3009,7 @@ $1被封禁的理由是:“$2”',
 'tooltip-ca-nstab-help' => '查看帮助页面',
 'tooltip-ca-nstab-category' => '查看分类页面',
 'tooltip-minoredit' => '标记本编辑为小编辑',
-'tooltip-save' => '保存的更改',
+'tooltip-save' => '保存的更改',
 'tooltip-preview' => '预览您的更改,请在保存前使用此功能!',
 'tooltip-diff' => '显示您对该文字所做的更改',
 'tooltip-compareselectedversions' => '查看此页面两个选定的修订版本间的差异。',
@@ -2958,7 +3030,6 @@ $1被封禁的理由是:“$2”',
 '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 将只会影响机器人 */',
@@ -3003,47 +3074,47 @@ $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' => '文件数',
 
@@ -3109,7 +3180,7 @@ $1',
 'file-no-thumb-animation-gif' => "'''注意:由于技术限制,高分辨率GIF图像的缩略图无法进行动画处理。'''",
 
 # Special:NewFiles
-'newimages' => '新文件库',
+'newimages' => 'æ\96°æ\96\87件å\9b¾åº\93',
 'imagelisttext' => "以下是按$2排列的'''$1'''个文件列表。",
 'newimages-summary' => '本特殊页面展示最后上传的文件。',
 'newimages-legend' => '过滤',
@@ -3129,11 +3200,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' => '请按照下列格式编写:
 
@@ -3142,8 +3227,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' => '简体',
@@ -3186,7 +3269,7 @@ Variants for Chinese language
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => '宽度',
 'exif-imagelength' => '高度',
 'exif-bitspersample' => '每像素字节数',
@@ -3364,14 +3447,14 @@ 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组传真编码',
 'exif-compression-4' => 'CCITT第4组传真编码',
 'exif-compression-6' => 'JPEG(旧)',
 
-'exif-copyrighted-true' => '版权',
+'exif-copyrighted-true' => '受版权保护',
 'exif-copyrighted-false' => '公共领域',
 
 'exif-unknowndate' => '未知日期',
@@ -3581,7 +3664,7 @@ Variants for Chinese language
 'edit-externally-help' => '(更多信息请见[//www.mediawiki.org/wiki/Manual:External_editors 安装说明])',
 
 # 'all' in various places, this might be different for inflected languages
-'watchlistall2' => '全部',
+'watchlistall2' => '所有',
 'namespacesall' => '全部',
 'monthsall' => '全部',
 'limitall' => '全部',
@@ -3734,8 +3817,8 @@ $5
 'watchlistedit-raw-removed' => '$1个标题被删除:',
 
 # Watchlist editing tools
-'watchlisttools-view' => 'æ\9f¥ç\9c\8bç\9b\91è§\86ç\9a\84更改',
-'watchlisttools-edit' => 'æ\9f¥ç\9c\8bå\92\8c编辑监视列表',
+'watchlisttools-view' => 'æ\9f¥ç\9c\8bç\9b¸å\85³更改',
+'watchlisttools-edit' => 'æ\9f¥ç\9c\8b并编辑监视列表',
 'watchlisttools-raw' => '编辑原始监视列表',
 
 # Signatures
@@ -3743,7 +3826,7 @@ $5
 
 # Core parser functions
 'unknown_extension_tag' => '不明的扩展标签“$1”',
-'duplicate-defaultsort' => "'''警告:'''默认排序关键字“$2”覆盖了之前的默认排序关键字“$1”。",
+'duplicate-defaultsort' => "'''警告:'''默认排序关键词“$2”覆盖了之前的默认排序关键词“$1”。",
 
 # Special:Version
 'version' => '版本',
@@ -3780,11 +3863,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' => '搜索重复文件',
@@ -3821,13 +3910,13 @@ MediaWiki发表时预期有用,但对此'''无任何保证''',亦无隐含
 
 # External image whitelist
 'external_image_whitelist' => ' #请原样保留本行文字<pre>
-#在下方书写正则表达式片段(//中间的部份)
-#这些规则将与外部(盗链)图像的URL匹配
-#匹配的URL将被显示为图像,否则只会显示链向图像的链接
-#以#开头的行视为评论
+#请在下面输入正则表达式片段(//之间的部份)
+#这些项目将会匹配外部图像的URL
+#匹配的项目将显示为图像,否则只会显示图像的链接
+#以#å¼\80头ç\9a\84è¡\8c被è§\86为è¯\84论
 #不区分大小写
 
-#在本行上面输入所有正则表达式。请原样保留本行文字</pre>',
+#请在本行上面输入所有正则表达式片段。请原样保留本行文字</pre>',
 
 # Special:Tags
 'tags' => '有效的更改标签',
@@ -3875,6 +3964,9 @@ MediaWiki发表时预期有用,但对此'''无任何保证''',亦无隐含
 'htmlform-submit' => '提交',
 'htmlform-reset' => '撤销更改',
 'htmlform-selectorother-other' => '其他',
+'htmlform-no' => '否',
+'htmlform-yes' => '是',
+'htmlform-chosen-placeholder' => '选择选项',
 
 # SQLite database support
 'sqlite-has-fts' => '带全文搜索的版本$1',
@@ -3902,13 +3994,13 @@ 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{{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-create2' => '用户帐户 $3 由 $1 创建',
 'logentry-newusers-byemail' => '$1创建用户$3,并且密码已通过电子邮件发送',
 'logentry-newusers-autocreate' => '用户帐户$1已被自动{{GENDER:$2|创建}}',
 'logentry-rights-rights' => '$1将$3的用户组从$4改为$5',
@@ -3917,7 +4009,7 @@ MediaWiki发表时预期有用,但对此'''无任何保证''',亦无隐含
 'rightsnone' => '(无)',
 
 # Feedback
-'feedback-bugornote' => '如果你准备好详细描述一个技术问题,请[$1 报告bug]。或者你可以使用下面的简单表格。你的评论将被添加至页面“[$3 $2]”,附有你的用户名和使用的浏览器。',
+'feedback-bugornote' => '如果你准备好详细描述一个技术问题,请[$1 报告bug]。或者你可以使用下面的简单表格。你的评论将被添加至页面“[$3 $2]”,附有你的用户名。',
 'feedback-subject' => '主题:',
 'feedback-message' => '信息:',
 'feedback-cancel' => '取消',
index 7e3e306..6d032e1 100644 (file)
  * @author Andrew971218
  * @author Bencmq
  * @author Breawycker
+ * @author Danny0838
  * @author FireJackey
  * @author Frankou
+ * @author Gakmo
  * @author Gaoxuewei
  * @author Hakka
  * @author Horacewai2
  * @author Kuailong
  * @author Lauhenry
  * @author Liangent
+ * @author Liflon
+ * @author Littletung
  * @author Mark85296341
  * @author Oapbtommy
  * @author Pbdragonwang
  * @author PhiLiP
  * @author Philip
+ * @author Radish10cm
  * @author Shinjiman
  * @author Shirayuki
  * @author Shizhao
@@ -174,6 +179,7 @@ $specialPageAliases = array(
        'Randomredirect'            => array( '隨機重定向頁面' ),
        'Recentchanges'             => array( '最近更改' ),
        'Recentchangeslinked'       => array( '鏈出更改' ),
+       'Redirect'                  => array( '重定向' ),
        'Revisiondelete'            => array( '刪除或恢復版本' ),
        'Search'                    => array( '搜索' ),
        'Shortpages'                => array( '短頁面' ),
@@ -207,6 +213,7 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
+       'redirect'                  => array( '0', '#重定向', '#REDIRECT' ),
        'notoc'                     => array( '0', '__無目錄__', '__无目录__', '__NOTOC__' ),
        'nogallery'                 => array( '0', '__無圖庫__', '__无图库__', '__NOGALLERY__' ),
        'forcetoc'                  => array( '0', '__強制目錄__', '__强显目录__', '__FORCETOC__' ),
@@ -228,10 +235,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 +247,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,37 +274,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-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-useeditwarning' => '當我在更改未儲存時離開頁面時警告我',
+'tog-norollbackdiff' => '回退後不做差異比對',
+'tog-useeditwarning' => '當離開頁面時編輯仍未儲存,請提醒我',
 
 'underline-always' => '總是使用',
 'underline-never' => '從不使用',
@@ -305,7 +313,7 @@ $messages = array(
 # Font style option in Special:Preferences
 'editfont-style' => '編輯區字型樣式:',
 'editfont-default' => '瀏覽器預設',
-'editfont-monospace' => '固定間距字型',
+'editfont-monospace' => '距字型',
 'editfont-sansserif' => '無襯線字型',
 'editfont-serif' => '襯線字型',
 
@@ -360,25 +368,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' => '內容頁面',
@@ -388,9 +408,9 @@ $messages = array(
 'morenotlisted' => '更多未列出的項目...',
 'mypage' => '頁面',
 'mytalk' => '討論',
-'anontalk' => 'IP的對話頁',
+'anontalk' => 'IP的對話頁',
 'navigation' => '導覽',
-'and' => 'å\92\8c',
+'and' => 'å\8f\8a',
 
 # Cologne Blue skin
 'qbfind' => '尋找',
@@ -441,6 +461,7 @@ $messages = array(
 'create-this-page' => '建立本頁',
 'delete' => '刪除',
 'deletethispage' => '刪除本頁',
+'undeletethispage' => '取消刪除此頁',
 'undelete_short' => '反刪除$1項修訂',
 'viewdeleted_short' => '查看$1項已刪除的修訂',
 'protect' => '保護',
@@ -475,40 +496,37 @@ $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:新聞動態',
 'disclaimers' => '免責聲明',
 'disclaimerpage' => 'Project:一般免責聲明',
 'edithelp' => '編輯幫助',
-'edithelppage' => 'Help:如何編輯頁面',
 'helppage' => 'Help:目錄',
 'mainpage' => '首頁',
 '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|版本頁]]。',
 
@@ -521,7 +539,7 @@ $1',
 'youhavenewmessagesmanyusers' => '你有來自多位用戶的$1( $2 )。',
 'newmessageslinkplural' => '{{PLURAL:$1|一項新訊息|新訊息}}',
 'newmessagesdifflinkplural' => '最新{{PLURAL:$1|更改|更改}}',
-'youhavenewmessagesmulti' => '您在 $1 有一條新訊息',
+'youhavenewmessagesmulti' => '您在 $1 有新訊息',
 'editsection' => '編輯',
 'editold' => '編輯',
 'viewsourceold' => '檢視原始碼',
@@ -645,6 +663,8 @@ $2',
 'namespaceprotected' => "您並沒有權限編輯'''$1'''名字空間的頁面。",
 'customcssprotected' => '你並無權限編輯此CSS頁面,因為它包含了其他用戶的個人設置。',
 'customjsprotected' => '你並無權限去編輯此JavaScript頁面,因為他包含了另一位用戶的個人設定。',
+'mycustomcssprotected' => '你沒有編輯這CSS頁面的權限。',
+'mycustomjsprotected' => '你沒有編輯這JavaScript頁面的權限。',
 'ns-specialprotected' => '特殊頁面是不可以編輯的。',
 'titleprotected' => "這個標題已經被[[User:$1|$1]]保護以防止建立。理由是''$2''。",
 'filereadonlyerror' => '無法修改文件「$1」因為文件庫「$2」處於唯讀模式。 !
@@ -668,9 +688,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上的密碼。',
@@ -683,17 +712,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,請開啟它並重新登入。',
@@ -741,7 +790,7 @@ $2',
 'cannotchangeemail' => '本wiki不允許對賬戶的電郵地址進行更改。',
 'emaildisabled' => '此網站不能發送電子郵件。',
 'accountcreated' => '已建立賬戶',
-'accountcreatedtext' => '$1的賬戶已經被建立。',
+'accountcreatedtext' => '[[{{ns:User}}:$1|$1]]([[{{ns:User talk}}:$1|討論]])的賬戶已經被建立。',
 'createaccount-title' => '在{{SITENAME}}中建立新賬戶',
 'createaccount-text' => '有人在{{SITENAME}}中利用您的電郵創建了一個名為 "$2" 的新賬戶($4),密碼是 "$3" 。您應該立即登入並更改密碼。
 
@@ -776,13 +825,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' => '查看生成的電子郵件嗎?',
@@ -808,7 +859,7 @@ $2
 臨時密碼:$2',
 'passwordreset-emailsent' => '已發送重置密碼電郵。',
 'passwordreset-emailsent-capture' => '重置密碼電子郵件已發送,並在下面顯示。',
-'passwordreset-emailerror-capture' => '生成的重置密碼電子郵件如下所示,但發送失敗:$1',
+'passwordreset-emailerror-capture' => '生成的重置密碼電子郵件如下所示,但發送給{{GENDER:$2|用戶}}失敗:$1',
 
 # Special:ChangeEmail
 'changeemail' => '更改電郵地址',
@@ -1012,14 +1063,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' => '離開這個頁面可能會令您失去之前的所有更改。
-若您已經登入,您可在您偏好設定的「編輯」節中關閉此警告。',
+'editwarning-warning' => '離開這個頁面可能會令您失去之前作出的所有更改。若您已經登入,您可在偏好設定的「編輯」部份裡關閉此警告。',
 
 # Content models
 'content-model-wikitext' => 'wiki語法',
@@ -1079,7 +1130,7 @@ $2
 'histlegend' => "差異選擇:標記要比較修訂版本的單選按鈕並點擊底部的按鈕進行比較。<br />
 說明:'''({{int:cur}})''' 指與最新修訂版本比較,'''({{int:last}})''' 指與前一個修訂修訂版本比較,'''{{int:minoreditletter}}''' = 小修改。",
 'history-fieldset-title' => '瀏覽歷史',
-'history-show-deleted' => '僅已刪除的',
+'history-show-deleted' => '僅限已刪除',
 'histfirst' => '最早版本',
 'histlast' => '最新版本',
 'historysize' => '($1 位元組)',
@@ -1097,8 +1148,7 @@ $2
 'rev-deleted-user' => '(用戶名已移除)',
 'rev-deleted-event' => '(日誌已除)',
 'rev-deleted-user-contribs' => '[用戶名或IP地址已移除 - 從貢獻中隱藏編輯]',
-'rev-deleted-text-permission' => "該頁面修訂已被'''刪除'''。
-在[{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} 刪除日誌]中可以找到詳細的訊息。",
+'rev-deleted-text-permission' => "該頁面修訂已被'''刪除'''。在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]中可以找到詳細的訊息。",
 'rev-deleted-text-unhide' => "本頁面版本已被'''刪除'''。詳情請見[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]。如果你想繼續操作,你仍然可以[$1 查看本版本]。",
 'rev-suppressed-text-unhide' => "該頁面修訂已經被'''監督隱藏'''。在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 監督日誌]中可以找到詳細的信息。如果您想繼續的話,您可以仍然[$1 去查看這次修訂]。",
 'rev-deleted-text-view' => "該頁面修訂已經被'''刪除'''。您可以查看它。在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]中可以找到詳細的信息。",
@@ -1243,7 +1293,6 @@ $1",
 'searchmenu-legend' => '搜尋選項',
 'searchmenu-exists' => "'''在這個 wiki 上已有一頁面叫做「[[:$1]]」。'''",
 'searchmenu-new' => "'''在這個 wiki 上建立這個頁面「[[:$1]]」!'''",
-'searchhelp-url' => 'Help:目錄',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|去瀏覽以此為首的頁面]]',
 'searchprofile-articles' => '內容頁面',
 'searchprofile-project' => '幫助和計劃頁面',
@@ -1427,6 +1476,8 @@ $1",
 'userrights-notallowed' => '您的賬戶無權限來添加或刪除用戶權限。',
 'userrights-changeable-col' => '您可以更改的群組',
 'userrights-unchangeable-col' => '您不可以更改的群組',
+'userrights-conflict' => '使用者權限衝突!請重新套用您的更改。',
+'userrights-removed-self' => '您已成功移除自己的權限,故此您沒法再次訪問此頁。',
 
 # Groups
 'group' => '群組:',
@@ -1497,6 +1548,10 @@ $1",
 'right-editusercssjs' => '編輯其他用戶的CSS和JavaScript檔案',
 'right-editusercss' => '編輯其他用戶的CSS檔案',
 'right-edituserjs' => '編輯其他用戶的JavaScript檔案',
+'right-editmyusercss' => '編輯你自己的用戶CSS檔',
+'right-editmyuserjs' => '編輯你自己的用戶JavaScript檔',
+'right-viewmywatchlist' => '查看您的監視列表',
+'right-editmywatchlist' => '編輯您的監視列表。請注意即使沒有這種權利,某些操作仍將添加頁面。',
 'right-rollback' => '快速復原上位用戶對某一頁面之編輯',
 'right-markbotedits' => '標示復原編輯作機械人編輯',
 'right-noratelimit' => '沒有使用頻率限制',
@@ -1558,13 +1613,15 @@ $1",
 'action-userrights-interwiki' => '編輯在其它wiki上用戶的權限',
 'action-siteadmin' => '鎖定和解除鎖定資料庫',
 'action-sendemail' => '發送電郵',
+'action-editmywatchlist' => '編輯您的監視列表�',
+'action-viewmywatchlist' => '查看您的監視列表',
 
 # Recent changes
 'nchanges' => '$1次更改',
 'recentchanges' => '最近更改',
 'recentchanges-legend' => '最近更改選項',
-'recentchanges-summary' => '跟蹤這個wiki上的最新更改。',
-'recentchanges-feed-description' => '追蹤此è¨\82é\96±å\9c¨ wiki 上的最近更改。',
+'recentchanges-summary' => '跟蹤此維基上的最近更改。',
+'recentchanges-feed-description' => 'è¨\82é\96±æ­¤ç¶­å\9fº上的最近更改。',
 'recentchanges-label-newpage' => '這次編輯建立了一個新頁面',
 'recentchanges-label-minor' => '這是一個小編輯',
 'recentchanges-label-bot' => '這次編輯是由機器人進行',
@@ -1612,8 +1669,7 @@ $1",
 'reuploaddesc' => '取消上載並返回上載表單',
 'upload-tryagain' => '提交修改後的檔案描述',
 'uploadnologin' => '未登入',
-'uploadnologintext' => '您必須先[[Special:UserLogin|登入]]
-才能上載檔案。',
+'uploadnologintext' => '您必須先$1才能上載檔案。',
 'upload_directory_missing' => '上傳目錄($1)遺失,不能由網頁伺服器建立。',
 'upload_directory_read_only' => '上傳目錄($1)不存在或無寫權限。',
 'uploaderror' => '上載錯誤',
@@ -1991,7 +2047,7 @@ Template:消除歧義',
 'double-redirect-fixed-maintenance' => '修復從[[$1]]到[[$2]]的雙重重定向。',
 'double-redirect-fixer' => '重新定向修正器',
 
-'brokenredirects' => '損壞的重定向頁',
+'brokenredirects' => '受損重定向頁',
 'brokenredirectstext' => '以下的重定向頁指向的是不存在的頁面:',
 'brokenredirects-edit' => '編輯',
 'brokenredirects-delete' => '刪除',
@@ -2144,6 +2200,15 @@ Template:消除歧義',
 'listusers-noresult' => '找不到用戶。',
 'listusers-blocked' => '(已封禁)',
 
+# Special:ActiveUsers
+'activeusers' => '活躍用戶列表',
+'activeusers-intro' => '這個是在最近$1天之內有一些動作的用戶列表。',
+'activeusers-count' => '最近$3天內有$1次編輯',
+'activeusers-from' => '顯示用戶開始於:',
+'activeusers-hidebots' => '隱藏機器人',
+'activeusers-hidesysops' => '隱藏管理員',
+'activeusers-noresult' => '找不到用戶。',
+
 # Special:ListGroupRights
 'listgrouprights' => '用戶群組權限',
 'listgrouprights-summary' => '以下面是一個在這個wiki中定義出來的用戶權限清單,以及它們的存取權。
@@ -2211,8 +2276,7 @@ Template:消除歧義',
 'watchnologin' => '未登入',
 'watchnologintext' => '您必須先[[Special:UserLogin|登入]],才能更改您的監視列表。',
 'addwatch' => '加至監視列表',
-'addedwatchtext' => '頁面「[[:$1]]」已加到您的[[Special:Watchlist|監視清單]]中。
-將來有關此頁面及其討論頁的任何修改將會在那裡列出。',
+'addedwatchtext' => '已將頁面「[[:$1]]」加入您的[[Special:Watchlist|監視列表]]。將來此頁面及其討論頁如有更動都會在那裡列出。',
 'removewatch' => '停止監視',
 'removedwatchtext' => '[[:$1]]已經從[[Special:Watchlist|您的監視頁面]]中移除。',
 'watch' => '監視',
@@ -2223,8 +2287,8 @@ Template:消除歧義',
 'notvisiblerev' => '上次由不同用戶所作的修訂版本已經刪除',
 'watchnochange' => '在顯示的時間段內您所監視的頁面沒有更改。',
 'watchlist-details' => '不包含討論頁,您的監視列表上有 $1 個頁面。',
-'wlheader-enotif' => '已經啟動電子郵件通知功能。',
-'wlheader-showupdated' => "* 在{{GENDER:|你|妳|你}}上次檢視後有被修改過的頁面會顯示為'''粗體'''",
+'wlheader-enotif' => '已經啟動電子郵件通知功能。',
+'wlheader-showupdated' => "在{{GENDER:|你|妳|你}}上次檢視後有被修改過的頁面會顯示為'''粗體'''。",
 'watchmethod-recent' => '檢查被監視頁面的最近編輯',
 'watchmethod-list' => '檢查最近編輯的被監視頁面',
 'watchlistcontains' => '您的監視列表包含$1個頁面。',
@@ -2250,7 +2314,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',
@@ -2374,7 +2438,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' => '其它時間:',
@@ -2537,7 +2601,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' => '在編輯及列表中隱藏用戶名',
@@ -2578,7 +2642,7 @@ $1',
 'ipblocklist-submit' => '搜尋',
 'ipblocklist-localblock' => '本地封鎖',
 'ipblocklist-otherblocks' => '其他{{PLURAL:$1|封鎖|封鎖}}',
-'infiniteblock' => '永久',
+'infiniteblock' => '無限期',
 'expiringblock' => '$1 $2 到期',
 'anononlyblock' => '僅限匿名用戶',
 'noautoblockblock' => '禁用自動查封',
@@ -2794,6 +2858,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' => '無法創建臨時縮略圖文件',
@@ -2902,7 +2968,7 @@ $1被封禁的理由是“$2”',
 'tooltip-n-mainpage-description' => '訪問首頁',
 'tooltip-n-portal' => '關於本計劃、{{GENDER:|你|妳|你}}可以做什麼、應該如何做',
 'tooltip-n-currentevents' => '提供目前新聞事件的背景資料',
-'tooltip-n-recentchanges' => '列出該網站中的最近修改',
+'tooltip-n-recentchanges' => '列出此維基中的最近修改',
 'tooltip-n-randompage' => '隨機載入一個頁面',
 'tooltip-n-help' => '尋求幫助',
 'tooltip-t-whatlinkshere' => '列出所有與本頁相連的頁面',
@@ -2947,7 +3013,6 @@ $1被封禁的理由是“$2”',
 '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 將只會影響機器人 */',
@@ -3111,11 +3176,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' => '請按照下列格式編寫:
 
@@ -3125,8 +3204,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' => '‪中文(简体)',
@@ -3166,7 +3243,7 @@ Variants for Chinese language
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => '寬度',
 'exif-imagelength' => '高度',
 'exif-bitspersample' => '每象素比特數',
@@ -3344,7 +3421,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組傳真編碼',
@@ -3743,7 +3820,7 @@ $5
 'version-hook-subscribedby' => '利用於',
 'version-version' => '(版本 $1)',
 'version-license' => '授權',
-'version-poweredby-credits' => "這個 Wiki 由 '''[//www.mediawiki.org/ MediaWiki]''' 驅動,版權所有 © 2001-$1 $2。",
+'version-poweredby-credits' => "此維基由'''[//www.mediawiki.org/ MediaWiki]'''驅動,版權所有 © 2001-$1 $2。",
 'version-poweredby-others' => '其他',
 'version-credits-summary' => '我們感謝以下人士為[[Special:Version|MediaWiki]]作出的貢獻。',
 'version-license-info' => 'MediaWiki為自由軟件;您可依據自由軟件基金會所發表的GNU通用公共授權條款規定,就本程式再為發佈與/或修改;無論您依據的是本授權的第二版或(您自行選擇的)任一日後發行的版本。
@@ -3757,12 +3834,19 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任
 'version-entrypoints' => '入口點URL',
 'version-entrypoints-header-entrypoint' => '入口點',
 'version-entrypoints-header-url' => 'URL',
-
-# Special:FilePath
-'filepath' => '檔案路徑',
-'filepath-page' => '檔案名:',
-'filepath-submit' => '前往',
-'filepath-summary' => '這個特殊頁面擷取一個檔案的完整路徑。圖片會以完整的解像度顯示,其它的檔案類型會以同它們已關聯程式啟動。',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath 條目路徑]',
+
+# 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' => '選擇重覆檔案',
@@ -3856,6 +3940,7 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任
 'htmlform-selectorother-other' => '其他',
 'htmlform-no' => '否',
 'htmlform-yes' => '是',
+'htmlform-chosen-placeholder' => '選項',
 
 # SQLite database support
 'sqlite-has-fts' => '帶全文搜尋的版本$1',
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..ffc8c3b 100644 (file)
@@ -1,5 +1,7 @@
-# Doxyfile 1.7.5.1
+# Doxyfile 1.7.6.1
 
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for MediaWiki.
 #
 # Some placeholders have been added for MediaWiki usage:
 # {{OUTPUT_DIRECTORY}}
@@ -44,7 +46,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>:" \
@@ -64,6 +66,7 @@ ALIASES =     "type{1}=<b> \1 </b>:" \
                "copyright=\note" \
                "license=\note" \
                "codeCoverageIgnore="
+TCL_SUBST              =
 OPTIMIZE_OUTPUT_FOR_C  = NO
 OPTIMIZE_OUTPUT_JAVA   = NO
 OPTIMIZE_FOR_FORTRAN   = NO
@@ -72,13 +75,14 @@ EXTENSION_MAPPING      =
 BUILTIN_STL_SUPPORT    = NO
 CPP_CLI_SUPPORT        = NO
 SIP_SUPPORT            = NO
-IDL_PROPERTY_SUPPORT   = NO
+IDL_PROPERTY_SUPPORT   = YES
 DISTRIBUTE_GROUP_DOC   = YES
 SUBGROUPING            = YES
 INLINE_GROUPED_CLASSES = NO
 INLINE_SIMPLE_STRUCTS  = NO
 TYPEDEF_HIDES_STRUCT   = NO
 SYMBOL_CACHE_SIZE      = 0
+LOOKUP_CACHE_SIZE      = 1
 #---------------------------------------------------------------------------
 # Build related configuration options
 #---------------------------------------------------------------------------
@@ -176,6 +180,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        =
@@ -216,7 +221,7 @@ HTML_STYLESHEET        =
 HTML_EXTRA_FILES       =
 HTML_COLORSTYLE_HUE    = 220
 HTML_COLORSTYLE_SAT    = 100
-HTML_COLORSTYLE_GAMMA  =  80
+HTML_COLORSTYLE_GAMMA  = 80
 HTML_TIMESTAMP         = YES
 HTML_ALIGN_MEMBERS     = YES
 HTML_DYNAMIC_SECTIONS  = NO
@@ -358,7 +363,7 @@ MSCFILE_DIRS           =
 DOT_GRAPH_MAX_NODES    = 50
 MAX_DOT_GRAPH_DEPTH    = 1000
 DOT_TRANSPARENT        = NO
-DOT_MULTI_TARGETS      = NO
+DOT_MULTI_TARGETS      = YES
 GENERATE_LEGEND        = YES
 DOT_CLEANUP            = YES
 
index a13453d..e29ffd9 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" to 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__ );
        }
 
        /**
@@ -1143,8 +1155,7 @@ abstract class Maintenance {
                        $title = $titleObj->getPrefixedDBkey();
                        $this->output( "$title..." );
                        # Update searchindex
-                       # TODO: pass the Content object to SearchUpdate, let the search engine decide how to deal with it.
-                       $u = new SearchUpdate( $pageId, $titleObj->getText(), $rev->getContent()->getTextForSearchIndex() );
+                       $u = new SearchUpdate( $pageId, $titleObj->getText(), $rev->getContent() );
                        $u->doUpdate();
                        $this->output( "\n" );
                }
@@ -1190,7 +1201,9 @@ abstract class Maintenance {
                                        $st = fgets( STDIN, 1024 );
                                }
                        }
-                       if ( $st === false ) return false;
+                       if ( $st === false ) {
+                               return false;
+                       }
                        $resp = trim( $st );
                        return $resp;
                }
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..7aac4d4 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;
@@ -413,6 +414,8 @@ class TextPassDumper extends BackupDumper {
         * @throws MWException
         */
        function getText( $id ) {
+               global $wgContentHandlerUseDB;
+
                $prefetchNotTried = true; // Whether or not we already tried to get the text via prefetch.
                $text = false; // The candidate for a good text. false if no proper value.
                $failures = 0; // The number of times, this invocation of getText already failed.
@@ -478,7 +481,23 @@ class TextPassDumper extends BackupDumper {
                                if ( ! isset( $this->db ) ) {
                                        throw new MWException( "No database available" );
                                }
-                               $revLength = $this->db->selectField( 'revision', 'rev_len', array( 'rev_id' => $revID ) );
+
+                               $revLength = strlen( $text );
+                               if ( $wgContentHandlerUseDB ) {
+                                       $row  = $this->db->selectRow( 'revision', array( 'rev_len', 'rev_content_model' ), array( 'rev_id' => $revID ), __METHOD__ );
+                                       if ( $row ) {
+                                               // only check the length for the wikitext content handler,
+                                               // it's a wasted (and failed) check otherwise
+                                               if ( $row->rev_content_model == CONTENT_MODEL_WIKITEXT ) {
+                                                       $revLength = $row->rev_len;
+                                               }
+                                       }
+
+                               }
+                               else {
+                                       $revLength = $this->db->selectField( 'revision', 'rev_len', array( 'rev_id' => $revID ) );
+                               }
+
                                if ( strlen( $text ) == $revLength ) {
                                        if ( $tryIsPrefetch ) {
                                                $this->prefetchCount++;
@@ -611,17 +630,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 +654,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 +676,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
                        );
                }
diff --git a/maintenance/benchmarks/README b/maintenance/benchmarks/README
new file mode 100644 (file)
index 0000000..c021abd
--- /dev/null
@@ -0,0 +1,7 @@
+This directory hold several benchmarking scripts used as a proof of speed
+or to track PHP performances over time.
+
+To get somehow accurate result, you might want to bound the PHP process
+to a specific CPU with `taskset` and raise its priority with `nice`. Example:
+
+ $ taskset 1 nice -n-10 php bench_wfIsWindows.php
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;
index 3e19397..e833115 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Copy all jobs from one job queue system to another.
@@ -96,4 +96,4 @@ class CopyJobQueue extends Maintenance {
 }
 
 $maintClass = 'CopyJobQueue';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+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;
 }
 
index 59ea18f..f73dfc1 100644 (file)
@@ -1284,6 +1284,9 @@ editinterface
 editintro
 edititis
 editlink
+editmyusercss
+editmyuserjs
+editmywatchlist
 editnotice
 editnotsupported
 editondblclick
@@ -1663,9 +1666,9 @@ ggp
 ghostscript
 gimpbaseenums
 git
+gitblit
 gitdir
 github
-gitweb
 global
 globalauth
 globalblock
@@ -4340,6 +4343,7 @@ view
 viewcount
 viewdeleted
 viewhelppage
+viewmywatchlist
 viewprevnext
 viewsource
 viewsourcelink
index 15b0016..866ec5a 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;
 }
 
@@ -53,23 +53,26 @@ $maintenance->setup();
 // to $maintenance->mSelf. Keep that here for b/c
 $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" );
+# Load composer's autoloader if present
+if ( is_readable( "$IP/vendor/autoload.php" ) ) {
+       require_once "$IP/vendor/autoload.php";
 }
-
+# Get the 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";
 # 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 +85,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 +127,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 7dfbec1..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.
@@ -69,10 +69,11 @@ class DumpLinks extends Maintenance {
                        $link = Title::makeTitle( $row->pl_namespace, $row->pl_title );
                        $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 1eecfe4..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,8 +43,9 @@ 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__ );
 
@@ -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..7c24f0f 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.
@@ -52,6 +52,8 @@ class EditCLI extends Maintenance {
                $noRC = $this->hasOption( 'no-rc' );
 
                $wgUser = User::newFromName( $userName );
+               $context = RequestContext::getMain();
+               $context->setUser( $wgUser );
                if ( !$wgUser ) {
                        $this->error( "Invalid username", true );
                }
@@ -63,6 +65,7 @@ class EditCLI extends Maintenance {
                if ( !$wgTitle ) {
                        $this->error( "Invalid title", true );
                }
+               $context->setTitle( $wgTitle );
 
                $page = WikiPage::factory( $wgTitle );
 
@@ -92,4 +95,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 c29c91c..962b082 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"
                                ]
                        },
                        {
                                "classes": [
                                        "mw.Title",
                                        "mw.notification",
+                                       "mw.user",
                                        "mw.util",
-                                       "mw.plugin.notify"
+                                       "mw.plugin.*"
                                ]
                        },
+                       {
+                               "name": "Actions",
+                               "classes": ["mw.toolbar"]
+                       },
                        {
                                "name": "API",
                                "classes": ["mw.Api*"]
index e932b5c..60522c5 100644 (file)
@@ -9,10 +9,13 @@
        "--": [
                "./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",
                "../../resources/mediawiki/mediawiki.notification.js",
+               "../../resources/mediawiki/mediawiki.user.js",
+               "../../resources/mediawiki.action/mediawiki.action.edit.js",
                "../../resources/mediawiki.api",
                "../../resources/jquery/jquery.localize.js"
        ]
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 f5bcb5d..0ec22e0 100644 (file)
@@ -96,7 +96,6 @@ $wgIgnoredMessages = array(
        'talkpageheader',
        'anonnotice',
        'autoblock_whitelist',
-       'searchmenu-help',
        'searchmenu-new-nocreate',
        'googlesearch',
        'opensearch-desc',
@@ -188,6 +187,7 @@ $wgIgnoredMessages = array(
        'fewestrevisions-summary',
        'upload-summary',
        'wantedtemplates-summary',
+       'activeusers-summary',
        'search-summary',
        'editpage-head-copy-warn',
        'editpage-tos-summary',
@@ -223,6 +223,8 @@ $wgIgnoredMessages = array(
        'deletedarticle',
        // 'uploadedimage',
        // 'overwroteimage',
+       'createacct-helpusername',
+       'createacct-imgcaptcha-help',
        'userlogout-summary',
        'changeemail-summary',
        'changepassword-summary',
@@ -247,6 +249,15 @@ $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',
+       'edithelppage',
 );
 
 /** Optional messages, which may be translated only if changed in the target language. */
@@ -306,7 +317,6 @@ $wgOptionalMessages = array(
        'modern.css',
        'vector.css',
        'print.css',
-       'handheld.css',
        'noscript.css',
        'group-autoconfirmed.css',
        'group-bot.css',
@@ -471,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 b7ad695..900a350 100644 (file)
@@ -135,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',
@@ -225,6 +237,7 @@ $wgMessageStructure = array(
                'create-this-page',
                'delete',
                'deletethispage',
+               'undeletethispage',
                'undelete_short',
                'viewdeleted_short',
                'protect',
@@ -411,6 +424,8 @@ $wgMessageStructure = array(
                'namespaceprotected',
                'customcssprotected',
                'customjsprotected',
+               'mycustomcssprotected',
+               'mycustomjsprotected',
                'ns-specialprotected',
                'titleprotected',
                'filereadonlyerror',
@@ -431,10 +446,14 @@ $wgMessageStructure = array(
                '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',
@@ -459,13 +478,36 @@ $wgMessageStructure = array(
                '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',
@@ -541,14 +583,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-emaildisabled',
-               'passwordreset-pretext',
                'passwordreset-username',
                'passwordreset-domain',
                'passwordreset-capture',
@@ -698,6 +741,7 @@ $wgMessageStructure = array(
                'edit-gone-missing',
                'edit-conflict',
                'edit-no-change',
+               'postedit-confirmation',
                'edit-already-exists',
                'addsection-preload',
                'addsection-editintro',
@@ -736,6 +780,7 @@ $wgMessageStructure = array(
                'undo-failure',
                'undo-norev',
                'undo-summary',
+               'undo-summary-username-hidden',
        ),
        'cantcreateaccount' => array(
                'cantcreateaccounttitle',
@@ -910,9 +955,7 @@ $wgMessageStructure = array(
                'searchmenu-exists',
                'searchmenu-new',
                'searchmenu-new-nocreate',
-               'searchhelp-url',
                'searchmenu-prefix',
-               'searchmenu-help',
                'searchprofile-articles',
                'searchprofile-project',
                'searchprofile-images',
@@ -993,7 +1036,6 @@ $wgMessageStructure = array(
                'resetprefs',
                'restoreprefs',
                'prefs-editing',
-               'prefs-edit-boxsize',
                'rows',
                'columns',
                'searchresultshead',
@@ -1035,7 +1077,6 @@ $wgMessageStructure = array(
                'prefs-common-css-js',
                'prefs-reset-intro',
                'prefs-emailconfirm-label',
-               'prefs-textboxsize',
                'youremail',
                'username',
                'uid',
@@ -1070,6 +1111,8 @@ $wgMessageStructure = array(
                'prefs-dateformat',
                'prefs-timeoffset',
                'prefs-advancedediting',
+               'prefs-editor',
+               'prefs-preview',
                'prefs-advancedrc',
                'prefs-advancedrendering',
                'prefs-advancedsearchoptions',
@@ -1104,6 +1147,8 @@ $wgMessageStructure = array(
                'userrights-changeable-col',
                'userrights-unchangeable-col',
                'userrights-irreversible-marker',
+               'userrights-conflict',
+               'userrights-removed-self',
        ),
        'group' => array(
                'group',
@@ -1176,6 +1221,10 @@ $wgMessageStructure = array(
                'right-editusercssjs',
                'right-editusercss',
                'right-edituserjs',
+               'right-editmyusercss',
+               'right-editmyuserjs',
+               'right-viewmywatchlist',
+               'right-editmywatchlist',
                'right-rollback',
                'right-markbotedits',
                'right-noratelimit',
@@ -1237,6 +1286,8 @@ $wgMessageStructure = array(
                'action-userrights-interwiki',
                'action-siteadmin',
                'action-sendemail',
+               'action-editmywatchlist',
+               'action-viewmywatchlist',
        ),
        'recentchanges' => array(
                'nchanges',
@@ -1245,6 +1296,7 @@ $wgMessageStructure = array(
                'recentchanges-legend',
                'recentchanges-summary',
                'recentchangestext',
+               'recentchanges-noresult',
                'recentchanges-feed-description',
                'recentchanges-label-newpage',
                'recentchanges-label-minor',
@@ -1284,7 +1336,6 @@ $wgMessageStructure = array(
                'recentchangeslinked-feed',
                'recentchangeslinked-toolbox',
                'recentchangeslinked-title',
-               'recentchangeslinked-noresult',
                'recentchangeslinked-summary',
                'recentchangeslinked-page',
                'recentchangeslinked-to',
@@ -1847,6 +1898,17 @@ $wgMessageStructure = array(
                'listusers-noresult',
                'listusers-blocked',
        ),
+       'activeusers' => array(
+               'activeusers',
+               'activeusers-summary',
+               'activeusers-intro',
+               'activeusers-count',
+               'activeusers-from',
+               'activeusers-hidebots',
+               'activeusers-hidesysops',
+               'activeusers-submit',
+               'activeusers-noresult',
+       ),
        'listgrouprights' => array(
                'listgrouprights',
                'listgrouprights-summary',
@@ -1924,7 +1986,6 @@ $wgMessageStructure = array(
                'unwatchthispage',
                'notanarticle',
                'notvisiblerev',
-               'watchnochange',
                'watchlist-details',
                'wlheader-enotif',
                'wlheader-showupdated',
@@ -2407,6 +2468,7 @@ $wgMessageStructure = array(
                'thumbnail-more',
                'filemissing',
                'thumbnail_error',
+               'thumbnail_error_remote',
                'djvu_page_error',
                'djvu_no_xml',
                'thumbnail-temp-create',
@@ -2479,7 +2541,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',
@@ -2632,7 +2694,6 @@ $wgMessageStructure = array(
                'modern.css',
                'vector.css',
                'print.css',
-               'handheld.css',
                'noscript.css',
                'group-autoconfirmed.css',
                'group-bot.css',
@@ -2808,11 +2869,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',
        ),
@@ -3168,16 +3244,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',
@@ -3596,11 +3672,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',
@@ -3686,6 +3769,7 @@ $wgMessageStructure = array(
                'htmlform-selectorother-other',
                'htmlform-no',
                'htmlform-yes',
+               'htmlform-chosen-placeholder',
        ),
        'sqlite' => array(
                'sqlite-has-fts',
@@ -3842,8 +3926,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',
@@ -3931,6 +4015,7 @@ XHTML id names.",
        'deletedcontribs'     => 'Special:DeletedContributions',
        'linksearch'          => 'Special:LinkSearch',
        'listusers'           => 'Special:ListUsers',
+       'activeusers'         => 'Special:ActiveUsers',
        'newuserlog'          => 'Special:Log/newusers',
        'listgrouprights'     => 'Special:ListGroupRights',
        'emailuser'           => 'Email user',
@@ -3971,12 +4056,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',
@@ -3987,9 +4071,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' => '',
@@ -4058,7 +4142,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 fbba977..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,7 @@ foreach ( $mmfl['setupFiles'] as $fileName ) {
        if ( empty( $mmfl['quiet'] ) ) {
                fwrite( STDERR, "Loading data from $fileName\n" );
        }
-       if ( !include_once( $fileName ) ) {
+       if ( !( include_once $fileName ) ) {
                fwrite( STDERR, "Unable to read $fileName\n" );
                exit( 1 );
        }
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 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..9fb1314 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" );
+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 or directory. Multiple values " .
+                       "accepted with comma separation. Path relative to \$IP.",
+                       false, true );
+               $this->addOption( 'output',
+                       'Path to write doc to',
+                       false, true );
+               $this->addOption( 'no-extensions',
+                       'Ignore extensions' );
+       }
 
-       return $tmpFileName;
-}
+       public function getDbType() {
+               return Maintenance::DB_NONE;
+       }
 
-#
-# Main !
-#
+       protected function init() {
+               global $IP;
 
-unset( $file );
+               $this->doxygen = $this->getOption( 'doxygen', 'doxygen' );
+               $this->mwVersion = $this->getOption( 'version', 'master' );
 
-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>]
+               $this->input = '';
+               $inputs = explode( ',', $this->getOption( 'file', '' ) );
+               foreach( $inputs as $input ) {
+                       # Doxygen inputs are space separted and double quoted
+                       $this->input .= " \"$IP/$input\"";
+               }
 
-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
+               $this->output = $this->getOption( 'output', "$IP/docs" );
+
+               $this->inputFilter = wfShellWikiCmd(
+                       $IP . '/maintenance/mwdoc-filter.php' );
+               $this->template = $IP . '/maintenance/Doxyfile';
+               $this->excludes = array(
+                       'vendor',
+                       '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 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 c5bf569..74fb1b1 100644 (file)
@@ -522,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);
@@ -636,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);
 
@@ -703,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;
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..86658c5 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 ) {
@@ -68,29 +68,55 @@ class PurgeDeletedFiles extends Maintenance {
                $res = $db->select( 'logging', array( 'log_title', 'log_timestamp' ), $conds, __METHOD__ );
                foreach ( $res as $row ) {
                        $file = $repo->newFile( Title::makeTitle( NS_FILE, $row->log_title ) );
-
+                       // If there is an orphaned storage file still there...delete it
+                       if ( !$file->exists() && $repo->fileExists( $file->getPath() ) ) {
+                               $dpath = $this->getDeletedPath( $repo, $file );
+                               if ( $repo->fileExists( $dpath ) ) { // sanity check to avoid data loss
+                                       $repo->getBackend()->delete( array( 'src' => $file->getPath() ) );
+                                       $this->output( "Deleted orphan file: {$file->getPath()}.\n" );
+                               } else {
+                                       $this->error( "File was not deleted: {$file->getPath()}.\n" );
+                               }
+                       }
                        // Purge current version and any versions in oldimage table
                        $file->purgeCache();
                        $file->purgeHistory();
                        // Purge items from fileachive table (rows are likely here)
-                       $this->purgeFromArchiveTable( $file );
+                       $this->purgeFromArchiveTable( $repo, $file );
 
                        $this->output( "Purged file {$row->log_title}; deleted on {$row->log_timestamp}.\n" );
                }
        }
 
-       protected function purgeFromArchiveTable( LocalFile $file ) {
-               $db = $file->getRepo()->getSlaveDB();
+       protected function purgeFromArchiveTable( LocalRepo $repo, LocalFile $file ) {
+               $db = $repo->getSlaveDB();
                $res = $db->select( 'filearchive',
                        array( 'fa_archive_name' ),
                        array( 'fa_name' => $file->getName() ),
                        __METHOD__
                );
                foreach ( $res as $row ) {
+                       $ofile = $repo->newFromArchiveName( $file->getTitle(), $row->fa_archive_name );
+                       // If there is an orphaned storage file still there...delete it
+                       if ( !$file->exists() && $repo->fileExists( $ofile->getPath() ) ) {
+                               $dpath = $this->getDeletedPath( $repo, $ofile );
+                               if ( $repo->fileExists( $dpath ) ) { // sanity check to avoid data loss
+                                       $repo->getBackend()->delete( array( 'src' => $ofile->getPath() ) );
+                                       $this->output( "Deleted orphan file: {$ofile->getPath()}.\n" );
+                               } else {
+                                       $this->error( "File was not deleted: {$ofile->getPath()}.\n" );
+                               }
+                       }
                        $file->purgeOldThumbnails( $row->fa_archive_name );
                }
        }
+
+       protected function getDeletedPath( LocalRepo $repo, LocalFile $file ) {
+               $hash = $repo->getFileSha1( $file->getPath() );
+               $key = "{$hash}.{$file->getExtension()}";
+               return $repo->getDeletedHashPath( $key ) . $key;
+       }
 }
 
 $maintClass = "PurgeDeletedFiles";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index fb66db0..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();
                }
@@ -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 );
        }
 
@@ -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..1268d20 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.
@@ -35,6 +35,10 @@ class RebuildAll extends Maintenance {
                $this->mDescription = "Rebuild links, text index and recent changes";
        }
 
+       public function getDbType() {
+               return Maintenance::DB_ADMIN;
+       }
+
        public function execute() {
                // Rebuild the text index
                if ( wfGetDB( DB_SLAVE )->getType() != 'postgres' ) {
@@ -58,4 +62,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..c651f72 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.
@@ -115,9 +115,8 @@ class RebuildTextIndex extends Maintenance {
 
                                        $rev = new Revision( $s );
                                        $content = $rev->getContent();
-                                       $text = $content->getTextForSearchIndex();
 
-                                       $u = new SearchUpdate( $s->page_id, $title, $text );
+                                       $u = new SearchUpdate( $s->page_id, $title, $content );
                                        $u->doUpdate();
                                } catch ( MWContentSerializationException $ex ) {
                                        $this->output( "Failed to deserialize content of revision {$s->rev_id} of page "
@@ -147,7 +146,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 +161,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 66d8028..9dac031 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 );
@@ -83,7 +84,7 @@ class RunJobs extends Maintenance {
                }
 
                $flags = JobQueueGroup::USE_CACHE | JobQueueGroup::USE_PRIORITY;
-               $lastTime = time();
+               $lastTime = time(); // time since last slave check
                do {
                        $job = ( $type === false )
                                ? $group->pop( JobQueueGroup::TYPE_DEFAULT, $flags )
@@ -94,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();
+                                       $e->report(); // write error to STDERR and the log
                                }
+                               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
@@ -125,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 ) {
@@ -145,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 831746d..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,7 +44,7 @@ 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();
@@ -67,4 +67,4 @@ class ShowJobs extends Maintenance {
 }
 
 $maintClass = "ShowJobs";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index dbbdab9..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.
@@ -60,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
@@ -71,4 +71,4 @@ class ShowSiteStats extends Maintenance {
 }
 
 $maintClass = "ShowSiteStats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 1169990..a628b0b 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.
@@ -34,16 +34,42 @@ class MwSql extends Maintenance {
                parent::__construct();
                $this->mDescription = "Send SQL queries to a MediaWiki database";
                $this->addOption( 'cluster', 'Use an external cluster by name', false, true );
+               $this->addOption( 'slave', 'Use a slave server (either "any" or by name)', false, true );
        }
 
        public function execute() {
-               // Get a DB handle (with this wiki's DB select) from the appropriate load balancer
+               // Get the appropriate load balancer (for this wiki)
                if ( $this->hasOption( 'cluster' ) ) {
                        $lb = wfGetLBFactory()->getExternalLB( $this->getOption( 'cluster' ) );
-                       $dbw = $lb->getConnection( DB_MASTER ); // master for external LB
                } else {
-                       $dbw = wfGetDB( DB_MASTER ); // master for primary LB for this wiki
+                       $lb = wfGetLB();
                }
+               // Figure out which server to use
+               if ( $this->hasOption( 'slave' ) ) {
+                       $server = $this->getOption( 'slave' );
+                       if ( $server === 'any' ) {
+                               $index = DB_SLAVE;
+                       } else {
+                               $index = null;
+                               for ( $i = 0; $i < $lb->getServerCount(); ++$i ) {
+                                       if ( $lb->getServerName( $i ) === $server ) {
+                                               $index = $i;
+                                               break;
+                                       }
+                               }
+                               if ( $index === null ) {
+                                       $this->error( "No slave server configured with the name '$server'.", 1 );
+                               }
+                       }
+               } else {
+                       $index = DB_MASTER;
+               }
+               // Get a DB handle (with this wiki's DB selected) from the appropriate load balancer
+               $dbw = $lb->getConnection( $index );
+               if ( $this->hasOption( 'slave' ) && $dbw->getLBInfo( 'master' ) !== null ) {
+                       $this->error( "The server selected ({$dbw->getServer()}) is not a slave.", 1 );
+               }
+
                if ( $this->hasArg( 0 ) ) {
                        $file = fopen( $this->getArg( 0 ), 'r' );
                        if ( !$file ) {
@@ -70,9 +96,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 +117,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 +158,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;
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 19c740b..7fc6bb8 100644 (file)
@@ -760,6 +760,9 @@ CREATE TABLE /*_*/ipblocks (
 
   -- Start and end of an address range, in hexadecimal
   -- Size chosen to allow IPv6
+  -- FIXME: these fields were originally blank for single-IP blocks,
+  -- but now they are populated. No migration was ever done. They 
+  -- should be fixed to be blank again for such blocks (bug 49504).
   ipb_range_start tinyblob NOT NULL,
   ipb_range_end tinyblob NOT NULL,
 
@@ -807,7 +810,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.
@@ -1052,7 +1055,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 8118f68..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
@@ -82,10 +82,6 @@ TEXT;
                        $collation = Collation::singleton();
                }
 
-               // Collation sanity check: in some cases the constructor will work,
-               // but this will raise an exception, breaking all category pages
-               $collation->getFirstLetterData();
-
                $options = array(
                        'LIMIT' => self::BATCH_SIZE,
                        'ORDER BY' => 'cl_to, cl_type, cl_from',
@@ -307,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' );
index 7e1e3a3..f931ad8 100644 (file)
@@ -20,7 +20,7 @@
  * @file
  */
 
-if( !defined( 'MEDIAWIKI' ) ) {
+if ( !defined( 'MEDIAWIKI' ) ) {
        die( 'Not an entry point.' );
 }
 
@@ -61,7 +61,10 @@ return array(
         * See Vector for an example.
         */
        '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'],
        ),
@@ -96,7 +99,12 @@ return array(
                'localBasePath' => $GLOBALS['wgStyleDirectory'],
        ),
        'skins.vector.js' => array(
-               'scripts' => 'vector/vector.js',
+               'scripts' => array(
+                       'vector/vector.js',
+                       'vector/collapsibleTabs.js',
+               ),
+               'position' => 'top',
+               'dependencies' => 'jquery.delayedBind',
                'remoteBasePath' => $GLOBALS['wgStylePath'],
                'localBasePath' => $GLOBALS['wgStyleDirectory'],
        ),
@@ -141,6 +149,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' ),
@@ -578,6 +590,12 @@ return array(
                        'mediawiki.Title',
                ),
        ),
+       'mediawiki.api.login' => array(
+               'scripts' => 'resources/mediawiki.api/mediawiki.api.login.js',
+               'dependencies' => array(
+                       'mediawiki.api',
+               ),
+       ),
        'mediawiki.api.parse' => array(
                'scripts' => 'resources/mediawiki.api/mediawiki.api.parse.js',
                'dependencies' => 'mediawiki.api',
@@ -589,6 +607,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',
@@ -636,6 +657,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',
@@ -660,6 +682,7 @@ return array(
                        'jquery.client',
                        'jquery.placeholder',
                        'jquery.suggestions',
+                       'mediawiki.api',
                ),
        ),
        'mediawiki.Title' => array(
@@ -732,7 +755,14 @@ 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',
@@ -894,7 +924,9 @@ return array(
        ),
        'mediawiki.special.changeslist' => array(
                'styles' => 'resources/mediawiki.special/mediawiki.special.changeslist.css',
-               'dependencies' => array( 'jquery.makeCollapsible' ),
+       ),
+       'mediawiki.special.changeslist.enhanced' => array(
+               'styles' => 'resources/mediawiki.special/mediawiki.special.changeslist.enhanced.css',
        ),
        'mediawiki.special.movePage' => array(
                'scripts' => 'resources/mediawiki.special/mediawiki.special.movePage.js',
@@ -902,7 +934,8 @@ 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',
+               'position' => 'top',
        ),
        'mediawiki.special.recentchanges' => array(
                'scripts' => 'resources/mediawiki.special/mediawiki.special.recentchanges.js',
@@ -922,7 +955,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',
@@ -934,14 +967,26 @@ return array(
                ),
                'dependencies' => array( 'mediawiki.libs.jpegmeta', 'mediawiki.util' ),
        ),
-       'mediawiki.special.userlogin.signup' => array(
-               'scripts' => 'resources/mediawiki.special/mediawiki.special.userLogin.signup.js',
+       'mediawiki.special.userlogin' => array(
+               'styles' => array(
+                       'resources/mediawiki.special/mediawiki.special.vforms.css',
+                       'resources/mediawiki.special/mediawiki.special.userLogin.css',
+               ),
+               'position' => 'top',
        ),
-       'mediawiki.special.userlogin.vform' => array(
+       'mediawiki.special.createaccount' => array(
                'styles' => array(
                        'resources/mediawiki.special/mediawiki.special.vforms.css',
-                       'resources/mediawiki.special/mediawiki.special.userLogin.vform.css',
+                       'resources/mediawiki.special/mediawiki.special.createAccount.css',
+               ),
+       ),
+       'mediawiki.special.createaccount.js' => array(
+               'scripts' => 'resources/mediawiki.special/mediawiki.special.createAccount.js',
+               'messages' => array(
+                       'createacct-captcha',
+                       'createacct-imgcaptcha-ph'
                ),
+               'dependencies' => 'mediawiki.jqueryMsg',
                'position' => 'top',
        ),
        'mediawiki.special.javaScriptTest' => array(
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);
index fef8c4b..dbbbfc7 100644 (file)
Binary files a/resources/jquery.tipsy/images/tipsy.png and b/resources/jquery.tipsy/images/tipsy.png differ
index 5b5dab2..26b9da5 100644 (file)
Binary files a/resources/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.png and b/resources/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.png differ
index ac8b229..b4b148d 100644 (file)
Binary files a/resources/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.png and b/resources/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.png differ
index ee039dc..9a9606f 100644 (file)
Binary files a/resources/jquery.ui/themes/default/images/ui-icons_222222_256x240.png and b/resources/jquery.ui/themes/default/images/ui-icons_222222_256x240.png differ
index 45e8928..08d2617 100644 (file)
Binary files a/resources/jquery.ui/themes/default/images/ui-icons_2e83ff_256x240.png and b/resources/jquery.ui/themes/default/images/ui-icons_2e83ff_256x240.png differ
index 7ec70d1..80cb644 100644 (file)
Binary files a/resources/jquery.ui/themes/default/images/ui-icons_454545_256x240.png and b/resources/jquery.ui/themes/default/images/ui-icons_454545_256x240.png differ
index 5ba708c..8373712 100644 (file)
Binary files a/resources/jquery.ui/themes/default/images/ui-icons_888888_256x240.png and b/resources/jquery.ui/themes/default/images/ui-icons_888888_256x240.png differ
index 7930a55..34fc893 100644 (file)
Binary files a/resources/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.png and b/resources/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.png differ
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 b0bd685..2da022c 100644 (file)
@@ -6,7 +6,7 @@
        /* Private Members */
 
        /**
-        * @var profileCache {Object} Keyed by userAgent string,
+        * @var {Object} profileCache Keyed by userAgent string,
         * value is the parsed $.client.profile object for that user agent.
         */
        var profileCache = {};
@@ -18,9 +18,9 @@
                /**
                 * Get an object containing information about the client.
                 *
-                * @param nav {Object} An object with atleast a 'userAgent' and 'platform' key.
+                * @param {Object} nav An object with atleast a 'userAgent' and 'platform' key.
                 * Defaults to the global Navigator object.
-                * @return {Object} The resulting client object will be in the following format:
+                * @returns {Object} The resulting client object will be in the following format:
                 *  {
                 *   'name': 'firefox',
                 *   'layout': 'gecko',
                                        // Generic version digit
                                        x = 'x',
                                        // Strings found in user agent strings that need to be conformed
-                                       wildUserAgents = ['Opera', 'Navigator', 'Minefield', 'KHTML', 'Chrome', 'PLAYSTATION 3'],
+                                       wildUserAgents = ['Opera', 'Navigator', 'Minefield', 'KHTML', 'Chrome', 'PLAYSTATION 3', 'Iceweasel'],
                                        // Translations for conforming user agent strings
                                        userAgentTranslations = [
                                                // Tons of browsers lie about being something they are not
-                                               [/(Firefox|MSIE|KHTML,\slike\sGecko|Konqueror)/, ''],
+                                               [/(Firefox|MSIE|KHTML,?\slike\sGecko|Konqueror)/, ''],
                                                // Chrome lives in the shadow of Safari still
                                                ['Chrome Safari', 'Chrome'],
                                                // KHTML is the layout engine not the browser - LIES!
                                        // version detectection
                                        versionPrefixes = [
                                                'camino', 'chrome', 'firefox', 'iceweasel', 'netscape', 'netscape6', 'opera', 'version', 'konqueror',
-                                               'lynx', 'msie', 'safari', 'ps3'
+                                               'lynx', 'msie', 'safari', 'ps3', 'android'
                                        ],
                                        // Used as matches 2, 3 and 4 in version extraction - 3 is used as actual version number
                                        versionSuffix = '(\\/|\\;?\\s|)([a-z0-9\\.\\+]*?)(\\;|dev|rel|\\)|\\s|$)',
                                        // Names of known browsers
                                        names = [
                                                'camino', 'chrome', 'firefox', 'iceweasel', 'netscape', 'konqueror', 'lynx', 'msie', 'opera',
-                                               'safari', 'ipod', 'iphone', 'blackberry', 'ps3', 'rekonq'
+                                               'safari', 'ipod', 'iphone', 'blackberry', 'ps3', 'rekonq', 'android'
                                        ],
                                        // Tanslations for conforming browser names
                                        nameTranslations = [],
                },
 
                /**
-                * Checks the current browser against a support map object to determine if the browser has been black-listed or
-                * not. If the browser was not configured specifically it is assumed to work. It is assumed that the body
-                * element is classified as either "ltr" or "rtl". If neither is set, "ltr" is assumed.
+                * Checks the current browser against a support map object.
                 *
                 * A browser map is in the following format:
                 * {
+                *   // Multiple rules with configurable operators
+                *   'msie': [['>=', 7], ['!=', 9]],
+                *    // Match no versions
+                *   'iphone': false,
+                *    // Match any version
+                *   'android': null
+                * }
+                *
+                * It can optionally be split into ltr/rtl sections:
+                * {
                 *   'ltr': {
-                *     // Multiple rules with configurable operators
-                *     'msie': [['>=', 7], ['!=', 9]],
-                *      // Blocked entirely
+                *     'android': null,
                 *     'iphone': false
                 *   },
                 *   'rtl': {
-                *     // Test against a string
-                *     'msie': [['!==', '8.1.2.3']],
-                *     // RTL rules do not fall through to LTR rules, you must explicity set each of them
+                *     'android': false,
+                *     // rules are not inherited from ltr
                 *     'iphone': false
                 *   }
                 * }
                 *
-                * @param map {Object} Browser support map
-                * @param profile {Object} (optional) a client-profile object.
+                * @param {Object} map Browser support map
+                * @param {Object} [profile] A client-profile object
+                * @param {boolean} [exactMatchOnly=false] Only return true if the browser is matched, otherwise
+                * returns true if the browser is not found.
                 *
-                * @return Boolean true if browser known or assumed to be supported, false if blacklisted
+                * @returns {boolean} The current browser is in the support map
                 */
-               test: function ( map, profile ) {
+               test: function ( map, profile, exactMatchOnly ) {
                        /*jshint evil: true */
 
                        var conditions, dir, i, op, val;
                        profile = $.isPlainObject( profile ) ? profile : $.client.profile();
-                       dir = $( 'body' ).is( '.rtl' ) ? 'rtl' : 'ltr';
+                       if ( map.ltr && map.rtl ) {
+                               dir = $( 'body' ).is( '.rtl' ) ? 'rtl' : 'ltr';
+                               map = map[dir];
+                       }
                        // Check over each browser condition to determine if we are running in a compatible client
-                       if ( typeof map[dir] !== 'object' || map[dir][profile.name] === undefined ) {
-                               // Unknown, so we assume it's working
-                               return true;
+                       if ( typeof map !== 'object' || map[profile.name] === undefined ) {
+                               // Not found, return true if exactMatchOnly not set, false otherwise
+                               return !exactMatchOnly;
                        }
-                       conditions = map[dir][profile.name];
+                       conditions = map[profile.name];
                        if ( conditions === false ) {
+                               // Match no versions
                                return false;
                        }
+                       if ( conditions === null ) {
+                               // Match all versions
+                               return true;
+                       }
                        for ( i = 0; i < conditions.length; i++ ) {
                                op = conditions[i][0];
                                val = conditions[i][1];
index f07f1b7..2d46bde 100644 (file)
@@ -18,6 +18,8 @@
        var lpx = 'jquery.makeCollapsible> ';
 
        /**
+        * Handler for a click on a collapsible toggler.
+        *
         * @param {jQuery} $collapsible
         * @param {string} action The action this function will take ('expand' or 'collapse').
         * @param {jQuery|null} [optional] $defaultToggle
         * @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();
                        }
                }
 
                toggleElement( $collapsible, wasCollapsed ? 'expand' : 'collapse', $toggle, options );
        }
 
-       /**
-        * Toggles collapsible and togglelink class and updates text label.
-        *
-        * @param {jQuery} $that
-        * @param {jQuery.Event} e
-        * @param {Object|undefined} options
-        */
-       function toggleLinkDefault( $that, e, options ) {
-               var $collapsible = $that.closest( '.mw-collapsible' );
-               options = $.extend( { toggleClasses: true }, options );
-               togglingHandler( $that, $collapsible, e, options );
-       }
-
-       /**
-        * Toggles collapsible and togglelink class.
-        *
-        * @param {jQuery} $that
-        * @param {jQuery.Event} e
-        * @param {Object|undefined} options
-        */
-       function toggleLinkPremade( $that, e, options ) {
-               var $collapsible = $that.eq( 0 ).closest( '.mw-collapsible' );
-               options = $.extend( { toggleClasses: true }, options );
-               togglingHandler( $that, $collapsible, e, options );
-       }
-
-       /**
-        * Toggles customcollapsible.
-        *
-        * @param {jQuery} $that
-        * @param {jQuery.Event} e
-        * @param {Object|undefined} options
-        * @param {jQuery} $collapsible
-        */
-       function toggleLinkCustom( $that, e, options, $collapsible ) {
-               options = $.extend( { linksPassthru: true }, options );
-               togglingHandler( $that, $collapsible, e, options );
-       }
-
        /**
         * Make any element collapsible.
         *
         *   div.mw-collapsible-content. May only be used with custom togglers.
         */
        $.fn.makeCollapsible = function ( options ) {
-               return this.each(function () {
-                       var $collapsible, collapsetext, expandtext, $toggle, $toggleLink, $firstItem, collapsibleId,
-                               $customTogglers, firstval;
+               if ( options === undefined ) {
+                       options = {};
+               }
 
-                       if ( options === undefined ) {
-                               options = {};
-                       }
+               return this.each( function () {
+                       var $collapsible, collapseText, expandText, $toggle, clickHandler, $defaultToggleLink,
+                               premadeToggleHandler, $toggleLink, $firstItem, collapsibleId, $customTogglers, firstval;
 
                        // Ensure class "mw-collapsible" is present in case .makeCollapsible()
                        // is called on element(s) that don't have it yet.
-                       $collapsible = $(this).addClass( 'mw-collapsible' );
+                       $collapsible = $( this ).addClass( 'mw-collapsible' );
 
                        // Return if it has been enabled already.
                        if ( $collapsible.data( 'mw-made-collapsible' ) ) {
                        }
 
                        // Use custom text or default?
-                       collapsetext = options.collapseText || $collapsible.attr( 'data-collapsetext' ) || mw.msg( 'collapsible-collapse' );
-                       expandtext = options.expandText || $collapsible.attr( 'data-expandtext' ) || mw.msg( 'collapsible-expand' );
-
-                       // Create toggle link with a space around the brackets (&nbsp;[text]&nbsp;)
-                       $toggleLink =
+                       collapseText = options.collapseText || $collapsible.attr( 'data-collapsetext' ) || mw.msg( 'collapsible-collapse' );
+                       expandText = options.expandText || $collapsible.attr( 'data-expandtext' ) || mw.msg( 'collapsible-expand' );
+
+                       // Default click handler and toggle link to use when none is present
+                       clickHandler = function ( e, opts ) {
+                               var defaultOpts = {
+                                       toggleClasses: true,
+                                       toggleText: { collapseText: collapseText, expandText: expandText }
+                               };
+                               opts = $.extend( defaultOpts, options, opts );
+                               togglingHandler( $( this ), $collapsible, e, opts );
+                       };
+                       $defaultToggleLink =
                                $( '<a href="#"></a>' )
-                                       .text( collapsetext )
+                                       .text( collapseText )
                                        .wrap( '<span class="mw-collapsible-toggle"></span>' )
                                                .parent()
                                                .prepend( '&nbsp;[' )
                                                .append( ']&nbsp;' )
-                                               .on( 'click.mw-collapsible', function ( e, opts ) {
-                                                       opts = $.extend( { toggleText: { collapseText: collapsetext, expandText: expandtext } }, options, opts );
-                                                       toggleLinkDefault( $(this), e, opts );
-                                               } );
+                                               .on( 'click.mw-collapsible', clickHandler );
+
+                       // Default handler for clicking on premade toggles
+                       premadeToggleHandler = function ( e, opts ) {
+                               var defaultOpts = { toggleClasses: true, linksPassthru: true };
+                               opts = $.extend( defaultOpts, options, opts );
+                               togglingHandler( $( this ), $collapsible, e, opts );
+                       };
 
                        // Check if this element has a custom position for the toggle link
                        // (ie. outside the container or deeper inside the tree)
                                }
                        }
 
-                       // Bind the custom togglers
+                       // Bind the togglers
                        if ( $customTogglers && $customTogglers.length ) {
-                               $customTogglers.on( 'click.mw-collapsible', function ( e, opts ) {
-                                       opts = $.extend( {}, options, opts );
-                                       toggleLinkCustom( $(this), e, opts, $collapsible );
-                               } );
-
-                               // Initial state
-                               if ( options.collapsed || $collapsible.hasClass( 'mw-collapsed' ) ) {
-                                       // Remove here so that the toggler goes in the right direction,
-                                       // It re-adds the class.
-                                       $collapsible.removeClass( 'mw-collapsed' );
-                                       toggleLinkCustom( $customTogglers, null, $.extend( { instantHide: true }, options ), $collapsible );
-                               }
+                               clickHandler = function ( e, opts ) {
+                                       var defaultOpts = {};
+                                       opts = $.extend( defaultOpts, options, opts );
+                                       togglingHandler( $( this ), $collapsible, e, opts );
+                               };
+
+                               $toggleLink = $customTogglers;
+                               $toggleLink.on( 'click.mw-collapsible', clickHandler );
 
-                       // If this is not a custom case, do the default:
-                       // Wrap the contents and add the toggle link
                        } else {
-                               // Elements are treated differently
+                               // If this is not a custom case, do the default: wrap the
+                               // contents and add the toggle link. Different elements are
+                               // treated differently.
                                if ( $collapsible.is( 'table' ) ) {
                                        // The toggle-link will be in one the the cells (td or th) of the first row
                                        $firstItem = $collapsible.find( 'tr:first th, tr:first td' );
 
                                        // If theres no toggle link, add it to the last cell
                                        if ( !$toggle.length ) {
-                                               $firstItem.eq(-1).prepend( $toggleLink );
+                                               $toggleLink = $defaultToggleLink.prependTo( $firstItem.eq( -1 ) );
                                        } else {
-                                               $toggleLink = $toggle.off( 'click.mw-collapsible' ).on( 'click.mw-collapsible', function ( e, opts ) {
-                                                       opts = $.extend( {}, options, opts );
-                                                       toggleLinkPremade( $toggle, e, opts );
-                                               } );
+                                               clickHandler = premadeToggleHandler;
+                                               $toggleLink = $toggle.on( 'click.mw-collapsible', clickHandler );
                                        }
 
                                } else if ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) {
                                        if ( !$toggle.length ) {
                                                // Make sure the numeral order doesn't get messed up, force the first (soon to be second) item
                                                // to be "1". Except if the value-attribute is already used.
-                                               // If no value was set WebKit returns "", Mozilla returns '-1', others return null or undefined.
+                                               // If no value was set WebKit returns "", Mozilla returns '-1', others return 0, null or undefined.
                                                firstval = $firstItem.attr( 'value' );
                                                if ( firstval === undefined || !firstval || firstval === '-1' || firstval === -1 ) {
                                                        $firstItem.attr( 'value', '1' );
                                                }
-                                               $collapsible.prepend( $toggleLink.wrap( '<li class="mw-collapsible-toggle-li"></li>' ).parent() );
+                                               $toggleLink = $defaultToggleLink;
+                                               $toggleLink.wrap( '<li class="mw-collapsible-toggle-li"></li>' ).parent().prependTo( $collapsible );
                                        } else {
-                                               $toggleLink = $toggle.off( 'click.mw-collapsible' ).on( 'click.mw-collapsible', function ( e, opts ) {
-                                                       opts = $.extend( {}, options, opts );
-                                                       toggleLinkPremade( $toggle, e, opts );
-                                               } );
+                                               clickHandler = premadeToggleHandler;
+                                               $toggleLink = $toggle.on( 'click.mw-collapsible', clickHandler );
                                        }
 
                                } else { // <div>, <p> etc.
 
                                        // If theres no toggle link, add it
                                        if ( !$toggle.length ) {
-                                               $collapsible.prepend( $toggleLink );
+                                               $toggleLink = $defaultToggleLink.prependTo( $collapsible );
                                        } else {
-                                               $toggleLink = $toggle.off( 'click.mw-collapsible' ).on( 'click.mw-collapsible', function ( e, opts ) {
-                                                       opts = $.extend( {}, options, opts );
-                                                       toggleLinkPremade( $toggle, e, opts );
-                                               } );
+                                               clickHandler = premadeToggleHandler;
+                                               $toggleLink = $toggle.on( 'click.mw-collapsible', clickHandler );
                                        }
                                }
                        }
 
-                       // Initial state (only for those that are not custom,
-                       // because the initial state of those has been taken care of already).
-                       if (
-                               ( options.collapsed || $collapsible.hasClass( 'mw-collapsed' ) ) &&
-                               ( !$customTogglers || !$customTogglers.length )
-                       ) {
+                       // Initial state
+                       if ( options.collapsed || $collapsible.hasClass( 'mw-collapsed' ) ) {
+                               // Remove here so that the toggler goes in the right direction (the class is re-added)
                                $collapsible.removeClass( 'mw-collapsed' );
-                               // The collapsible element could have multiple togglers
-                               // To toggle the initial state only click one of them (ie. the first one, eq(0) )
-                               // Else it would go like: hide,show,hide,show for each toggle link.
-                               // This is just like it would be in reality (only one toggle is clicked at a time).
-                               $toggleLink.eq( 0 ).trigger( 'click', [ { instantHide: true } ] );
+                               // One toggler can hook to multiple elements, and one element can have
+                               // multiple togglers. This is the sanest way to handle that.
+                               clickHandler.call( $toggleLink.get( 0 ), null, { instantHide: true } );
                        }
                } );
        };
index e08c9aa..97357d9 100644 (file)
                var maxSeen = 0,
                        longest,
                        realCellIndex = 0,
-                       $tableHeaders = $( 'thead:eq(0) > tr', table );
-               if ( $tableHeaders.length > 1 ) {
-                       $tableHeaders.each( function () {
-                               if ( this.cells.length > maxSeen ) {
-                                       maxSeen = this.cells.length;
-                                       longest = this;
+                       $tableHeaders = $( [] ),
+                       $tableRows = $( 'thead:eq(0) > tr', table );
+               if ( $tableRows.length <= 1 ) {
+                       $tableHeaders = $tableRows.children( 'th' );
+               } else {
+                       // We need to find the cells of the row containing the most columns
+                       var rowspan,
+                               i,
+                               headersIndex = [];
+                       $tableRows.each( function ( rowIndex ) {
+                               $.each( this.cells, function( index2, cell ) {
+                                       rowspan = Number( cell.rowSpan );
+                                       for ( i = 0; i < rowspan; i++ ) {
+                                               if ( headersIndex[rowIndex+i] === undefined ) {
+                                                       headersIndex[rowIndex+i] = $( [] );
+                                               }
+                                               headersIndex[rowIndex+i].push( cell );
+                                       }
+                               } );
+                       } );
+                       $.each( headersIndex, function ( index, cellArray ) {
+                               if ( cellArray.length >= maxSeen ) {
+                                       maxSeen = cellArray.length;
+                                       longest = index;
                                }
-                       });
-                       $tableHeaders = $( longest );
+                       } );
+                       $tableHeaders = headersIndex[longest];
                }
-               $tableHeaders = $tableHeaders.children( 'th' ).each( function ( index ) {
+               $tableHeaders.each( function ( index ) {
                        this.column = realCellIndex;
 
                        var colspan = this.colspan;
 
        }
 
+       /**
+        * Sets the sort count of the columns that are not affected by the sorting to have them sorted
+        * in default (ascending) order when their header cell is clicked the next time.
+        *
+        * @param {jQuery} $headers
+        * @param {Number[][]} sortList
+        * @param {Number[][]} headerToColumns
+        */
+       function setHeadersOrder( $headers, sortList, headerToColumns ) {
+               // Loop through all headers to retrieve the indices of the columns the header spans across:
+               $.each( headerToColumns, function( headerIndex, columns ) {
+
+                       $.each( columns, function( i, columnIndex ) {
+                               var header = $headers[headerIndex];
+
+                               if ( !isValueInArray( columnIndex, sortList ) ) {
+                                       // Column shall not be sorted: Reset header count and order.
+                                       header.order = 0;
+                                       header.count = 0;
+                               } else {
+                                       // Column shall be sorted: Apply designated count and order.
+                                       $.each( sortList, function( j, sortColumn ) {
+                                               if ( sortColumn[0] === i ) {
+                                                       header.order = sortColumn[1];
+                                                       header.count = sortColumn[1] + 1;
+                                                       return false;
+                                               }
+                                       } );
+                               }
+                       } );
+
+               } );
+       }
+
        function isValueInArray( v, a ) {
                var l = a.length;
                for ( var i = 0; i < l; i++ ) {
                ts.dateRegex[0] = new RegExp( /^\s*(\d{1,2})[\,\.\-\/'\s]{1,2}(\d{1,2})[\,\.\-\/'\s]{1,2}(\d{2,4})\s*?/i);
 
                // Written Month name, dmy
-               ts.dateRegex[1] = new RegExp( '^\\s*(\\d{1,2})[\\,\\.\\-\\/\'\\s]*(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]*(\\d{2,4})\\s*$', 'i' );
+               ts.dateRegex[1] = new RegExp( '^\\s*(\\d{1,2})[\\,\\.\\-\\/\'\\s]+(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]+(\\d{2,4})\\s*$', 'i' );
 
                // Written Month name, mdy
-               ts.dateRegex[2] = new RegExp( '^\\s*(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]*(\\d{1,2})[\\,\\.\\-\\/\'\\s]*(\\d{2,4})\\s*$', 'i' );
+               ts.dateRegex[2] = new RegExp( '^\\s*(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]+(\\d{1,2})[\\,\\.\\-\\/\'\\s]+(\\d{2,4})\\s*$', 'i' );
 
        }
 
                $.each( sortObjects, function( i, sortObject ) {
                        $.each ( sortObject, function( columnIndex, order ) {
                                var orderIndex = ( order === 'desc' ) ? 1 : 0;
-                               sortList.push( [columnIndex, orderIndex] );
+                               sortList.push( [parseInt( columnIndex, 10 ), orderIndex] );
                        } );
                } );
                return sortList;
                                                                }
                                                        }
 
+                                                       // Reset order/counts of cells not affected by sorting
+                                                       setHeadersOrder( $headers, config.sortList, headerToColumns );
+
                                                        // Set CSS for headers
                                                        setHeadersCss( $table[0], $headers, config.sortList, sortCSS, sortMsg, columnToHeader );
                                                        appendToTable(
                                                        sortList = convertSortList( sortList );
                                                }
 
+                                               // Set each column's sort count to be able to determine the correct sort
+                                               // order when clicking on a header cell the next time
+                                               setHeadersOrder( $headers, sortList, headerToColumns );
+
                                                // re-build the cache for the tbody cells
                                                cache = buildCache( table );
 
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
index 2835c9c..1c5a018 100644 (file)
@@ -1,17 +1,20 @@
+/**
+ * Interface for the classic edit toolbar.
+ *
+ * @class mw.toolbar
+ * @singleton
+ */
 ( function ( mw, $ ) {
-       var isReady, toolbar, currentFocused, queue, $toolbar, slice;
-
-       isReady = false;
-       queue = [];
-       $toolbar = false;
-       slice = Array.prototype.slice;
+       var toolbar, isReady, $toolbar, queue, slice, currentFocused;
 
        /**
-        * Internal helper that does the actual insertion
-        * of the button into the toolbar.
-        * See mw.toolbar.addButton for parameter documentation.
+        * Internal helper that does the actual insertion of the button into the toolbar.
+        *
+        * See #addButton for parameter documentation.
+        *
+        * @private
         */
-       function insertButton( b /* imageFile */, speedTip, tagOpen, tagClose, sampleText, imageId, selectText ) {
+       function insertButton( b, speedTip, tagOpen, tagClose, sampleText, imageId ) {
                // Backwards compatibility
                if ( typeof b !== 'object' ) {
                        b = {
                                tagOpen: tagOpen,
                                tagClose: tagClose,
                                sampleText: sampleText,
-                               imageId: imageId,
-                               selectText: selectText
+                               imageId: imageId
                        };
                }
-               var $image = $( '<img>', {
+               var $image = $( '<img>' ).attr( {
                        width : 23,
                        height: 22,
                        src   : b.imageFile,
                        id    : b.imageId || undefined,
                        'class': 'mw-toolbar-editbutton'
                } ).click( function () {
-                       toolbar.insertTags( b.tagOpen, b.tagClose, b.sampleText, b.selectText );
+                       toolbar.insertTags( b.tagOpen, b.tagClose, b.sampleText );
                        return false;
                } );
 
                $toolbar.append( $image );
-               return true;
        }
 
+       isReady = false;
+       $toolbar = false;
+       queue = [];
+       slice = queue.slice;
+
        toolbar = {
+
                /**
                 * Add buttons to the toolbar.
+                *
                 * Takes care of race conditions and time-based dependencies
                 * by placing buttons in a queue if this method is called before
                 * the toolbar is created.
-                * @param {Object} button: Object with the following properties:
-                * - imageFile
-                * - speedTip
-                * - tagOpen
-                * - tagClose
-                * - sampleText
-                * - imageId
-                * - selectText
-                * For compatiblity, passing the above as separate arguments
+                *
+                * For compatiblity, passing the properties listed below as separate arguments
                 * (in the listed order) is also supported.
+                *
+                * @param {Object} button Object with the following properties:
+                * @param {string} button.imageFile
+                * @param {string} button.speedTip
+                * @param {string} button.tagOpen
+                * @param {string} button.tagClose
+                * @param {string} button.sampleText
+                * @param {string} [button.imageId]
                 */
                addButton: function () {
                        if ( isReady ) {
                },
 
                /**
-                * Apply tagOpen/tagClose to selection in textarea,
-                * use sampleText instead of selection if there is none.
+                * Apply tagOpen/tagClose to selection in currently focused textarea.
+                *
+                * Uses `sampleText` if selection is empty.
+                *
+                * @param {string} tagOpen
+                * @param {string} tagClose
+                * @param {string} sampleText
                 */
                insertTags: function ( tagOpen, tagClose, sampleText ) {
                        if ( currentFocused && currentFocused.length ) {
        mw.toolbar = toolbar;
 
        $( document ).ready( function () {
-               var buttons, i, b, $iframe;
+               var buttons, i, b, $iframe, editBox, scrollTop, $editForm;
 
                // currentFocus is used to determine where to insert tags
                currentFocused = $( '#wpTextbox1' );
                // Make sure edit summary does not exceed byte limit
                $( '#wpSummary' ).byteLimit( 255 );
 
-               /**
-                * Restore the edit box scroll state following a preview operation,
-                * and set up a form submission handler to remember this state
-                */
-               ( function scrollEditBox() {
-                       var editBox, scrollTop, $editForm;
-
-                       editBox = document.getElementById( 'wpTextbox1' );
-                       scrollTop = document.getElementById( 'wpScrolltop' );
-                       $editForm = $( '#editform' );
-                       if ( $editForm.length && editBox && scrollTop ) {
-                               if ( scrollTop.value ) {
-                                       editBox.scrollTop = scrollTop.value;
-                               }
-                               $editForm.submit( function () {
-                                       scrollTop.value = editBox.scrollTop;
-                               });
+               // Restore the edit box scroll state following a preview operation,
+               // and set up a form submission handler to remember this state.
+               editBox = document.getElementById( 'wpTextbox1' );
+               scrollTop = document.getElementById( 'wpScrolltop' );
+               $editForm = $( '#editform' );
+               if ( $editForm.length && editBox && scrollTop ) {
+                       if ( scrollTop.value ) {
+                               editBox.scrollTop = scrollTop.value;
                        }
-               }() );
+                       $editForm.submit( function () {
+                               scrollTop.value = editBox.scrollTop;
+                       });
+               }
 
-               $( '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..d693d80
--- /dev/null
@@ -0,0 +1,83 @@
+.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-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-vector .postedit {
+       font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
+}
+
+.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..93befe3 100644 (file)
@@ -5,10 +5,10 @@
  */
 jQuery( function ( $ ) {
        // Select all h1-h6 elements that contain editsection links
-       // Don't use the ":has:(.editsection a)" selector because it performs very bad.
+       // Don't use the ":has:(.mw-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' );
                if ( !$edit.length ) {
                        return;
                }
index 2cd1b92..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 } );
                        }
                },
 
@@ -85,7 +85,7 @@
                                        } else {
                                                d.reject( 'token-missing', data );
                                        }
-                               })
+                               } )
                                .fail( d.reject );
 
                        return d.promise( { abort: apiPromise.abort } );
diff --git a/resources/mediawiki.api/mediawiki.api.login.js b/resources/mediawiki.api/mediawiki.api.login.js
new file mode 100644 (file)
index 0000000..ccbae06
--- /dev/null
@@ -0,0 +1,54 @@
+/**
+ * Make the two-step login easier.
+ * @author Niklas Laxström
+ * @class mw.Api.plugin.login
+ * @since 1.22
+ */
+( function ( mw, $ ) {
+       'use strict';
+
+       $.extend( mw.Api.prototype, {
+               /**
+                * @param {string} username
+                * @param {string} password
+                * @return {jQuery.Promise} See mw.Api#post
+                */
+               login: function ( username, password ) {
+                       var params, request,
+                               deferred = $.Deferred(),
+                               api = this;
+
+                       params = {
+                               action: 'login',
+                               lgname: username,
+                               lgpassword: password
+                       };
+
+                       request = api.post( params );
+                       request.fail( deferred.reject );
+                       request.done( function ( data ) {
+                               params.lgtoken = data.login.token;
+                               api.post( params )
+                                       .fail( deferred.reject )
+                                       .done( function ( data ) {
+                                               var code;
+                                               if ( data.login && data.login.result === 'Success' ) {
+                                                       deferred.resolve( data );
+                                               } else {
+                                                       // Set proper error code whenever possible
+                                                       code = data.error && data.error.code || 'unknown';
+                                                       deferred.reject( code, data );
+                                               }
+                                       } );
+                       } );
+
+                       return deferred.promise( { abort: request.abort } );
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.login
+        */
+
+}( mediaWiki, jQuery ) );
index 4044655..08bb171 100644 (file)
@@ -23,6 +23,7 @@
 
                        apiPromise = this.get( {
                                        action: 'parse',
+                                       contentmodel: 'wikitext',
                                        text: wikitext
                                } )
                                .done( function ( data ) {
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
index 2c251d7..f43505e 100644 (file)
Binary files a/resources/mediawiki.special/images/glyph-people-large.png 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
index 306f1f1..4b3d4ee 100644 (file)
Binary files a/resources/mediawiki.special/images/icon-lock.png 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..5e4af7b 100644 (file)
@@ -2,63 +2,6 @@
  * Styling for Special:Watchlist and Special:RecentChanges
  */
 
-table.mw-enhanced-rc {
-       border: 0;
-       border-spacing: 0;
-}
-
-table.mw-enhanced-rc th,
-table.mw-enhanced-rc td {
-       padding: 0;
-       vertical-align: top;
-}
-
-td.mw-enhanced-rc {
-       white-space: nowrap;
-       font-family: monospace;
-}
-
-.mw-enhanced-rc-time {
-       font-family: monospace;
-}
-
-table.mw-enhanced-rc td.mw-enhanced-rc-nested {
-       padding-left: 1em;
-}
-
-/* Show/hide arrows in enhanced changeslist */
-.mw-enhanced-rc .collapsible-expander {
-       float: none;
-}
-
-/* If JS is disabled, the arrows or the placeholder space shouldn't be shown */
-.client-nojs .mw-enhancedchanges-arrow-space {
-       display: none;
-}
-
-.mw-enhancedchanges-arrow-space {
-       display: inline-block;
-       *display: inline; /* IE7 and below */
-       zoom: 1;
-       width: 15px;
-       height: 15px;
-}
-
-/* let it look like it is clickable */
-.mw-enhancedchanges-arrow.mw-collapsible-toggle {
-       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 {
        font-weight: bold;
 }
diff --git a/resources/mediawiki.special/mediawiki.special.changeslist.enhanced.css b/resources/mediawiki.special/mediawiki.special.changeslist.enhanced.css
new file mode 100644 (file)
index 0000000..2632c78
--- /dev/null
@@ -0,0 +1,55 @@
+/**
+ * Styling for Special:Watchlist and Special:RecentChanges when preference 'usenewrc'
+ * a.k.a. Enhanced Recent Changes is enabled.
+ */
+
+table.mw-enhanced-rc {
+       border: 0;
+       border-spacing: 0;
+}
+
+table.mw-enhanced-rc th,
+table.mw-enhanced-rc td {
+       padding: 0;
+       vertical-align: top;
+}
+
+td.mw-enhanced-rc {
+       white-space: nowrap;
+       font-family: monospace;
+}
+
+.mw-enhanced-rc-time {
+       font-family: monospace;
+}
+
+table.mw-enhanced-rc td.mw-enhanced-rc-nested {
+       padding-left: 1em;
+}
+
+/* Show/hide arrows in enhanced changeslist */
+.mw-enhanced-rc .collapsible-expander {
+       float: none;
+}
+
+/* If JS is disabled, the arrows or the placeholder space shouldn't be shown */
+.client-nojs .mw-enhancedchanges-arrow-space {
+       display: none;
+}
+
+.mw-enhancedchanges-arrow-space {
+       display: inline-block;
+       *display: inline; /* IE7 and below */
+       zoom: 1;
+       width: 15px;
+       height: 15px;
+}
+
+/* let it look like it is clickable */
+.mw-enhancedchanges-arrow.mw-collapsible-toggle {
+       cursor: pointer;
+}
+
+.mw-enhanced-watched .mw-enhanced-rc-time {
+       font-weight: bold;
+}
diff --git a/resources/mediawiki.special/mediawiki.special.createAccount.css b/resources/mediawiki.special/mediawiki.special.createAccount.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.js b/resources/mediawiki.special/mediawiki.special.createAccount.js
new file mode 100644 (file)
index 0000000..aa61a1e
--- /dev/null
@@ -0,0 +1,93 @@
+/**
+ * JavaScript for Create account form (Special:UserLogin?type=signup).
+ */
+( function ( mw, $ ) {
+
+       // When sending password by email, hide the password input fields.
+       // This function doesn't need to be loaded early by ResourceLoader, but is tiny.
+       function hidePasswordOnEmail( $ ) {
+               $( '#wpCreateaccountMail' )
+                       .on( 'change', function() {
+                               $( '.mw-row-password' ).toggle( !$( this ).attr( 'checked' ) );
+                       } )
+                       .trigger( 'change' );
+       }
+
+       // Move the FancyCaptcha image into a more attractive container.
+       // This function does need to be run early by ResourceLoader.
+       function adjustFancyCaptcha( $, mw ) {
+               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' ) );
+               }
+       }
+
+       $( document ).ready( function( $ ) {
+               adjustFancyCaptcha( $, mw);
+               hidePasswordOnEmail( $ );
+       } );
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.special/mediawiki.special.userLogin.css b/resources/mediawiki.special/mediawiki.special.userLogin.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.userLogin.signup.js b/resources/mediawiki.special/mediawiki.special.userLogin.signup.js
deleted file mode 100644 (file)
index bba4260..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * JavaScript for Special:UserLogin/signup
- */
-jQuery( document ).ready( function ( $ ) {
-       $( '#wpCreateaccountMail' )
-               .on( 'change', function() {
-                       $( '.mw-row-password' ).toggle( !$( this ).attr( 'checked' ) );
-               } )
-               .trigger( 'change' );
-} );
diff --git a/resources/mediawiki.special/mediawiki.special.userLogin.vform.css b/resources/mediawiki.special/mediawiki.special.userLogin.vform.css
deleted file mode 100644 (file)
index 312f811..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/* 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;
-}
index 4ae06df..2d948ea 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * When inside the VForm style, disable the border that Vector puts on the div
- * surrounding the login/create account form.
+ * 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,
 
 /* Reposition and resize language links, which appear on a per-wiki basis */
 .mw-ui-container #languagelinks {
-       margin-bottom: 3em;
+       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.
        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;
 }
index 0e0b40e..810340c 100644 (file)
   width: 100%;
 }
 
-/* line 48, sourcefiles/scss/components/default/_buttons.scss */
+/* 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;
   border-radius: 0;
   float: left;
 }
-/* line 52, sourcefiles/scss/components/default/_buttons.scss */
+/* 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;
   -webkit-border-bottom-left-radius: 3px;
   border-bottom-left-radius: 3px;
 }
-/* line 57, sourcefiles/scss/components/default/_buttons.scss */
+/* 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-bottom-right-radius: 3px;
 }
 
-/* line 12, sourcefiles/scss/components/default/_forms.scss */
+/* 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 17, sourcefiles/scss/components/default/_forms.scss */
+/* line 19, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-vform > div {
   display: block;
   margin: 0 0 15px 0;
   padding: 0;
   width: 100%;
 }
-/* line 26, sourcefiles/scss/components/default/_forms.scss */
+/* line 27, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-vform > div input,
-.mw-ui-vform > div label,
 .mw-ui-vform > div .mw-ui-button {
   display: block;
   -webkit-box-sizing: border-box;
   margin: 0;
   width: 100%;
 }
-/* line 33, sourcefiles/scss/components/default/_forms.scss */
+/* line 34, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-vform > div input {
   outline: 0;
   border-style: solid;
   box-shadow: #4091ed 0px 0px 5px;
   border-color: #4091ed;
 }
-/* line 37, sourcefiles/scss/components/default/_forms.scss */
+/* 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: #7d7d7d;
+  color: #4a4a4a;
   width: auto;
   margin: 0 0 0.2em 0;
   padding: 0;
 .mw-ui-vform > div label * {
   font-weight: normal;
 }
-/* line 44, sourcefiles/scss/components/default/_forms.scss */
-.mw-ui-vform > div label.mw-ui-checkbox-label, .mw-ui-vform > div 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-vform > div label.mw-ui-checkbox-label > input[type="checkbox"], .mw-ui-vform > div label.mw-ui-checkbox-label > input[type="radio"], .mw-ui-vform > div label.mw-ui-radio-label > input[type="checkbox"], .mw-ui-vform > div label.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 51, sourcefiles/scss/components/default/_forms.scss */
+/* line 49, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-vform > div input[type="checkbox"],
 .mw-ui-vform > div input[type="radio"] {
   display: inline;
   width: auto;
 }
 
-/* line 66, sourcefiles/scss/components/default/_forms.scss */
+/* line 65, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-input {
   outline: 0;
   border-style: solid;
   border-color: #4091ed;
 }
 
-/* line 71, sourcefiles/scss/components/default/_forms.scss */
-.mw-ui-block-label, .mw-ui-formlist div label {
+/* line 72, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-label {
   font-size: 0.9em;
-  color: #7d7d7d;
+  color: #4a4a4a;
 }
 /* line 34, sourcefiles/scss/mixins/_forms.scss */
-.mw-ui-block-label *, .mw-ui-formlist div label * {
+.mw-ui-label * {
   font-weight: normal;
 }
 
-/* line 80, sourcefiles/scss/components/default/_forms.scss */
+/* line 81, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-checkbox-label, .mw-ui-radio-label {
   margin-bottom: 0.5em;
   cursor: pointer;
index 4849fb4..5f03376 100644 (file)
   width: 100%;
 }
 
-/* line 48, sourcefiles/scss/components/default/_buttons.scss */
+/* 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;
   border-radius: 0;
   float: left;
 }
-/* line 52, sourcefiles/scss/components/default/_buttons.scss */
+/* 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;
   -webkit-border-bottom-left-radius: 3px;
   border-bottom-left-radius: 3px;
 }
-/* line 57, sourcefiles/scss/components/default/_buttons.scss */
+/* 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;
   text-shadow: none;
 }
 
-/* line 12, sourcefiles/scss/components/default/_forms.scss */
+/* 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 17, sourcefiles/scss/components/default/_forms.scss */
+/* line 19, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-vform > div {
   display: block;
   margin: 0 0 15px 0;
   padding: 0;
   width: 100%;
 }
-/* line 26, sourcefiles/scss/components/default/_forms.scss */
+/* line 27, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-vform > div input,
-.mw-ui-vform > div label,
 .mw-ui-vform > div .mw-ui-button {
   display: block;
   -webkit-box-sizing: border-box;
   margin: 0;
   width: 100%;
 }
-/* line 33, sourcefiles/scss/components/default/_forms.scss */
+/* line 34, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-vform > div input {
   outline: 0;
   border-style: solid;
   box-shadow: #4091ed 0px 0px 5px;
   border-color: #4091ed;
 }
-/* line 37, sourcefiles/scss/components/default/_forms.scss */
+/* 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: #7d7d7d;
+  color: #4a4a4a;
   width: auto;
   margin: 0 0 0.2em 0;
   padding: 0;
 .mw-ui-vform > div label * {
   font-weight: normal;
 }
-/* line 44, sourcefiles/scss/components/default/_forms.scss */
-.mw-ui-vform > div label.mw-ui-checkbox-label, .mw-ui-vform > div 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-vform > div label.mw-ui-checkbox-label > input[type="checkbox"], .mw-ui-vform > div label.mw-ui-checkbox-label > input[type="radio"], .mw-ui-vform > div label.mw-ui-radio-label > input[type="checkbox"], .mw-ui-vform > div label.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 51, sourcefiles/scss/components/default/_forms.scss */
+/* line 49, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-vform > div input[type="checkbox"],
 .mw-ui-vform > div input[type="radio"] {
   display: inline;
   width: auto;
 }
 
-/* line 66, sourcefiles/scss/components/default/_forms.scss */
+/* line 65, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-input {
   outline: 0;
   border-style: solid;
   border-color: #4091ed;
 }
 
-/* line 71, sourcefiles/scss/components/default/_forms.scss */
-.mw-ui-block-label, .mw-ui-formlist div label {
+/* line 72, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-label {
   font-size: 0.9em;
-  color: #7d7d7d;
+  color: #4a4a4a;
 }
 /* line 34, sourcefiles/scss/mixins/_forms.scss */
-.mw-ui-block-label *, .mw-ui-formlist div label * {
+.mw-ui-label * {
   font-weight: normal;
 }
 
-/* line 80, sourcefiles/scss/components/default/_forms.scss */
+/* line 81, sourcefiles/scss/components/default/_forms.scss */
 .mw-ui-checkbox-label, .mw-ui-radio-label {
   margin-bottom: 0.5em;
   cursor: pointer;
   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;
+}
index be96e64..28c6524 100644 (file)
@@ -14,7 +14,7 @@ sass_dir = "scss"
 output_style = :expanded
 
 # To enable relative paths to assets via compass helper functions. Uncomment:
-relative_assets = true
+relative_assets = true
 
 # To disable debugging comments that display the original location of your selectors. Uncomment:
 line_comments = true
index e52a1ed..d7cb34a 100644 (file)
@@ -1,3 +1,4 @@
 @import "utilities";
 @import "vector/buttons";
-@import "vector/forms";
\ No newline at end of file
+@import "vector/forms";
+@import "vector/containers";
index 1ea9a18..d67810f 100644 (file)
@@ -44,6 +44,14 @@ $buttonBorderRadius: 3px;
     }
 }
 
+// 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);
index 440669e..8bbe3c2 100644 (file)
@@ -5,10 +5,12 @@
 // --------------------------------------------------------------------------
 
 // The FancyCaptcha image CAPTCHA used on WMF wikis drives the width of the
-// 'vform' stacked div design, the form can't be narrower than this.
+// '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);
 
@@ -20,9 +22,8 @@ $defaultFormWidth: $captchaContainerWidth;
         padding: 0;
         width: 100%;
 
-        // MW currently doesn't use the type attribute everywhere on inputs
+        // MW currently doesn't use the type attribute everywhere on inputs.
         input,
-        label,
         .mw-ui-button {
             display: block;
             @include box-sizing(border-box);
@@ -35,18 +36,15 @@ $defaultFormWidth: $captchaContainerWidth;
         }
 
         label {
+            display: block;
+            @include box-sizing(border-box);
             @include agora-label-styling;
-
             width: auto;
             margin: 0 0 0.2em 0;
             padding: 0;
-
-            &.mw-ui-checkbox-label, &.mw-ui-radio-label {
-                @include agora-inline-label-styling;
-            }
         }
 
-        // Override the above styling just for checkboxes and radio inputs
+        // Override input styling just for checkboxes and radio inputs.
         input[type="checkbox"],
         input[type="radio"] {
             display: inline;
@@ -61,22 +59,25 @@ $defaultFormWidth: $captchaContainerWidth;
 // Elements
 // --------------------------------------------------------------------------
 
-// Apply mw-ui-input to fields individually to style them
-// You don't need to use this if <input> is within a Agora form container
+// 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
 }
 
-// Default label styling is mw-ui-block-label
-.mw-ui-block-label, .mw-ui-formlist div label {
+// 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
 }
 
-// Checkbox and radio button label alignment hack
+// 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" />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/_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;
+}
index 6316232..5db857a 100644 (file)
@@ -29,7 +29,7 @@
         //weight: bold;
         size: 0.9em;
     };
-    color: darken($agoraGray, 30%);
+    color: darken($agoraGray, 50%);
 
     & * {
         font-weight: normal;
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 83bf2e3..f93cac1 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( { gravity: 's' } );
+                       } );
+               }
+       } );
+}( 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 6c7e697..0d1fbb7 100644 (file)
@@ -259,6 +259,8 @@ var mw = ( function ( $, undefined ) {
        };
 
        /**
+        * Base library for MediaWiki.
+        *
         * @class mw
         * @alternateClassName mediaWiki
         * @singleton
@@ -267,10 +269,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,
@@ -294,9 +303,15 @@ var mw = ( function ( $, undefined ) {
                 */
                libs: {},
 
-               /* Extension points */
-
                /**
+                * Access container for deprecated functionality that can be moved from
+                * from their legacy location and attached to this object (e.g. a global
+                * function that is deprecated and as stop-gap can be exposed through here).
+                *
+                * This was reserved for future use but never ended up being used.
+                *
+                * @deprecated since 1.22: Let deprecated identifiers keep their original name
+                * and use mw.log#deprecate to create an access container for tracking.
                 * @property
                 */
                legacy: {},
@@ -419,11 +434,11 @@ var mw = ( function ( $, undefined ) {
                         *
                         * @private
                         * @param {string} text CSS text
-                        * @param {Mixed} [nextnode] An Element or jQuery object for an element where
-                        * the style tag should be inserted before. Otherwise appended to the `<head>`.
-                        * @return {HTMLElement} Node reference to the created `<style>` tag.
+                        * @param {HTMLElement|jQuery} [nextnode=document.head] The element where the style tag should be
+                        *  inserted before. Otherwise it will be appended to `<head>`.
+                        * @return {HTMLElement} Reference to the created `<style>` element.
                         */
-                       function addStyleTag( text, nextnode ) {
+                       function newStyleTag( text, nextnode ) {
                                var s = document.createElement( 'style' );
                                // Insert into document before setting cssText (bug 33305)
                                if ( nextnode ) {
@@ -469,8 +484,13 @@ var mw = ( function ( $, undefined ) {
                        }
 
                        /**
+                        * Add a bit of CSS text to the current browser page.
+                        *
+                        * The CSS will be appended to an existing ResourceLoader-created `<style>` tag
+                        * or create a new one based on whether the given `cssText` is safe for extension.
+                        *
                         * @param {string} [cssText=cssBuffer] If called without cssText,
-                        * the internal buffer will be inserted instead.
+                        *  the internal buffer will be inserted instead.
                         * @param {Function} [callback]
                         */
                        function addEmbeddedCSS( cssText, callback ) {
@@ -542,7 +562,7 @@ var mw = ( function ( $, undefined ) {
                                        }
                                }
 
-                               $( addStyleTag( cssText, getMarker() ) ).data( 'ResourceLoaderDynamicStyleTag', true );
+                               $( newStyleTag( cssText, getMarker() ) ).data( 'ResourceLoaderDynamicStyleTag', true );
 
                                cssCallbacks.fire().empty();
                        }
@@ -815,8 +835,7 @@ var mw = ( function ( $, undefined ) {
                         */
                        function addScript( src, callback, async ) {
                                /*jshint evil:true */
-                               var script, head,
-                                       done = false;
+                               var script, head, done;
 
                                // Using isReady directly instead of storing it locally from
                                // a $.fn.ready callback (bug 31895).
@@ -828,6 +847,7 @@ var mw = ( function ( $, undefined ) {
 
                                        // IE-safe way of getting the <head>. document.head isn't supported
                                        // in old IE, and doesn't work when in the <head>.
+                                       done = false;
                                        head = document.getElementsByTagName( 'head' )[0] || document.body;
 
                                        script = document.createElement( 'script' );
@@ -847,12 +867,12 @@ var mw = ( function ( $, undefined ) {
                                                                // Handle memory leak in IE
                                                                script.onload = script.onreadystatechange = null;
 
-                                                               // Remove the script
+                                                               // Detach the element from the document
                                                                if ( script.parentNode ) {
                                                                        script.parentNode.removeChild( script );
                                                                }
 
-                                                               // Dereference the script
+                                                               // Dereference the element from javascript
                                                                script = undefined;
 
                                                                callback();
@@ -1145,10 +1165,14 @@ var mw = ( function ( $, undefined ) {
 
                        /* Public Methods */
                        return {
-                               addStyleTag: addStyleTag,
+                               /**
+                                * @inheritdoc #newStyleTag
+                                * @method
+                                */
+                               addStyleTag: newStyleTag,
 
                                /**
-                                * Requests dependencies from server, loading and executing when things when ready.
+                                * Batch-request queued dependencies from the server.
                                 */
                                work: function () {
                                        var     reqBase, splits, maxQueryLength, q, b, bSource, bGroup, bSourceGroup,
@@ -1310,7 +1334,7 @@ var mw = ( function ( $, undefined ) {
                                },
 
                                /**
-                                * Registers a module, letting the system know about it and its
+                                * Register a module, letting the system know about it and its
                                 * properties. Startup modules contain calls to this function.
                                 *
                                 * @param {string} module Module name
@@ -1361,9 +1385,10 @@ var mw = ( function ( $, undefined ) {
                                },
 
                                /**
-                                * Implements a module, giving the system a course of action to take
-                                * upon loading. Results of a request for one or more modules contain
-                                * calls to this function.
+                                * Implement a module given the components that make up the module.
+                                *
+                                * When #load or #using requests one or more modules, the server
+                                * response contain calls to this function.
                                 *
                                 * All arguments are required.
                                 *
@@ -1418,7 +1443,7 @@ var mw = ( function ( $, undefined ) {
                                },
 
                                /**
-                                * Executes a function as soon as one or more required modules are ready
+                                * Execute a function as soon as one or more required modules are ready.
                                 *
                                 * @param {string|Array} dependencies Module name or array of modules names the callback
                                 *  dependends on to be ready before executing
@@ -1455,7 +1480,7 @@ var mw = ( function ( $, undefined ) {
                                },
 
                                /**
-                                * Loads an external script or one or more modules for future use
+                                * Load an external script or one or more modules.
                                 *
                                 * @param {string|Array} modules Either the name of a module, array of modules,
                                 *  or a URL of an external script or style
@@ -1535,7 +1560,7 @@ var mw = ( function ( $, undefined ) {
                                },
 
                                /**
-                                * Changes the state of a module
+                                * Change the state of one or more modules.
                                 *
                                 * @param {string|Object} module module name or object of module name/state pairs
                                 * @param {string} state state name
@@ -1564,9 +1589,9 @@ var mw = ( function ( $, undefined ) {
                                },
 
                                /**
-                                * Gets the version of a module
+                                * Get the version of a module.
                                 *
-                                * @param {string} module 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 ) {
@@ -1576,14 +1601,15 @@ var mw = ( function ( $, undefined ) {
                                },
 
                                /**
-                                * @deprecated since 1.18 use mw.loader.getVersion() instead
+                                * @inheritdoc #getVersion
+                                * @deprecated since 1.18 use #getVersion instead
                                 */
                                version: function () {
                                        return mw.loader.getVersion.apply( mw.loader, arguments );
                                },
 
                                /**
-                                * Gets the state of a module
+                                * Get the state of a module.
                                 *
                                 * @param {string} module name of module to get state for
                                 */
@@ -1606,7 +1632,13 @@ var mw = ( function ( $, undefined ) {
                                },
 
                                /**
-                                * For backwards-compatibility with Squid-cached pages. Loads mw.user
+                                * Load the `mediawiki.user` module.
+                                *
+                                * For backwards-compatibility with cached pages from before 2013 where:
+                                *
+                                * - the `mediawiki.user` module didn't exist yet
+                                * - `mw.user` was still part of mediawiki.js
+                                * - `mw.loader.go` still existed and called after `mw.loader.load()`
                                 */
                                go: function () {
                                        mw.loader.load( 'mediawiki.user' );
@@ -1644,22 +1676,6 @@ var mw = ( function ( $, undefined ) {
                                        return s.replace( /['"<>&]/g, escapeCallback );
                                },
 
-                               /**
-                                * Wrapper object for raw HTML passed to mw.html.element().
-                                * @class mw.html.Raw
-                                */
-                               Raw: function ( value ) {
-                                       this.value = value;
-                               },
-
-                               /**
-                                * Wrapper object for CDATA element contents passed to mw.html.element()
-                                * @class mw.html.Cdata
-                                */
-                               Cdata: function ( value ) {
-                                       this.value = value;
-                               },
-
                                /**
                                 * Create an HTML element string, with safe escaping.
                                 *
@@ -1726,6 +1742,22 @@ var mw = ( function ( $, undefined ) {
                                        }
                                        s += '</' + name + '>';
                                        return s;
+                               },
+
+                               /**
+                                * Wrapper object for raw HTML passed to mw.html.element().
+                                * @class mw.html.Raw
+                                */
+                               Raw: function ( value ) {
+                                       this.value = value;
+                               },
+
+                               /**
+                                * Wrapper object for CDATA element contents passed to mw.html.element()
+                                * @class mw.html.Cdata
+                                */
+                               Cdata: function ( value ) {
+                                       this.value = value;
                                }
                        };
                }() ),
@@ -1734,7 +1766,84 @@ 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 = {};
+
+                       /**
+                        * Create an instance of mw.hook.
+                        *
+                        * @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 e036dc9..e8366a5 100644 (file)
@@ -1,57 +1,52 @@
-/*
- * Implementation for mediaWiki.user
+/**
+ * @class mw.user
+ * @singleton
  */
-
 ( function ( mw, $ ) {
+       var callbacks, options, tokens, user;
 
        /**
-        * User object
+        * Gets the current user's groups or rights.
+        *
+        * @private
+        * @param {string} info One of 'groups' or 'rights'
+        * @param {Function} callback
         */
-       function User( options, tokens ) {
-               var user, callbacks;
-
-               /* Private Members */
-
-               user = this;
-               callbacks = {};
-
-               /**
-                * Gets the current user's groups or rights.
-                * @param {String} info: One of 'groups' or 'rights'.
-                * @param {Function} callback
-                */
-               function getUserInfo( info, callback ) {
-                       var api;
-                       if ( callbacks[info] ) {
-                               callbacks[info].add( callback );
-                               return;
-                       }
-                       callbacks.rights = $.Callbacks('once memory');
-                       callbacks.groups = $.Callbacks('once memory');
+       function getUserInfo( info, callback ) {
+               var api;
+               if ( callbacks[info] ) {
                        callbacks[info].add( callback );
-                       api = new mw.Api();
-                       api.get( {
-                               action: 'query',
-                               meta: 'userinfo',
-                               uiprop: 'rights|groups'
-                       } ).always( function ( data ) {
-                               var rights, groups;
-                               if ( data.query && data.query.userinfo ) {
-                                       rights = data.query.userinfo.rights;
-                                       groups = data.query.userinfo.groups;
-                               }
-                               callbacks.rights.fire( rights || [] );
-                               callbacks.groups.fire( groups || [] );
-                       } );
+                       return;
                }
+               callbacks.rights = $.Callbacks('once memory');
+               callbacks.groups = $.Callbacks('once memory');
+               callbacks[info].add( callback );
+               api = new mw.Api();
+               api.get( {
+                       action: 'query',
+                       meta: 'userinfo',
+                       uiprop: 'rights|groups'
+               } ).always( function ( data ) {
+                       var rights, groups;
+                       if ( data.query && data.query.userinfo ) {
+                               rights = data.query.userinfo.rights;
+                               groups = data.query.userinfo.groups;
+                       }
+                       callbacks.rights.fire( rights || [] );
+                       callbacks.groups.fire( groups || [] );
+               } );
+       }
 
-               /* Public Members */
-
-               this.options = options || new mw.Map();
+       callbacks = {};
 
-               this.tokens = tokens || new mw.Map();
+       // Extend the skeleton mw.user from mediawiki.js
+       // This is kind of ugly but we're stuck with this for b/c reasons
+       options = mw.user.options || new mw.Map();
+       tokens = mw.user.tokens || new mw.Map();
 
-               /* Public Methods */
+       mw.user = user = {
+               options: options,
+               tokens: tokens,
 
                /**
                 * Generates a random user session ID (32 alpha-numeric characters).
@@ -59,9 +54,9 @@
                 * This information would potentially be stored in a cookie to identify a user during a
                 * session or series of sessions. Its uniqueness should not be depended on.
                 *
-                * @return String: Random set of 32 alpha-numeric characters
+                * @return {string} Random set of 32 alpha-numeric characters
                 */
-               this.generateRandomSessionId = function () {
+               generateRandomSessionId: function () {
                        var i, r,
                                id = '',
                                seed = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
                                id += seed.substring( r, r + 1 );
                        }
                        return id;
-               };
+               },
 
                /**
                 * Gets the current user's name.
                 *
-                * @return Mixed: User name string or null if users is anonymous
+                * @return {string|null} User name string or null if users is anonymous
                 */
-               this.getName = function () {
+               getName: function () {
                        return mw.config.get( 'wgUserName' );
-               };
+               },
 
                /**
-                * @deprecated since 1.20 use mw.user.getName() instead
+                * @inheritdoc #getName
+                * @deprecated since 1.20 use #getName instead
                 */
-               this.name = function () {
-                       return this.getName();
-               };
+               name: function () {
+                       return user.getName();
+               },
 
                /**
                 * Get date user registered, if available.
                 *
-                * @return {Date|false|null} date user registered, or false for anonymous users, or
+                * @return {Date|boolean|null} Date user registered, or false for anonymous users, or
                 *  null when data is not available
                 */
-               this.getRegistration = function () {
+               getRegistration: function () {
                        var registration = mw.config.get( 'wgUserRegistration' );
-                       if ( this.isAnon() ) {
+                       if ( user.isAnon() ) {
                                return false;
                        } else if ( registration === null ) {
                                // Information may not be available if they signed up before
                        } else {
                                return new Date( registration );
                        }
-               };
+               },
 
                /**
                 * Checks if the current user is anonymous.
                 *
-                * @return Boolean
+                * @return {boolean}
                 */
-               this.isAnon = function () {
+               isAnon: function () {
                        return user.getName() === null;
-               };
+               },
 
                /**
-                * @deprecated since 1.20 use mw.user.isAnon() instead
+                * @inheritdoc #isAnon
+                * @deprecated since 1.20 use #isAnon instead
                 */
-               this.anonymous = function () {
+               anonymous: function () {
                        return user.isAnon();
-               };
+               },
 
                /**
-                * Gets a random session ID automatically generated and kept in a cookie.
+                * Gets a random ID automatically generated and stored in a session cookie.
                 *
                 * This ID is ephemeral for everyone, staying in their browser only until they close
                 * their browser.
                 *
-                * @return String: User name or random session ID
+                * @return {string} Random session ID
                 */
-               this.sessionId = function () {
+               sessionId: function () {
                        var sessionId = $.cookie( 'mediaWiki.user.sessionId' );
                        if ( typeof sessionId === 'undefined' || sessionId === null ) {
                                sessionId = user.generateRandomSessionId();
                                $.cookie( 'mediaWiki.user.sessionId', sessionId, { 'expires': null, 'path': '/' } );
                        }
                        return sessionId;
-               };
+               },
 
                /**
-                * Gets the current user's name or a random ID automatically generated and kept in a cookie.
-                *
-                * 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.
+                * Gets the current user's name or the session ID
                 *
                 * @return {string} User name or random session ID
                 */
-               this.id = function () {
-                       var id,
-                               name = user.getName();
+               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();
+               },
 
                /**
                 * Gets the user's bucket, placing them in one at random based on set odds if needed.
                 *
-                * @param key String: Name of bucket
-                * @param options Object: Bucket configuration options
-                * @param options.buckets Object: List of bucket-name/relative-probability pairs (required,
-                * must have at least one pair)
-                * @param options.version Number: Version of bucket test, changing this forces rebucketing
-                * (optional, default: 0)
-                * @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
-                *
-                * @example
                 *     mw.user.bucket( 'test', {
                 *         'buckets': { 'ignored': 50, 'control': 25, 'test': 25 },
                 *         'version': 1,
                 *         'expires': 7
                 *     } );
+                *
+                * @param {string} key Name of bucket
+                * @param {Object} options Bucket configuration options
+                * @param {Object} options.buckets List of bucket-name/relative-probability pairs (required,
+                *  must have at least one pair)
+                * @param {number} options.version Version of bucket test, changing this forces rebucketing
+                *  (optional, default: 0)
+                * @param {number} options.expires 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
                 */
-               this.bucket = function ( key, options ) {
+               bucket: function ( key, options ) {
                        var cookie, parts, version, bucket,
                                range, k, rand, total;
 
                                );
                        }
                        return bucket;
-               };
+               },
 
                /**
                 * Gets the current user's groups.
+                *
+                * @param {Function} callback
                 */
-               this.getGroups = function ( callback ) {
+               getGroups: function ( callback ) {
                        getUserInfo( 'groups', callback );
-               };
+               },
 
                /**
                 * Gets the current user's rights.
+                *
+                * @param {Function} callback
                 */
-               this.getRights = function ( callback ) {
+               getRights: function ( callback ) {
                        getUserInfo( 'rights', callback );
-               };
-       }
-
-       // Extend the skeleton mw.user from mediawiki.js
-       // This is kind of ugly but we're stuck with this for b/c reasons
-       mw.user = new User( mw.user.options, mw.user.tokens );
+               }
+       };
 
 }( mediaWiki, jQuery ) );
index 1bd7430..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;
                        } );
                        if ( id ) {
                                $item.attr( 'id', id );
                        }
-                       if ( accesskey ) {
-                               $link.attr( 'accesskey', accesskey );
-                               tooltip += ' [' + accesskey + ']';
+
+                       if ( tooltip ) {
+                               // Trim any existing accesskey hint and the trailing space
+                               tooltip = $.trim( tooltip.replace( util.tooltipAccessKeyRegexp, '' ) );
+                               if ( accesskey ) {
+                                       tooltip += ' [' + accesskey + ']';
+                               }
                                $link.attr( 'title', tooltip );
+                               if ( accesskey ) {
+                                       util.updateTooltipAccessKeys( $link );
+                               }
                        }
-                       if ( accesskey && tooltip ) {
-                               util.updateTooltipAccessKeys( $link );
+
+                       if ( accesskey ) {
+                               $link.attr( 'accesskey', accesskey );
                        }
 
                        // 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 );
+                               $( nextnode ).before( $item );
 
                        // - nextnode is a CSS selector for jQuery
                        } else if ( typeof nextnode === 'string' && $ul.find( nextnode ).length !== 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 e4a16d8..6fa8b3c 100644 (file)
@@ -38,8 +38,8 @@ function isCompatible( ua ) {
                ua.match( /SymbianOS|Series60/ ) ||
                // Any NetFront based browser
                ua.match( /NetFront/ ) ||
-               // Opera Mini < 7
-               ua.match( /Opera Mini\/[0-6]\./ )
+               // 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'] );
 
index 21b07f7..5ae8843 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,18 +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 />")
-                       . "<input type='submit' class=\"searchButton\" name=\"go\" value=\"" . wfMessage( 'searcharticle' )->escaped() . "\" />";
+               $s .= $this->makeSearchInput( array( 'class' => 'mw-searchInput', 'type' => 'text', 'size' => '14' ) );
+               $s .= ( $which == 'footer' ? " " : "<br />" );
+               $s .= $this->makeSearchButton( 'go', array( 'class' => 'searchButton' ) );
 
-               if( $wgUseTwoButtonsSearchForm ) {
-                       $s .= " <input type='submit' class=\"searchButton\" name=\"fulltext\" value=\"" . wfMessage( 'searchbutton' )->escaped() . "\" />\n";
+               if ( $wgUseTwoButtonsSearchForm ) {
+                       $s .= $this->makeSearchButton( 'fulltext', array( 'class' => 'searchButton' ) );
                } 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>
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/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 349638a..7bdfca5 100644 (file)
@@ -135,10 +135,6 @@ h1 {
        line-height: 21pt;
 }
 
-h1 .editsection {
-       font-size: 55.6%;
-}
-
 h1#firstHeading {
        padding-bottom: 0;
        margin-bottom: 0;
@@ -263,6 +259,7 @@ input.mw-searchInput {
        font-size: small;
        margin-right: 8px;
        text-align: right;
+       padding-left: 140px;
 }
 /* Override text justification (user preference), see bug 31990 */
 #linkcollection * {
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..9feb973 100644 (file)
@@ -86,15 +86,9 @@ h6 {
 h1 {
        font-size: 188%;
 }
-h1 .editsection {
-       font-size: 53%;
-}
 h2 {
        font-size: 150%;
 }
-h2 .editsection {
-       font-size: 67%;
-}
 h3,
 h4,
 h5,
@@ -105,28 +99,14 @@ h6 {
 h3 {
        font-size: 132%;
 }
-h3 .editsection {
-       font-size: 76%;
-       font-weight: normal;
-}
 h4 {
        font-size: 116%;
 }
-h4 .editsection {
-       font-size: 86%;
-       font-weight: normal; }
 h5 {
-       font-size: 100%;
-}
-h5 .editsection {
-       font-weight: normal;
+       font-size: 108%;
 }
 h6 {
-       font-size: 80%;
-}
-h6 .editsection {
-       font-size: 125%;
-       font-weight: normal;
+       font-size: 100%;
 }
 
 /* Some space under the headers in the content area */
index 0229744..4bb99ae 100644 (file)
@@ -111,7 +111,7 @@ div#jump-to-nav,
 div.top,
 div#column-one,
 #colophon,
-.editsection,
+.mw-editsection,
 .toctoggle,
 .tochidden,
 div#f-poweredbyico,
@@ -352,7 +352,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 {
index 5bd40cb..598f190 100644 (file)
Binary files a/skins/common/images/icons/fileicon-psd.png and b/skins/common/images/icons/fileicon-psd.png differ
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..2a9c25f 100644 (file)
 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;
 }
 
 /* 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%; }
-
 #footer { clear: both }
 /* images */
 /* @noflip */
@@ -161,9 +152,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 +271,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 +446,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..4c68401 100644 (file)
@@ -127,21 +127,6 @@ span.texhtml {
        cursor: pointer;
 }
 
-/* Edit section links */
-/* Correct directionality when page dir is different from site/user dir */
-/* @noflip */
-.mw-content-ltr .editsection,
-.mw-content-rtl .mw-content-ltr .editsection {
-       float: right;
-       margin-left: 5px;
-}
-/* @noflip */
-.mw-content-rtl .editsection,
-.mw-content-ltr .mw-content-rtl .editsection {
-       float: left;
-       margin-right: 5px;
-}
-
 /**
  * File description page
  */
@@ -235,6 +220,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 +554,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 +698,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 +1106,37 @@ table.floatleft {
        z-index: 99;
 }
 
-.editsection, .toctoggle {
+.mw-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..488c37d 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 );
 };
 
 /**
@@ -610,12 +492,10 @@ window.removeHandler = function( element, remove, handler ) {
                element.detachEvent( 'on' + 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..dc236ea 100644 (file)
@@ -32,7 +32,7 @@ a.stub {
 #logo,
 #footer,
 #siteNotice,
-.editsection,
+.mw-editsection,
 .toctoggle {
        display: none;
 }
index f201209..f222028 100644 (file)
@@ -340,10 +340,6 @@ a.new:visited {
        color: #a55858;
 }
 
-span.editsection {
-       font-size: small;
-}
-
 h1, h2 {
        border-bottom: solid 1px #003366;
 }
@@ -412,11 +408,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..e97bbdb 100644 (file)
@@ -3,7 +3,7 @@
 #p-personal,
 #jump-to-nav,
 #footer,
-span.editsection,
+.mw-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 147cd15..90a41d3 100644 (file)
@@ -384,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;
 }
@@ -425,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 {
@@ -518,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%;
 }
index 0ec584a..799ebac 100644 (file)
Binary files a/skins/monobook/wiki-indexed.png and b/skins/monobook/wiki-indexed.png differ
diff --git a/skins/vector/collapsibleTabs.js b/skins/vector/collapsibleTabs.js
new file mode 100644 (file)
index 0000000..eb84325
--- /dev/null
@@ -0,0 +1,210 @@
+/**
+ * Collapsible tabs jQuery Plugin
+ */
+( function ( $ ) {
+       var rtl = $( 'html' ).attr( 'dir' ) === 'rtl';
+       $.fn.collapsibleTabs = function ( options ) {
+               // return if the function is called on an empty jquery object
+               if ( !this.length ) {
+                       return this;
+               }
+               // Merge options into the defaults
+               var $settings = $.extend( {}, $.collapsibleTabs.defaults, options );
+
+               this.each( function () {
+                       var $el = $( this );
+                       // add the element to our array of collapsible managers
+                       $.collapsibleTabs.instances = ( $.collapsibleTabs.instances.length === 0 ?
+                               $el : $.collapsibleTabs.instances.add( $el ) );
+                       // attach the settings to the elements
+                       $el.data( 'collapsibleTabsSettings', $settings );
+                       // attach data to our collapsible elements
+                       $el.children( $settings.collapsible ).each( function () {
+                               $.collapsibleTabs.addData( $( this ) );
+                       } );
+               } );
+
+               // if we haven't already bound our resize hanlder, bind it now
+               if ( !$.collapsibleTabs.boundEvent ) {
+                       $( window )
+                               .delayedBind( '500', 'resize', function ( ) {
+                                       $.collapsibleTabs.handleResize();
+                               } );
+               }
+               // call our resize handler to setup the page
+               $.collapsibleTabs.handleResize();
+               return this;
+       };
+       /**
+        * Returns the amount of horizontal distance between the two tabs groups
+        * (#left-navigation and #right-navigation), in pixels. If negative, this
+        * means that the tabs overlap, and the value is the width of overlapping
+        * parts.
+        *
+        * Used in default expandCondition and collapseCondition.
+        *
+        * @return {Numeric} distance/overlap in pixels
+        */
+       function calculateTabDistance() {
+               var $leftTab, $rightTab, leftEnd, rightStart;
+
+               // In RTL, #right-navigation is actually on the left and vice versa.
+               // Hooray for descriptive naming.
+               if ( !rtl ) {
+                       $leftTab = $( '#left-navigation' );
+                       $rightTab = $( '#right-navigation' );
+               } else {
+                       $leftTab = $( '#right-navigation' );
+                       $rightTab = $( '#left-navigation' );
+               }
+
+               leftEnd = $leftTab.offset().left + $leftTab.width();
+               rightStart = $rightTab.offset().left;
+
+               return rightStart - leftEnd;
+       }
+       $.collapsibleTabs = {
+               instances: [],
+               boundEvent: null,
+               defaults: {
+                       expandedContainer: '#p-views ul',
+                       collapsedContainer: '#p-cactions ul',
+                       collapsible: 'li.collapsible',
+                       shifting: false,
+                       expandCondition: function ( eleWidth ) {
+                               // If there's at least eleWidth pixels free space, expand.
+                               return calculateTabDistance() >= eleWidth;
+                       },
+                       collapseCondition: function () {
+                               // If there's an overlap, collapse.
+                               return calculateTabDistance() < 0;
+                       }
+               },
+               addData: function ( $collapsible ) {
+                       var $settings = $collapsible.parent().data( 'collapsibleTabsSettings' );
+                       if ( $settings !== null ) {
+                               $collapsible.data( 'collapsibleTabsSettings', {
+                                       expandedContainer: $settings.expandedContainer,
+                                       collapsedContainer: $settings.collapsedContainer,
+                                       expandedWidth: $collapsible.width(),
+                                       prevElement: $collapsible.prev()
+                               } );
+                       }
+               },
+               getSettings: function ( $collapsible ) {
+                       var $settings = $collapsible.data( 'collapsibleTabsSettings' );
+                       if ( $settings === undefined ) {
+                               $.collapsibleTabs.addData( $collapsible );
+                               $settings = $collapsible.data( 'collapsibleTabsSettings' );
+                       }
+                       return $settings;
+               },
+               /**
+                * @param {jQuery.Event} e
+                */
+               handleResize: function () {
+                       $.collapsibleTabs.instances.each( function () {
+                               var $el = $( this ),
+                                       data = $.collapsibleTabs.getSettings( $el );
+
+                               if ( data.shifting ) {
+                                       return;
+                               }
+
+                               // if the two navigations are colliding
+                               if ( $el.children( data.collapsible ).length > 0 && data.collapseCondition() ) {
+
+                                       $el.trigger( 'beforeTabCollapse' );
+                                       // move the element to the dropdown menu
+                                       $.collapsibleTabs.moveToCollapsed( $el.children( data.collapsible + ':last' ) );
+                               }
+
+                               // if there are still moveable items in the dropdown menu,
+                               // and there is sufficient space to place them in the tab container
+                               if ( $( data.collapsedContainer + ' ' + data.collapsible ).length > 0 &&
+                                               data.expandCondition( $.collapsibleTabs.getSettings( $( data.collapsedContainer ).children(
+                                                               data.collapsible + ':first' ) ).expandedWidth ) ) {
+                                       //move the element from the dropdown to the tab
+                                       $el.trigger( 'beforeTabExpand' );
+                                       $.collapsibleTabs
+                                               .moveToExpanded( data.collapsedContainer + ' ' + data.collapsible + ':first' );
+                               }
+                       });
+               },
+               moveToCollapsed: function ( ele ) {
+                       var data, expContainerSettings, target,
+                               $moving = $( ele );
+
+                       data = $.collapsibleTabs.getSettings( $moving );
+                       if ( !data ) {
+                               return;
+                       }
+                       expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
+                       if ( !expContainerSettings ) {
+                               return;
+                       }
+                       expContainerSettings.shifting = true;
+
+                       // Remove the element from where it's at and put it in the dropdown menu
+                       target = data.collapsedContainer;
+                       $moving.css( 'position', 'relative' )
+                               .css( ( rtl ? 'left' : 'right' ), 0 )
+                               .animate( { width: '1px' }, 'normal', function () {
+                                       var data, expContainerSettings;
+                                       $( this ).hide();
+                                       // add the placeholder
+                                       $( '<span class="placeholder" style="display: none;"></span>' ).insertAfter( this );
+                                       // XXX: 'data' is undefined here, should the 'data' from the outer scope have
+                                       // a different name?
+                                       $( this ).detach().prependTo( target ).data( 'collapsibleTabsSettings', data );
+                                       $( this ).attr( 'style', 'display: list-item;' );
+                                       data = $.collapsibleTabs.getSettings( $( ele ) );
+                                       if ( data ) {
+                                               expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
+                                               if ( expContainerSettings ) {
+                                                       expContainerSettings.shifting = false;
+                                                       $.collapsibleTabs.handleResize();
+                                               }
+                                       }
+                               } );
+               },
+               moveToExpanded: function ( ele ) {
+                       var data, expContainerSettings, $target, expandedWidth,
+                               $moving = $( ele );
+
+                       data = $.collapsibleTabs.getSettings( $moving );
+                       if ( !data ) {
+                               return;
+                       }
+                       expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
+                       if ( !expContainerSettings ) {
+                               return;
+                       }
+                       expContainerSettings.shifting = true;
+
+                       // grab the next appearing placeholder so we can use it for replacing
+                       $target = $( data.expandedContainer ).find( 'span.placeholder:first' );
+                       expandedWidth = data.expandedWidth;
+                       $moving.css( 'position', 'relative' ).css( ( rtl ? 'right' : 'left' ), 0 ).css( 'width', '1px' );
+                       $target.replaceWith(
+                               $moving
+                               .detach()
+                               .css( 'width', '1px' )
+                               .data( 'collapsibleTabsSettings', data )
+                               .animate( { width: expandedWidth + 'px' }, 'normal', function () {
+                                       $( this ).attr( 'style', 'display: block;' );
+                                       var data, expContainerSettings;
+                                       data = $.collapsibleTabs.getSettings( $( this ) );
+                                       if ( data ) {
+                                               expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
+                                               if ( expContainerSettings ) {
+                                                       expContainerSettings.shifting = false;
+                                                       $.collapsibleTabs.handleResize();
+                                               }
+                                       }
+                               } )
+                       );
+               }
+       };
+
+}( jQuery ) );
diff --git a/skins/vector/images/arrow-down-focus-icon.svg b/skins/vector/images/arrow-down-focus-icon.svg
new file mode 100644 (file)
index 0000000..f2edf26
--- /dev/null
@@ -0,0 +1,37 @@
+<?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"
+   version="1.1"
+   width="22"
+   height="16"
+   id="svg2">
+  <defs
+     id="defs4" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="translate(0,-1036.3622)"
+     id="layer1">
+    <path
+       d="M 10.028624,3.7729932 8.1976442,6.9443424 6.3666649,3.7729932 z"
+       transform="matrix(2.7307791,0,0,1.576616,-11.885956,1036.4136)"
+       id="path2985"
+       style="fill:#929292;fill-opacity:1;stroke:none" />
+  </g>
+</svg>
diff --git a/skins/vector/images/arrow-down-icon.svg b/skins/vector/images/arrow-down-icon.svg
new file mode 100644 (file)
index 0000000..9218ff2
--- /dev/null
@@ -0,0 +1,37 @@
+<?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"
+   version="1.1"
+   width="22"
+   height="16"
+   id="svg2">
+  <defs
+     id="defs4" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="translate(0,-1036.3622)"
+     id="layer1">
+    <path
+       d="M 10.028624,3.7729932 8.1976442,6.9443424 6.3666649,3.7729932 z"
+       transform="matrix(2.7307791,0,0,1.576616,-11.885956,1036.4136)"
+       id="path2985"
+       style="fill:#797979;fill-opacity:1;stroke:none" />
+  </g>
+</svg>
index 6acc994..222531c 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 {
@@ -219,6 +219,12 @@ div.vectorMenu {
        float: left;
        /* @embed */
        background-image: url(images/arrow-down-icon.png);
+       /* 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/arrow-down-icon.svg);
+       /* @embed */
+       background-image: linear-gradient(transparent, transparent), url(images/arrow-down-icon.svg);
        background-position: 100% 60%;
        background-repeat: no-repeat;
        cursor: pointer;
@@ -226,6 +232,12 @@ div.vectorMenu {
 div.vectorMenuFocus {
        /* @embed */
        background-image: url(images/arrow-down-focus-icon.png);
+       /* 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/arrow-down-focus-icon.svg);
+       /* @embed */
+       background-image: linear-gradient(transparent, transparent), url(images/arrow-down-focus-icon.svg);
        background-position: 100% 60%;
 }
 /* @noflip */
@@ -688,10 +700,6 @@ div#content {
        font-size: 0.8em;
 }
 
-.editsection {
-       float: right;
-}
-
 ul {
        list-style-type: disc;
        /* @embed */
@@ -789,7 +797,6 @@ div#content a.external[href *=".pdf?"], div#content a.external[href *=".PDF?"],
        /* @embed */
        background-image: linear-gradient(transparent, transparent), url(images/user-icon.svg);
        padding-left: 15px !important;
-       text-transform: none;
 }
 
 .redirectText {
index 4427d9a..fb1f212 100644 (file)
@@ -18,4 +18,32 @@ jQuery( function ( $ ) {
                                $el.removeClass( 'vectorMenuFocus' );
                        } );
        } );
+
+       /**
+        * Collapsible tabs for Vector
+        */
+       var $cactions = $( '#p-cactions' );
+
+       // Bind callback functions to animate our drop down menu in and out
+       // and then call the collapsibleTabs function on the menu
+       $( '#p-views ul' )
+               .bind( 'beforeTabCollapse', function () {
+                       // If the dropdown was hidden, show it
+                       if ( $cactions.hasClass( 'emptyPortlet' ) ) {
+                               $cactions
+                                       .removeClass( 'emptyPortlet' )
+                                       .find( 'h3, h5' )
+                                               .css( 'width', '1px' ).animate( { 'width': '24px' }, 390 );
+                       }
+               } )
+               .bind( 'beforeTabExpand', function () {
+                       // If we're removing the last child node right now, hide the dropdown
+                       if ( $cactions.find( 'li' ).length === 1 ) {
+                               $cactions.find( 'h3, h5' ).animate( { 'width': '1px' }, 390, function () {
+                                       $( this ).attr( 'style', '' )
+                                               .parent().addClass( 'emptyPortlet' );
+                               });
+                       }
+               } )
+               .collapsibleTabs();
 } );
diff --git a/tests/RunSeleniumTests.php b/tests/RunSeleniumTests.php
deleted file mode 100644 (file)
index b7320cb..0000000
+++ /dev/null
@@ -1,258 +0,0 @@
-#!/usr/bin/env php
-<?php
-/**
- * @file
- * @ingroup Maintenance
- * @copyright Copyright © Wikimedia Deuschland, 2009
- * @author Hallo Welt! Medienwerkstatt GmbH
- * @author Markus Glaser, Dan Nessett, Priyanka Dhanda
- * initial idea by Daniel Kinzler
- *
- * 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
- */
-
-if ( PHP_SAPI != 'cli' ) {
-       die( "Run me from the command line please.\n" );
-}
-
-define( 'SELENIUMTEST', true );
-
-require( __DIR__ . '/../maintenance/Maintenance.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' );
-} else {
-       # Keep the old pre PHPUnit 3.5.0 behavior for compatibility
-       require_once( 'PHPUnit/TextUI/Command.php' );
-}
-
-require_once( 'PHPUnit/Extensions/SeleniumTestCase.php' );
-include_once( 'PHPUnit/Util/Log/JUnit.php' );
-
-require_once( __DIR__ . "/selenium/SeleniumServerManager.php" );
-
-class SeleniumTester extends Maintenance {
-       protected $selenium;
-       protected $serverManager;
-       protected $seleniumServerExecPath;
-
-       public function __construct() {
-               parent::__construct();
-               $this->mDescription = "Selenium Test Runner. For documentation, visit http://www.mediawiki.org/wiki/SeleniumFramework";
-               $this->addOption( 'port', 'Port used by selenium server. Default: 4444', false, true );
-               $this->addOption( 'host', 'Host selenium server. Default: $wgServer . $wgScriptPath', false, true );
-               $this->addOption( 'testBrowser', 'The browser used during testing. Default: firefox', false, true );
-               $this->addOption( 'wikiUrl', 'The Mediawiki installation to point to. Default: http://localhost', false, true );
-               $this->addOption( 'username', 'The login username for sunning tests. Default: empty', false, true );
-               $this->addOption( 'userPassword', 'The login password for running tests. Default: empty', false, true );
-               $this->addOption( 'seleniumConfig', 'Location of the selenium config file. Default: empty', false, true );
-               $this->addOption( 'list-browsers', 'List the available browsers.' );
-               $this->addOption( 'verbose', 'Be noisier.' );
-               $this->addOption( 'startserver', 'Start Selenium Server (on localhost) before the run.' );
-               $this->addOption( 'stopserver', 'Stop Selenium Server (on localhost) after the run.' );
-               $this->addOption( 'jUnitLogFile', 'Log results in a specified JUnit log file. Default: empty', false, true );
-               $this->addOption( 'runAgainstGrid', 'The test will be run against a Selenium Grid. Default: false.', false, true );
-               $this->deleteOption( 'dbpass' );
-               $this->deleteOption( 'dbuser' );
-               $this->deleteOption( 'globals' );
-               $this->deleteOption( 'wiki' );
-       }
-
-       public function listBrowsers() {
-               $desc = "Available browsers:\n";
-
-               foreach ( $this->selenium->getAvailableBrowsers() as $k => $v ) {
-                       $desc .= "  $k => $v\n";
-               }
-
-               echo $desc;
-       }
-
-       protected function startServer() {
-               if ( $this->seleniumServerExecPath == '' ) {
-                       die ( "The selenium server exec path is not set in " .
-                               "selenium_settings.ini. Cannot start server \n" .
-                               "as requested - terminating RunSeleniumTests\n" );
-               }
-               $this->serverManager = new SeleniumServerManager( 'true',
-                       $this->selenium->getPort(),
-                       $this->seleniumServerExecPath );
-               switch ( $this->serverManager->start() ) {
-                       case 'started':
-                               break;
-                       case 'failed':
-                               die ( "Unable to start the Selenium Server - " .
-                                       "terminating RunSeleniumTests\n" );
-                       case 'running':
-                               echo ( "Warning: The Selenium Server is " .
-                                       "already running\n" );
-                               break;
-               }
-
-               return;
-       }
-
-       protected function stopServer() {
-               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" );
-               } else {
-                       switch ( $this->serverManager->stop() ) {
-                               case 'stopped':
-                                       break;
-                               case 'failed':
-                                       echo ( "unable to stop the Selenium Server\n" );
-                       }
-               }
-               return;
-       }
-
-       protected function runTests( $seleniumTestSuites = array() ) {
-               $result = new PHPUnit_Framework_TestResult;
-               $result->addListener( new SeleniumTestListener( $this->selenium->getLogger() ) );
-               if ( $this->selenium->getJUnitLogFile() ) {
-                       $jUnitListener = new PHPUnit_Util_Log_JUnit( $this->selenium->getJUnitLogFile(), true );
-                       $result->addListener( $jUnitListener );
-               }
-
-               foreach ( $seleniumTestSuites as $testSuiteName => $testSuiteFile ) {
-                       require( $testSuiteFile );
-                       $suite = new $testSuiteName();
-                       $suite->setName( $testSuiteName );
-                       $suite->addTests();
-
-                       try {
-                               $suite->run( $result );
-                       } catch ( Testing_Selenium_Exception $e ) {
-                               $suite->tearDown();
-                               throw new MWException( $e->getMessage() );
-                       }
-               }
-
-               if ( $this->selenium->getJUnitLogFile() ) {
-                       $jUnitListener->flush();
-               }
-       }
-
-       public function execute() {
-               global $wgServer, $wgScriptPath, $wgHooks;
-
-               $seleniumSettings = array();
-               $seleniumBrowsers = array();
-               $seleniumTestSuites = array();
-
-               $configFile = $this->getOption( 'seleniumConfig', '' );
-               if ( strlen( $configFile ) > 0 ) {
-                       $this->output( "Using Selenium Configuration file: " . $configFile . "\n" );
-                       SeleniumConfig::getSeleniumSettings( $seleniumSettings,
-                               $seleniumBrowsers,
-                               $seleniumTestSuites,
-                               $configFile );
-               } elseif ( !isset( $wgHooks['SeleniumSettings'] ) ) {
-                       $this->output( "No command line, configuration file or configuration hook found.\n" );
-                       SeleniumConfig::getSeleniumSettings( $seleniumSettings,
-                               $seleniumBrowsers,
-                               $seleniumTestSuites
-                       );
-               } else {
-                       $this->output( "Using 'SeleniumSettings' hook for configuration.\n" );
-                       wfRunHooks( 'SeleniumSettings', array( $seleniumSettings,
-                               $seleniumBrowsers,
-                               $seleniumTestSuites ) );
-               }
-
-               // State for starting/stopping the Selenium server has nothing to do with the Selenium
-               // class. Keep this state local to SeleniumTester class. Using getOption() is clumsy, but
-               // the Maintenance class does not have a setOption()
-               if ( !isset( $seleniumSettings['startserver'] ) ) {
-                       $this->getOption( 'startserver', true );
-               }
-               if ( !isset( $seleniumSettings['stopserver'] ) ) {
-                       $this->getOption( 'stopserver', true );
-               }
-               if ( !isset( $seleniumSettings['seleniumserverexecpath'] ) ) {
-                       $seleniumSettings['seleniumserverexecpath'] = '';
-               }
-               $this->seleniumServerExecPath = $seleniumSettings['seleniumserverexecpath'];
-
-               //set reasonable defaults if we did not find the settings
-               if ( !isset( $seleniumBrowsers ) ) {
-                       $seleniumBrowsers = array( 'firefox' => '*firefox' );
-               }
-               if ( !isset( $seleniumSettings['host'] ) ) {
-                       $seleniumSettings['host'] = $wgServer . $wgScriptPath;
-               }
-               if ( !isset( $seleniumSettings['port'] ) ) {
-                       $seleniumSettings['port'] = '4444';
-               }
-               if ( !isset( $seleniumSettings['wikiUrl'] ) ) {
-                       $seleniumSettings['wikiUrl'] = 'http://localhost';
-               }
-               if ( !isset( $seleniumSettings['username'] ) ) {
-                       $seleniumSettings['username'] = '';
-               }
-               if ( !isset( $seleniumSettings['userPassword'] ) ) {
-                       $seleniumSettings['userPassword'] = '';
-               }
-               if ( !isset( $seleniumSettings['testBrowser'] ) ) {
-                       $seleniumSettings['testBrowser'] = 'firefox';
-               }
-               if ( !isset( $seleniumSettings['jUnitLogFile'] ) ) {
-                       $seleniumSettings['jUnitLogFile'] = false;
-               }
-               if ( !isset( $seleniumSettings['runAgainstGrid'] ) ) {
-                       $seleniumSettings['runAgainstGrid'] = false;
-               }
-
-               // Setup Selenium class
-               $this->selenium = new Selenium();
-               $this->selenium->setAvailableBrowsers( $seleniumBrowsers );
-               $this->selenium->setRunAgainstGrid( $this->getOption( 'runAgainstGrid', $seleniumSettings['runAgainstGrid'] ) );
-               $this->selenium->setUrl( $this->getOption( 'wikiUrl', $seleniumSettings['wikiUrl'] ) );
-               $this->selenium->setBrowser( $this->getOption( 'testBrowser', $seleniumSettings['testBrowser'] ) );
-               $this->selenium->setPort( $this->getOption( 'port', $seleniumSettings['port'] ) );
-               $this->selenium->setHost( $this->getOption( 'host', $seleniumSettings['host'] ) );
-               $this->selenium->setUser( $this->getOption( 'username', $seleniumSettings['username'] ) );
-               $this->selenium->setPass( $this->getOption( 'userPassword', $seleniumSettings['userPassword'] ) );
-               $this->selenium->setVerbose( $this->hasOption( 'verbose' ) );
-               $this->selenium->setJUnitLogFile( $this->getOption( 'jUnitLogFile', $seleniumSettings['jUnitLogFile'] ) );
-
-               if ( $this->hasOption( 'list-browsers' ) ) {
-                       $this->listBrowsers();
-                       exit( 0 );
-               }
-               if ( $this->hasOption( 'startserver' ) ) {
-                       $this->startServer();
-               }
-
-               $logger = new SeleniumTestConsoleLogger;
-               $this->selenium->setLogger( $logger );
-
-               $this->runTests( $seleniumTestSuites );
-
-               if ( $this->hasOption( 'stopserver' ) ) {
-                       $this->stopServer();
-               }
-       }
-}
-
-$maintClass = "SeleniumTester";
-
-require_once( RUN_MAINTENANCE_IF_MAIN );
index 4341891..d7237f7 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,6 +49,8 @@ $wgAutoloadClasses += array(
 
        //db
        'ORMTableTest' => "$testDir/phpunit/includes/db/ORMTableTest.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",
@@ -69,6 +73,7 @@ $wgAutoloadClasses += array(
 
        # tests/phpunit/includes/parser
        'NewParserTest' => "$testDir/phpunit/includes/parser/NewParserTest.php",
+       'MediaWikiParserTest' => "$testDir/phpunit/includes/parser/MediaWikiParserTest.php",
 
        # tests/phpunit/includes/libs
        'GenericArrayObjectTest' => "$testDir/phpunit/includes/libs/GenericArrayObjectTest.php",
@@ -77,6 +82,13 @@ $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",
+       'MockImageHandler' => "$testDir/phpunit/mocks/media/MockBitmapHandler.php",
+       'MockSvgHandler' => "$testDir/phpunit/mocks/media/MockBitmapHandler.php",
+
        # tests/phpunit/languages
        'LanguageClassesTestCase' => "$testDir/phpunit/languages/LanguageClassesTestCase.php",
 
@@ -86,15 +98,4 @@ $wgAutoloadClasses += array(
        # tests/parser
        'ParserTest' => "$testDir/parser/parserTest.inc",
        'ParserTestParserHook' => "$testDir/parser/parserTestsParserHook.php",
-
-       # tests/selenium
-       'Selenium' => "$testDir/selenium/Selenium.php",
-       'SeleniumLoader' => "$testDir/selenium/SeleniumLoader.php",
-       'SeleniumTestCase' => "$testDir/selenium/SeleniumTestCase.php",
-       'SeleniumTestConsoleLogger' => "$testDir/selenium/SeleniumTestConsoleLogger.php",
-       'SeleniumTestConstants' => "$testDir/selenium/SeleniumTestConstants.php",
-       'SeleniumTestHTMLLogger' => "$testDir/selenium/SeleniumTestHTMLLogger.php",
-       'SeleniumTestListener' => "$testDir/selenium/SeleniumTestListener.php",
-       'SeleniumTestSuite' => "$testDir/selenium/SeleniumTestSuite.php",
-       'SeleniumConfig' => "$testDir/selenium/SeleniumConfig.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 3d34f34..4efd708 100644 (file)
@@ -1,6 +1,8 @@
 <?php
 /**
- * Helper code for the MediaWiki parser test suite.
+ * Helper code for the MediaWiki parser test suite. Some code is duplicated
+ * in PHPUnit's NewParserTests.php, so you'll probably want to update both
+ * at the same time.
  *
  * Copyright © 2004, 2010 Brion Vibber <brion@pobox.com>
  * http://www.mediawiki.org/
@@ -143,13 +145,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;
@@ -211,6 +212,61 @@ class ParserTest {
                        $wgStyleDirectory = "$IP/skins";
                }
 
+               self::setupInterwikis();
+       }
+
+       /**
+        * Insert hardcoded interwiki in the lookup table.
+        *
+        * This function insert a set of well known interwikis that are used in
+        * the parser tests. They can be considered has fixtures are injected in
+        * the interwiki cache by using the 'InterwikiLoadPrefix' hook.
+        * Since we are not interested in looking up interwikis in the database,
+        * the hook completely replace the existing mechanism (hook returns false).
+        */
+       public static function setupInterwikis() {
+               # Hack: insert a few Wikipedia in-project interwiki prefixes,
+               # for testing inter-language links
+               Hooks::register( 'InterwikiLoadPrefix', function ( $prefix, &$iwData ) {
+                       static $testInterwikis = array(
+                               'wikipedia' => array(
+                                       'iw_url' => 'http://en.wikipedia.org/wiki/$1',
+                                       'iw_api' => '',
+                                       'iw_wikiid' => '',
+                                       'iw_local' => 0 ),
+                               'meatball' => array(
+                                       'iw_url' => 'http://www.usemod.com/cgi-bin/mb.pl?$1',
+                                       'iw_api' => '',
+                                       'iw_wikiid' => '',
+                                       'iw_local' => 0 ),
+                               'zh' => array(
+                                       'iw_url' => 'http://zh.wikipedia.org/wiki/$1',
+                                       'iw_api' => '',
+                                       'iw_wikiid' => '',
+                                       'iw_local' => 1 ),
+                               'es' => array(
+                                       'iw_url' => 'http://es.wikipedia.org/wiki/$1',
+                                       'iw_api' => '',
+                                       'iw_wikiid' => '',
+                                       'iw_local' => 1 ),
+                               'fr' => array(
+                                       'iw_url' => 'http://fr.wikipedia.org/wiki/$1',
+                                       'iw_api' => '',
+                                       'iw_wikiid' => '',
+                                       'iw_local' => 1 ),
+                               'ru' => array(
+                                       'iw_url' => 'http://ru.wikipedia.org/wiki/$1',
+                                       'iw_api' => '',
+                                       'iw_wikiid' => '',
+                                       'iw_local' => 1 ),
+                       );
+                       if( array_key_exists( $prefix, $testInterwikis ) ) {
+                               $iwData = $testInterwikis[$prefix];
+                       }
+
+                       // We only want to rely on the above fixtures
+                       return false;
+               } );// hooks::register
        }
 
        public function setupRecorder( $options ) {
@@ -518,18 +574,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 +725,6 @@ class ParserTest {
                        ),
                        'wgEnableUploads' => self::getOptionValue( 'wgEnableUploads', $opts, true ),
                        'wgStylePath' => '/skins',
-                       'wgStyleSheetPath' => '/skins',
                        'wgSitename' => 'MediaWiki',
                        'wgLanguageCode' => $lang,
                        'wgDBprefix' => $this->db->getType() != 'oracle' ? 'parsertest_' : 'pt_',
@@ -678,6 +738,8 @@ class ParserTest {
                        'wgNoFollowDomainExceptions' => array(),
                        'wgThumbnailScriptPath' => false,
                        'wgUseImageResize' => true,
+                       'wgSVGConverter' => 'null',
+                       'wgSVGConverters' => array( 'null' => 'echo "1">$output' ),
                        'wgLocaltimezone' => 'UTC',
                        'wgAllowExternalImages' => true,
                        'wgUseTidy' => false,
@@ -822,41 +884,6 @@ class ParserTest {
                                'user_name' => 'Anonymous' ) );
                }
 
-               # Hack: insert a few Wikipedia in-project interwiki prefixes,
-               # for testing inter-language links
-               $this->db->insert( 'interwiki', array(
-                       array( 'iw_prefix' => 'wikipedia',
-                               'iw_url' => 'http://en.wikipedia.org/wiki/$1',
-                               'iw_api' => '',
-                               'iw_wikiid' => '',
-                               'iw_local' => 0 ),
-                       array( 'iw_prefix' => 'meatball',
-                               'iw_url' => 'http://www.usemod.com/cgi-bin/mb.pl?$1',
-                               'iw_api' => '',
-                               'iw_wikiid' => '',
-                               'iw_local' => 0 ),
-                       array( 'iw_prefix' => 'zh',
-                               'iw_url' => 'http://zh.wikipedia.org/wiki/$1',
-                               'iw_api' => '',
-                               'iw_wikiid' => '',
-                               'iw_local' => 1 ),
-                       array( 'iw_prefix' => 'es',
-                               'iw_url' => 'http://es.wikipedia.org/wiki/$1',
-                               'iw_api' => '',
-                               'iw_wikiid' => '',
-                               'iw_local' => 1 ),
-                       array( 'iw_prefix' => 'fr',
-                               'iw_url' => 'http://fr.wikipedia.org/wiki/$1',
-                               'iw_api' => '',
-                               'iw_wikiid' => '',
-                               'iw_local' => 1 ),
-                       array( 'iw_prefix' => 'ru',
-                               'iw_url' => 'http://ru.wikipedia.org/wiki/$1',
-                               'iw_api' => '',
-                               'iw_wikiid' => '',
-                               'iw_local' => 1 ),
-               ) );
-
                # Update certain things in site_stats
                $this->db->insert( 'site_stats', array( 'ss_row_id' => 1, 'ss_images' => 2, 'ss_good_articles' => 1 ) );
 
@@ -866,6 +893,8 @@ class ParserTest {
                # Clear the message cache
                MessageCache::singleton()->clear();
 
+               // Remember to update newParserTests.php after changing the below
+               // (and it uses a slightly different syntax just for teh lulz)
                $this->uploadDir = $this->setupUploadDir();
                $user = User::createNew( 'WikiSysop' );
                $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Foobar.jpg' ) );
@@ -899,6 +928,19 @@ class ParserTest {
                        'fileExists' => true
                ), $this->db->timestamp( '20130225203040' ), $user );
 
+               $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Foobar.svg' ) );
+               $image->recordUpload2( '', 'Upload of some lame SVG', 'Some lame SVG', array(
+                               'size'        => 12345,
+                               'width'       => 240,
+                               'height'      => 180,
+                               'bits'        => 24,
+                               'media_type'  => MEDIATYPE_DRAWING,
+                               'mime'        => 'image/svg+xml',
+                               'metadata'    => serialize( array() ),
+                               'sha1'        => wfBaseConvert( '', 16, 36, 31 ),
+                               'fileExists'  => true
+               ), $this->db->timestamp( '20010115123500' ), $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(
@@ -982,7 +1024,11 @@ class ParserTest {
                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" );
-
+               wfMkdirParents( $dir . '/f/ff', null, __METHOD__ );
+               copy( "$IP/skins/monobook/headbg.jpg", "$dir/f/ff/Foobar.svg" );
+               file_put_contents( "$dir/f/ff/Foobar.svg",
+                       '<?xml version="1.0" encoding="utf-8"?>' .
+                       '<svg xmlns="http://www.w3.org/2000/svg" />' );
                return $dir;
        }
 
@@ -1032,6 +1078,14 @@ class ParserTest {
 
                                "$dir/0/09/Bad.jpg",
 
+                               "$dir/f/ff/Foobar.svg",
+                               "$dir/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png",
+                               "$dir/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png",
+                               "$dir/thumb/f/ff/Foobar.svg/langde-270px-Foobar.svg.png",
+                               "$dir/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png",
+                               "$dir/thumb/f/ff/Foobar.svg/langde-180px-Foobar.svg.png",
+                               "$dir/thumb/f/ff/Foobar.svg/langde-360px-Foobar.svg.png",
+
                                "$dir/math/f/a/5/fa50b8b616463173474302ca3e63586b.png",
                        )
                );
@@ -1045,10 +1099,13 @@ class ParserTest {
                                "$dir/thumb/3/3a/Foobar.jpg",
                                "$dir/thumb/3/3a",
                                "$dir/thumb/3",
-
                                "$dir/e/ea",
                                "$dir/e",
-
+                               "$dir/f/ff/",
+                               "$dir/f/",
+                               "$dir/thumb/f/ff/Foobar.svg",
+                               "$dir/thumb/f/ff/",
+                               "$dir/thumb/f/",
                                "$dir/0/09/",
                                "$dir/0/",
                                "$dir/thumb",
@@ -1095,10 +1152,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";
                }
@@ -1110,28 +1169,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";
                                }
                        }
@@ -1166,9 +1226,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 1d4102c..17f9437 100644 (file)
@@ -303,6 +303,59 @@ b
 
 !! 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
@@ -1462,6 +1515,17 @@ Templates: Strip whitespace from named parameters, but not positional ones
 
 !! end
 
+!! test
+Templates: Parsoid parameter escaping test 1
+!! options
+parsoid
+!! input
+{{echo|[foo]|{{echo|[bar]}}}}
+!! result
+<p about="#mwt1" typeof="mw:Transclusion"
+data-mw="{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;[foo]&quot;},&quot;2&quot;:{&quot;wt&quot;:&quot;{{echo|[bar]}}&quot;}},&quot;i&quot;:0}">[foo]</p>
+!! end
+
 ###
 ### Parsoid-centric tests for testing RT edge cases for pre
 ###
@@ -2376,8 +2440,25 @@ parsoid
 *#*#;*;;foo :bar
 *#*#;boo :baz
 !! result
-<ul><li><ol><li><ul><li><ol><li><dl><dt><ul><li><dl><dt><dl><dt>foo&nbsp;</dt><dd>bar
-</dd></dl></dt></dl></li></ul></dt><dt>boo&nbsp;</dt><dd>baz</dd></dl></li></ol></li></ul></li></ol></li></ul>
+<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
 
 
@@ -2406,7 +2487,23 @@ 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&nbsp;</dt><dd> bar (who uses this?)</dd></dl></dt></dl></dd></dl></dd></dl></li></ul></dt></dl></li></ol></li></ul>
+<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
 
 ###
@@ -2993,6 +3090,15 @@ External link containing double-single-quotes with no space separating the url f
 </p>
 !! end
 
+!! test
+External link with comments in link text
+!! input
+[http://www.google.com Google <!-- comment -->]
+!! result
+<p><a rel="nofollow" class="external text" href="http://www.google.com">Google </a>
+</p>
+!! end
+
 !! test
 URL-encoding in URL functions (single parameter)
 !! input
@@ -3665,16 +3771,17 @@ Table with empty line following the start tag
 !! 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
 
@@ -3751,7 +3858,6 @@ parsoid
 <table>
 <tbody>
 <tr>
-<td></td>
 <td>foo</td></tr></tbody></table>
 !! end
 
@@ -3785,6 +3891,15 @@ Piped link
 </p>
 !! end
 
+!! test
+Piped link with comment in link text
+!! input
+[[Main Page|The Main<!--front--> Page]]
+!! result
+<p><a href="/wiki/Main_Page" title="Main Page">The Main Page</a>
+</p>
+!! end
+
 !! test
 Broken link
 !! input
@@ -3970,6 +4085,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
@@ -4231,6 +4373,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
@@ -4349,6 +4554,84 @@ language=ln
 </p>
 !! end
 
+!! test
+Parsoid: handle constructor well
+!! options
+parsoid
+!! input
+[[constructor]]
+
+[[constructor:foo]]
+!! result
+<p data-parsoid="{&quot;dsr&quot;:[0,15,0,0]}"><a rel="mw:WikiLink" href="./Constructor" data-parsoid="{&quot;stx&quot;:&quot;simple&quot;,&quot;a&quot;:{&quot;href&quot;:&quot;./Constructor&quot;},&quot;sa&quot;:{&quot;href&quot;:&quot;constructor&quot;},&quot;dsr&quot;:[0,15,2,2]}">constructor</a></p>
+
+
+<p data-parsoid="{&quot;dsr&quot;:[17,36,0,0]}"><a rel="mw:WikiLink" href="./Foo" data-parsoid="{&quot;stx&quot;:&quot;simple&quot;,&quot;a&quot;:{&quot;href&quot;:&quot;./Foo&quot;},&quot;sa&quot;:{&quot;href&quot;:&quot;constructor:foo&quot;},&quot;dsr&quot;:[17,36,2,2]}">constructor:foo</a></p>
+!! end
+
+##
+## Redirects, Parsoid-only
+##
+!! test
+Simple redirect to page
+!! options
+parsoid
+!! input
+#REDIRECT [[Main Page]]
+!! result
+<link rel="mw:PageProp/redirect" href="./Main_Page">
+!! end
+
+!! test
+Redirect to category
+!! options
+parsoid=wt2html
+!! input
+#REDIRECT [[Category:Foo]]
+!! result
+<link rel="mw:PageProp/redirect" href="./Category:Foo"><link rel="mw:WikiLink/Category" href="./Category:Foo">
+!! end
+
+!! test
+Redirect to category page
+!! options
+parsoid=wt2html,html2html
+!! input
+#REDIRECT [[:Category:Foo]]
+!! result
+<p><a rel="mw:WikiLink" href="Category:Foo">Category:Foo</a></p>
+!! end
+
+!! test
+Redirect to image page
+!! options
+parsoid
+!! input
+#REDIRECT [[File:Wiki.png]]
+!! result
+<link rel="mw:PageProp/redirect" href="./File:Wiki.png">
+!! end
+
+!! test
+Redirect to language
+!! options
+parsoid
+!! input
+#REDIRECT [[en:File:Wiki.png]]
+!! result
+<link rel="mw:PageProp/redirect" href="File:Wiki.png">
+!! end
+
+!! test
+Redirect to interwiki
+!! options
+parsoid
+!! input
+#REDIRECT [[meatball:File:Wiki.png]]
+!! result
+<link rel="mw:PageProp/redirect" href="File:Wiki.png">
+!! end
+
 ##
 ## XHTML tidiness
 ###
@@ -4467,7 +4750,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
 ----
 ----
@@ -4713,9 +4996,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>
@@ -4730,9 +5013,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>
@@ -4747,9 +5030,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>
@@ -4836,7 +5119,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>
 
@@ -4877,6 +5160,33 @@ Single-comment whitespace lines dont break lists, but multi-comment whitespace l
 
 !!end
 
+!!test
+Test the li-hack
+(Cannot test this with PHP parser since it relies on Tidy for the hack)
+!!options
+parsoid=wt2html,wt2wt
+!!input
+* foo
+* <li>li-hack
+* {{echo|<li>templated li-hack}}
+* <!--foo--> <li> unsupported li-hack with preceding comments
+
+<ul>
+<li><li>not a li-hack
+</li>
+</ul>
+!!result
+<ul><li> foo</li>
+<li>li-hack</li>
+<li about="#mwt1" typeof="mw:Transclusion" data-mw='{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<li>templated li-hack"}}}'>templated li-hack</li>
+<li> <!--foo--> </li><li> li-hack with preceding comments</li></ul>
+
+<ul>
+<li></li><li>not a li-hack
+</li>
+</ul>
+!!end
+
 ###
 ### Magic Words
 ###
@@ -5040,7 +5350,7 @@ Magic Word: {{NUMBEROFFILES}}
 !! input
 {{NUMBEROFFILES}}
 !! result
-<p>3
+<p>4
 </p>
 !! end
 
@@ -5916,8 +6226,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
 
@@ -5943,7 +6253,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
 
@@ -6105,6 +6415,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
@@ -6489,24 +6812,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
@@ -6529,10 +6852,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
@@ -6561,7 +6884,7 @@ parsoid
   </tr>
 </table>
 !!result
-<table  about="#mwt1" typeof="mw:Object/Template">
+<table  about="#mwt1" typeof="mw:Transclusion">
   <tbody><tr >
     <td >
     <table >
@@ -6740,10 +7063,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
@@ -6751,7 +7077,7 @@ Template:dangerous
 !! input
 {{Template:dangerous}}
 !! result
-<p><span>Oh no</span>
+<p>@<span>Oh no</span>
 </p>
 !! end
 
@@ -7208,9 +7534,9 @@ Special:RecentChanges/param
 !! options
 msg
 !! input
-{{#special:foobarnonexistent}}
+{{#special:foobar nonexistent}}
 !! result
-No such special page
+Special:Foobar nonexistent
 !! end
 
 !! test
@@ -7238,9 +7564,9 @@ Special:RecentChanges/param
 !! options
 msg
 !! input
-{{#speciale:foobarnonexistent}}
+{{#speciale:foobar nonexistent}}
 !! result
-No_such_special_page
+Special:Foobar_nonexistent
 !! end
 
 ###
@@ -7565,6 +7891,37 @@ Thumbnail image caption with a free URL and explicit alt
 
 !! end
 
+
+!! test
+SVG thumbnails with no language set
+!! options
+!! input
+[[File:Foobar.svg|thumb|width=200]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png" width="180" height="180" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>width=200</div></div></div>
+
+!! end
+
+!! test
+SVG thumbnails with language de
+!! options
+!! input
+[[File:Foobar.svg|thumb|width=200|lang=de]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=File:Foobar.svg&amp;lang=de" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/langde-180px-Foobar.svg.png" width="180" height="180" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/langde-270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/langde-360px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>width=200</div></div></div>
+
+!! end
+
+!! test
+SVG thumbnails with invalid language code
+!! options
+!! input
+[[File:Foobar.svg|thumb|width=200|lang=invalid.language.code]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png" width="180" height="180" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>lang=invalid.language.code</div></div></div>
+
+!! end
+
 !! test
 BUG 1887: A ISBN with a thumbnail
 !! input
@@ -7760,31 +8117,223 @@ wgEnableUploads=0
 </p>
 !! end
 
-
-###
-### Subpages
-###
-!! article
-Subpage test/subpage
-!! text
-foo
-!! endarticle
+# 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
-Subpage link
+Parsoid-specific image handling - simple image
 !! options
-subpage title=[[Subpage test]]
+parsoid
 !! input
-[[/subpage]]
+[[Image:Foobar.jpg]]
 !! result
-<p><a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">/subpage</a>
+<p>
+<span class="mw-default-size" typeof="mw:Image">
+<a href="File:Foobar.jpg">
+<img resource="./File:Foobar.jpg" src="//upload.wikimedia.org/wikipedia/commons/3/3a/Foobar.jpg" height="220" width="1941">
+</a>
+</span>
 </p>
 !! end
 
 !! test
-Subpage noslash link
+Parsoid-specific image handling - simple image without link
 !! options
-subpage title=[[Subpage test]]
+parsoid
+!! input
+[[Image:Foobar.jpg|link=]]
+!! result
+<p>
+<span class="mw-default-size" typeof="mw:Image">
+<span>
+<img resource="./File:Foobar.jpg" src="//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="//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="//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="//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="//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="//upload.wikimedia.org/wikipedia/commons/3/3a/Foobar.jpg/180px-Foobar.jpg" height="21" width="180" />
+</a>
+<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="//upload.wikimedia.org/wikipedia/commons/3/3a/Foobar.jpg/50px-Foobar.jpg" height="6" width="50" />
+</a>
+<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="//upload.wikimedia.org/wikipedia/commons/3/3a/Foobar.jpg/442px-Foobar.jpg" height="50" width="442" />
+</a>
+<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="//upload.wikimedia.org/wikipedia/commons/3/3a/Foobar.jpg/442px-Foobar.jpg" height="50" width="442" />
+</a>
+<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="//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
+###
+!! article
+Subpage test/subpage
+!! text
+foo
+!! endarticle
+
+!! test
+Subpage link
+!! options
+subpage title=[[Subpage test]]
+!! input
+[[/subpage]]
+!! result
+<p><a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">/subpage</a>
+</p>
+!! end
+
+!! test
+Subpage noslash link
+!! options
+subpage title=[[Subpage test]]
 !!input
 [[/subpage/]]
 !! result
@@ -7975,6 +8524,48 @@ Bar
 </p>
 !! end
 
+!! test
+Parsoid: Serialize link to category page with colon escape
+!! options
+parsoid
+!! input
+
+[[:Category:Foo]]
+[[:Category:Foo|Bar]]
+!! result
+<p>
+<a rel="mw:WikiLink" href="Category:Foo">Category:Foo</a>
+<a rel="mw:WikiLink" href="Category:Foo">Bar</a>
+</p>
+!! end
+
+!! test
+Parsoid: Serialize link to file page with colon escape
+!! options
+parsoid
+!! input
+
+[[:File:Foo.png]]
+[[:File:Foo.png|Bar]]
+!! result
+<p>
+<a rel="mw:WikiLink" href="File:Foo.png">File:Foo.png</a>
+<a rel="mw:WikiLink" href="File:Foo.png">Bar</a>
+</p>
+!! end
+
+!! test
+Parsoid: Serialize a genuine category link without colon escape
+!! options
+parsoid
+!! input
+[[Category:Foo]]
+[[Category:Foo|Bar]]
+!! result
+<link rel="mw:WikiLink/Category" href="Category:Foo">
+<link rel="mw:WikiLink/Category" href="Category:Foo#Bar">
+!! end
+
 ###
 ### Inter-language links
 ###
@@ -8017,13 +8608,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
@@ -8062,14 +8653,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
 
@@ -8117,16 +8708,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
 
@@ -8159,12 +8750,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
 
@@ -8195,12 +8786,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
 
@@ -8225,11 +8816,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
 
@@ -8240,8 +8831,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
 
@@ -8251,8 +8842,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
 
@@ -8271,10 +8862,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
 
@@ -8285,8 +8876,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
 
@@ -8295,7 +8886,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
 
@@ -8317,9 +8908,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
 
@@ -8341,10 +8932,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
@@ -8380,19 +8971,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
@@ -8414,10 +9005,10 @@ 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
 
@@ -8451,12 +9042,12 @@ __NOEDITSECTION__
 </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>
+<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
 
@@ -8552,7 +9143,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
@@ -8565,7 +9156,7 @@ disabled
 !! test
 div with braces in attribute value
 !! options
-disabled
+parsoid
 !! input
 <div title="{}">Foo</div>
 !! result
@@ -8582,7 +9173,7 @@ disabled
 !! test
 div with empty attribute value, no space before equals
 !! options
-disabled
+parsoid
 !! input
 <div class=>HTML rocks</div>
 !! result
@@ -9743,7 +10334,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>
@@ -9758,7 +10349,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>
@@ -10956,6 +11547,8 @@ Say the magic word
 * {{BASEPAGENAME}}
 * {{SUBPAGENAME}}
 * {{SUBPAGENAMEE}}
+* {{ROOTPAGENAME}}
+* {{ROOTPAGENAMEE}}
 * {{BASEPAGENAME}}
 * {{BASEPAGENAMEE}}
 * {{TALKPAGENAME}}
@@ -10976,6 +11569,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
@@ -11551,7 +12146,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
 
@@ -11582,12 +12177,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
 
@@ -11694,7 +12289,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
@@ -11743,6 +12338,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
@@ -11924,7 +12540,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
 
@@ -12037,6 +12653,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
@@ -12241,7 +12881,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
 
@@ -12253,7 +12893,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
 
@@ -12265,7 +12905,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
 
@@ -12625,7 +13265,7 @@ comment title=[[Main Page]]
 !! input
 pre-comment text /* External links */ removed bogus entries
 !! result
-pre-comment text <a href="/wiki/Main_Page#External_links" title="Main Page">→</a>‎<span dir="auto"><span class="autocomment">External links: </span> removed bogus entries</span>
+pre-comment text <a href="/wiki/Main_Page#External_links" title="Main Page">→</a>‎<span dir="auto"><span class="autocomment">External links: </span> removed bogus entries</span>
 !!end
 
 !! test
@@ -12856,6 +13496,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
@@ -13085,7 +13759,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
 
@@ -13102,7 +13776,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
 
@@ -13119,7 +13793,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
 
@@ -13136,7 +13810,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
 
@@ -13155,7 +13829,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>
@@ -13175,8 +13849,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
 
@@ -13194,8 +13868,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
 
@@ -13222,11 +13896,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
 
@@ -13243,7 +13917,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
 
@@ -13345,7 +14019,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
 
@@ -13471,6 +14145,19 @@ abc
 </p>
 !! end
 
+!!test
+Special parser function
+!! input
+{{#special:RandomPage}}
+{{#special:BaDtItLe}}
+{{#special:Foobar}}
+!! result
+<p>Special:Random
+Special:Badtitle
+Special:Foobar
+</p>
+!! end
+
 !!test
 Bug 34939 - Case insensitive link parsing ([HttP://])
 !! input
@@ -13498,6 +14185,7 @@ HttP://MediaWiki.Org/
 </p>
 !! end
 
+
 ###
 ### Parsoids-specific tests
 ### Parsoid-PHP parser incompatibilities
@@ -13505,76 +14193,446 @@ 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.
-
-#### --------------- Headings ---------------
-#### 0. Unnested
-#### 1. Nested inside html <h1>=foo=</h1>
-#### 2. Outside heading nest on a single line <h1>foo</h1>*bar
-#### 3. Nested inside html with wikitext split by html tags
-#### 4. No escape needed
-#### 5. Empty headings <h1></h1>
-#### 6. Heading chars in SOL context
-#### ----------------------------------------
-!! test
-Headings: 0. Unnested
-!! input
-<nowiki>=foo=</nowiki>
+#### ----------------------------------------------------------------
+#### Parsoid-only testing of Parsoid's impl of <ref> and <references>
+#### tags. Parsoid's output for these tags differs from that of the
+#### PHP parser.
+#### ----------------------------------------------------------------
 
-<nowiki>=foo</nowiki>''a''=
-!! result
-<p>=foo=
-</p><p>=foo<i>a</i>=
-</p>
+!!test
+Ref: 1. ref-location should be replaced with an index span
+!!options
+parsoid
+!!input
+A <ref>foo</ref>
+B <ref name="x">foo</ref>
+C <ref name="y" />
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span>
+B <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"x"}}' id="cite_ref-x-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-x-2">[2]</a></span>
+C <span about="#mwt3" class="reference" data-mw='{"name":"ref","attrs":{"name":"y"}}' id="cite_ref-y-3-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-y-3">[3]</a></span></p>
 !!end
 
-!! test
-Headings: 1. Nested inside html
-!! options
-disabled
-!! input
-=<nowiki>=foo=</nowiki>=
-==<nowiki>=foo=</nowiki>==
-===<nowiki>=foo=</nowiki>===
-====<nowiki>=foo=</nowiki>====
-=====<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>
+!!test
+Ref: 2. ref-tags with identical names should all get the same index
+!!options
+parsoid
+!!input
+A <ref name="x">foo</ref>
+B <ref name="x" />
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"x"}}' id="cite_ref-x-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-x-1">[1]</a></span>
+B <span about="#mwt2" class="reference" data-mw='{"name":"ref","attrs":{"name":"x"}}' id="cite_ref-x-1-1" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-x-1">[1]</a></span></p>
 !!end
 
-!! test
-Headings: 2. Outside heading nest on a single line <h1>foo</h1>*bar
+!!test
+Ref: 3. spaces in ref-names should be ignored
+!!options
+parsoid
+!!input
+A <ref name="x">foo</ref>
+B <ref name=" x " />
+C <ref name= x  />
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"x"}}' id="cite_ref-x-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-x-1">[1]</a></span>
+B <span about="#mwt2" class="reference" data-mw='{"name":"ref","attrs":{"name":"x"}}' id="cite_ref-x-1-1" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-x-1">[1]</a></span>
+C <span about="#mwt3" class="reference" data-mw='{"name":"ref","attrs":{"name":"x"}}' id="cite_ref-x-1-2" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-x-1">[1]</a></span></p>
+!!end
+
+!!test
+Ref: 4. 'constructor' should be accepted as a valid ref-name
+(NOTE: constructor is a predefined property in JS and constructor as a ref-name can clash with it if not handled properly)
+!!options
+parsoid
+!!input
+A <ref name="constructor">foo</ref>
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"constructor"}}' id="cite_ref-constructor-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-constructor-1">[1]</a></span></p>
+!!end
+
+!!test
+Ref: 5. body should accept generic wikitext
+!!options
+parsoid
+!!input
+A <ref>
+ This is a '''[[bolded link]]''' and this is a {{echo|transclusion}}
+</ref>
+
+<references />
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"This is a <b data-parsoid=\"{&amp;quot;dsr&amp;quot;:[19,40,3,3]}\"><a rel=\"mw:WikiLink\" href=\"./Bolded_link\" data-parsoid=\"{&amp;quot;a&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;./Bolded_link&amp;quot;},&amp;quot;sa&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;bolded link&amp;quot;},&amp;quot;stx&amp;quot;:&amp;quot;simple&amp;quot;,&amp;quot;dsr&amp;quot;:[22,37,2,2]}\">bolded link</a></b> and this is a <span about=\"#mwt3\" typeof=\"mw:Transclusion\" data-mw=\"{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;transclusion&amp;quot;}}}\" data-parsoid=\"{&amp;quot;src&amp;quot;:&amp;quot;{{echo|transclusion}}&amp;quot;,&amp;quot;dsr&amp;quot;:[55,76,null,null]}\">transclusion</span>\n"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
+
+<ol about="#mwt2" class="references" data-mw='{"name":"references","attrs":{}}' typeof="mw:Extension/references">
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> This is a <b><a rel="mw:WikiLink" href="./Bolded_link">bolded link</a></b> and this is a <span about="#mwt3" typeof="mw:Transclusion" data-mw='{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"transclusion"}}}'>transclusion</span>
+</li></ol>
+!!end
+
+!!test
+Ref: 6. indent-pres should not be output in ref-body
+!!options
+parsoid
+!!input
+A <ref>
+ foo
+ bar
+ baz
+</ref>
+
+<references />
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo\n bar\n baz\n"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
+
+<ol about="#mwt2" class="references" data-mw='{"name":"references","attrs":{}}' typeof="mw:Extension/references">
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo
+ bar
+ baz
+</li></ol>
+!!end
+
+!!test
+Ref: 6. No p-wrapping in ref-body
+!!options
+parsoid
+!!input
+A <ref>
+foo
+
+bar
+
+
+baz
+
+
+
+booz
+</ref>
+
+<references />
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo\n\nbar\n\n\nbaz\n\n\n\nbooz\n"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
+
+<ol about="#mwt2" class="references" data-mw='{"name":"references","attrs":{}}' typeof="mw:Extension/references">
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo
+
+bar
+
+
+baz
+
+
+
+booz
+</li></ol>
+!!end
+
+!!test
+Ref: 8. transclusion wikitext has lower precedence
+!!options
+parsoid
+!!input
+A <ref> foo {{echo|</ref> B C}}
+
+<references />
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo <span typeof=\"mw:Nowiki\" data-parsoid=\"{&amp;quot;src&amp;quot;:&amp;quot;{{&amp;quot;,&amp;quot;dsr&amp;quot;:[12,14,2,null]}\">{{</span>echo|"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> B C<span typeof="mw:Nowiki">}}</span></p>
+
+<ol about="#mwt2" class="references" data-mw='{"name":"references","attrs":{}}' typeof="mw:Extension/references">
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo <span typeof="mw:Nowiki">{{</span>echo|</li></ol>
+!!end
+
+!!test
+Ref: 9. unclosed comments should not leak out of ref-body
+!!options
+parsoid
+!!input
+A <ref> foo <!--</ref> B C
+
+<references />
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo <!---->"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> B C</p>
+
+<ol about="#mwt2" class="references" data-mw='{"name":"references","attrs":{}}' typeof="mw:Extension/references">
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo <!----></li></ol>
+!!end
+
+!!test
+Ref: 10. Unclosed HTML tags should not leak out of ref-body
+!!options
+parsoid
+!!input
+A <ref> <b> foo </ref> B C
+
+<references />
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"<b data-parsoid=\"{&amp;quot;stx&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;autoInsertedEnd&amp;quot;:true,&amp;quot;dsr&amp;quot;:[8,16,3,0]}\"> foo </b>"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> B C</p>
+
+<ol about="#mwt2" class="references" data-mw='{"name":"references","attrs":{}}' typeof="mw:Extension/references">
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> <b> foo </b></li></ol>
+!!end
+
+!!test
+Ref: 11. ref-tags acts like an inline element wrt P-wrapping
+!!options
+parsoid
+!!input
+A <ref>foo</ref> B
+C <ref>bar</ref> D
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> B
+C <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{}}' id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-2">[2]</a></span> D</p>
+!!end
+
+!!test
+Ref: 12. ref-tags act as trailing newline migration barrier
+!!options
+parsoid
+!!input
+<!--the newline at the end of this line moves out of the p-tag-->a
+
+b<!--the newline at the end of this line stays inside the p-tag--> <ref />
+<ref />
+
+c
+!!result
+<p><!--the newline at the end of this line moves out of the p-tag-->a</p>
+
+
+<p>b<!--the newline at the end of this line stays inside the p-tag--> <span about="#mwt1" class="reference" data-mw='{"name":"ref","attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span>
+<span about="#mwt2" class="reference" data-mw='{"name":"ref","attrs":{}}' id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-2">[2]</a></span></p>
+
+
+<p>c</p>
+!!end
+
+!!test
+Ref: 13. ref-tags are not SOL-transparent and block indent-pres
+!!options
+parsoid
+!!input
+<ref>foo</ref> A
+<ref>bar
+</ref> B
+!!result
+<p><span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> A
+<span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"bar\n"},"attrs":{}}' id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-2">[2]</a></span> B</p>
+!!end
+
+!!test
+Ref: 14. A nested ref-tag should be emitted as plain text
+!!options
+parsoid
+!!input
+<ref>foo <ref>bar</ref> baz</ref>
+
+<references />
+!!result
+<p><span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo &amp;lt;ref&amp;gt;bar"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> baz&lt;/ref&gt;</p>
+
+<ol about="#mwt2" class="references" data-mw='{"name":"references","attrs":{}}' typeof="mw:Extension/references"><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo &lt;ref&gt;bar</li></ol>
+!!end
+
+!!test
+Ref: 15. ref-tags with identical names should get identical indexes
+!!options
+parsoid
+!!input
+A1 <ref name="a">foo</ref> A2 <ref name="a" />
+B1 <ref name="b" /> B2 <ref name="b">bar</ref>
+
+<references />
+!!result
+<p>A1 <span about="#mwt3" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"a"}}' id="cite_ref-a-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-a-1">[1]</a></span> A2 <span about="#mwt4" class="reference" data-mw='{"name":"ref","attrs":{"name":"a"}}' id="cite_ref-a-1-1" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-a-1">[1]</a></span>
+B1 <span about="#mwt7" class="reference" data-mw='{"name":"ref","attrs":{"name":"b"}}' id="cite_ref-b-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-b-2">[2]</a></span> B2 <span about="#mwt8" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"name":"b"}}' id="cite_ref-b-2-1" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-b-2">[2]</a></span></p>
+
+<ol about="#mwt10" class="references" data-mw='{"name":"references","attrs":{}}' typeof="mw:Extension/references"><li about="#cite_note-a-1" id="cite_note-a-1"><span rel="mw:referencedBy">↑ <a href="#cite_ref-a-1-0">1.0</a> <a href="#cite_ref-a-1-1">1.1</a></span> foo</li><li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy">↑ <a href="#cite_ref-b-2-0">2.0</a> <a href="#cite_ref-b-2-1">2.1</a></span> bar</li></ol>
+!!end
+
+!!test
+References: 1. references tag without any refs should be handled properly
+!!options
+parsoid
+!!input
+<references />
+!!result
+<ol about="#mwt2" class="references" data-mw='{"name":"references","attrs":{}}' typeof="mw:Extension/references"></ol>
+!!end
+
+!!test
+References: 2. references tag with group only outputs references from that group
+!!options
+parsoid
+!!input
+A <ref group="a">foo</ref>
+B <ref group="b">bar</ref>
+
+<references group='a' />
+!!result
+<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"group":"a"}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[a 1]</a></span>
+B <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"group":"b"}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[b 1]</a></span></p>
+
+<ol about="#mwt6" class="references" data-mw='{"name":"references","attrs":{"group":"a"}}' typeof="mw:Extension/references"><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo</li></ol>
+!!end
+
+!!test
+References: 3. ref list should be cleared after processing references
+!!options
+parsoid
+!!input
+A <ref>foo</ref>
+
+<references />
+
+B <ref>bar</ref>
+
+<references />
+!!result
+<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
+
+<ol about="#mwt4" class="references" data-mw='{"name":"references","attrs":{}}' typeof="mw:Extension/references"><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo</li></ol>
+
+<p>B <span about="#mwt6" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
+
+<ol about="#mwt8" class="references" data-mw='{"name":"references","attrs":{}}' typeof="mw:Extension/references"><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> bar</li></ol>
+!!end
+
+!!test
+References: 4. only referenced group should be cleared after processing references
+!!options
+parsoid
+!!input
+A <ref group="a">afoo</ref>
+B <ref>bfoo</ref>
+
+<references group="a"/>
+
+C <ref>cfoo</ref>
+
+<references />
+!!result
+<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"afoo"},"attrs":{"group":"a"}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[a 1]</a></span>
+B <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"bfoo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"<ref>bfoo</ref>","dsr":[30,45,5,6]}'><a href="#cite_note-1">[1]</a></span></p>
+
+<ol about="#mwt6" class="references" data-mw='{"name":"references","attrs":{"group":"a"}}' typeof="mw:Extension/references"><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> afoo</li></ol>
+
+<p>C <span about="#mwt8" class="reference" data-mw='{"name":"ref","body":{"html":"cfoo"},"attrs":{}}' id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-2">[2]</a></span></p>
+
+<ol about="#mwt10" class="references" data-mw='{"name":"references","attrs":{}}' typeof="mw:Extension/references"><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> bfoo</li><li about="#cite_note-2" id="cite_note-2"><span rel="mw:referencedBy"><a href="#cite_ref-2-0">↑</a></span> cfoo</li></ol>
+!!end
+
+!!test
+References: 5. ref tags in references should be processed while ignoring all other content
+!!options
+parsoid
+!!input
+A <ref name="a" />
+B <ref name="b">bar</ref>
+
+<references>
+<ref name="a">foo</ref>
+This should just get lost.
+</references>
+!!result
+<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","attrs":{"name":"a"}}' id="cite_ref-a-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-a-1">[1]</a></span>
+B <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"name":"b"}}' id="cite_ref-b-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-b-2">[2]</a></span></p>
+
+<ol about="#mwt7" class="references" data-mw='{"name":"references","body":{"extsrc":"<ref name=\"a\">foo</ref>\nThis should just get lost."},"attrs":{}}' typeof="mw:Extension/references"><li about="#cite_note-a-1" id="cite_note-a-1"><span rel="mw:referencedBy"><a href="#cite_ref-a-1-0">↑</a></span> foo</li><li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy"><a href="#cite_ref-b-2-0">↑</a></span> bar</li></ol>
+!!end
+
+#### ----------------------------------------------------------------
+#### The following section of tests are primarily to test
+#### 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
+#### 1. Nested inside html <h1>=foo=</h1>
+#### 2. Outside heading nest on a single line <h1>foo</h1>*bar
+#### 3. Nested inside html with wikitext split by html tags
+#### 4. No escape needed
+#### 5. Empty headings <h1></h1>
+#### 6. Heading chars in SOL context
+#### ----------------------------------------
+!! test
+Headings: 0. Unnested
 !! options
-disabled
+parsoid
+!! input
+<nowiki>=foo=</nowiki>
+
+<nowiki> =foo= </nowiki>
+<!--cmt-->
+<nowiki>=foo=</nowiki>
+
+=foo''a''<nowiki>=</nowiki>
+!! result
+<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
+parsoid
+!! input
+=<nowiki>=foo=</nowiki>=
+
+==<nowiki>=foo=</nowiki>==
+
+===<nowiki>=foo=</nowiki>===
+
+====<nowiki>=foo=</nowiki>====
+
+=====<nowiki>=foo=</nowiki>=====
+
+======<nowiki>=foo=</nowiki>======
+!! result
+<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
+parsoid
 !! input
 =foo=
 <nowiki>*bar</nowiki>
+
 =foo=
 =bar
+
 =foo=
 <nowiki>=bar=</nowiki>
 !! result
@@ -13586,44 +14644,75 @@ 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>
@@ -13634,16 +14723,87 @@ disabled
 !!end
 
 !! test
-Headings: 6. Heading chars in SOL context
+Headings: 6a. Heading chars in SOL context (with trailing spaces)
 !! options
-disabled
+parsoid
+!! input
+<nowiki>=a=</nowiki>
+
+<nowiki>=a= </nowiki>
+
+<nowiki>=a=    </nowiki>
+
+<nowiki>=a=    </nowiki>
+!! result
+<p>=a=</p>
+<p>=a= </p>
+<p>=a= </p>
+<p>=a=         </p>
+!!end
+
+!! test
+Headings: 6b. Heading chars in SOL context (with trailing newlines)
+!! options
+parsoid
 !! input
-<!--cmt--><nowiki>=h1=</nowiki>
+<nowiki>=a=
+b</nowiki>
+
+<nowiki>=a= 
+b</nowiki>
+
+<nowiki>=a=    
+b</nowiki>
+
+<nowiki>=a=     
+b</nowiki>
 !! result
-<p><!--cmt-->=h1=
+<p>=a=
+b</p>
+<p>=a= 
+b</p>
+<p>=a= 
+b</p>
+<p>=a=  
+b</p>
 </p>
 !!end
 
+!! test
+Headings: 6c. Heading chars in SOL context (leading newline break)
+!! options
+parsoid
+!! input
+<nowiki>a
+=b=</nowiki>
+!! result
+<p>a
+=b=</p>
+!!end
+
+!! test
+Headings: 6d. Heading chars in SOL context (with interspersed comments)
+!! options
+parsoid
+!! input
+<!--c0--><nowiki>=a=</nowiki>
+<!--c1-->
+<nowiki>=a= </nowiki><!--c2-->  <!--c3-->
+!! result
+<p><!--c0-->=a=</p>
+<p><!--c1-->=a= <!--c2-->       <!--c3--></p>
+!!end
+
+!! test
+Headings: 6d. Heading chars in SOL context (No escaping needed)
+!! options
+parsoid=html2wt
+!! input
+=a=<div>b</div>
+!! result
+=a=<div>b</div>
+!!end
+
 #### --------------- Lists ---------------
 #### 0. Outside nests (*foo, etc.)
 #### 1. Nested inside html <ul><li>*foo</li></ul>
@@ -13746,7 +14906,7 @@ Lists: 3. Only bullets at start of text should be escaped
 !! test
 Lists: 4. No escapes needed
 !! options
-disabled
+parsoid
 !! input
 *foo*bar
 
@@ -13758,7 +14918,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
 
@@ -13771,9 +14931,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>
@@ -13785,18 +14947,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
@@ -13817,18 +14980,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 ---------------
@@ -13891,99 +15051,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
 {|
 |-
@@ -13994,14 +15145,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
 {|
 |-
@@ -14012,14 +15163,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
 {|
 |-
@@ -14036,8 +15187,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
@@ -14053,7 +15212,7 @@ Tables: 4d. No escaping needed
 
 !! end
 
-#### --------------- Links ---------------
+#### --------------- Links ----------------
 #### 1. Quote marks in link text
 #### 2. Wikilinks: Escapes needed
 #### 3. Wikilinks: No escapes needed
@@ -14063,7 +15222,7 @@ Tables: 4d. No escaping needed
 !! test
 Links 1. Quote marks in link text
 !! options
-disabled
+parsoid
 !! input
 [[Foo|<nowiki>Foo''boo''</nowiki>]]
 !! result
@@ -14073,15 +15232,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>
@@ -14090,12 +15252,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]]
@@ -14107,7 +15272,7 @@ disabled
 !! test
 Links 4. ExtLinks: Escapes needed
 !! options
-disabled
+parsoid
 !! input
 [http://google.com <nowiki>[google]</nowiki>]
 [http://google.com <nowiki>google]</nowiki>]
@@ -14119,7 +15284,7 @@ disabled
 !! test
 Links 5. ExtLinks: No escapes needed
 !! options
-disabled
+parsoid
 !! input
 [http://google.com [google]
 !! result
@@ -14137,18 +15302,22 @@ disabled
 ''<nowiki>'foo'</nowiki>''
 ''<nowiki>''foo''</nowiki>''
 ''<nowiki>'''foo'''</nowiki>''
+''foo''<nowiki>'s</nowiki>
 '''<nowiki>'foo'</nowiki>'''
 '''<nowiki>''foo''</nowiki>'''
 '''<nowiki>'''foo'''</nowiki>'''
 '''<nowiki>foo'</nowiki>''<nowiki>bar'</nowiki>''baz'''
+'''foo'''<nowiki>'s</nowiki>
 !! result
 <p><i>'foo'</i>
 <i>''foo''</i>
 <i>'''foo'''</i>
+<i>foo</i>'s
 <b>'foo'</b>
 <b>''foo''</b>
 <b>'''foo'''</b>
 <b>foo'<i>bar'</i>baz</b>
+<b>foo</b>'s
 </p>
 !! end
 
@@ -14178,7 +15347,7 @@ disabled
 </p>
 !! end
 
-#### --------------- Paragraphs ---------------
+#### ----------- Paragraphs ---------------
 #### 1. No unnecessary escapes
 #### --------------------------------------
 
@@ -14191,9 +15360,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>
@@ -14203,31 +15372,55 @@ bar <span><nowiki>[[foo]]</nowiki></span>
 </p>
 !!end
 
-#### --------------- PRE ------------------
-#### 1. Leading space in SOL context should be escaped
-#### --------------------------------------
+#### ----------------------- PRE --------------------------
+#### 1. Leading whitespace in SOL context should be escaped
+#### ------------------------------------------------------
 !! test
-1. Leading space in SOL context should be escaped
+1. Leading whitespace in SOL context should be escaped
 !! options
-disabled
+parsoid
 !! input
-<nowiki> foo</nowiki>
-<!--cmt--><nowiki> foo</nowiki>
+<nowiki> a</nowiki>
+
+<nowiki>  a</nowiki>
+
+<nowiki>       a(tab)</nowiki>
+
+<nowiki>       a</nowiki>
+<!--cmt-->
+<nowiki>  a</nowiki>
+
+<nowiki>a
+ b</nowiki>
+
+<nowiki>a
+       b</nowiki>
+
+<nowiki>a
+        b</nowiki>
 !! result
-<p> foo
-<!--cmt--> foo
-</p>
+<p> a</p>
+<p>  a</p>
+<p>    a(tab)</p>
+<p>    a</p>
+<p><!--cmt-->  a</p>
+<p>a
+ b</p>
+<p>a
+       b</p>
+<p>a
+        b</p>
 !! end
 
 #### --------------- HTML tags ---------------
 #### 1. a tags
 #### 2. other tags
 #### 3. multi-line html tag
-#### --------------------------------------
+#### -----------------------------------------
 !! test
 1. a tags
 !! options
-disabled
+parsoid
 !! input
 <a href="http://google.com">google</a>
 !! result
@@ -14267,8 +15460,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>
@@ -14301,11 +15494,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
 
@@ -14388,11 +15581,11 @@ 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
 
@@ -14505,7 +15698,7 @@ RT-ed inter-element separators should be valid separators
 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
-disabled parsoid
+parsoid
 !!input
 {|
 |<small>foo
@@ -14537,11 +15730,30 @@ Empty TD followed by TD with tpl-generated attribute
 
 !!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
-disabled parsoid
+parsoid=wt2html,wt2wt
 !!input
 {|
 |-
@@ -14550,10 +15762,33 @@ disabled parsoid
 !!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></td></tr>
+<td> <!--c--></td></tr>
 <tr>
-<td>foo</td></tr></tbody></table>
+<td><!--c--> <!--d--></td></tr>
+</tbody></table>
+
 !!end
 
 !!test
@@ -14569,6 +15804,22 @@ parsoid
 
 !!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 e49ea6d..0000000
+++ /dev/null
@@ -1,50 +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;
-               $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 ecc8ad1..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 ) {
@@ -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 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 0f37182..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 ),
@@ -229,39 +228,46 @@ class BlockTest extends MediaWikiLangTestCase {
                $this->assertEquals( 0, $block->getBy(), 'Correct blocker id' );
        }
 
-       function testBlocksOnXff() {
+       protected function addXffBlocks() {
+               static $inited = false;
+
+               if ( $inited ) {
+                       return;
+               }
+
+               $inited = true;
 
                $blockList = array(
                        array( 'target' => '70.2.0.0/16',
-                               'type' =>  Block::TYPE_RANGE,
+                               'type' => Block::TYPE_RANGE,
                                'desc' => 'Range Hardblock',
                                'ACDisable' => false,
                                'isHardblock' => true,
                                'isAutoBlocking' => false,
                        ),
                        array( 'target' => '2001:4860:4001::/48',
-                               'type' =>  Block::TYPE_RANGE,
+                               'type' => Block::TYPE_RANGE,
                                'desc' => 'Range6 Hardblock',
                                'ACDisable' => false,
                                'isHardblock' => true,
                                'isAutoBlocking' => false,
                        ),
                        array( 'target' => '60.2.0.0/16',
-                               'type' =>  Block::TYPE_RANGE,
+                               '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,
+                               'type' => Block::TYPE_RANGE,
                                'desc' => 'Range Softblock',
                                'ACDisable' => false,
                                'isHardblock' => false,
                                'isAutoBlocking' => false,
                        ),
                        array( 'target' => '50.1.1.1',
-                               'type' =>  Block::TYPE_IP,
+                               'type' => Block::TYPE_IP,
                                'desc' => 'Exact Softblock',
                                'ACDisable' => false,
                                'isHardblock' => false,
@@ -288,8 +294,10 @@ class BlockTest extends MediaWikiLangTestCase {
                        $block->isAutoblocking( $insBlock['isAutoBlocking'] );
                        $block->insert();
                }
+       }
 
-               $xffHeaders = array(
+       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'
@@ -331,14 +339,16 @@ class BlockTest extends MediaWikiLangTestCase {
                                'result' => 'Range6 Hardblock'
                        ),
                );
+       }
 
-               foreach ( $xffHeaders as $test ) {
-                       $list = array_map( 'trim', explode( ',', $test['xff'] ) );
-                       $xffblocks = Block::getBlocksForIPList( $list, true );
-                       $this->assertEquals( $test['count'], count( $xffblocks ), 'Number of blocks for ' . $test['xff'] );
-                       $block = Block::chooseBlock( $xffblocks, $list );
-                       $this->assertEquals( $test['result'], $block->mReason, 'Correct block type for XFF header ' . $test['xff'] );
-               }
-
+       /**
+        * @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;
        }
 
index c746208..ae35fd7 100644 (file)
@@ -2,7 +2,7 @@
 class CollationTest extends MediaWikiLangTestCase {
        protected function setUp() {
                parent::setUp();
-               if ( !extension_loaded( 'intl' ) ) {
+               if ( !wfDl( 'intl' ) ) {
                        $this->markTestSkipped( 'These tests require intl extension' );
                }
        }
@@ -47,6 +47,7 @@ class CollationTest extends MediaWikiLangTestCase {
                        array( 'en', 'A', 'Aꦲ' ),
                );
        }
+
        /**
         * Opposite of testIsPrefix
         *
@@ -84,6 +85,7 @@ class CollationTest extends MediaWikiLangTestCase {
                $col = Collation::factory( $collation );
                $this->assertEquals( $firstLetter, $col->getFirstLetter( $string ) );
        }
+
        function firstLetterProvider() {
                return array(
                        array( 'uppercase', 'Abc', 'A' ),
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();
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 2e6417f..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() {
@@ -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;
        }
 
@@ -660,6 +653,7 @@ class GlobalTest extends MediaWikiTestCase {
 
        public static function provideWfShellMaintenanceCmdList() {
                global $wgPhpCli;
+
                return array(
                        array( 'eval.php', array( '--help', '--test' ), array(),
                                "'$wgPhpCli' 'eval.php' '--help' '--test'",
index c585726..8bd0849 100644 (file)
@@ -13,6 +13,7 @@ class GlobalWithDBTest extends MediaWikiTestCase {
 
        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 10b62b3..c60f223 100644 (file)
@@ -152,6 +152,7 @@ class WfBaseConvertTest extends MediaWikiTestCase {
 
                        $x[] = array( $base, $str );
                }
+
                return $x;
        }
 
index 8c67ced..5b622c1 100644 (file)
@@ -103,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 e4e33d1..604f901 100644 (file)
@@ -24,5 +24,4 @@ class WfShorthandToIntegerTest extends MediaWikiTestCase {
                        array( '1k', 1024, 'One kb lowercased' ),
                );
        }
-
 }
index ddfffe8..3ac33a4 100644 (file)
@@ -12,6 +12,7 @@ class WfTimestampTest extends MediaWikiTestCase {
 
        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' ),
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 9e3d3a4..ecfe418 100644 (file)
@@ -37,7 +37,6 @@ class HtmlTest extends MediaWikiTestCase {
                        'wgLanguageCode' => $langCode,
                        'wgContLang' => $langObj,
                        'wgLang' => $langObj,
-                       'wgHtml5' => true,
                        'wgWellFormedXml' => false,
                ) );
        }
@@ -70,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 ########
@@ -117,14 +141,6 @@ class HtmlTest extends MediaWikiTestCase {
                        Html::expandAttributes( array( 'selected' => true ) ),
                        'Boolean attributes have empty string value when value is true (wgWellFormedXml)'
                );
-
-               $this->setMwGlobals( '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)'
-               );
        }
 
        /**
@@ -432,6 +448,7 @@ class HtmlTest extends MediaWikiTestCase {
                foreach ( $types as $type ) {
                        $cases[] = array( $type );
                }
+
                return $cases;
        }
 
@@ -596,6 +613,7 @@ class HtmlTest extends MediaWikiTestCase {
                                isset( $case[3] ) ? $case[3] : ''
                        );
                }
+
                return $ret;
        }
 
@@ -610,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:
                }
index ab93b2b..93ce119 100644 (file)
@@ -123,7 +123,6 @@ class TestConverter extends LanguageConverter {
                        'tg' => new ReplacementArray()
                );
        }
-
 }
 
 class LanguageToTest extends Language {
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 6b71b7e..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"
                );
-
        }
 
        /**
@@ -350,7 +348,6 @@ class MWNamespaceTest extends MediaWikiTestCase {
                        '$wgContentNamespaces is an array with only NS_MAIN by default'
                );
 
-
                # test !is_array( $wgcontentNamespaces )
                $wgContentNamespaces = '';
                $this->assertEquals( NS_MAIN, MWNamespace::getContentNamespaces() );
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 9e50b4c..386ddb8 100644 (file)
@@ -253,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 39673c0..f35a05f 100644 (file)
@@ -63,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.
@@ -78,5 +78,4 @@ class RevisionTest_ContentHandlerUseDB extends RevisionStorageTest {
                        $this->assertTrue( true ); // ok
                }
        }
-
 }
index 9380928..e3b0844 100644 (file)
@@ -403,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 {
@@ -422,7 +421,6 @@ class RevisionTestModifyableContent extends TextContent {
        public function setText( $text ) {
                $this->mText = $text;
        }
-
 }
 
 class RevisionTestModifyableContentHandler extends TextContentHandler {
index f5aacab..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
                ) );
 
@@ -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
@@ -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' ),
@@ -246,5 +272,4 @@ class SanitizerTest extends MediaWikiTestCase {
                        $message
                );
        }
-
 }
diff --git a/tests/phpunit/includes/SeleniumConfigurationTest.php b/tests/phpunit/includes/SeleniumConfigurationTest.php
deleted file mode 100644 (file)
index 4b49f63..0000000
+++ /dev/null
@@ -1,222 +0,0 @@
-<?php
-
-class SeleniumConfigurationTest extends MediaWikiTestCase {
-
-       /**
-        * The file where the test temporarity stores the selenium config.
-        * This should be cleaned up as part of teardown.
-        */
-       private $tempFileName;
-
-       /**
-        * String containing the a sample selenium settings
-        */
-       private $testConfig0 = '
-[SeleniumSettings]
-browsers[firefox]      = "*firefox"
-browsers[iexplorer] = "*iexploreproxy"
-browsers[chrome]       = "*chrome"
-host                           = "localhost"
-port                           = "foobarr"
-wikiUrl                        = "http://localhost/deployment"
-username                       = "xxxxxxx"
-userPassword           = ""
-testBrowser            = "chrome"
-startserver            =
-stopserver             =
-jUnitLogFile   =
-runAgainstGrid = false
-
-[SeleniumTests]
-testSuite[SimpleSeleniumTestSuite] = "tests/selenium/SimpleSeleniumTestSuite.php"
-testSuite[TestSuiteName] = "testSuitePath"
-';
-       /**
-        * Array of expected browsers from $testConfig0
-        */
-       private $testBrowsers0 = array( 'firefox' => '*firefox',
-               'iexplorer' => '*iexploreproxy',
-               'chrome' => '*chrome'
-       );
-       /**
-        * Array of expected selenium settings from $testConfig0
-        */
-       private $testSettings0 = array(
-               'host' => 'localhost',
-               'port' => 'foobarr',
-               'wikiUrl' => 'http://localhost/deployment',
-               'username' => 'xxxxxxx',
-               'userPassword' => '',
-               'testBrowser' => 'chrome',
-               'startserver' => null,
-               'stopserver' => null,
-               'seleniumserverexecpath' => null,
-               'jUnitLogFile' => null,
-               'runAgainstGrid' => null
-       );
-       /**
-        * Array of expected testSuites from $testConfig0
-        */
-       private $testSuites0 = array(
-               'SimpleSeleniumTestSuite' => 'tests/selenium/SimpleSeleniumTestSuite.php',
-               'TestSuiteName' => 'testSuitePath'
-       );
-
-       /**
-        * Another sample selenium settings file contents
-        */
-       private $testConfig1 =
-               '
-[SeleniumSettings]
-host                           = "localhost"
-testBrowser            = "firefox"
-';
-       /**
-        * Expected browsers from $testConfig1
-        */
-       private $testBrowsers1 = null;
-       /**
-        * Expected selenium settings from $testConfig1
-        */
-       private $testSettings1 = array(
-               'host' => 'localhost',
-               'port' => null,
-               'wikiUrl' => null,
-               'username' => null,
-               'userPassword' => null,
-               'testBrowser' => 'firefox',
-               'startserver' => null,
-               'stopserver' => null,
-               'seleniumserverexecpath' => null,
-               'jUnitLogFile' => null,
-               'runAgainstGrid' => null
-       );
-       /**
-        * Expected test suites from $testConfig1
-        */
-       private $testSuites1 = null;
-
-
-       protected function setUp() {
-               parent::setUp();
-               if ( !defined( 'SELENIUMTEST' ) ) {
-                       define( 'SELENIUMTEST', true );
-               }
-       }
-
-       /**
-        * Clean up the temporary file used to store the selenium settings.
-        */
-       protected function tearDown() {
-               if ( strlen( $this->tempFileName ) > 0 ) {
-                       unlink( $this->tempFileName );
-                       unset( $this->tempFileName );
-               }
-               parent::tearDown();
-       }
-
-       /**
-        * @expectedException MWException
-        * @group SeleniumFramework
-        */
-       public function testErrorOnIncorrectConfigFile() {
-               $seleniumSettings = array();
-               $seleniumBrowsers = array();
-               $seleniumTestSuites = array();
-
-               SeleniumConfig::getSeleniumSettings( $seleniumSettings,
-                       $seleniumBrowsers,
-                       $seleniumTestSuites,
-                       "Some_fake_settings_file.ini" );
-       }
-
-       /**
-        * @expectedException MWException
-        * @group SeleniumFramework
-        */
-       public function testErrorOnMissingConfigFile() {
-               $seleniumSettings = array();
-               $seleniumBrowsers = array();
-               $seleniumTestSuites = array();
-               $this->setMwGlobals( 'wgSeleniumConfigFile', '' );
-
-               SeleniumConfig::getSeleniumSettings( $seleniumSettings,
-                       $seleniumBrowsers,
-                       $seleniumTestSuites );
-       }
-
-       /**
-        * @group SeleniumFramework
-        */
-       public function testUsesGlobalVarForConfigFile() {
-               $seleniumSettings = array();
-               $seleniumBrowsers = array();
-               $seleniumTestSuites = array();
-               $this->writeToTempFile( $this->testConfig0 );
-               $this->setMwGlobals( 'wgSeleniumConfigFile', $this->tempFileName );
-
-               SeleniumConfig::getSeleniumSettings( $seleniumSettings,
-                       $seleniumBrowsers,
-                       $seleniumTestSuites );
-               $this->assertEquals( $seleniumSettings, $this->testSettings0,
-                       'The selenium settings should have been read from the file defined in $wgSeleniumConfigFile'
-               );
-               $this->assertEquals( $seleniumBrowsers, $this->testBrowsers0,
-                       'The available browsers should have been read from the file defined in $wgSeleniumConfigFile'
-               );
-               $this->assertEquals( $seleniumTestSuites, $this->testSuites0,
-                       'The test suites should have been read from the file defined in $wgSeleniumConfigFile'
-               );
-       }
-
-       /**
-        * @group SeleniumFramework
-        * @dataProvider sampleConfigs
-        */
-       public function testgetSeleniumSettings( $sampleConfig, $expectedSettings, $expectedBrowsers, $expectedSuites ) {
-               $this->writeToTempFile( $sampleConfig );
-               $seleniumSettings = array();
-               $seleniumBrowsers = array();
-               $seleniumTestSuites = null;
-
-               SeleniumConfig::getSeleniumSettings( $seleniumSettings,
-                       $seleniumBrowsers,
-                       $seleniumTestSuites,
-                       $this->tempFileName );
-
-               $this->assertEquals( $seleniumSettings, $expectedSettings,
-                       "The selenium settings for the following test configuration was not retrieved correctly" . $sampleConfig
-               );
-               $this->assertEquals( $seleniumBrowsers, $expectedBrowsers,
-                       "The available browsers for the following test configuration was not retrieved correctly" . $sampleConfig
-               );
-               $this->assertEquals( $seleniumTestSuites, $expectedSuites,
-                       "The test suites for the following test configuration was not retrieved correctly" . $sampleConfig
-               );
-       }
-
-       /**
-        * create a temp file and write text to it.
-        * @param $testToWrite the text to write to the temp file
-        */
-       private function writeToTempFile( $textToWrite ) {
-               $this->tempFileName = tempnam( sys_get_temp_dir(), 'test_settings.' );
-               $tempFile = fopen( $this->tempFileName, "w" );
-               fwrite( $tempFile, $textToWrite );
-               fclose( $tempFile );
-       }
-
-       /**
-        * Returns an array containing:
-        *     The contents of the selenium cingiguration ini file
-        *  The expected selenium configuration array that getSeleniumSettings should return
-        *  The expected available browsers array that getSeleniumSettings should return
-        *  The expected test suites arrya that getSeleniumSettings should return
-        */
-       public function sampleConfigs() {
-               return array(
-                       array( $this->testConfig0, $this->testSettings0, $this->testBrowsers0, $this->testSuites0 ),
-                       array( $this->testConfig1, $this->testSettings1, $this->testBrowsers1, $this->testSuites1 )
-               );
-       }
-}
index fc7d8d0..4cdf020 100644 (file)
@@ -10,6 +10,7 @@ function getSiteParams( $conf, $wiki ) {
                        break;
                }
        }
+
        return array(
                'suffix' => $site,
                'lang' => $lang,
index 0530b44..842e2fc 100644 (file)
@@ -49,6 +49,7 @@ class StringUtilsTest extends MediaWikiTestCase {
                                $escaped .= $char;
                        }
                }
+
                return $escaped;
        }
 
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 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 476c194..a11c3d9 100644 (file)
@@ -286,5 +286,4 @@ class TitleMethodsTest extends MediaWikiTestCase {
                $title = Title::newFromText( $title );
                $this->assertEquals( $expectedBool, $title->isWikitextPage() );
        }
-
 }
index e2c079a..6ae995e 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
                }
        }
@@ -404,41 +402,78 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
        function testCssAndJavascriptPermissions() {
                $this->setUser( $this->userName );
 
+               $this->setTitle( NS_USER, $this->userName . '/test.js' );
+               $this->runCSSandJSPermissions(
+                       array( array( 'badaccess-group0' ), array( 'mycustomjsprotected' ) ),
+                       array( array( 'badaccess-group0' ), array( 'mycustomjsprotected' ) ),
+                       array( array( 'badaccess-group0' ) ),
+                       array( array( 'badaccess-group0' ), array( 'mycustomjsprotected' ) ),
+                       array( array( 'badaccess-group0' ) )
+               );
+
+               $this->setTitle( NS_USER, $this->userName . '/test.css' );
+               $this->runCSSandJSPermissions(
+                       array( array( 'badaccess-group0' ), array( 'mycustomcssprotected' ) ),
+                       array( array( 'badaccess-group0' ) ),
+                       array( array( 'badaccess-group0' ), array( 'mycustomcssprotected' ) ),
+                       array( array( 'badaccess-group0' ) ),
+                       array( array( 'badaccess-group0' ), array( 'mycustomcssprotected' ) )
+               );
+
                $this->setTitle( NS_USER, $this->altUserName . '/test.js' );
                $this->runCSSandJSPermissions(
                        array( array( 'badaccess-group0' ), array( 'customjsprotected' ) ),
                        array( array( 'badaccess-group0' ), array( 'customjsprotected' ) ),
-                       array( array( 'badaccess-group0' ) ) );
+                       array( array( 'badaccess-group0' ), array( 'customjsprotected' ) ),
+                       array( array( 'badaccess-group0' ), array( 'customjsprotected' ) ),
+                       array( array( 'badaccess-group0' ) )
+               );
 
                $this->setTitle( NS_USER, $this->altUserName . '/test.css' );
                $this->runCSSandJSPermissions(
+                       array( array( 'badaccess-group0' ), array( 'customcssprotected' ) ),
+                       array( array( 'badaccess-group0' ), array( 'customcssprotected' ) ),
                        array( array( 'badaccess-group0' ), array( 'customcssprotected' ) ),
                        array( array( 'badaccess-group0' ) ),
-                       array( array( 'badaccess-group0' ), array( 'customcssprotected' ) ) );
+                       array( array( 'badaccess-group0' ), array( 'customcssprotected' ) )
+               );
 
                $this->setTitle( NS_USER, $this->altUserName . '/tempo' );
                $this->runCSSandJSPermissions(
                        array( array( 'badaccess-group0' ) ),
                        array( array( 'badaccess-group0' ) ),
-                       array( array( 'badaccess-group0' ) ) );
+                       array( array( 'badaccess-group0' ) ),
+                       array( array( 'badaccess-group0' ) ),
+                       array( array( 'badaccess-group0' ) )
+               );
        }
 
-       function runCSSandJSPermissions( $result0, $result1, $result2 ) {
+       function runCSSandJSPermissions( $result0, $result1, $result2, $result3, $result4 ) {
                $this->setUserPerm( '' );
                $this->assertEquals( $result0,
                        $this->title->getUserPermissionsErrors( 'bogus',
                                $this->user ) );
 
-               $this->setUserPerm( 'editusercss' );
+               $this->setUserPerm( 'editmyusercss' );
                $this->assertEquals( $result1,
                        $this->title->getUserPermissionsErrors( 'bogus',
                                $this->user ) );
 
-               $this->setUserPerm( 'edituserjs' );
+               $this->setUserPerm( 'editmyuserjs' );
                $this->assertEquals( $result2,
                        $this->title->getUserPermissionsErrors( 'bogus',
                                $this->user ) );
 
+               $this->setUserPerm( 'editusercss' );
+               $this->assertEquals( $result3,
+                       $this->title->getUserPermissionsErrors( 'bogus',
+                               $this->user ) );
+
+               $this->setUserPerm( 'edituserjs' );
+               $this->assertEquals( $result4,
+                       $this->title->getUserPermissionsErrors( 'bogus',
+                               $this->user ) );
+
                $this->setUserPerm( 'editusercssjs' );
                $this->assertEquals( array( array( 'badaccess-group0' ) ),
                        $this->title->getUserPermissionsErrors( 'bogus',
@@ -538,7 +573,6 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                        $this->title->userCan( 'edit', $this->user ) );
                $this->assertEquals( array(),
                        $this->title->getUserPermissionsErrors( 'edit', $this->user ) );
-
        }
 
        function testActionPermissions() {
@@ -562,7 +596,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 +638,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 +680,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 970862b..33bd8d6 100644 (file)
@@ -197,6 +197,7 @@ class TitleTest extends MediaWikiTestCase {
                foreach ( $errors as $error ) {
                        $result[] = $error[0];
                }
+
                return $result;
        }
 
index d382f6f..1c6b733 100644 (file)
@@ -101,11 +101,19 @@ class WebRequestTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideGetIP
         */
-       function testGetIP( $expected, $input, $squid, $private, $description ) {
+       function testGetIP( $expected, $input, $squid, $xffList, $private, $description ) {
                $_SERVER = $input;
                $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();
@@ -121,6 +129,7 @@ class WebRequestTest extends MediaWikiTestCase {
                                        'REMOTE_ADDR' => '127.0.0.1'
                                ),
                                array(),
+                               array(),
                                false,
                                'Simple IPv4'
                        ),
@@ -130,6 +139,7 @@ class WebRequestTest extends MediaWikiTestCase {
                                        'REMOTE_ADDR' => '::1'
                                ),
                                array(),
+                               array(),
                                false,
                                'Simple IPv6'
                        ),
@@ -140,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'
                        ),
@@ -150,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'
                        ),
@@ -160,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 dca9910..41f3572 100644 (file)
@@ -44,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,
                ) );
        }
diff --git a/tests/phpunit/includes/XmlTypeCheckTest.php b/tests/phpunit/includes/XmlTypeCheckTest.php
new file mode 100644 (file)
index 0000000..18f363f
--- /dev/null
@@ -0,0 +1,30 @@
+<?php
+/**
+ * PHPUnit tests for XMLTypeCheck.
+ * @author physikerwelt
+ * @group ?
+ * @covers XMLTypeCheck
+ */
+class XmlTypeCheckTest extends MediaWikiTestCase {
+       const WELL_FORMED_XML = "<root><child /></root>";
+       const MAL_FORMED_XML = "<root><child /></error>";
+
+       /**
+        * @covers XMLTypeCheck::newFromString
+        * @covers XMLTypeCheck::getRootElement
+        */
+       public function testWellFormedXML() {
+               $testXML = XmlTypeCheck::newFromString( self::WELL_FORMED_XML );
+               $this->assertTrue( $testXML->wellFormed );
+               $this->assertEquals( 'root', $testXML->getRootElement() );
+       }
+
+       /**
+        * @covers XMLTypeCheck::newFromString
+        */
+       public function testMalFormedXML() {
+               $testXML = XmlTypeCheck::newFromString( self::MAL_FORMED_XML );
+               $this->assertFalse( $testXML->wellFormed );
+       }
+
+}
\ No newline at end of file
index 696b145..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];
@@ -107,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',
@@ -119,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 8842766..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 );
-
        }
 
        /**
index 7d8e01f..f3b9a67 100644 (file)
@@ -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 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 30ec6c3..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
  *
index c68065d..4d5ddba 100644 (file)
@@ -18,7 +18,7 @@
  * http://www.gnu.org/copyleft/gpl.html
  */
 
-require_once( 'ApiQueryContinueTestBase.php' );
+require_once 'ApiQueryContinueTestBase.php';
 
 /**
  * @group API
index 33f4663..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
index e0a84e1..fbb1e64 100644 (file)
@@ -24,7 +24,7 @@
  * @file
  */
 
-require_once( 'ApiQueryTestBase.php' );
+require_once 'ApiQueryTestBase.php';
 
 abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
 
@@ -68,13 +68,14 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
                                // 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,6 +104,7 @@ 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' );
@@ -143,7 +145,7 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
                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 ) {
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 3d96beb..8ee8ea9 100644 (file)
@@ -24,7 +24,6 @@
  * @file
  */
 
-
 /** This class has some common functionality for testing query module
  */
 abstract class ApiQueryTestBase extends ApiTestCase {
@@ -48,6 +47,7 @@ STR;
                        $request = array_merge_recursive( $request, $req );
                        $this->mergeExpected( $expected, $exp );
                }
+
                return array( $request, $expected );
        }
 
@@ -62,6 +62,7 @@ STR;
                $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;
        }
 
@@ -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
                }
diff --git a/tests/phpunit/includes/cache/MessageCacheTest.php b/tests/phpunit/includes/cache/MessageCacheTest.php
new file mode 100644 (file)
index 0000000..c550150
--- /dev/null
@@ -0,0 +1,127 @@
+<?php
+
+/**
+ * @group Database
+ * @group Cache
+ */
+class MessageCacheTest extends MediaWikiLangTestCase {
+
+       protected function setUp() {
+               parent::setUp();
+               $this->configureLanguages();
+               MessageCache::singleton()->enable();
+       }
+
+       /**
+        * 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' => $langCode,
+                       'wgLang' => $langObj,
+                       'wgContLang' => $langObj,
+               ) );
+       }
+
+       function addDBData() {
+               $this->configureLanguages();
+
+               // Set up messages and fallbacks ab -> ru -> de
+               $this->makePage( 'FallbackLanguageTest-Full', 'ab' );
+               $this->makePage( 'FallbackLanguageTest-Full', 'ru' );
+               $this->makePage( 'FallbackLanguageTest-Full', 'de' );
+
+               // Fallbacks where ab does not exist
+               $this->makePage( 'FallbackLanguageTest-Partial', 'ru' );
+               $this->makePage( 'FallbackLanguageTest-Partial', 'de' );
+
+               // 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 );
+       }
+
+       /**
+        * Helper function for addDBData -- adds a simple page to the database
+        *
+        * @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, $content = null, $createSubPage = true ) {
+               global $wgContLang;
+
+               if ( $content === null ) {
+                       $content = $lang;
+               }
+               if ( $lang !== $wgContLang->getCode() || $createSubPage ) {
+                       $title = "$title/$lang";
+               }
+
+               $title = Title::newFromText( $title, NS_MEDIAWIKI );
+               $wikiPage = new WikiPage( $title );
+               $contentHandler = ContentHandler::makeContent( $content, $title );
+               $wikiPage->doEditContent( $contentHandler, "$lang translation test case" );
+       }
+
+       /**
+        * Test message fallbacks, bug #1495
+        *
+        * @dataProvider provideMessagesForFallback
+        */
+       function testMessageFallbacks( $message, $lang, $expectedContent ) {
+               $result = MessageCache::singleton()->get( $message, true, $lang );
+               $this->assertEquals( $expectedContent, $result, "Message fallback failed." );
+       }
+
+       function provideMessagesForFallback() {
+               return array(
+                       array( 'FallbackLanguageTest-Full', 'ab', 'ab' ),
+                       array( 'FallbackLanguageTest-Partial', 'ab', 'ru' ),
+                       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' ),
+               );
+       }
+
+       /**
+        * There's a fallback case where the message key is given as fully qualified -- this
+        * should ignore the passed $lang and use the language from the key
+        *
+        * @dataProvider provideMessagesForFullKeys
+        */
+       function testFullKeyBehaviour( $message, $lang, $expectedContent ) {
+               $result = MessageCache::singleton()->get( $message, true, $lang, true );
+               $this->assertEquals( $expectedContent, $result, "Full key message fallback failed." );
+       }
+
+       function provideMessagesForFullKeys() {
+               return array(
+                       array( 'MessageCacheTest-FullKeyTest/ru', 'ru', 'ru' ),
+                       array( 'MessageCacheTest-FullKeyTest/ru', 'ab', 'ru' ),
+                       array( 'MessageCacheTest-FullKeyTest/ru/foo', 'ru', false ),
+               );
+       }
+
+}
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 67d4fde..c345513 100644 (file)
@@ -317,6 +317,7 @@ class DummyContentHandlerForTesting extends ContentHandler {
         */
        public function unserializeContent( $blob, $format = null ) {
                $d = unserialize( $blob );
+
                return new DummyContentForTesting( $d );
        }
 
index 8f53dd3..1c45820 100644 (file)
@@ -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 4fc2d51..c7138b7 100644 (file)
@@ -162,7 +162,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 +172,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() {
@@ -423,5 +423,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;
        }
 
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 39611cb..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;
@@ -39,6 +40,7 @@ class FileBackendTest extends MediaWikiTestCase {
                                'name' => 'localtesting',
                                'lockManager' => 'fsLockManager',
                                #'parallelize' => 'implicit',
+                               'wikiId' => wfWikiID() . $uniqueId,
                                'containerPaths' => array(
                                        'unittest-cont1' => "{$tmpPrefix}-localtesting-cont1",
                                        'unittest-cont2' => "{$tmpPrefix}-localtesting-cont2" )
@@ -48,6 +50,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        'name' => 'localtesting',
                        'lockManager' => 'fsLockManager',
                        'parallelize' => 'implicit',
+                       'wikiId' => wfWikiId() . $uniqueId,
                        'backends' => array(
                                array(
                                        'name' => 'localmultitesting1',
@@ -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
                }
 
@@ -889,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;
@@ -1365,6 +1371,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
        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 ),
@@ -1453,7 +1460,7 @@ class FileBackendTest extends MediaWikiTestCase {
                }
        }
 
-       // @TODO: testSecure
+       // @todo testSecure
 
        public function testDoOperations() {
                $this->backend = $this->singleBackend;
@@ -1763,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",
@@ -1782,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",
@@ -1814,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",
@@ -1853,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
@@ -2059,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
@@ -2071,11 +2084,11 @@ class FileBackendTest extends MediaWikiTestCase {
                        // no errors
                }
 
-               $items = is_array( $iter ) ? $iter : iterator_to_array( $iter );
+               $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." );
        }
 
@@ -2180,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 );
@@ -2188,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;
        }
 
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 820f8c5..6990153 100644 (file)
@@ -46,7 +46,10 @@ class JobQueueTest extends MediaWikiTestCase {
                                if ( !( $this->$q instanceof JobQueueDB ) ) {
                                        $this->$q->setTestingPrefix( 'unittests-' . wfRandomString( 32 ) );
                                }
-                       } catch ( MWException $e ) {}; // unsupported? (@TODO: what if it was another error?)
+                       } catch ( MWException $e ) {
+                               // unsupported?
+                               // @todo What if it was another error?
+                       };
                }
        }
 
@@ -59,12 +62,7 @@ class JobQueueTest extends MediaWikiTestCase {
                        ) as $q
                ) {
                        if ( $this->$q ) {
-                               do {
-                                       $job = $this->$q->pop();
-                                       if ( $job ) {
-                                               $this->$q->ack( $job );
-                                       }
-                               } while ( $job );
+                               $this->$q->delete();
                        }
                        $this->$q = null;
                }
@@ -109,7 +107,6 @@ class JobQueueTest extends MediaWikiTestCase {
                $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)" );
 
@@ -147,6 +144,15 @@ 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)" );
        }
 
        /**
index 0782e4e..ef263c4 100644 (file)
@@ -88,7 +88,6 @@ class FormatJsonTest extends MediaWikiTestCase {
                        strtolower( FormatJson::encode( "\xf0\xa0\x80\x80" ) ),
                        'Test encoding an broken json_encode character (U+20000)'
                );
-
        }
 
        public function testDecodeReturnType() {
@@ -156,6 +155,7 @@ class FormatJsonTest extends MediaWikiTestCase {
                                $cases[] = array( $from, '"' . ( $leaveUnescaped ? $from : $to ) . '"' );
                        }
                }
+
                return $cases;
        }
 }
index 632eb52..a1b87f6 100644 (file)
@@ -151,14 +151,11 @@ class CSSJanusTest extends MediaWikiTestCase {
                                '#settings td p strong'
                        ),
                        array(
-                               # Not sure how 4+ values should behave,
-                               # testing to make sure changes are detected
-                               '.foo { x-unknown: 1 2 3 4 5; }',
-                               '.foo { x-unknown: 1 4 3 2 5; }',
+                               // Do not mangle 5 or more values
+                               '.foo { -x-unknown: 1 2 3 4 5; }'
                        ),
                        array(
-                               '.foo { x-unknown: 1 2 3 4 5 6; }',
-                               '.foo { x-unknown: 1 4 3 2 5 6; }',
+                               '.foo { -x-unknown: 1 2 3 4 5 6; }'
                        ),
 
                        // Shorthand / Three notation
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 117a072..ffa6084 100644 (file)
@@ -146,5 +146,4 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
                $res = $handler->getTiffByteOrder( $this->filePath . 'test.tiff' );
                $this->assertEquals( 'LE', $res );
        }
-
 }
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 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 067a7c4..87dc41c 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
@@ -11,24 +11,110 @@ require_once( __DIR__ . '/NewParserTest.php' );
  */
 class MediaWikiParserTest {
 
-       public static function suite() {
-               global $wgParserTestFiles;
+       /**
+        * @defgroup filtering_constants Filtering constants
+        *
+        * Limit inclusion of parser tests files coming from MediaWiki core
+        * @{
+        */
 
-               $suite = new PHPUnit_Framework_TestSuite;
+       /** Include files shipped with MediaWiki core */
+       const CORE_ONLY = 1;
+       /** Include non core files as set in $wgParserTestFiles */
+       const NO_CORE = 2;
+       /** Include anything set via $wgParserTestFiles */
+       const WITH_ALL  = 3;  # CORE_ONLY | NO_CORE
+
+       /** @} */
+
+       /**
+        * Get a PHPUnit test suite of parser tests. Optionally filtered with
+        * $flags.
+        *
+        * @par Examples:
+        * Get a suite of parser tests shipped by MediaWiki core:
+        * @code
+        * MediaWikiParserTest::suite( MediaWikiParserTest::CORE_ONLY );
+        * @endcode
+        * Get a suite of various parser tests, like extensions:
+        * @code
+        * MediaWikiParserTest::suite( MediaWikiParserTest::NO_CORE );
+        * @endcode
+        * Get any test defined via $wgParserTestFiles:
+        * @code
+        * MediaWikiParserTest::suite( MediaWikiParserTest::WITH_ALL );
+        * @endcode
+        *
+        * @param $flags bitwise flag to filter out the $wgParserTestFiles that
+        * will be included.  Default: MediaWikiParserTest::CORE_ONLY
+        *
+        * @return PHPUnit_Framework_TestSuite
+        */
+       public static function suite( $flags = self::CORE_ONLY ) {
+               if( is_string( $flags ) ) {
+                       $flags = self::CORE_ONLY;
+               }
+               global $wgParserTestFiles, $IP;
+
+               $mwTestDir = $IP.'/tests/';
+
+               # Human friendly helpers
+               $wantsCore = ($flags & self::CORE_ONLY);
+               $wantsRest = ($flags & self::NO_CORE);
+
+               # Will hold the .txt parser test files we will include
+               $filesToTest = array();
+
+               # Filter out .txt files
+               foreach( $wgParserTestFiles as $parserTestFile ) {
+                       $isCore = ( 0 === strpos( $parserTestFile, $mwTestDir ) );
+
+                       if( $isCore && $wantsCore ) {
+                               self::debug( "included core parser tests: $parserTestFile" );
+                               $filesToTest[] = $parserTestFile;
+                       } elseif( !$isCore && $wantsRest ) {
+                               self::debug( "included non core parser tests: $parserTestFile" );
+                               $filesToTest[] = $parserTestFile;
+                       } else {
+                               self::debug( "skipped parser tests: $parserTestFile" );
+                       }
+               }
+               self::debug( 'parser tests files: '
+                       . implode(' ', $filesToTest) );
 
-               foreach ( $wgParserTestFiles as $filename ) {
-                       $testsName = basename( $filename, '.txt' );
+               $suite = new PHPUnit_Framework_TestSuite;
+               foreach ( $filesToTest 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 ) );
-
-                       eval( "/** @group Database\n@group Parser\n*/ class $className extends NewParserTest { protected \$file = '" . strtr( $filename, array( "'" => "\\'", '\\' => '\\\\' ) ) . "'; } " );
+                       $parserTestClassName = str_replace( '.', '_', ucfirst( $testsName ) );
+                       $parserTestClassDefinition = <<<EOT
+/**
+ * @group Database
+ * @group Parser
+ * @group ParserTests
+ * @group ParserTests_$parserTestClassName
+ */
+class $parserTestClassName extends NewParserTest {
+       protected \$file = '$escapedFileName';
+}
+EOT;
 
-                       $parserTester = new $className( $testsName );
-                       $suite->addTestSuite( new ReflectionClass ( $parserTester ) );
+                       eval( $parserTestClassDefinition );
+                       self::debug( "Adding test class $parserTestClassName" );
+                       $suite->addTestSuite( $parserTestClassName );
                }
                return $suite;
        }
+
+       /**
+        * Write $msg under log group 'tests-parser'
+        * @param string $msg Message to log
+        */
+       protected static function debug( $msg ) {
+               return wfDebugLog( 'tests-parser', wfGetCaller() . ' ' . $msg );
+       }
 }
index 77311b9..93923fd 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();
@@ -32,8 +31,13 @@ class NewParserTest extends MediaWikiTestCase {
 
        protected $file = false;
 
+       public static function setUpBeforeClass() {
+               // Inject ParserTest well-known interwikis
+               ParserTest::setupInterwikis();
+       }
+
        protected function setUp() {
-               global $wgNamespaceProtection, $wgNamespaceAliases;
+               global $wgNamespaceAliases;
                global $wgHooks, $IP;
 
                parent::setUp();
@@ -52,11 +56,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 +76,72 @@ 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();
+
+               $tmpGlobals['wgFileExtensions'][] = 'svg';
+               $tmpGlobals['wgSVGConverter'] = 'rsvg';
+               $tmpGlobals['wgSVGConverters']['rsvg'] = '$path/rsvg-convert -w $width -h $height $input -o $output';
 
                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';
+               }
+               // Vector images have to be handled slightly differently
+               $tmpGlobals['wgMediaHandlers']['image/svg+xml'] = 'MockSvgHandler';
 
-               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 $wgNamespaceAliases;
 
-               global $wgNamespaceProtection, $wgNamespaceAliases;
-
-               $wgNamespaceProtection[NS_MEDIAWIKI] = $this->savedWeirdGlobals['mw_namespace_protection'];
                $wgNamespaceAliases['Image'] = $this->savedWeirdGlobals['image_alias'];
                $wgNamespaceAliases['Image_talk'] = $this->savedWeirdGlobals['image_talk_alias'];
 
@@ -119,67 +149,26 @@ 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();
        }
 
        function addDBData() {
                $this->tablesUsed[] = 'site_stats';
-               $this->tablesUsed[] = 'interwiki';
                # disabled for performance
                #$this->tablesUsed[] = 'image';
 
-               # Hack: insert a few Wikipedia in-project interwiki prefixes,
-               # for testing inter-language links
-               $this->db->insert( 'interwiki', array(
-                               array( 'iw_prefix' => 'wikipedia',
-                                       'iw_url' => 'http://en.wikipedia.org/wiki/$1',
-                                       'iw_api' => '',
-                                       'iw_wikiid' => '',
-                                       'iw_local' => 0 ),
-                               array( 'iw_prefix' => 'meatball',
-                                       'iw_url' => 'http://www.usemod.com/cgi-bin/mb.pl?$1',
-                                       'iw_api' => '',
-                                       'iw_wikiid' => '',
-                                       'iw_local' => 0 ),
-                               array( 'iw_prefix' => 'zh',
-                                       'iw_url' => 'http://zh.wikipedia.org/wiki/$1',
-                                       'iw_api' => '',
-                                       'iw_wikiid' => '',
-                                       'iw_local' => 1 ),
-                               array( 'iw_prefix' => 'es',
-                                       'iw_url' => 'http://es.wikipedia.org/wiki/$1',
-                                       'iw_api' => '',
-                                       'iw_wikiid' => '',
-                                       'iw_local' => 1 ),
-                               array( 'iw_prefix' => 'fr',
-                                       'iw_url' => 'http://fr.wikipedia.org/wiki/$1',
-                                       'iw_api' => '',
-                                       'iw_wikiid' => '',
-                                       'iw_local' => 1 ),
-                               array( 'iw_prefix' => 'ru',
-                                       'iw_url' => 'http://ru.wikipedia.org/wiki/$1',
-                                       'iw_api' => '',
-                                       'iw_wikiid' => '',
-                                       'iw_local' => 1 ),
-                               /**
-                                * @todo Fixme! Why are we inserting duplicate data here? Shouldn't
-                                * need this IGNORE or shouldn't need the insert at all.
-                                */
-                       ), __METHOD__, array( 'IGNORE' )
-               );
-
                # Update certain things in site_stats
                $this->db->insert( 'site_stats',
                        array( 'ss_row_id' => 1, 'ss_images' => 2, 'ss_good_articles' => 1 ),
                        __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
 
@@ -251,6 +240,20 @@ class NewParserTest extends MediaWikiTestCase {
                                $this->db->timestamp( '20010115123500' ), $user
                        );
                }
+               $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Foobar.svg' ) );
+               if ( !$this->db->selectField( 'image', '1', array( 'img_name' => $image->getName() ) ) ) {
+                       $image->recordUpload2( '', 'Upload of some lame SVG', 'Some lame SVG', array(
+                                       'size'        => 12345,
+                                       'width'       => 200,
+                                       'height'      => 200,
+                                       'bits'        => 24,
+                                       'media_type'  => MEDIATYPE_DRAWING,
+                                       'mime'        => 'image/svg+xml',
+                                       'metadata'    => serialize( array() ),
+                                       'sha1'        => wfBaseConvert( '', 16, 36, 31 ),
+                                       'fileExists'  => true
+                       ), $this->db->timestamp( '20010115123500' ), $user );
+               }
        }
 
        //ParserTest setup/teardown functions
@@ -289,7 +292,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(
@@ -300,12 +306,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',
@@ -315,47 +315,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 ) {
@@ -373,6 +341,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];
@@ -381,21 +358,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();
 
@@ -405,9 +370,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;
@@ -432,6 +394,7 @@ class NewParserTest extends MediaWikiTestCase {
                // wfDebug( "Creating upload directory $dir\n" );
                if ( file_exists( $dir ) ) {
                        wfDebug( "Already exists!\n" );
+
                        return $dir;
                }
 
@@ -461,6 +424,19 @@ class NewParserTest extends MediaWikiTestCase {
                $backend->store( array(
                        'src' => "$IP/skins/monobook/headbg.jpg", 'dst' => "$base/local-public/0/09/Bad.jpg"
                ) );
+
+               // No helpful SVG file to copy, so make one ourselves
+               $tmpDir = wfTempDir();
+               $tempFsFile = new TempFSFile( "$tmpDir/Foobar.svg" );
+               $tempFsFile->autocollect(); // destroy file when $tempFsFile leaves scope
+               file_put_contents( "$tmpDir/Foobar.svg",
+                       '<?xml version="1.0" encoding="utf-8"?>' .
+                       '<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200"><text>Foo</text></svg>' );
+
+               $backend->prepare( array( 'dir' => "$base/local-public/f/ff" ) );
+               $backend->quickStore( array(
+                       'src' => "$tmpDir/Foobar.svg", 'dst' => "$base/local-public/f/ff/Foobar.svg"
+               ) );
        }
 
        /**
@@ -473,9 +449,6 @@ class NewParserTest extends MediaWikiTestCase {
                foreach ( $this->savedGlobals as $var => $val ) {
                        $GLOBALS[$var] = $val;
                }
-
-               RepoGroup::destroySingleton();
-               LinkCache::singleton()->clear();
        }
 
        /**
@@ -486,6 +459,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(
@@ -510,6 +489,14 @@ class NewParserTest extends MediaWikiTestCase {
 
                                "$base/local-public/0/09/Bad.jpg",
 
+                               "$base/local-public/f/ff/Foobar.svg",
+                               "$base/local-thumb/f/ff/Foobar.svg/180px-Foobar.svg.jpg",
+                               "$base/local-thumb/f/ff/Foobar.svg/270px-Foobar.svg.jpg",
+                               "$base/local-thumb/f/ff/Foobar.svg/360px-Foobar.svg.jpg",
+                               "$base/local-thumb/f/ff/Foobar.svg/langde-180px-Foobar.svg.jpg",
+                               "$base/local-thumb/f/ff/Foobar.svg/langde-270px-Foobar.svg.jpg",
+                               "$base/local-thumb/f/ff/Foobar.svg/langde-360px-Foobar.svg.jpg",
+
                                "$base/local-public/math/f/a/5/fa50b8b616463173474302ca3e63586b.png",
                        )
                );
@@ -543,6 +530,7 @@ class NewParserTest extends MediaWikiTestCase {
                        global $wgParserTestFiles;
                        $this->file = $wgParserTestFiles[0];
                }
+
                return new TestFileIterator( $this->file, $this );
        }
 
@@ -566,7 +554,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" );
@@ -717,7 +705,6 @@ class NewParserTest extends MediaWikiTestCase {
                        }
 
                        $id++;
-
                }
        }
 
@@ -911,6 +898,7 @@ class NewParserTest extends MediaWikiTestCase {
                                }
                        }
                }
+
                return $opts;
        }
 
@@ -922,6 +910,7 @@ class NewParserTest extends MediaWikiTestCase {
                if ( substr( $opt, 0, 2 ) == '[[' ) {
                        return substr( $opt, 2, -2 );
                }
+
                return $opt;
        }
 
index 50fe0e4..cacbb85 100644 (file)
@@ -44,6 +44,5 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
                        '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 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..e947c34 100644 (file)
@@ -17,6 +17,7 @@ class MockSearch extends SearchEngine {
 
 /**
  * @group Search
+ * @group Database
  */
 class SearchUpdateTest extends MediaWikiTestCase {
 
@@ -25,16 +26,8 @@ class SearchUpdateTest extends MediaWikiTestCase {
                $this->setMwGlobals( 'wgSearchType', 'MockSearch' );
        }
 
-       function update( $text, $title = 'Test', $id = 1 ) {
-               $u = new SearchUpdate( $id, $title, $text );
-               $u->doUpdate();
-               return array( MockSearch::$title, MockSearch::$text );
-       }
-
        function updateText( $text ) {
-               list( , $resultText ) = $this->update( $text );
-               $resultText = trim( $resultText ); // abstract from some implementation details
-               return $resultText;
+               return trim( SearchUpdate::updateText( $text ) );
        }
 
        function testUpdateText() {
index b86636f..e0092a5 100644 (file)
@@ -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 8033784..b453e74 100644 (file)
@@ -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 15a11ed..c737f05 100644 (file)
@@ -53,7 +53,6 @@ class SpecialSearchTest extends MediaWikiTestCase {
                        )
                        , $message
                );
-
        }
 
        public static function provideSearchOptionsTests() {
@@ -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 ac93aa7..a75fba6 100644 (file)
@@ -6,7 +6,6 @@
  * @group Database
  */
 class UploadFromUrlTest extends ApiTestCase {
-
        protected function setUp() {
                parent::setUp();
 
@@ -31,6 +30,7 @@ class UploadFromUrlTest extends ApiTestCase {
                $module->execute();
 
                wfSetupSession( $sessionId );
+
                return array( $module->getResultData(), $req );
        }
 
@@ -175,7 +175,6 @@ class UploadFromUrlTest extends ApiTestCase {
 
                $this->user->addGroup( 'users' );
 
-
                $data = $this->doAsyncUpload( $token );
 
                $this->assertEquals( $data[0]['upload']['result'], 'Warning' );
@@ -236,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',
@@ -260,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',
@@ -278,7 +277,6 @@ class UploadFromUrlTest extends ApiTestCase {
                $this->assertFalse( $job );
 
                return;
-
                /*
                // Broken until using leavemessage with ignorewarnings is supported
                $job->run();
@@ -331,7 +329,6 @@ class UploadFromUrlTest extends ApiTestCase {
                return $data;
        }
 
-
        /**
         *
         */
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 6659dad..4274335 100644 (file)
@@ -96,5 +96,4 @@ abstract class LanguageClassesTestCase extends MediaWikiTestCase {
                unset( $this->languageObject );
                parent::tearDown();
        }
-
 }
index 11d00f3..40d14e3 100644 (file)
@@ -12,8 +12,6 @@
  * @file
  */
 
-require_once dirname( __DIR__ ) . '/bootstrap.php';
-
 /** Tests for MediaWiki languages/LanguageSr.php */
 class LanguageSrTest extends LanguageClassesTestCase {
        function testEasyConversions() {
index d5dbfb2..9023dc7 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 
 class LanguageTest extends LanguageClassesTestCase {
-
        function testLanguageConvertDoubleWidthToSingleWidth() {
                $this->assertEquals(
                        "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
@@ -202,7 +201,6 @@ class LanguageTest extends LanguageClassesTestCase {
                                'formatTimePeriod() rounding, recursion, (>48h)'
                        ),
                );
-
        }
 
        function testTruncate() {
@@ -496,9 +494,34 @@ class LanguageTest extends LanguageClassesTestCase {
        public static function provideUnknownLanguageTags() {
                return array(
                        array( 'mw', 'non-existent two-letter code' ),
+                       array( 'foo"<bar', 'very invalid language 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
         */
@@ -1362,6 +1385,9 @@ class LanguageTest extends LanguageClassesTestCase {
                        array( 'other', 2, array(
                                'kissa=kala', '1=2=3', 'other',
                        ) ),
+                       array( '', 2, array(
+                               '0=explicit zero', '1=explicit one',
+                       ) ),
                );
        }
 
@@ -1456,4 +1482,26 @@ class LanguageTest extends LanguageClassesTestCase {
                        array( 'FI', false, 'is not supported language, input should be in lower case' ),
                );
        }
+
+       /**
+        * @dataProvider provideGetParentLanguage
+        */
+       function testGetParentLanguage( $code, $expected, $comment ) {
+               $lang = Language::factory( $code );
+               if ( is_null( $expected ) ) {
+                       $this->assertNull( $lang->getParentLanguage(), $comment );
+               } else {
+                       $this->assertEquals( $expected, $lang->getParentLanguage()->getCode(), $comment );
+               }
+       }
+
+       public static function provideGetParentLanguage() {
+               return array(
+                       array( 'zh-cn', 'zh', 'zh is the parent language of zh-cn' ),
+                       array( 'zh', 'zh', 'zh is defined as the parent language of zh, because zh converter can convert zh-cn to zh' ),
+                       array( 'zh-invalid', null, 'do not be fooled by arbitrarily composed language codes' ),
+                       array( 'en-gb', null, 'en does not have converter' ),
+                       array( 'en', null, 'en does not have converter. Although FakeConverter handles en -> en conversion but it is useless' ),
+               );
+       }
 }
index 464a310..6358ac0 100644 (file)
@@ -56,5 +56,4 @@ class LanguageTrTest extends LanguageClassesTestCase {
 
                );
        }
-
 }
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 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 f82898f..78a5153 100644 (file)
@@ -124,6 +124,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
                                return true;
                        }
                }
+
                return false;
        }
 
@@ -145,6 +146,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
                                return true;
                        }
                }
+
                return false;
        }
 
@@ -271,7 +273,6 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
                $this->assertTextNode( "title", $name );
                $this->assertTextNode( "ns", $ns );
                $this->assertTextNode( "id", $id );
-
        }
 
        /**
@@ -299,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..e046328
--- /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 {
+       protected $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..742b41e
--- /dev/null
@@ -0,0 +1,92 @@
+<?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
+ */
+
+class MockBitmapHandler extends BitmapHandler {
+       function doTransform( $image, $dstPath, $dstUrl, $params, $flags = 0 ) {
+               return MockImageHandler::doFakeTransform( $this, $image, $dstPath, $dstUrl, $params, $flags );
+       }
+       function doClientImage( $image, $scalerParams ) {
+                       return $this->getClientScalingThumbnailImage( $image, $scalerParams );
+       }
+}
+class MockSvgHandler extends SvgHandler {
+       function doTransform( $image, $dstPath, $dstUrl, $params, $flags = 0 ) {
+               return MockImageHandler::doFakeTransform( $this, $image, $dstPath, $dstUrl, $params, $flags );
+       }
+}
+/**
+ * Mock handler for images.
+ *
+ * This is really intended for unit testing.
+ *
+ * @ingroup Media
+ */
+class MockImageHandler {
+
+       /**
+        * 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.
+        */
+       static function doFakeTransform( $that, $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
+
+               $that->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" );
+                       // getClientScalingThumbnailImage is protected
+                       return $that->doClientImage( $image, $scalerParams );
+               }
+
+               return new ThumbnailImage( $image, $dstUrl, false, $params );
+       }
+}
index 2a1ebc3..e4cb6b6 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;
 
@@ -89,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'] );
-
                }
        }
 
@@ -99,16 +101,19 @@ class PHPUnitMaintClass extends Maintenance {
 }
 
 $maintClass = 'PHPUnitMaintClass';
-require( RUN_MAINTENANCE_IF_MAIN );
+require RUN_MAINTENANCE_IF_MAIN;
 
-require_once( 'PHPUnit/Runner/Version.php' );
+if ( !class_exists( 'PHPUnit_Runner_Version') ) {
+       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" );
+if ( !class_exists( 'PHPUnit_TextUI_Command' ) ) {
+       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 876876b..850d39c 100644 (file)
@@ -100,7 +100,6 @@ class SideBarTest extends MediaWikiLangTestCase {
 ** http://valid.no.desc.org/
 '
                );
-
        }
 
        /**
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..7a9122f 100644 (file)
@@ -2,17 +2,18 @@
 
 <!-- colors don't work on Windows! -->
 <phpunit bootstrap="./bootstrap.php"
-         colors="true"
-         backupGlobals="false"
-         convertErrorsToExceptions="true"
-         convertNoticesToExceptions="true"
-         convertWarningsToExceptions="true"
-         stopOnFailure="false"
-                timeoutForSmallTests="10"
-                timeoutForMediumTests="30"
-                timeoutForLargeTests="60"
-         strict="true"
-                verbose="true">
+       colors="true"
+       backupGlobals="false"
+       convertErrorsToExceptions="true"
+       convertNoticesToExceptions="true"
+       convertWarningsToExceptions="true"
+       forceCoversAnnotation="true"
+       stopOnFailure="false"
+       timeoutForSmallTests="10"
+       timeoutForMediumTests="30"
+       timeoutForLargeTests="60"
+       strict="true"
+       verbose="true">
        <testsuites>
                <testsuite name="includes">
                        <directory>includes</directory>
                        <directory>maintenance</directory>
                </testsuite>
                <testsuite name="structure">
-                       <file>StructureTest.php</file>
+                       <directory>structure</directory>
                </testsuite>
                <testsuite name="uploadfromurl">
                        <file>suites/UploadFromUrlTestSuite.php</file>
                </testsuite>
                <testsuite name="extensions">
                        <file>suites/ExtensionsTestSuite.php</file>
+                       <file>suites/ExtensionsParserTestSuite.php</file>
                </testsuite>
        </testsuites>
        <groups>
diff --git a/tests/phpunit/suites/ExtensionsParserTestSuite.php b/tests/phpunit/suites/ExtensionsParserTestSuite.php
new file mode 100644 (file)
index 0000000..3d68b24
--- /dev/null
@@ -0,0 +1,8 @@
+<?php
+class ExtensionsParserTestSuite extends PHPUnit_Framework_TestSuite {
+
+       public static function suite() {
+               return MediaWikiParserTest::suite( MediaWikiParserTest::NO_CORE );
+       }
+
+}
index 3200e0b..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();
@@ -26,7 +26,6 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
                $tmpGlobals['wgScript'] = '/index.php';
                $tmpGlobals['wgScriptPath'] = '/';
                $tmpGlobals['wgArticlePath'] = '/wiki/$1';
-               $tmpGlobals['wgStyleSheetPath'] = '/skins';
                $tmpGlobals['wgStylePath'] = '/skins';
                $tmpGlobals['wgThumbnailScriptPath'] = false;
                $tmpGlobals['wgLocalFileRepo'] = array(
@@ -57,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();
@@ -185,6 +183,7 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
 
                if ( file_exists( $dir ) ) {
                        wfDebug( "Already exists!\n" );
+
                        return $dir;
                }
 
@@ -202,6 +201,7 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
                // the UploadFromUrlTest class
                class_exists( 'UploadFromUrlTest' );
                $suite = new UploadFromUrlTestSuite( 'UploadFromUrlTest' );
+
                return $suite;
        }
 }
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 3f3c899..1a2bfa1 100644 (file)
@@ -50,7 +50,7 @@
        // 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' ) ) );
        }
 
        /**
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;
 
index 88bbf5c..b2a6fd5 100644 (file)
@@ -1,16 +1,11 @@
 ( function ( $ ) {
-       var uacount, uas, testMap;
 
        QUnit.module( 'jquery.client', QUnit.newMwEnvironment() );
 
-       /** Number of user-agent defined */
-       uacount = 0;
-
-       uas = ( function () {
-
+       var uacount = 0,
                // Object keyed by userAgent. Value is an array (human-readable name, client-profile object, navigator.platform value)
                // Info based on results from http://toolserver.org/~krinkle/testswarm/job/174/
-               var uas = {
+               uas = {
                        // Internet Explorer 6
                        // Internet Explorer 7
                        'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)': {
                                        rtl: true
                                }
                        },
+                       // Iceweasel 15.0.1
+                       'Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0.1 Iceweasel/15.0.1': {
+                               title: 'Iceweasel 15.0.1',
+                               platform: 'Linux',
+                               profile: {
+                                       name: 'iceweasel',
+                                       layout: 'gecko',
+                                       layoutVersion: 20100101,
+                                       platform: 'linux',
+                                       version: '15.0.1',
+                                       versionBase: '15',
+                                       versionNumber: 15
+                               },
+                               wikiEditor: {
+                                       ltr: true,
+                                       rtl: true
+                               }
+                       },
                        // Firefox 5
                        // Safari 3
                        // Safari 4
                                }
                        },
                        // Safari 5
+                       // Safari 6
+                       'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.29.13 (KHTML, like Gecko) Version/6.0.4 Safari/536.29.13': {
+                               title: 'Safari 6',
+                               platform: 'MacIntel',
+                               profile: {
+                                       name: 'safari',
+                                       layout: 'webkit',
+                                       layoutVersion: 536,
+                                       platform: 'mac',
+                                       version: '6.0.4',
+                                       versionBase: '6',
+                                       versionNumber: 6
+                               },
+                               wikiEditor: {
+                                       ltr: true,
+                                       rtl: true
+                               }
+                       },
+                       // Safari 6.0.5+ (doesn't have the comma in "KHTML, like Gecko")
+                       'Mozilla/5.0 (Macintosh; Intel Mac OS X 1084) AppleWebKit/536.30.1 (KHTML like Gecko) Version/6.0.5 Safari/536.30.1': {
+                               title: 'Safari 6',
+                               platform: 'MacIntel',
+                               profile: {
+                                       name: 'safari',
+                                       layout: 'webkit',
+                                       layoutVersion: 536,
+                                       platform: 'mac',
+                                       version: '6.0.5',
+                                       versionBase: '6',
+                                       versionNumber: 6
+                               },
+                               wikiEditor: {
+                                       ltr: true,
+                                       rtl: true
+                               }
+                       },
                        // Opera 10+
                        'Opera/9.80 (Windows NT 5.1)': {
                                title: 'Opera 10+ (exact version unspecified)',
                                        rtl: true
                                }
                        },
+                       // Android WebKit Browser 2.3
+                       'Mozilla/5.0 (Linux; U; Android 2.3.5; en-us; HTC Vision Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1': {
+                               title: 'Android WebKit Browser 2.3',
+                               platform: 'Linux armv7l',
+                               profile: {
+                                       name: 'android',
+                                       layout: 'webkit',
+                                       layoutVersion: 533,
+                                       platform: 'linux',
+                                       version: '2.3.5',
+                                       versionBase: '2',
+                                       versionNumber: 2.3
+                               },
+                               wikiEditor: {
+                                       ltr: true,
+                                       rtl: true
+                               }
+                       },
                        // Bug #34924
                        'Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.34 (KHTML, like Gecko) rekonq Safari/534.34': {
                                title: 'Rekonq',
                                        rtl: true
                                }
                        }
-               };
-               $.each( uas, function () {
-                       uacount++;
-               } );
-               return uas;
-       }() );
-
-       QUnit.test( 'profile userAgent support', uacount, function ( assert ) {
-               // Generate a client profile object and compare recursively
-               var uaTest = function ( rawUserAgent, data ) {
-                       var ret = $.client.profile( {
-                               userAgent: rawUserAgent,
-                               platform: data.platform
-                       } );
-                       assert.deepEqual( ret, data.profile, 'Client profile support check for ' + data.title + ' (' + data.platform + '): ' + rawUserAgent );
-               };
+               },
+               testMap = {
+                       // Example from WikiEditor
+                       // Make sure to use raw numbers, a string like "7.0" would fail on a
+                       // version 10 browser since in string comparaison "10" is before "7.0" :)
+                       'ltr': {
+                               'msie': [['>=', 7.0]],
+                               'firefox': [['>=', 2]],
+                               'opera': [['>=', 9.6]],
+                               'safari': [['>=', 3]],
+                               'chrome': [['>=', 3]],
+                               'netscape': [['>=', 9]],
+                               'blackberry': false,
+                               'ipod': false,
+                               'iphone': false
+                       },
+                       'rtl': {
+                               'msie': [['>=', 8]],
+                               'firefox': [['>=', 2]],
+                               'opera': [['>=', 9.6]],
+                               'safari': [['>=', 3]],
+                               'chrome': [['>=', 3]],
+                               'netscape': [['>=', 9]],
+                               'blackberry': false,
+                               'ipod': false,
+                               'iphone': false
+                       }
+               }
+       ;
 
-               // Loop through and run tests
-               $.each( uas, uaTest );
+       // Count test cases
+       $.each( uas, function () {
+               uacount++;
        } );
 
-       QUnit.test( 'profile return validation for current user agent', 7, function ( assert ) {
+       QUnit.test( 'profile( navObject )', 7, function ( assert ) {
                var p = $.client.profile();
 
                function unknownOrType( val, type, summary ) {
                assert.equal( typeof p.versionNumber, 'number', 'p.versionNumber is a number' );
        } );
 
-       // Example from WikiEditor
-       // Make sure to use raw numbers, a string like "7.0" would fail on a
-       // version 10 browser since in string comparaison "10" is before "7.0" :)
-       testMap = {
-               'ltr': {
-                       'msie': [['>=', 7.0]],
-                       'firefox': [['>=', 2]],
-                       'opera': [['>=', 9.6]],
-                       'safari': [['>=', 3]],
-                       'chrome': [['>=', 3]],
-                       'netscape': [['>=', 9]],
-                       'blackberry': false,
-                       'ipod': false,
-                       'iphone': false
-               },
-               'rtl': {
-                       'msie': [['>=', 8]],
-                       'firefox': [['>=', 2]],
-                       'opera': [['>=', 9.6]],
-                       'safari': [['>=', 3]],
-                       'chrome': [['>=', 3]],
-                       'netscape': [['>=', 9]],
-                       'blackberry': false,
-                       'ipod': false,
-                       'iphone': false
-               }
-       };
+       QUnit.test( 'profile( navObject ) - samples', uacount, function ( assert ) {
+               // Loop through and run tests
+               $.each( uas, function ( rawUserAgent, data ) {
+                       // Generate a client profile object and compare recursively
+                       var ret = $.client.profile( {
+                               userAgent: rawUserAgent,
+                               platform: data.platform
+                       } );
+                       assert.deepEqual( ret, data.profile, 'Client profile support check for ' + data.title + ' (' + data.platform + '): ' + rawUserAgent );
+               } );
+       } );
 
-       QUnit.test( 'test', 1, function ( assert ) {
+       QUnit.test( 'test( testMap )', 4, function ( assert ) {
                // .test() uses eval, make sure no exceptions are thrown
                // then do a basic return value type check
-               var testMatch = $.client.test( testMap );
+               var testMatch = $.client.test( testMap ),
+                       ie7Profile = $.client.profile( {
+                               'userAgent': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
+                               'platform': ''
+                       } );
+
+               assert.equal( typeof testMatch, 'boolean', 'map with ltr/rtl split returns a boolean value' );
+
+               testMatch = $.client.test( testMap.ltr );
+
+               assert.equal( typeof testMatch, 'boolean', 'simple map (without ltr/rtl split) returns a boolean value' );
+
+               assert.equal( $.client.test( {
+                       'msie': null
+               }, ie7Profile ), true, 'returns true if any version of a browser are allowed (null)' );
+
+               assert.equal( $.client.test( {
+                       'msie': false
+               }, ie7Profile ), false, 'returns false if all versions of a browser are not allowed (false)' );
+       } );
+
+       QUnit.test( 'test( testMap, exactMatchOnly )', 2, function ( assert ) {
+               var ie7Profile = $.client.profile( {
+                       'userAgent': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
+                       'platform': ''
+               } );
 
-               assert.equal( typeof testMatch, 'boolean', 'test returns a boolean value' );
+               assert.equal( $.client.test( {
+                       'firefox': [['>=', 2]]
+               }, ie7Profile, false ), true, 'returns true if browser not found and exactMatchOnly not set' );
 
+               assert.equal( $.client.test( {
+                       'firefox': [['>=', 2]]
+               }, ie7Profile, true ), false, 'returns false if browser not found and exactMatchOnly is set' );
        } );
 
-       QUnit.test( 'User-agent matches against WikiEditor\'s compatibility map', uacount * 2, function ( assert ) {
+       QUnit.test( 'test( testMap) - WikiEditor sample', uacount * 2, function ( assert ) {
                var $body = $( 'body' ),
                        bodyClasses = $body.attr( 'class' );
 
index 9f34bee..7ae743c 100644 (file)
                $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 1a380a5..d23bfc3 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'
        };
 
                        $table.find( '.headerSort:eq(0)' ).click();
                }
        );
+       tableTest(
+               'Basic planet table: ascending by name (multiple clicks)',
+               header,
+               planets,
+               ascendingName,
+               function ( $table ) {
+                       $table.tablesorter();
+                       $table.find( '.headerSort:eq(0)' ).click();
+                       $table.find( '.headerSort:eq(1)' ).click();
+                       $table.find( '.headerSort:eq(0)' ).click();
+               }
+       );
        tableTest(
                'Basic planet table: descending by name',
                header,
                        $table.data( 'tablesorter' ).sort();
                }
        );
+       tableTest(
+               'Sort via click event after having initialized the tablesorter with initial sorting',
+               header,
+               initial,
+               descasc,
+               function ( $table ) {
+                       $table.tablesorter(
+                               { sortList: [ { 0: 'asc' }, { 1: 'asc' } ] }
+                       );
+                       $table.find( '.headerSort:eq(0)' ).click();
+               }
+       );
+       tableTest(
+               'Multi-sort via click event after having initialized the tablesorter with initial sorting',
+               header,
+               initial,
+               asc,
+               function ( $table ) {
+                       $table.tablesorter(
+                               { sortList: [ { 0: 'desc' }, { 1: 'desc' } ] }
+                       );
+                       $table.find( '.headerSort:eq(0)' ).click();
+
+                       // Pretend to click while pressing the multi-sort key
+                       var event = $.Event( 'click' );
+                       event[$table.data( 'tablesorter' ).config.sortMultiSortKey] = true;
+                       $table.find( '.headerSort:eq(1)' ).trigger( event );
+               }
+       );
        QUnit.test( 'Reset sorting making table appear unsorted', 3, function ( assert ) {
                var $table = tableCreate( header, initial );
                $table.tablesorter(
                        $table.find( '.headerSort:eq(0)' ).click();
                }
        );
+       tableTest( 'Sorting with colspanned headers: sort spanned column twice',
+               header,
+               initial,
+               [ caa4, bbc2, abc3, aab5, aaa1 ],
+               function ( $table ) {
+                       // Make colspanned header for test
+                       $table.find( 'tr:eq(0) th:eq(1), tr:eq(0) th:eq(2)' ).remove();
+                       $table.find( 'tr:eq(0) th:eq(0)' ).prop( 'colspan', '3' );
+
+                       $table.tablesorter();
+                       $table.find( '.headerSort:eq(0)' ).click();
+                       $table.find( '.headerSort:eq(0)' ).click();
+               }
+       );
        tableTest( 'Sorting with colspanned headers: subsequent column',
                header,
                initial,
                        $table.find( '.headerSort:eq(1)' ).click();
                }
        );
+       tableTest( 'Sorting with colspanned headers: sort subsequent column twice',
+               header,
+               initial,
+               [ aab5, caa4, abc3, bbc2, aaa1 ],
+               function ( $table ) {
+                       // Make colspanned header for test
+                       $table.find( 'tr:eq(0) th:eq(1), tr:eq(0) th:eq(2)' ).remove();
+                       $table.find( 'tr:eq(0) th:eq(0)' ).prop( 'colspan', '3' );
+
+                       $table.tablesorter();
+                       $table.find( '.headerSort:eq(1)' ).click();
+                       $table.find( '.headerSort:eq(1)' ).click();
+               }
+       );
+
 
        // Regression tests!
        tableTest(
                );
        } );
 
+       QUnit.test( 'bug 38911 - The row with the largest amount of columns should receive the sort indicators', 3, function ( assert ) {
+               var $table = $(
+                       '<table class="sortable">' +
+                               '<thead>' +
+                               '<tr><th rowspan="2" id="A1">A1</th><th colspan="2">B2a</th></tr>' +
+                               '<tr><th id="B2b">B2b</th><th id="C2b">C2b</th></tr>' +
+                               '</thead>' +
+                               '<tr><td>A</td><td>Aa</td><td>Ab</td></tr>' +
+                               '<tr><td>B</td><td>Ba</td><td>Bb</td></tr>' +
+                               '</table>'
+               );
+               $table.tablesorter();
+
+               assert.equal(
+                       $table.find( '#A1' ).attr( 'class' ),
+                       'headerSort',
+                       'The first column of the first row should be sortable'
+               );
+               assert.equal(
+                       $table.find( '#B2b' ).attr( 'class' ),
+                       'headerSort',
+                       'The th element of the 2nd row of the 2nd column should be sortable'
+               );
+               assert.equal(
+                       $table.find( '#C2b' ).attr( 'class' ),
+                       'headerSort',
+                       'The th element of the 2nd row of the 3rd column should be sortable'
+               );
+       } );
+
+       QUnit.test( 'rowspans in table headers should prefer the last row when rows are equal in length', 2, function ( assert ) {
+               var $table = $(
+                       '<table class="sortable">' +
+                               '<thead>' +
+                               '<tr><th rowspan="2" id="A1">A1</th><th>B2a</th></tr>' +
+                               '<tr><th id="B2b">B2b</th></tr>' +
+                               '</thead>' +
+                               '<tr><td>A</td><td>Aa</td></tr>' +
+                               '<tr><td>B</td><td>Ba</td></tr>' +
+                               '</table>'
+               );
+               $table.tablesorter();
+
+               assert.equal(
+                       $table.find( '#A1' ).attr( 'class' ),
+                       'headerSort',
+                       'The first column of the first row should be sortable'
+               );
+               assert.equal(
+                       $table.find( '#B2b' ).attr( 'class' ),
+                       'headerSort',
+                       'The th element of the 2nd row of the 2nd column should be sortable'
+               );
+       } );
+
        // bug 41889 - exploding rowspans in more complex cases
        tableTestHTML(
                'Rowspan exploding with row headers',
index e338675..73dcf34 100644 (file)
 
        } );
 
+       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,
index cc8e640..57825c5 100644 (file)
@@ -37,9 +37,7 @@
                        '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',
-                       // Recent Opera Mini - JS mostly doesn't work, but serving jQuery doesn't hurt users
-                       'Opera/9.80 (Android; Opera Mini/7.29530/27.1407; U; en) Presto/2.8.119 Version/11.10'
+                       '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: [
                        '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 < 7
+                       // 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 (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.
diff --git a/tests/selenium/Selenium.php b/tests/selenium/Selenium.php
deleted file mode 100644 (file)
index 07f9867..0000000
+++ /dev/null
@@ -1,191 +0,0 @@
-<?php
-/**
- * Selenium connector
- * This is implemented as a singleton.
- */
-
-require( 'Testing/Selenium.php' );
-
-class Selenium {
-       protected static $_instance = null;
-
-       public $isStarted = false;
-       public $tester;
-
-       protected $port;
-       protected $host;
-       protected $browser;
-       protected $browsers;
-       protected $logger;
-       protected $user;
-       protected $pass;
-       protected $timeout = 30000;
-       protected $verbose;
-       protected $junitlogfile; //processed by phpUnderControl
-       protected $runagainstgrid = false;
-
-       /**
-        * @todo this shouldn't have to be static
-        */
-       static protected $url;
-
-       /**
-        * Override parent
-        */
-       public function __construct() {
-               /**
-                * @todo this is an ugly hack to make information available to
-                * other tests.  It should be fixed.
-                */
-               if ( null === self::$_instance ) {
-                       self::$_instance = $this;
-               } else {
-                       throw new MWException( "Already have one Selenium instance." );
-               }
-       }
-
-       public function start() {
-               $this->tester = new Testing_Selenium( $this->browser, self::$url, $this->host,
-                       $this->port, $this->timeout );
-               if ( method_exists( $this->tester, "setVerbose" ) ) {
-                       $this->tester->setVerbose( $this->verbose );
-               }
-
-               $this->tester->start();
-               $this->isStarted = true;
-       }
-
-       public function stop() {
-               $this->tester->stop();
-               $this->tester = null;
-               $this->isStarted = false;
-       }
-
-       public function login() {
-               if ( strlen( $this->user ) == 0 ) {
-                       return;
-               }
-               $this->open( self::$url . '/index.php?title=Special:Userlogin' );
-               $this->type( 'wpName1', $this->user );
-               $this->type( 'wpPassword1', $this->pass );
-               $this->click( "//input[@id='wpLoginAttempt']" );
-               $this->waitForPageToLoad( 10000 );
-
-               // after login we redirect to the main page. So check whether the "Prefernces" top menu item exists
-               $value = $this->isElementPresent( "//li[@id='pt-preferences']" );
-
-               if ( $value != true ) {
-                       throw new Testing_Selenium_Exception( "Login Failed" );
-               }
-
-       }
-
-       public static function getInstance() {
-               if ( null === self::$_instance ) {
-                       throw new MWException( "No instance set yet" );
-               }
-
-               return self::$_instance;
-       }
-
-       public function loadPage( $title, $action ) {
-               $this->open( self::$url . '/index.php?title=' . $title . '&action=' . $action );
-       }
-
-       public function setLogger( $logger ) {
-               $this->logger = $logger;
-       }
-
-       public function getLogger() {
-               return $this->logger;
-       }
-
-       public function log( $message ) {
-               $this->logger->write( $message );
-       }
-
-       public function setUrl( $url ) {
-               self::$url = $url;
-       }
-
-       public static function getUrl() {
-               return self::$url;
-       }
-
-       public function setPort( $port ) {
-               $this->port = $port;
-       }
-
-       public function getPort() {
-               return $this->port;
-       }
-
-       public function setUser( $user ) {
-               $this->user = $user;
-       }
-
-       // Function to get username
-       public function getUser() {
-               return $this->user;
-       }
-
-
-       public function setPass( $pass ) {
-               $this->pass = $pass;
-       }
-
-       //add function to get password
-       public function getPass() {
-               return $this->pass;
-       }
-
-       public function setHost( $host ) {
-               $this->host = $host;
-       }
-
-       public function setVerbose( $verbose ) {
-               $this->verbose = $verbose;
-       }
-
-       public function setAvailableBrowsers( $availableBrowsers ) {
-               $this->browsers = $availableBrowsers;
-       }
-
-       public function setJUnitLogfile( $junitlogfile ) {
-               $this->junitlogfile = $junitlogfile;
-       }
-
-       public function getJUnitLogfile() {
-               return $this->junitlogfile;
-       }
-
-       public function setRunAgainstGrid( $runagainstgrid ) {
-               $this->runagainstgrid = $runagainstgrid;
-       }
-
-       public function setBrowser( $b ) {
-               if ( $this->runagainstgrid ) {
-                       $this->browser = $b;
-                       return true;
-               }
-               if ( !isset( $this->browsers[$b] ) ) {
-                       throw new MWException( "Invalid Browser: $b.\n" );
-               }
-
-               $this->browser = $this->browsers[$b];
-       }
-
-       public function getAvailableBrowsers() {
-               return $this->browsers;
-       }
-
-       public function __call( $name, $args ) {
-               $t = call_user_func_array( array( $this->tester, $name ), $args );
-               return $t;
-       }
-
-       // Prevent external cloning
-       protected function __clone() {}
-       // Prevent external construction
-       // protected function __construct() {}
-}
diff --git a/tests/selenium/SeleniumConfig.php b/tests/selenium/SeleniumConfig.php
deleted file mode 100644 (file)
index 0823275..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-<?php
-if ( !defined( 'SELENIUMTEST' ) ) {
-       die( 1 );
-}
-
-class SeleniumConfig {
-
-       /**
-        * Retreives the Selenium configuration values from an ini file.
-        * See sample config file in selenium_settings.ini.sample
-        *
-        */
-       public static function getSeleniumSettings( &$seleniumSettings,
-                                                                                               &$seleniumBrowsers,
-                                                                                               &$seleniumTestSuites,
-                                                                                               $seleniumConfigFile = null ) {
-               if ( strlen( $seleniumConfigFile ) == 0 ) {
-                       global $wgSeleniumConfigFile;
-                       if ( isset( $wgSeleniumConfigFile ) ) {
-                               $seleniumConfigFile = $wgSeleniumConfigFile;
-                       }
-               }
-
-               if ( strlen( $seleniumConfigFile ) == 0 || !file_exists( $seleniumConfigFile ) ) {
-                       throw new MWException( "Unable to read local Selenium Settings from " . $seleniumConfigFile . "\n" );
-               }
-
-               $configArray = parse_ini_file( $seleniumConfigFile, true );
-               if ( $configArray === false ) {
-                       throw new MWException( "Error parsing " . $seleniumConfigFile . "\n" );
-               }
-
-               if ( array_key_exists( 'SeleniumSettings', $configArray ) ) {
-                       wfSuppressWarnings();
-                       //we may need to change how this is set. But for now leave it in the ini file
-                       $seleniumBrowsers = $configArray['SeleniumSettings']['browsers'];
-
-                       $seleniumSettings['host'] = $configArray['SeleniumSettings']['host'];
-                       $seleniumSettings['port'] = $configArray['SeleniumSettings']['port'];
-                       $seleniumSettings['wikiUrl'] = $configArray['SeleniumSettings']['wikiUrl'];
-                       $seleniumSettings['username'] = $configArray['SeleniumSettings']['username'];
-                       $seleniumSettings['userPassword'] = $configArray['SeleniumSettings']['userPassword'];
-                       $seleniumSettings['testBrowser'] = $configArray['SeleniumSettings']['testBrowser'];
-                       $seleniumSettings['startserver'] = $configArray['SeleniumSettings']['startserver'];
-                       $seleniumSettings['stopserver'] = $configArray['SeleniumSettings']['stopserver'];
-                       $seleniumSettings['seleniumserverexecpath'] = $configArray['SeleniumSettings']['seleniumserverexecpath'];
-                       $seleniumSettings['jUnitLogFile'] = $configArray['SeleniumSettings']['jUnitLogFile'];
-                       $seleniumSettings['runAgainstGrid'] = $configArray['SeleniumSettings']['runAgainstGrid'];
-
-                       wfRestoreWarnings();
-               }
-               if ( array_key_exists( 'SeleniumTests', $configArray ) ) {
-                       wfSuppressWarnings();
-                       $seleniumTestSuites = $configArray['SeleniumTests']['testSuite'];
-                       wfRestoreWarnings();
-               }
-               return true;
-       }
-
-       private static function parse_ini_line( $iniLine ) {
-               static $specialValues = array( 'false' => false, 'true' => true, 'null' => null );
-               list( $key, $value ) = explode( '=', $iniLine, 2 );
-               $key = trim( $key );
-               $value = trim( $value );
-
-               if ( isset( $specialValues[$value] ) ) {
-                       $value = $specialValues[$value];
-               } else {
-                       $value = trim( $value, '"' );
-               }
-
-               /* Support one-level arrays */
-               if ( preg_match( '/^([A-Za-z]+)\[([A-Za-z]+)\]/', $key, $m ) ) {
-                       $key = $m[1];
-                       $value = array( $m[2] => $value );
-               }
-
-               return array( $key => $value );
-       }
-}
diff --git a/tests/selenium/SeleniumLoader.php b/tests/selenium/SeleniumLoader.php
deleted file mode 100644 (file)
index 8d5e771..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-class SeleniumLoader {
-       static function load() {
-               require_once( 'Testing/Selenium.php' );
-               require_once( 'PHPUnit/Framework.php' );
-               require_once( 'PHPUnit/Extensions/SeleniumTestCase.php' );
-       }
-}
diff --git a/tests/selenium/SeleniumServerManager.php b/tests/selenium/SeleniumServerManager.php
deleted file mode 100644 (file)
index 9efa509..0000000
+++ /dev/null
@@ -1,252 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Dan Nessett <dnessett@yahoo.com>
- * http://citizendium.org/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-class SeleniumServerManager {
-       private $SeleniumStartServer = false;
-       private $OS = '';
-       private $SeleniumServerPid = 'NaN';
-       private $SeleniumServerPort = 4444;
-       private $SeleniumServerStartTimeout = 10; // 10 secs.
-       private $SeleniumServerExecPath;
-
-       public function __construct( $startServer,
-                                                                $serverPort,
-                                                                $serverExecPath ) {
-               $this->OS = (string)PHP_OS;
-
-               if ( isset( $startServer ) ) {
-                       $this->SeleniumStartServer = $startServer;
-               }
-
-               if ( isset( $serverPort ) ) {
-                       $this->SeleniumServerPort = $serverPort;
-               }
-
-               if ( isset( $serverExecPath ) ) {
-                       $this->SeleniumServerExecPath = $serverExecPath;
-               }
-
-               return;
-       }
-
-       // Getters for certain private attributes. No setters, since they
-       // should not change after the manager object is created.
-
-       public function getSeleniumStartServer() {
-               return $this->SeleniumStartServer;
-       }
-
-       public function getSeleniumServerPort() {
-               return $this->SeleniumServerPort;
-       }
-
-       public function getSeleniumServerPid() {
-               return $this->SeleniumServerPid;
-       }
-
-       // Changing value of SeleniumStartServer allows starting server after
-       // creation of the class instance. Only allow setting SeleniumStartServer
-       // to true, since after server is started, it is shut down by stop().
-
-       public function setSeleniumStartServer( $startServer ) {
-               if ( $startServer == true ) {
-                       $this->SeleniumStartServer = true;
-               }
-       }
-
-       // return values are: 1) started - server started, 2) failed -
-       // server not started, 3) running - instructed to start server, but
-       // server already running
-
-       public function start() {
-
-               if ( !$this->SeleniumStartServer ) {
-                       return 'failed';
-               }
-
-               // commented out cases are untested
-
-               switch ( $this->OS ) {
-                       case "Linux":
-#                      case' CYGWIN_NT-5.1':
-                       case 'Darwin':
-#                      case 'FreeBSD':
-#                      case 'HP-UX':
-#                      case 'IRIX64':
-#                      case 'NetBSD':
-#                      case 'OpenBSD':
-#                      case 'SunOS':
-#                      case 'Unix':
-                               // *nix based OS
-                               return $this->startServerOnUnix();
-                               break;
-                       case "Windows":
-                       case "WIN32":
-                       case "WINNT":
-                               // Windows
-                               return $this->startServerOnWindows();
-                               break;
-                       default:
-                               // An untested OS
-                               return 'failed';
-                               break;
-               }
-       }
-
-       public function stop() {
-
-               // commented out cases are untested
-
-               switch ( $this->OS ) {
-                       case "Linux":
-#                      case' CYGWIN_NT-5.1':
-                       case 'Darwin':
-#                      case 'FreeBSD':
-#                      case 'HP-UX':
-#                      case 'IRIX64':
-#                      case 'NetBSD':
-#                      case 'OpenBSD':
-#                      case 'SunOS':
-#                      case 'Unix':
-                               // *nix based OS
-                               return $this->stopServerOnUnix();
-                               break;
-                       case "Windows":
-                       case "WIN32":
-                       case "WINNT":
-                               // Windows
-                               return $this->stopServerOnWindows();
-                               break;
-                       default:
-                               // An untested OS
-                               return 'failed';
-                               break;
-               }
-       }
-
-       private function startServerOnUnix() {
-
-               $output = array();
-               $user = $_ENV['USER'];
-               // @todo FIXME: This should be a little more generalized :)
-               if ( PHP_OS == 'Darwin' ) {
-                       // Mac OS X's ps barfs on the 'w' param, but doesn't need it.
-                       $ps = "ps -U %s";
-               } else {
-                       // Good on Linux
-                       $ps = "ps -U %s w";
-               }
-               $psCommand = sprintf( $ps, escapeshellarg( $user ) );
-               exec( $psCommand . " | grep -i selenium-server", $output );
-
-               // Start server. If there is already a server running,
-               // return running.
-
-               if ( isset( $this->SeleniumServerExecPath ) ) {
-                       $found = 0;
-                       foreach ( $output as $string ) {
-                               $found += preg_match(
-                                       '~^(.*)java(.+)-jar(.+)selenium-server~',
-                                       $string );
-                       }
-                       if ( $found == 0 ) {
-
-                               // Didn't find the selenium server. Start it up.
-                               // First set up comamand line suffix.
-                               // NB: $! is pid of last job run in background
-                               // The echo guarentees it is put into $op when
-                               // the exec command is run.
-
-                               $commandSuffix = ' > /dev/null 2>&1' . ' & echo $!';
-                               $portText = ' -port ' . $this->SeleniumServerPort;
-                               $command = "java -jar " .
-                                       escapeshellarg( $this->SeleniumServerExecPath ) .
-                                       $portText . $commandSuffix;
-                               exec( $command, $op );
-                               $pid = (int)$op[0];
-                               if ( $pid != "" ) {
-                                       $this->SeleniumServerPid = $pid;
-                               } else {
-                                       $this->SeleniumServerPid = 'NaN';
-                                       // Server start failed.
-                                       return 'failed';
-                               }
-                               // Wait for the server to startup and listen
-                               // on its port. Note: this solution kinda
-                               // stinks, since it uses a wait loop - dnessett
-
-                               wfSuppressWarnings();
-                               for ( $cnt = 1;
-                                         $cnt <= $this->SeleniumServerStartTimeout;
-                                         $cnt++ ) {
-                                       $fp = fsockopen( 'localhost',
-                                               $this->SeleniumServerPort,
-                                               $errno, $errstr, 0 );
-                                       if ( !$fp ) {
-                                               sleep( 1 );
-                                               continue;
-                                               // Server start succeeded.
-                                       } else {
-                                               fclose( $fp );
-                                               return 'started';
-                                       }
-                               }
-                               wfRestoreWarnings();
-                               echo ( "Starting Selenium server timed out.\n" );
-                               return 'failed';
-                       } else {
-                               // server already running.
-                               return 'running';
-                       }
-
-               }
-
-               // No Server execution path defined.
-               return 'failed';
-       }
-
-       private function startServerOnWindows() {
-               // Unimplemented.
-               return 'failed';
-       }
-
-       private function stopServerOnUnix() {
-
-               if ( !empty( $this->SeleniumServerPid ) &&
-                       $this->SeleniumServerPid != 'NaN'
-               ) {
-                       exec( "kill -9 " . $this->SeleniumServerPid );
-                       return 'stopped';
-               } else {
-                       return 'failed';
-               }
-       }
-
-       private function stopServerOnWindows() {
-               // Unimplemented.
-               return 'failed';
-
-       }
-}
diff --git a/tests/selenium/SeleniumTestCase.php b/tests/selenium/SeleniumTestCase.php
deleted file mode 100644 (file)
index 5346b1b..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-<?php
-include( "SeleniumTestConstants.php" );
-
-class SeleniumTestCase extends PHPUnit_Framework_TestCase { // PHPUnit_Extensions_SeleniumTestCase
-       protected $selenium;
-
-       public function setUp() {
-               set_time_limit( 60 );
-               $this->selenium = Selenium::getInstance();
-       }
-
-       public function tearDown() {
-
-       }
-
-       public function __call( $method, $args ) {
-               return call_user_func_array( array( $this->selenium, $method ), $args );
-       }
-
-       public function assertSeleniumAttributeEquals( $attribute, $value ) {
-               $attr = $this->getAttribute( $attribute );
-               $this->assertEquals( $attr, $value );
-       }
-
-       public function assertSeleniumHTMLContains( $element, $text ) {
-               $innerHTML = $this->getText( $element );
-               // or assertContains
-               $this->assertRegExp( "/$text/", $innerHTML );
-       }
-
-
-       /**
-        * Create a test fixture page if one does not exist
-        * @param $pageName The fixture page name. If none is supplied, it uses SeleniumTestConstants::WIKI_INTERNAL_LINK
-        */
-       function createTestPageIfMissing( $pageName = null ) {
-               if ( $pageName == null ) {
-                       $pageName = SeleniumTestConstants::WIKI_INTERNAL_LINK;
-               }
-               $this->type( SeleniumTestConstants::INPUT_SEARCH_BOX, $pageName );
-               $this->click( SeleniumTestConstants::BUTTON_SEARCH );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-               $this->click( SeleniumTestConstants::LINK_START . $pageName );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-               $location = $this->getLocation() . "\n";
-               if ( strpos( $location, '&redlink=1' ) !== false ) {
-                       $this->type( SeleniumTestConstants::TEXT_EDITOR, "Test fixture page. No real content here" );
-                       $this->click( SeleniumTestConstants::BUTTON_SAVE );
-                       $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-                       $this->assertTrue( $this->isTextPresent( $pageName ),
-                               $this->getText( SeleniumTestConstants::TEXT_PAGE_HEADING ) );
-               }
-       }
-
-       /**
-        * Create a test page using date as part of the name so that it is unique
-        * @param $pagePrefix The prefix to use for the page name. The current date will be appended to this to make it unique
-        * @param $watchThis Whether to add the page to my watchlist. Defaults to false.
-        */
-       function createNewTestPage( $pagePrefix, $watchThis = false ) {
-               $pageName = $pagePrefix . date( "Ymd-His" );
-               $this->type( SeleniumTestConstants::INPUT_SEARCH_BOX, $pageName );
-               $this->click( SeleniumTestConstants::BUTTON_SEARCH );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-               $this->click( SeleniumTestConstants::LINK_START . $pageName );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-               $location = $this->getLocation() . "\n";
-               $this->assertContains( '&redlink=1', $location ) .
-                       $this->type( SeleniumTestConstants::TEXT_EDITOR, "Test fixture page. No real content here" );
-               if ( $watchThis ) {
-                       $this->click( "wpWatchthis" );
-               }
-               $this->click( SeleniumTestConstants::BUTTON_SAVE );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-               $this->assertTrue( $this->isTextPresent( $pageName ),
-                       $this->getText( SeleniumTestConstants::TEXT_PAGE_HEADING ) );
-               return $pageName;
-       }
-
-       public function getExistingPage() {
-               $this->open( $this->getUrl() .
-                       '/index.php?title=Main_Page&action=edit' );
-               $this->type( "searchInput", "new" );
-               $this->click( "searchGoButton" );
-               $this->waitForPageToLoad( "30000" );
-       }
-
-       public function getNewPage( $pageName ) {
-
-               $this->open( $this->getUrl() .
-                       '/index.php?title=Main_Page&action=edit' );
-               $this->type( "searchInput", $pageName );
-               $this->click( "searchGoButton" );
-               $this->waitForPageToLoad( "30000" );
-               $this->click( "link=" . $pageName );
-               $this->waitForPageToLoad( "600000" );
-
-
-       }
-
-       // Loading the mediawiki editor
-       public function loadWikiEditor() {
-               $this->open( $this->getUrl() .
-                       '/index.php?title=Main_Page&action=edit' );
-       }
-
-       // Clear the content of the mediawiki editor
-       public function clearWikiEditor() {
-               $this->type( "wpTextbox1", "" );
-       }
-
-       // Click on the 'Show preview' button of the mediawiki editor
-       public function clickShowPreviewBtn() {
-               $this->click( "wpPreview" );
-       }
-
-       // Click on the 'Save Page' button of the mediawiki editor
-       public function clickSavePageBtn() {
-               $this->click( "wpSave" );
-       }
-
-       // Click on the 'Edit' link
-       public function clickEditLink() {
-               $this->click( "link=Edit" );
-               $this->waitForPageToLoad( "30000" );
-       }
-}
diff --git a/tests/selenium/SeleniumTestConsoleLogger.php b/tests/selenium/SeleniumTestConsoleLogger.php
deleted file mode 100644 (file)
index b6f5496..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
-class SeleniumTestConsoleLogger {
-       public function __construct() {
-               // Prepare testsuite for immediate output
-               @ini_set( 'zlib.output_compression', 0 );
-               @ini_set( 'implicit_flush', 1 );
-               for ( $i = 0; $i < ob_get_level(); $i++ ) {
-                       ob_end_flush();
-               }
-               ob_implicit_flush( 1 );
-       }
-
-       public function write( $message, $mode = false ) {
-               $out = '';
-               // if ( $mode == SeleniumTestSuite::RESULT_OK ) $out .= '<font color="green">';
-               $out .= htmlentities( $message );
-               // if ( $mode == SeleniumTestSuite::RESULT_OK ) $out .= '</font>';
-               if ( $mode != SeleniumTestSuite::CONTINUE_LINE ) {
-                       $out .= "\n";
-               }
-
-               echo $out;
-       }
-}
diff --git a/tests/selenium/SeleniumTestConstants.php b/tests/selenium/SeleniumTestConstants.php
deleted file mode 100644 (file)
index 1defb73..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-class SeleniumTestConstants {
-       const WIKI_TEST_WAIT_TIME = 3000; // Waiting time
-
-       //commonly used links
-       const LINK_MAIN_PAGE = 'link=Main page';
-       const LINK_RANDOM_PAGE = 'link=Random article';
-       const TEXT_PAGE_HEADING = 'firstHeading';
-
-       const LINK_START = 'link=';
-       const TEXT_EDITOR = 'wpTextbox1';
-       const LINK_PREVIEW = 'wpPreview';
-       const LINK_EDIT = 'link=Edit';
-
-       const WIKI_SEARCH_PAGE = 'Hair (musical)'; // Page name to search
-       const WIKI_TEXT_SEARCH = 'TV'; // Text to search
-       const WIKI_INTERNAL_LINK = 'Wikieditor-Fixture-Page'; // Exisiting page name to add as an internal tag
-
-       const INPUT_SEARCH_BOX = 'searchInput';
-       const BUTTON_SEARCH = 'mw-searchButton';
-       const BUTTON_SAVE = 'wpSave';
-}
-
diff --git a/tests/selenium/SeleniumTestHTMLLogger.php b/tests/selenium/SeleniumTestHTMLLogger.php
deleted file mode 100644 (file)
index 21332cf..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-
-class SeleniumTestHTMLLogger {
-       public function setHeaders() {
-               global $wgOut;
-               $wgOut->addHeadItem( 'selenium', '<style type="text/css">
-               .selenium pre {
-                       overflow-x: auto; /* Use horizontal scroller if needed; for Firefox 2, not needed in Firefox 3 */
-                       white-space: pre-wrap; /* css-3 */
-                       white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */
-                       white-space: -pre-wrap; /* Opera 4-6 */
-                       white-space: -o-pre-wrap; /* Opera 7 */
-                       /* width: 99%; */
-                       word-wrap: break-word; /* Internet Explorer 5.5+ */
-               }
-               .selenium-success { color: green }
-               </style>' );
-       }
-
-       public function write( $message, $mode = false ) {
-               global $wgOut;
-               $out = '';
-               if ( $mode == SeleniumTestSuite::RESULT_OK ) {
-                       $out .= '<span class="selenium-success">';
-               }
-               $out .= htmlspecialchars( $message );
-               if ( $mode == SeleniumTestSuite::RESULT_OK ) {
-                       $out .= '</span>';
-               }
-               if ( $mode != SeleniumTestSuite::CONTINUE_LINE ) {
-                       $out .= '<br />';
-               }
-
-               $wgOut->addHTML( $out );
-       }
-}
diff --git a/tests/selenium/SeleniumTestListener.php b/tests/selenium/SeleniumTestListener.php
deleted file mode 100644 (file)
index dc0ac66..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-
-class SeleniumTestListener implements PHPUnit_Framework_TestListener {
-       private $logger;
-       private $tests_ok = 0;
-       private $tests_failed = 0;
-
-       public function __construct( $loggerInstance ) {
-               $this->logger = $loggerInstance;
-       }
-
-       public function addError( PHPUnit_Framework_Test $test, Exception $e, $time ) {
-               $this->logger->write( 'Error: ' . $e->getMessage() );
-               $this->tests_failed++;
-       }
-
-       public function addFailure( PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time ) {
-               $this->logger->write( 'Failed: ' . $e->getMessage() );
-               $this->tests_failed++;
-       }
-
-       public function addIncompleteTest( PHPUnit_Framework_Test $test, Exception $e, $time ) {
-               $this->logger->write( 'Incomplete.' );
-               $this->tests_failed++;
-       }
-
-       public function addSkippedTest( PHPUnit_Framework_Test $test, Exception $e, $time ) {
-               $this->logger->write( 'Skipped.' );
-               $this->tests_failed++;
-       }
-
-       public function startTest( PHPUnit_Framework_Test $test ) {
-               $this->logger->write(
-                       'Testing ' . $test->getName() . ' ... ',
-                       SeleniumTestSuite::CONTINUE_LINE
-               );
-       }
-
-       public function endTest( PHPUnit_Framework_Test $test, $time ) {
-               if ( !$test->hasFailed() ) {
-                       $this->logger->write( 'OK', SeleniumTestSuite::RESULT_OK );
-                       $this->tests_ok++;
-               }
-       }
-
-       public function startTestSuite( PHPUnit_Framework_TestSuite $suite ) {
-               $this->logger->write( 'Testsuite ' . $suite->getName() . ' started.' );
-               $this->tests_ok = 0;
-               $this->tests_failed = 0;
-       }
-
-       public function endTestSuite( PHPUnit_Framework_TestSuite $suite ) {
-               $this->logger->write( 'Testsuite ' . $suite->getName() . ' ended.' );
-               if ( $this->tests_ok > 0 || $this->tests_failed > 0 ) {
-                       $this->logger->write( ' OK: ' . $this->tests_ok . ' Failed: ' . $this->tests_failed );
-               }
-               $this->tests_ok = 0;
-               $this->tests_failed = 0;
-       }
-
-       public function statusMessage( $message ) {
-               $this->logger->write( $message );
-       }
-}
-
diff --git a/tests/selenium/SeleniumTestSuite.php b/tests/selenium/SeleniumTestSuite.php
deleted file mode 100644 (file)
index 8c21f21..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-<?php
-
-abstract class SeleniumTestSuite extends PHPUnit_Framework_TestSuite {
-       private $selenium;
-       private $isSetUp = false;
-       private $loginBeforeTests = true;
-       private $triggerClientTestResources = true;
-
-       // Do not add line break after test output
-       const CONTINUE_LINE = 1;
-       const RESULT_OK = 2;
-       const RESULT_ERROR = 3;
-
-       abstract public function addTests();
-
-       public function setUp() {
-               // Hack because because PHPUnit version 3.0.6 which is on prototype does not
-               // run setUp as part of TestSuite::run
-               if ( $this->isSetUp ) {
-                       return;
-               }
-               $this->isSetUp = true;
-               $this->selenium = Selenium::getInstance();
-               $this->selenium->start();
-               if ( $this->triggerClientTestResources ) {
-                       $this->selenium->open( $this->selenium->getUrl() . '/index.php?setupTestSuite=' . $this->getName() );
-                       //wait a little longer for the db operation
-                       $this->selenium->waitForPageToLoad( 6000 );
-               }
-               if ( $this->loginBeforeTests ) {
-                       $this->login();
-               }
-       }
-
-       public function tearDown() {
-               if ( $this->triggerClientTestResources ) {
-                       $this->selenium->open( $this->selenium->getUrl() . '/index.php?clearTestSuite=' . $this->getName() );
-               }
-               $this->selenium->stop();
-       }
-
-       public function login() {
-               $this->selenium->login();
-       }
-
-       public function loadPage( $title, $action ) {
-               $this->selenium->loadPage( $title, $action );
-       }
-
-       protected function setLoginBeforeTests( $loginBeforeTests = true ) {
-               $this->loginBeforeTests = $loginBeforeTests;
-       }
-
-       protected function setTriggerClientTestResources( $triggerClientTestResources = true ) {
-               $this->triggerClientTestResources = $triggerClientTestResources;
-       }
-}
diff --git a/tests/selenium/data/SimpleSeleniumTestDB.sql b/tests/selenium/data/SimpleSeleniumTestDB.sql
deleted file mode 100644 (file)
index 99ae477..0000000
+++ /dev/null
@@ -1,1453 +0,0 @@
--- MySQL dump 10.13  Distrib 5.1.41, for debian-linux-gnu (x86_64)
---
--- Host: localhost    Database: test_wiki
--- ------------------------------------------------------
--- Server version      5.1.41-3ubuntu12.7
-
-/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
-/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
-/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
-/*!40101 SET NAMES utf8 */;
-/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
-/*!40103 SET TIME_ZONE='+00:00' */;
-/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
-/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
-/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
-/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
-
---
--- Table structure for table `mw_archive`
---
-
-DROP TABLE IF EXISTS `mw_archive`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_archive` (
-  `ar_namespace` int(11) NOT NULL DEFAULT '0',
-  `ar_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `ar_text` mediumblob NOT NULL,
-  `ar_comment` tinyblob NOT NULL,
-  `ar_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `ar_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `ar_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `ar_minor_edit` tinyint(4) NOT NULL DEFAULT '0',
-  `ar_flags` tinyblob NOT NULL,
-  `ar_rev_id` int(10) unsigned DEFAULT NULL,
-  `ar_text_id` int(10) unsigned DEFAULT NULL,
-  `ar_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `ar_len` int(10) unsigned DEFAULT NULL,
-  `ar_page_id` int(10) unsigned DEFAULT NULL,
-  `ar_parent_id` int(10) unsigned DEFAULT NULL,
-  KEY `name_title_timestamp` (`ar_namespace`,`ar_title`,`ar_timestamp`),
-  KEY `usertext_timestamp` (`ar_user_text`,`ar_timestamp`),
-  KEY `ar_revid` (`ar_rev_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_archive`
---
-
-LOCK TABLES `mw_archive` WRITE;
-/*!40000 ALTER TABLE `mw_archive` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_archive` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_category`
---
-
-DROP TABLE IF EXISTS `mw_category`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_category` (
-  `cat_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `cat_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `cat_pages` int(11) NOT NULL DEFAULT '0',
-  `cat_subcats` int(11) NOT NULL DEFAULT '0',
-  `cat_files` int(11) NOT NULL DEFAULT '0',
-  `cat_hidden` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  PRIMARY KEY (`cat_id`),
-  UNIQUE KEY `cat_title` (`cat_title`),
-  KEY `cat_pages` (`cat_pages`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_category`
---
-
-LOCK TABLES `mw_category` WRITE;
-/*!40000 ALTER TABLE `mw_category` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_category` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_categorylinks`
---
-
-DROP TABLE IF EXISTS `mw_categorylinks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_categorylinks` (
-  `cl_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `cl_to` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `cl_sortkey` varbinary(230) NOT NULL DEFAULT '',
-  `cl_sortkey_prefix` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `cl_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-  `cl_collation` varbinary(32) NOT NULL DEFAULT '',
-  `cl_type` enum('page','subcat','file') NOT NULL DEFAULT 'page',
-  UNIQUE KEY `cl_from` (`cl_from`,`cl_to`),
-  KEY `cl_sortkey` (`cl_to`,`cl_type`,`cl_sortkey`,`cl_from`),
-  KEY `cl_timestamp` (`cl_to`,`cl_timestamp`),
-  KEY `cl_collation` (`cl_collation`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_categorylinks`
---
-
-LOCK TABLES `mw_categorylinks` WRITE;
-/*!40000 ALTER TABLE `mw_categorylinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_categorylinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_change_tag`
---
-
-DROP TABLE IF EXISTS `mw_change_tag`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_change_tag` (
-  `ct_rc_id` int(11) DEFAULT NULL,
-  `ct_log_id` int(11) DEFAULT NULL,
-  `ct_rev_id` int(11) DEFAULT NULL,
-  `ct_tag` varchar(255) NOT NULL,
-  `ct_params` blob,
-  UNIQUE KEY `change_tag_rc_tag` (`ct_rc_id`,`ct_tag`),
-  UNIQUE KEY `change_tag_log_tag` (`ct_log_id`,`ct_tag`),
-  UNIQUE KEY `change_tag_rev_tag` (`ct_rev_id`,`ct_tag`),
-  KEY `change_tag_tag_id` (`ct_tag`,`ct_rc_id`,`ct_rev_id`,`ct_log_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_change_tag`
---
-
-LOCK TABLES `mw_change_tag` WRITE;
-/*!40000 ALTER TABLE `mw_change_tag` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_change_tag` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_external_user`
---
-
-DROP TABLE IF EXISTS `mw_external_user`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_external_user` (
-  `eu_local_id` int(10) unsigned NOT NULL,
-  `eu_external_id` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  PRIMARY KEY (`eu_local_id`),
-  UNIQUE KEY `eu_external_id` (`eu_external_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_external_user`
---
-
-LOCK TABLES `mw_external_user` WRITE;
-/*!40000 ALTER TABLE `mw_external_user` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_external_user` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_externallinks`
---
-
-DROP TABLE IF EXISTS `mw_externallinks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_externallinks` (
-  `el_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `el_to` blob NOT NULL,
-  `el_index` blob NOT NULL,
-  KEY `el_from` (`el_from`,`el_to`(40)),
-  KEY `el_to` (`el_to`(60),`el_from`),
-  KEY `el_index` (`el_index`(60))
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_externallinks`
---
-
-LOCK TABLES `mw_externallinks` WRITE;
-/*!40000 ALTER TABLE `mw_externallinks` DISABLE KEYS */;
-INSERT INTO `mw_externallinks` VALUES (1,'http://meta.wikimedia.org/wiki/Help:Contents','http://org.wikimedia.meta./wiki/Help:Contents'),(1,'http://www.mediawiki.org/wiki/Manual:Configuration_settings','http://org.mediawiki.www./wiki/Manual:Configuration_settings'),(1,'http://www.mediawiki.org/wiki/Manual:FAQ','http://org.mediawiki.www./wiki/Manual:FAQ'),(1,'https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce','https://org.wikimedia.lists./mailman/listinfo/mediawiki-announce');
-/*!40000 ALTER TABLE `mw_externallinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_filearchive`
---
-
-DROP TABLE IF EXISTS `mw_filearchive`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_filearchive` (
-  `fa_id` int(11) NOT NULL AUTO_INCREMENT,
-  `fa_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `fa_archive_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '',
-  `fa_storage_group` varbinary(16) DEFAULT NULL,
-  `fa_storage_key` varbinary(64) DEFAULT '',
-  `fa_deleted_user` int(11) DEFAULT NULL,
-  `fa_deleted_timestamp` binary(14) DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `fa_deleted_reason` text,
-  `fa_size` int(10) unsigned DEFAULT '0',
-  `fa_width` int(11) DEFAULT '0',
-  `fa_height` int(11) DEFAULT '0',
-  `fa_metadata` mediumblob,
-  `fa_bits` int(11) DEFAULT '0',
-  `fa_media_type` enum('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE') DEFAULT NULL,
-  `fa_major_mime` enum('unknown','application','audio','image','text','video','message','model','multipart') DEFAULT 'unknown',
-  `fa_minor_mime` varbinary(100) DEFAULT 'unknown',
-  `fa_description` tinyblob,
-  `fa_user` int(10) unsigned DEFAULT '0',
-  `fa_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
-  `fa_timestamp` binary(14) DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `fa_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  PRIMARY KEY (`fa_id`),
-  KEY `fa_name` (`fa_name`,`fa_timestamp`),
-  KEY `fa_storage_group` (`fa_storage_group`,`fa_storage_key`),
-  KEY `fa_deleted_timestamp` (`fa_deleted_timestamp`),
-  KEY `fa_user_timestamp` (`fa_user_text`,`fa_timestamp`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_filearchive`
---
-
-LOCK TABLES `mw_filearchive` WRITE;
-/*!40000 ALTER TABLE `mw_filearchive` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_filearchive` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_hitcounter`
---
-
-DROP TABLE IF EXISTS `mw_hitcounter`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_hitcounter` (
-  `hc_id` int(10) unsigned NOT NULL
-) ENGINE=MEMORY DEFAULT CHARSET=latin1 MAX_ROWS=25000;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_hitcounter`
---
-
-LOCK TABLES `mw_hitcounter` WRITE;
-/*!40000 ALTER TABLE `mw_hitcounter` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_hitcounter` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_image`
---
-
-DROP TABLE IF EXISTS `mw_image`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_image` (
-  `img_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `img_size` int(10) unsigned NOT NULL DEFAULT '0',
-  `img_width` int(11) NOT NULL DEFAULT '0',
-  `img_height` int(11) NOT NULL DEFAULT '0',
-  `img_metadata` mediumblob NOT NULL,
-  `img_bits` int(11) NOT NULL DEFAULT '0',
-  `img_media_type` enum('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE') DEFAULT NULL,
-  `img_major_mime` enum('unknown','application','audio','image','text','video','message','model','multipart') NOT NULL DEFAULT 'unknown',
-  `img_minor_mime` varbinary(100) NOT NULL DEFAULT 'unknown',
-  `img_description` tinyblob NOT NULL,
-  `img_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `img_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `img_timestamp` varbinary(14) NOT NULL DEFAULT '',
-  `img_sha1` varbinary(32) NOT NULL DEFAULT '',
-  PRIMARY KEY (`img_name`),
-  KEY `img_usertext_timestamp` (`img_user_text`,`img_timestamp`),
-  KEY `img_size` (`img_size`),
-  KEY `img_timestamp` (`img_timestamp`),
-  KEY `img_sha1` (`img_sha1`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_image`
---
-
-LOCK TABLES `mw_image` WRITE;
-/*!40000 ALTER TABLE `mw_image` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_image` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_imagelinks`
---
-
-DROP TABLE IF EXISTS `mw_imagelinks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_imagelinks` (
-  `il_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `il_to` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  UNIQUE KEY `il_from` (`il_from`,`il_to`),
-  UNIQUE KEY `il_to` (`il_to`,`il_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_imagelinks`
---
-
-LOCK TABLES `mw_imagelinks` WRITE;
-/*!40000 ALTER TABLE `mw_imagelinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_imagelinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_interwiki`
---
-
-DROP TABLE IF EXISTS `mw_interwiki`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_interwiki` (
-  `iw_prefix` varchar(32) NOT NULL,
-  `iw_url` blob NOT NULL,
-  `iw_api` blob NOT NULL,
-  `iw_wikiid` varchar(64) NOT NULL,
-  `iw_local` tinyint(1) NOT NULL,
-  `iw_trans` tinyint(4) NOT NULL DEFAULT '0',
-  UNIQUE KEY `iw_prefix` (`iw_prefix`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_interwiki`
---
-
-LOCK TABLES `mw_interwiki` WRITE;
-/*!40000 ALTER TABLE `mw_interwiki` DISABLE KEYS */;
-INSERT INTO `mw_interwiki` VALUES ('acronym','http://www.acronymfinder.com/af-query.asp?String=exact&Acronym=$1','','',0,0),('advogato','http://www.advogato.org/$1','','',0,0),('annotationwiki','http://www.seedwiki.com/page.cfm?wikiid=368&doc=$1','','',0,0),('arxiv','http://www.arxiv.org/abs/$1','','',0,0),('c2find','http://c2.com/cgi/wiki?FindPage&value=$1','','',0,0),('cache','http://www.google.com/search?q=cache:$1','','',0,0),('commons','http://commons.wikimedia.org/wiki/$1','','',0,0),('corpknowpedia','http://corpknowpedia.org/wiki/index.php/$1','','',0,0),('dictionary','http://www.dict.org/bin/Dict?Database=*&Form=Dict1&Strategy=*&Query=$1','','',0,0),('disinfopedia','http://www.disinfopedia.org/wiki.phtml?title=$1','','',0,0),('docbook','http://wiki.docbook.org/topic/$1','','',0,0),('doi','http://dx.doi.org/$1','','',0,0),('drumcorpswiki','http://www.drumcorpswiki.com/index.php/$1','','',0,0),('dwjwiki','http://www.suberic.net/cgi-bin/dwj/wiki.cgi?$1','','',0,0),('elibre','http://enciclopedia.us.es/index.php/$1','','',0,0),('emacswiki','http://www.emacswiki.org/cgi-bin/wiki.pl?$1','','',0,0),('foldoc','http://foldoc.org/?$1','','',0,0),('foxwiki','http://fox.wikis.com/wc.dll?Wiki~$1','','',0,0),('freebsdman','http://www.FreeBSD.org/cgi/man.cgi?apropos=1&query=$1','','',0,0),('gej','http://www.esperanto.de/cgi-bin/aktivikio/wiki.pl?$1','','',0,0),('gentoo-wiki','http://gentoo-wiki.com/$1','','',0,0),('google','http://www.google.com/search?q=$1','','',0,0),('googlegroups','http://groups.google.com/groups?q=$1','','',0,0),('hammondwiki','http://www.dairiki.org/HammondWiki/$1','','',0,0),('hewikisource','http://he.wikisource.org/wiki/$1','','',1,0),('hrwiki','http://www.hrwiki.org/index.php/$1','','',0,0),('imdb','http://us.imdb.com/Title?$1','','',0,0),('jargonfile','http://sunir.org/apps/meta.pl?wiki=JargonFile&redirect=$1','','',0,0),('jspwiki','http://www.jspwiki.org/wiki/$1','','',0,0),('keiki','http://kei.ki/en/$1','','',0,0),('kmwiki','http://kmwiki.wikispaces.com/$1','','',0,0),('linuxwiki','http://linuxwiki.de/$1','','',0,0),('lojban','http://www.lojban.org/tiki/tiki-index.php?page=$1','','',0,0),('lqwiki','http://wiki.linuxquestions.org/wiki/$1','','',0,0),('lugkr','http://lug-kr.sourceforge.net/cgi-bin/lugwiki.pl?$1','','',0,0),('mathsongswiki','http://SeedWiki.com/page.cfm?wikiid=237&doc=$1','','',0,0),('meatball','http://www.usemod.com/cgi-bin/mb.pl?$1','','',0,0),('mediawikiwiki','http://www.mediawiki.org/wiki/$1','','',0,0),('mediazilla','https://bugzilla.wikimedia.org/$1','','',1,0),('memoryalpha','http://www.memory-alpha.org/en/index.php/$1','','',0,0),('metawiki','http://sunir.org/apps/meta.pl?$1','','',0,0),('metawikimedia','http://meta.wikimedia.org/wiki/$1','','',0,0),('moinmoin','http://purl.net/wiki/moin/$1','','',0,0),('mozillawiki','http://wiki.mozilla.org/index.php/$1','','',0,0),('mw','http://www.mediawiki.org/wiki/$1','','',0,0),('oeis','http://www.research.att.com/cgi-bin/access.cgi/as/njas/sequences/eisA.cgi?Anum=$1','','',0,0),('openfacts','http://openfacts.berlios.de/index.phtml?title=$1','','',0,0),('openwiki','http://openwiki.com/?$1','','',0,0),('pmeg','http://www.bertilow.com/pmeg/$1.php','','',0,0),('ppr','http://c2.com/cgi/wiki?$1','','',0,0),('pythoninfo','http://wiki.python.org/moin/$1','','',0,0),('rfc','http://www.rfc-editor.org/rfc/rfc$1.txt','','',0,0),('s23wiki','http://is-root.de/wiki/index.php/$1','','',0,0),('seattlewiki','http://seattle.wikia.com/wiki/$1','','',0,0),('seattlewireless','http://seattlewireless.net/?$1','','',0,0),('senseislibrary','http://senseis.xmp.net/?$1','','',0,0),('sourceforge','http://sourceforge.net/$1','','',0,0),('squeak','http://wiki.squeak.org/squeak/$1','','',0,0),('susning','http://www.susning.nu/$1','','',0,0),('svgwiki','http://wiki.svg.org/$1','','',0,0),('tavi','http://tavi.sourceforge.net/$1','','',0,0),('tejo','http://www.tejo.org/vikio/$1','','',0,0),('theopedia','http://www.theopedia.com/$1','','',0,0),('tmbw','http://www.tmbw.net/wiki/$1','','',0,0),('tmnet','http://www.technomanifestos.net/?$1','','',0,0),('tmwiki','http://www.EasyTopicMaps.com/?page=$1','','',0,0),('twiki','http://twiki.org/cgi-bin/view/$1','','',0,0),('uea','http://www.tejo.org/uea/$1','','',0,0),('unreal','http://wiki.beyondunreal.com/wiki/$1','','',0,0),('usemod','http://www.usemod.com/cgi-bin/wiki.pl?$1','','',0,0),('vinismo','http://vinismo.com/en/$1','','',0,0),('webseitzwiki','http://webseitz.fluxent.com/wiki/$1','','',0,0),('why','http://clublet.com/c/c/why?$1','','',0,0),('wiki','http://c2.com/cgi/wiki?$1','','',0,0),('wikia','http://www.wikia.com/wiki/$1','','',0,0),('wikibooks','http://en.wikibooks.org/wiki/$1','','',1,0),('wikicities','http://www.wikia.com/wiki/$1','','',0,0),('wikif1','http://www.wikif1.org/$1','','',0,0),('wikihow','http://www.wikihow.com/$1','','',0,0),('wikimedia','http://wikimediafoundation.org/wiki/$1','','',0,0),('wikinews','http://en.wikinews.org/wiki/$1','','',1,0),('wikinfo','http://www.wikinfo.org/index.php/$1','','',0,0),('wikipedia','http://en.wikipedia.org/wiki/$1','','',1,0),('wikiquote','http://en.wikiquote.org/wiki/$1','','',1,0),('wikisource','http://wikisource.org/wiki/$1','','',1,0),('wikispecies','http://species.wikimedia.org/wiki/$1','','',1,0),('wikitravel','http://wikitravel.org/en/$1','','',0,0),('wikiversity','http://en.wikiversity.org/wiki/$1','','',1,0),('wikt','http://en.wiktionary.org/wiki/$1','','',1,0),('wiktionary','http://en.wiktionary.org/wiki/$1','','',1,0),('wlug','http://www.wlug.org.nz/$1','','',0,0),('zwiki','http://zwiki.org/$1','','',0,0),('zzz wiki','http://wiki.zzz.ee/index.php/$1','','',0,0);
-/*!40000 ALTER TABLE `mw_interwiki` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_ipblocks`
---
-
-DROP TABLE IF EXISTS `mw_ipblocks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_ipblocks` (
-  `ipb_id` int(11) NOT NULL AUTO_INCREMENT,
-  `ipb_address` tinyblob NOT NULL,
-  `ipb_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `ipb_by` int(10) unsigned NOT NULL DEFAULT '0',
-  `ipb_by_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `ipb_reason` tinyblob NOT NULL,
-  `ipb_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `ipb_auto` tinyint(1) NOT NULL DEFAULT '0',
-  `ipb_anon_only` tinyint(1) NOT NULL DEFAULT '0',
-  `ipb_create_account` tinyint(1) NOT NULL DEFAULT '1',
-  `ipb_enable_autoblock` tinyint(1) NOT NULL DEFAULT '1',
-  `ipb_expiry` varbinary(14) NOT NULL DEFAULT '',
-  `ipb_range_start` tinyblob NOT NULL,
-  `ipb_range_end` tinyblob NOT NULL,
-  `ipb_deleted` tinyint(1) NOT NULL DEFAULT '0',
-  `ipb_block_email` tinyint(1) NOT NULL DEFAULT '0',
-  `ipb_allow_usertalk` tinyint(1) NOT NULL DEFAULT '0',
-  PRIMARY KEY (`ipb_id`),
-  UNIQUE KEY `ipb_address` (`ipb_address`(255),`ipb_user`,`ipb_auto`,`ipb_anon_only`),
-  KEY `ipb_user` (`ipb_user`),
-  KEY `ipb_range` (`ipb_range_start`(8),`ipb_range_end`(8)),
-  KEY `ipb_timestamp` (`ipb_timestamp`),
-  KEY `ipb_expiry` (`ipb_expiry`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_ipblocks`
---
-
-LOCK TABLES `mw_ipblocks` WRITE;
-/*!40000 ALTER TABLE `mw_ipblocks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_ipblocks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_iwlinks`
---
-
-DROP TABLE IF EXISTS `mw_iwlinks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_iwlinks` (
-  `iwl_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `iwl_prefix` varbinary(20) NOT NULL DEFAULT '',
-  `iwl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  UNIQUE KEY `iwl_from` (`iwl_from`,`iwl_prefix`,`iwl_title`),
-  UNIQUE KEY `iwl_prefix_title_from` (`iwl_prefix`,`iwl_title`,`iwl_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_iwlinks`
---
-
-LOCK TABLES `mw_iwlinks` WRITE;
-/*!40000 ALTER TABLE `mw_iwlinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_iwlinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_job`
---
-
-DROP TABLE IF EXISTS `mw_job`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_job` (
-  `job_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `job_cmd` varbinary(60) NOT NULL DEFAULT '',
-  `job_namespace` int(11) NOT NULL,
-  `job_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `job_params` blob NOT NULL,
-  PRIMARY KEY (`job_id`),
-  KEY `job_cmd` (`job_cmd`,`job_namespace`,`job_title`,`job_params`(128))
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_job`
---
-
-LOCK TABLES `mw_job` WRITE;
-/*!40000 ALTER TABLE `mw_job` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_job` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_l10n_cache`
---
-
-DROP TABLE IF EXISTS `mw_l10n_cache`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_l10n_cache` (
-  `lc_lang` varbinary(32) NOT NULL,
-  `lc_key` varchar(255) NOT NULL,
-  `lc_value` mediumblob NOT NULL,
-  KEY `lc_lang_key` (`lc_lang`,`lc_key`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_l10n_cache`
---
-
-LOCK TABLES `mw_l10n_cache` WRITE;
-/*!40000 ALTER TABLE `mw_l10n_cache` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_l10n_cache` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_langlinks`
---
-
-DROP TABLE IF EXISTS `mw_langlinks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_langlinks` (
-  `ll_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `ll_lang` varbinary(20) NOT NULL DEFAULT '',
-  `ll_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  UNIQUE KEY `ll_from` (`ll_from`,`ll_lang`),
-  KEY `ll_lang` (`ll_lang`,`ll_title`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_langlinks`
---
-
-LOCK TABLES `mw_langlinks` WRITE;
-/*!40000 ALTER TABLE `mw_langlinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_langlinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_log_search`
---
-
-DROP TABLE IF EXISTS `mw_log_search`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_log_search` (
-  `ls_field` varbinary(32) NOT NULL,
-  `ls_value` varchar(255) NOT NULL,
-  `ls_log_id` int(10) unsigned NOT NULL DEFAULT '0',
-  UNIQUE KEY `ls_field_val` (`ls_field`,`ls_value`,`ls_log_id`),
-  KEY `ls_log_id` (`ls_log_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_log_search`
---
-
-LOCK TABLES `mw_log_search` WRITE;
-/*!40000 ALTER TABLE `mw_log_search` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_log_search` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_logging`
---
-
-DROP TABLE IF EXISTS `mw_logging`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_logging` (
-  `log_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `log_type` varbinary(32) NOT NULL DEFAULT '',
-  `log_action` varbinary(32) NOT NULL DEFAULT '',
-  `log_timestamp` binary(14) NOT NULL DEFAULT '19700101000000',
-  `log_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `log_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `log_namespace` int(11) NOT NULL DEFAULT '0',
-  `log_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `log_page` int(10) unsigned DEFAULT NULL,
-  `log_comment` varchar(255) NOT NULL DEFAULT '',
-  `log_params` blob NOT NULL,
-  `log_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  PRIMARY KEY (`log_id`),
-  KEY `type_time` (`log_type`,`log_timestamp`),
-  KEY `user_time` (`log_user`,`log_timestamp`),
-  KEY `page_time` (`log_namespace`,`log_title`,`log_timestamp`),
-  KEY `times` (`log_timestamp`),
-  KEY `log_user_type_time` (`log_user`,`log_type`,`log_timestamp`),
-  KEY `log_page_id_time` (`log_page`,`log_timestamp`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_logging`
---
-
-LOCK TABLES `mw_logging` WRITE;
-/*!40000 ALTER TABLE `mw_logging` DISABLE KEYS */;
-INSERT INTO `mw_logging` VALUES (1,'patrol','patrol','20110110173131',1,'WikiSysop',0,'TestResources',2,'','2\n0\n1',0);
-/*!40000 ALTER TABLE `mw_logging` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_math`
---
-
-DROP TABLE IF EXISTS `mw_math`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_math` (
-  `math_inputhash` varbinary(16) NOT NULL,
-  `math_outputhash` varbinary(16) NOT NULL,
-  `math_html_conservativeness` tinyint(4) NOT NULL,
-  `math_html` text,
-  `math_mathml` text,
-  UNIQUE KEY `math_inputhash` (`math_inputhash`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_math`
---
-
-LOCK TABLES `mw_math` WRITE;
-/*!40000 ALTER TABLE `mw_math` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_math` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_module_deps`
---
-
-DROP TABLE IF EXISTS `mw_module_deps`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_module_deps` (
-  `md_module` varbinary(255) NOT NULL,
-  `md_skin` varbinary(32) NOT NULL,
-  `md_deps` mediumblob NOT NULL,
-  UNIQUE KEY `md_module_skin` (`md_module`,`md_skin`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_module_deps`
---
-
-LOCK TABLES `mw_module_deps` WRITE;
-/*!40000 ALTER TABLE `mw_module_deps` DISABLE KEYS */;
-INSERT INTO `mw_module_deps` VALUES ('ext.vector.collapsibleNav','vector','[\"\\/home\\/pdhanda\\/deployment\\/extensions\\/Vector\\/modules\\/.\\/images\\/portal-break.png\",\"\\/home\\/pdhanda\\/deployment\\/extensions\\/Vector\\/modules\\/.\\/images\\/open.png\",\"\\/home\\/pdhanda\\/deployment\\/extensions\\/Vector\\/modules\\/.\\/images\\/closed-ltr.png\"]'),('jquery.wikiEditor','vector','[\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/loading.gif\"]'),('jquery.wikiEditor.toolbar','vector','{\"0\":\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/base.png\",\"1\":\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/loading.gif\",\"2\":\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/button-sprite.png\",\"3\":\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/arrow-right.png\",\"4\":\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/arrow-left.png\",\"5\":\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/arrow-down.png\",\"7\":\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/loading-small.gif\"}'),('mediawiki.legacy.shared','vector','[\"\\/home\\/pdhanda\\/deployment\\/skins\\/common\\/images\\/feed-icon.png\",\"\\/home\\/pdhanda\\/deployment\\/skins\\/common\\/images\\/remove.png\",\"\\/home\\/pdhanda\\/deployment\\/skins\\/common\\/images\\/add.png\",\"\\/home\\/pdhanda\\/deployment\\/skins\\/common\\/images\\/ajax-loader.gif\",\"\\/home\\/pdhanda\\/deployment\\/skins\\/common\\/images\\/spinner.gif\",\"\\/home\\/pdhanda\\/deployment\\/skins\\/common\\/images\\/help-question.gif\",\"\\/home\\/pdhanda\\/deployment\\/skins\\/common\\/images\\/help-question-hover.gif\"]'),('skins.vector','vector','{\"0\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/page-base.png\",\"1\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/border.png\",\"2\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/page-fade.png\",\"4\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/tab-break.png\",\"5\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/tab-normal-fade.png\",\"6\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/tab-current-fade.png\",\"8\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/arrow-down-icon.png\",\"11\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/search-fade.png\",\"12\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/portal-break.png\",\"14\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/preferences-break.png\",\"16\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/preferences-fade.png\",\"17\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/preferences-base.png\",\"18\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/bullet-icon.png\",\"19\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/external-link-ltr-icon.png\",\"20\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/lock-icon.png\",\"21\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/mail-icon.png\",\"22\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/news-icon.png\",\"23\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/file-icon.png\",\"24\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/talk-icon.png\",\"25\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/audio-icon.png\",\"26\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/video-icon.png\",\"27\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/document-icon.png\",\"28\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/user-icon.png\",\"29\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/watch-icons.png\",\"30\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/watch-icon-loading.gif\"}');
-/*!40000 ALTER TABLE `mw_module_deps` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_msg_resource`
---
-
-DROP TABLE IF EXISTS `mw_msg_resource`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_msg_resource` (
-  `mr_resource` varbinary(255) NOT NULL,
-  `mr_lang` varbinary(32) NOT NULL,
-  `mr_blob` mediumblob NOT NULL,
-  `mr_timestamp` binary(14) NOT NULL,
-  UNIQUE KEY `mr_resource_lang` (`mr_resource`,`mr_lang`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_msg_resource`
---
-
-LOCK TABLES `mw_msg_resource` WRITE;
-/*!40000 ALTER TABLE `mw_msg_resource` DISABLE KEYS */;
-INSERT INTO `mw_msg_resource` VALUES ('ext.vector.collapsibleNav','en','{\"vector-collapsiblenav-more\":\"More languages\"}','20110108005000'),('ext.vector.collapsibleTabs','en','{}','20110108005000'),('ext.vector.simpleSearch','en','{\"vector-simplesearch-search\":\"Search\",\"vector-simplesearch-containing\":\"containing...\"}','20110108005000'),('ext.wikiEditor','en','{}','20110110172914'),('ext.wikiEditor.toolbar','en','{\"wikieditor-toolbar-loading\":\"Loading...\",\"wikieditor-toolbar-tool-bold\":\"Bold\",\"wikieditor-toolbar-tool-bold-example\":\"Bold text\",\"wikieditor-toolbar-tool-italic\":\"Italic\",\"wikieditor-toolbar-tool-italic-example\":\"Italic text\",\"wikieditor-toolbar-tool-ilink\":\"Internal link\",\"wikieditor-toolbar-tool-ilink-example\":\"Link title\",\"wikieditor-toolbar-tool-xlink\":\"External link (remember http:\\/\\/ prefix)\",\"wikieditor-toolbar-tool-xlink-example\":\"http:\\/\\/www.example.com link title\",\"wikieditor-toolbar-tool-link\":\"Link\",\"wikieditor-toolbar-tool-link-title\":\"Insert link\",\"wikieditor-toolbar-tool-link-int\":\"To a wiki page\",\"wikieditor-toolbar-tool-link-int-target\":\"Target page or URL:\",\"wikieditor-toolbar-tool-link-int-target-tooltip\":\"Page title or URL\",\"wikieditor-toolbar-tool-link-int-text\":\"Text to display:\",\"wikieditor-toolbar-tool-link-int-text-tooltip\":\"Text to be displayed\",\"wikieditor-toolbar-tool-link-ext\":\"To an external web page\",\"wikieditor-toolbar-tool-link-ext-target\":\"Link URL:\",\"wikieditor-toolbar-tool-link-ext-text\":\"Link text:\",\"wikieditor-toolbar-tool-link-insert\":\"Insert link\",\"wikieditor-toolbar-tool-link-cancel\":\"Cancel\",\"wikieditor-toolbar-tool-link-int-target-status-exists\":\"Page exists\",\"wikieditor-toolbar-tool-link-int-target-status-notexists\":\"Page does not exist\",\"wikieditor-toolbar-tool-link-int-target-status-invalid\":\"Invalid title\",\"wikieditor-toolbar-tool-link-int-target-status-external\":\"External link\",\"wikieditor-toolbar-tool-link-int-target-status-loading\":\"Checking page existence...\",\"wikieditor-toolbar-tool-link-int-invalid\":\"The title you specified is invalid.\",\"wikieditor-toolbar-tool-link-lookslikeinternal\":\"The URL you specified looks like it was intended as a link to another wiki page.\\nDo you want to make it an internal link?\",\"wikieditor-toolbar-tool-link-lookslikeinternal-int\":\"Internal link\",\"wikieditor-toolbar-tool-link-lookslikeinternal-ext\":\"External link\",\"wikieditor-toolbar-tool-link-empty\":\"You did not enter anything to link to.\",\"wikieditor-toolbar-tool-file\":\"Embedded file\",\"wikieditor-toolbar-tool-file-pre\":\"$1{{ns:file}}:\",\"wikieditor-toolbar-tool-file-example\":\"Example.jpg\",\"wikieditor-toolbar-tool-reference\":\"Reference\",\"wikieditor-toolbar-tool-reference-title\":\"Insert reference\",\"wikieditor-toolbar-tool-reference-cancel\":\"Cancel\",\"wikieditor-toolbar-tool-reference-text\":\"Reference text\",\"wikieditor-toolbar-tool-reference-insert\":\"Insert\",\"wikieditor-toolbar-tool-reference-example\":\"Insert footnote text here\",\"wikieditor-toolbar-tool-signature\":\"Signature and timestamp\",\"wikieditor-toolbar-section-advanced\":\"Advanced\",\"wikieditor-toolbar-tool-heading\":\"Heading\",\"wikieditor-toolbar-tool-heading-1\":\"Level 1\",\"wikieditor-toolbar-tool-heading-2\":\"Level 2\",\"wikieditor-toolbar-tool-heading-3\":\"Level 3\",\"wikieditor-toolbar-tool-heading-4\":\"Level 4\",\"wikieditor-toolbar-tool-heading-5\":\"Level 5\",\"wikieditor-toolbar-tool-heading-example\":\"Heading text\",\"wikieditor-toolbar-group-format\":\"Format\",\"wikieditor-toolbar-tool-ulist\":\"Bulleted list\",\"wikieditor-toolbar-tool-ulist-example\":\"Bulleted list item\",\"wikieditor-toolbar-tool-olist\":\"Numbered list\",\"wikieditor-toolbar-tool-olist-example\":\"Numbered list item\",\"wikieditor-toolbar-tool-indent\":\"Indentation\",\"wikieditor-toolbar-tool-indent-example\":\"Indented line\",\"wikieditor-toolbar-tool-nowiki\":\"No wiki formatting\",\"wikieditor-toolbar-tool-nowiki-example\":\"Insert non-formatted text here\",\"wikieditor-toolbar-tool-redirect\":\"Redirect\",\"wikieditor-toolbar-tool-redirect-example\":\"Target page name\",\"wikieditor-toolbar-tool-big\":\"Big\",\"wikieditor-toolbar-tool-big-example\":\"Big text\",\"wikieditor-toolbar-tool-small\":\"Small\",\"wikieditor-toolbar-tool-small-example\":\"Small text\",\"wikieditor-toolbar-tool-superscript\":\"Superscript\",\"wikieditor-toolbar-tool-superscript-example\":\"Superscript text\",\"wikieditor-toolbar-tool-subscript\":\"Subscript\",\"wikieditor-toolbar-tool-subscript-example\":\"Subscript text\",\"wikieditor-toolbar-group-insert\":\"Insert\",\"wikieditor-toolbar-tool-gallery\":\"Picture gallery\",\"wikieditor-toolbar-tool-gallery-example\":\"{{ns:file}}:Example.jpg|Caption1\\n{{ns:file}}:Example.jpg|Caption2\",\"wikieditor-toolbar-tool-newline\":\"New line\",\"wikieditor-toolbar-tool-table\":\"Table\",\"wikieditor-toolbar-tool-table-example-old\":\"-\\n! header 1\\n! header 2\\n! header 3\\n|-\\n| row 1, cell 1\\n| row 1, cell 2\\n| row 1, cell 3\\n|-\\n| row 2, cell 1\\n| row 2, cell 2\\n| row 2, cell 3\",\"wikieditor-toolbar-tool-table-example-cell-text\":\"Cell text\",\"wikieditor-toolbar-tool-table-example\":\"Example\",\"wikieditor-toolbar-tool-table-example-header\":\"Header text\",\"wikieditor-toolbar-tool-table-title\":\"Insert table\",\"wikieditor-toolbar-tool-table-dimensions-rows\":\"Rows\",\"wikieditor-toolbar-tool-table-dimensions-columns\":\"Columns\",\"wikieditor-toolbar-tool-table-dimensions-header\":\"Add header row\",\"wikieditor-toolbar-tool-table-wikitable\":\"Style with borders\",\"wikieditor-toolbar-tool-table-sortable\":\"Make table sortable\",\"wikieditor-toolbar-tool-table-insert\":\"Insert\",\"wikieditor-toolbar-tool-table-cancel\":\"Cancel\",\"wikieditor-toolbar-tool-table-example-text\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut nec purus diam. Sed aliquam imperdiet nunc quis lacinia. Donec rutrum consectetur placerat. Sed volutpat neque non purus faucibus id ultricies enim euismod.\",\"wikieditor-toolbar-tool-table-toomany\":\"Inserting a table with more than $1 cells is not possible with this dialog.\",\"wikieditor-toolbar-tool-table-invalidnumber\":\"You have not entered a valid number of rows or columns.\",\"wikieditor-toolbar-tool-table-zero\":\"You cannot insert a table with zero rows or columns.\",\"wikieditor-toolbar-tool-replace\":\"Search and replace\",\"wikieditor-toolbar-tool-replace-title\":\"Search and replace\",\"wikieditor-toolbar-tool-replace-search\":\"Search for:\",\"wikieditor-toolbar-tool-replace-replace\":\"Replace with:\",\"wikieditor-toolbar-tool-replace-case\":\"Match case\",\"wikieditor-toolbar-tool-replace-regex\":\"Treat search string as a regular expression\",\"wikieditor-toolbar-tool-replace-button-findnext\":\"Find next\",\"wikieditor-toolbar-tool-replace-button-replacenext\":\"Replace next\",\"wikieditor-toolbar-tool-replace-button-replaceall\":\"Replace all\",\"wikieditor-toolbar-tool-replace-close\":\"Close\",\"wikieditor-toolbar-tool-replace-nomatch\":\"Your search did not match anything.\",\"wikieditor-toolbar-tool-replace-success\":\"$1 replacement(s) made.\",\"wikieditor-toolbar-tool-replace-emptysearch\":\"You did not enter anything to search for.\",\"wikieditor-toolbar-tool-replace-invalidregex\":\"The regular expression you entered is invalid: $1\",\"wikieditor-toolbar-section-characters\":\"Special characters\",\"wikieditor-toolbar-characters-page-latin\":\"Latin\",\"wikieditor-toolbar-characters-page-latinextended\":\"Latin extended\",\"wikieditor-toolbar-characters-page-ipa\":\"IPA\",\"wikieditor-toolbar-characters-page-symbols\":\"Symbols\",\"wikieditor-toolbar-characters-page-greek\":\"Greek\",\"wikieditor-toolbar-characters-page-cyrillic\":\"Cyrillic\",\"wikieditor-toolbar-characters-page-arabic\":\"Arabic\",\"wikieditor-toolbar-characters-page-persian\":\"Persian\",\"wikieditor-toolbar-characters-page-hebrew\":\"Hebrew\",\"wikieditor-toolbar-characters-page-bangla\":\"Bangla\",\"wikieditor-toolbar-characters-page-telugu\":\"Telugu\",\"wikieditor-toolbar-characters-page-sinhala\":\"Sinhala\",\"wikieditor-toolbar-characters-page-gujarati\":\"Gujarati\",\"wikieditor-toolbar-characters-page-thai\":\"Thai\",\"wikieditor-toolbar-characters-page-lao\":\"Lao\",\"wikieditor-toolbar-characters-page-khmer\":\"Khmer\",\"wikieditor-toolbar-section-help\":\"Help\",\"wikieditor-toolbar-help-heading-description\":\"Description\",\"wikieditor-toolbar-help-heading-syntax\":\"What you type\",\"wikieditor-toolbar-help-heading-result\":\"What you get\",\"wikieditor-toolbar-help-page-format\":\"Formatting\",\"wikieditor-toolbar-help-page-link\":\"Links\",\"wikieditor-toolbar-help-page-heading\":\"Headings\",\"wikieditor-toolbar-help-page-list\":\"Lists\",\"wikieditor-toolbar-help-page-file\":\"Files\",\"wikieditor-toolbar-help-page-reference\":\"References\",\"wikieditor-toolbar-help-page-discussion\":\"Discussion\",\"wikieditor-toolbar-help-content-bold-description\":\"Bold\",\"wikieditor-toolbar-help-content-bold-syntax\":\"\'\'\'Bold text\'\'\'\",\"wikieditor-toolbar-help-content-bold-result\":\"<strong>Bold text<\\/strong>\",\"wikieditor-toolbar-help-content-italic-description\":\"Italic\",\"wikieditor-toolbar-help-content-italic-syntax\":\"\'\'Italic text\'\'\",\"wikieditor-toolbar-help-content-italic-result\":\"<em>Italic text<\\/em>\",\"wikieditor-toolbar-help-content-bolditalic-description\":\"Bold &amp; italic\",\"wikieditor-toolbar-help-content-bolditalic-syntax\":\"\'\'\'\'\'Bold &amp; italic text\'\'\'\'\'\",\"wikieditor-toolbar-help-content-bolditalic-result\":\"<strong><em>Bold &amp; italic text<\\/em><\\/strong>\",\"wikieditor-toolbar-help-content-ilink-description\":\"Internal link\",\"wikieditor-toolbar-help-content-ilink-syntax\":\"[[Page title|Link label]]<br \\/>[[Page title]]\",\"wikieditor-toolbar-help-content-ilink-result\":\"<a href=\'#\'>Link label<\\/a><br \\/><a href=\'#\'>Page title<\\/a>\",\"wikieditor-toolbar-help-content-xlink-description\":\"External link\",\"wikieditor-toolbar-help-content-xlink-syntax\":\"[http:\\/\\/www.example.org Link label]<br \\/>[http:\\/\\/www.example.org]<br \\/>http:\\/\\/www.example.org\",\"wikieditor-toolbar-help-content-xlink-result\":\"<a href=\'#\' class=\'external\'>Link label<\\/a><br \\/><a href=\'#\' class=\'external autonumber\'>[1]<\\/a><br \\/><a href=\'#\' class=\'external\'>http:\\/\\/www.example.org<\\/a>\",\"wikieditor-toolbar-help-content-heading1-description\":\"&lt;wikieditor-toolbar-help-content-heading1-description&gt;\",\"wikieditor-toolbar-help-content-heading1-syntax\":\"&lt;wikieditor-toolbar-help-content-heading1-syntax&gt;\",\"wikieditor-toolbar-help-content-heading1-result\":\"&lt;wikieditor-toolbar-help-content-heading1-result&gt;\",\"wikieditor-toolbar-help-content-heading2-description\":\"2nd level heading\",\"wikieditor-toolbar-help-content-heading2-syntax\":\"== Heading text ==\",\"wikieditor-toolbar-help-content-heading2-result\":\"<h2>Heading text<\\/h2>\",\"wikieditor-toolbar-help-content-heading3-description\":\"3rd level heading\",\"wikieditor-toolbar-help-content-heading3-syntax\":\"=== Heading text ===\",\"wikieditor-toolbar-help-content-heading3-result\":\"<h3>Heading text<\\/h3>\",\"wikieditor-toolbar-help-content-heading4-description\":\"4th level heading\",\"wikieditor-toolbar-help-content-heading4-syntax\":\"==== Heading text ====\",\"wikieditor-toolbar-help-content-heading4-result\":\"<h4>Heading text<\\/h4>\",\"wikieditor-toolbar-help-content-heading5-description\":\"5th level heading\",\"wikieditor-toolbar-help-content-heading5-syntax\":\"===== Heading text =====\",\"wikieditor-toolbar-help-content-heading5-result\":\"<h5>Heading text<\\/h5>\",\"wikieditor-toolbar-help-content-ulist-description\":\"Bulleted list\",\"wikieditor-toolbar-help-content-ulist-syntax\":\"* List item<br \\/>* List item\",\"wikieditor-toolbar-help-content-ulist-result\":\"<ul><li>List item<\\/li><li>List item<\\/li><\\/ul>\",\"wikieditor-toolbar-help-content-olist-description\":\"Numbered list\",\"wikieditor-toolbar-help-content-olist-syntax\":\"# List item<br \\/># List item\",\"wikieditor-toolbar-help-content-olist-result\":\"<ol><li>List item<\\/li><li>List item<\\/li><\\/ol>\",\"wikieditor-toolbar-help-content-file-description\":\"Embedded file\",\"wikieditor-toolbar-help-content-file-syntax\":\"[[{{ns:file}}:Example.png|thumb|Caption text]]\",\"wikieditor-toolbar-help-content-file-result\":\"<div style=\'width:104px;\' class=\'thumbinner\'><a title=\'Caption text\' class=\'image\' href=\'#\'><img height=\'50\' width=\'100\' border=\'0\' class=\'thumbimage\' src=\'extensions\\/UsabilityInitiative\\/images\\/wikiEditor\\/toolbar\\/example-image.png\' alt=\'\'\\/><\\/a><div class=\'thumbcaption\'><div class=\'magnify\'><a title=\'Enlarge\' class=\'internal\' href=\'#\'><img height=\'11\' width=\'15\' alt=\'\' src=\'$1\\/common\\/images\\/magnify-clip.png\'\\/><\\/a><\\/div>Caption text<\\/div><\\/div>\",\"wikieditor-toolbar-help-content-reference-description\":\"Reference\",\"wikieditor-toolbar-help-content-reference-syntax\":\"Page text.&lt;ref name=\\\"test\\\"&gt;[http:\\/\\/www.example.org Link text], additional text.&lt;\\/ref&gt;\",\"wikieditor-toolbar-help-content-reference-result\":\"Page text.<sup><a href=\'#\'>[1]<\\/a><\\/sup>\",\"wikieditor-toolbar-help-content-rereference-description\":\"Additional use of same reference\",\"wikieditor-toolbar-help-content-rereference-syntax\":\"&lt;ref name=\\\"test\\\" \\/&gt;\",\"wikieditor-toolbar-help-content-rereference-result\":\"Page text.<sup><a href=\'#\'>[1]<\\/a><\\/sup>\",\"wikieditor-toolbar-help-content-showreferences-description\":\"Display references\",\"wikieditor-toolbar-help-content-showreferences-syntax\":\"&lt;references \\/&gt;\",\"wikieditor-toolbar-help-content-showreferences-result\":\"<ol class=\'references\'><li id=\'cite_note-test-0\'><b><a title=\'\' href=\'#\'>^<\\/a><\\/b> <a rel=\'nofollow\' title=\'http:\\/\\/www.example.org\' class=\'external text\' href=\'#\'>Link text<\\/a>, additional text.<\\/li><\\/ol>\",\"wikieditor-toolbar-help-content-signaturetimestamp-description\":\"Signature with timestamp\",\"wikieditor-toolbar-help-content-signaturetimestamp-syntax\":\"~~~~\",\"wikieditor-toolbar-help-content-signaturetimestamp-result\":\"<a href=\'#\' title=\'{{#special:mypage}}\'>Username<\\/a> (<a href=\'#\' title=\'{{#special:mytalk}}\'>talk<\\/a>) 15:54, 10 June 2009 (UTC)\",\"wikieditor-toolbar-help-content-signature-description\":\"Signature\",\"wikieditor-toolbar-help-content-signature-syntax\":\"~~~\",\"wikieditor-toolbar-help-content-signature-result\":\"<a href=\'#\' title=\'{{#special:mypage}}\'>Username<\\/a> (<a href=\'#\' title=\'{{#special:mytalk}}\'>talk<\\/a>)\",\"wikieditor-toolbar-help-content-indent-description\":\"Indent\",\"wikieditor-toolbar-help-content-indent-syntax\":\"Normal text<br \\/>:Indented text<br \\/>::Indented text\",\"wikieditor-toolbar-help-content-indent-result\":\"Normal text<dl><dd>Indented text<dl><dd>Indented text<\\/dd><\\/dl><\\/dd><\\/dl>\"}','20110110172914'),('jquery.async','en','{}','20110110172915'),('jquery.autoEllipsis','en','{}','20110110172915'),('jquery.checkboxShiftClick','en','{}','20110110172915'),('jquery.client','en','{}','20110110172915'),('jquery.cookie','en','{}','20110110172915'),('jquery.delayedBind','en','{}','20110110172915'),('jquery.highlightText','en','{}','20110110172915'),('jquery.makeCollapsible','en','{\"collapsible-expand\":\"Expand\",\"collapsible-collapse\":\"Collapse\"}','20110110172915'),('jquery.placeholder','en','{}','20110110172915'),('jquery.suggestions','en','{}','20110110172915'),('jquery.tabIndex','en','{}','20110110172915'),('jquery.textSelection','en','{}','20110110172915'),('jquery.wikiEditor','en','{\"wikieditor-wikitext-tab\":\"Wikitext\",\"wikieditor-loading\":\"Loading\"}','20110110172914'),('jquery.wikiEditor.toolbar','en','{}','20110110172914'),('mediawiki.action.watch.ajax','en','{}','20110110172915'),('mediawiki.language','en','{}','20110110172915'),('mediawiki.legacy.ajax','en','{\"watch\":\"Watch\",\"unwatch\":\"Unwatch\",\"watching\":\"Watching...\",\"unwatching\":\"Unwatching...\",\"tooltip-ca-watch\":\"Add this page to your watchlist\",\"tooltip-ca-unwatch\":\"Remove this page from your watchlist\"}','20110110172915'),('mediawiki.legacy.edit','en','{}','20110110172915'),('mediawiki.legacy.wikibits','en','{\"showtoc\":\"show\",\"hidetoc\":\"hide\"}','20110110172915'),('mediawiki.util','en','{}','20110110172915');
-/*!40000 ALTER TABLE `mw_msg_resource` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_msg_resource_links`
---
-
-DROP TABLE IF EXISTS `mw_msg_resource_links`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_msg_resource_links` (
-  `mrl_resource` varbinary(255) NOT NULL,
-  `mrl_message` varbinary(255) NOT NULL,
-  UNIQUE KEY `mrl_message_resource` (`mrl_message`,`mrl_resource`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_msg_resource_links`
---
-
-LOCK TABLES `mw_msg_resource_links` WRITE;
-/*!40000 ALTER TABLE `mw_msg_resource_links` DISABLE KEYS */;
-INSERT INTO `mw_msg_resource_links` VALUES ('jquery.makeCollapsible','collapsible-collapse'),('jquery.makeCollapsible','collapsible-expand'),('mediawiki.legacy.wikibits','hidetoc'),('mediawiki.legacy.wikibits','showtoc'),('mediawiki.legacy.ajax','tooltip-ca-unwatch'),('mediawiki.legacy.ajax','tooltip-ca-watch'),('mediawiki.legacy.ajax','unwatch'),('mediawiki.legacy.ajax','unwatching'),('ext.vector.collapsibleNav','vector-collapsiblenav-more'),('ext.vector.simpleSearch','vector-simplesearch-containing'),('ext.vector.simpleSearch','vector-simplesearch-search'),('mediawiki.legacy.ajax','watch'),('mediawiki.legacy.ajax','watching'),('jquery.wikiEditor','wikieditor-loading'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-arabic'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-bangla'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-cyrillic'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-greek'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-gujarati'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-hebrew'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-ipa'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-khmer'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-lao'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-latin'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-latinextended'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-persian'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-sinhala'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-symbols'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-telugu'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-thai'),('ext.wikiEditor.toolbar','wikieditor-toolbar-group-format'),('ext.wikiEditor.toolbar','wikieditor-toolbar-group-insert'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-bold-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-bold-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-bold-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-bolditalic-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-bolditalic-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-bolditalic-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-file-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-file-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-file-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading1-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading1-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading1-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading2-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading2-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading2-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading3-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading3-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading3-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading4-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading4-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading4-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading5-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading5-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading5-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-ilink-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-ilink-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-ilink-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-indent-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-indent-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-indent-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-italic-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-italic-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-italic-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-olist-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-olist-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-olist-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-reference-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-reference-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-reference-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-rereference-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-rereference-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-rereference-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-showreferences-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-showreferences-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-showreferences-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-signature-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-signature-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-signature-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-signaturetimestamp-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-signaturetimestamp-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-signaturetimestamp-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-ulist-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-ulist-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-ulist-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-xlink-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-xlink-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-xlink-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-heading-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-heading-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-heading-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-page-discussion'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-page-file'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-page-format'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-page-heading'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-page-link'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-page-list'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-page-reference'),('ext.wikiEditor.toolbar','wikieditor-toolbar-loading'),('ext.wikiEditor.toolbar','wikieditor-toolbar-section-advanced'),('ext.wikiEditor.toolbar','wikieditor-toolbar-section-characters'),('ext.wikiEditor.toolbar','wikieditor-toolbar-section-help'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-big'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-big-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-bold'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-bold-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-file'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-file-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-file-pre'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-gallery'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-gallery-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-heading'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-heading-1'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-heading-2'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-heading-3'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-heading-4'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-heading-5'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-heading-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-ilink'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-ilink-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-indent'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-indent-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-italic'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-italic-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-cancel'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-empty'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-ext'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-ext-target'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-ext-text'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-insert'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-invalid'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-target'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-target-status-exists'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-target-status-external'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-target-status-invalid'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-target-status-loading'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-target-status-notexists'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-target-tooltip'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-text'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-text-tooltip'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-lookslikeinternal'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-lookslikeinternal-ext'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-lookslikeinternal-int'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-title'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-newline'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-nowiki'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-nowiki-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-olist'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-olist-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-redirect'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-redirect-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-reference'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-reference-cancel'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-reference-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-reference-insert'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-reference-text'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-reference-title'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-button-findnext'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-button-replaceall'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-button-replacenext'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-case'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-close'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-emptysearch'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-invalidregex'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-nomatch'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-regex'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-replace'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-search'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-success'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-title'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-signature'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-small'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-small-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-subscript'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-subscript-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-superscript'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-superscript-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-cancel'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-dimensions-columns'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-dimensions-header'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-dimensions-rows'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-example-cell-text'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-example-header'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-example-old'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-example-text'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-insert'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-invalidnumber'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-sortable'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-title'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-toomany'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-wikitable'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-zero'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-ulist'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-ulist-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-xlink'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-xlink-example'),('jquery.wikiEditor','wikieditor-wikitext-tab');
-/*!40000 ALTER TABLE `mw_msg_resource_links` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_objectcache`
---
-
-DROP TABLE IF EXISTS `mw_objectcache`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_objectcache` (
-  `keyname` varbinary(255) NOT NULL DEFAULT '',
-  `value` mediumblob,
-  `exptime` datetime DEFAULT NULL,
-  PRIMARY KEY (`keyname`),
-  KEY `exptime` (`exptime`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_objectcache`
---
-
-LOCK TABLES `mw_objectcache` WRITE;
-/*!40000 ALTER TABLE `mw_objectcache` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_objectcache` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_oldimage`
---
-
-DROP TABLE IF EXISTS `mw_oldimage`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_oldimage` (
-  `oi_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `oi_archive_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `oi_size` int(10) unsigned NOT NULL DEFAULT '0',
-  `oi_width` int(11) NOT NULL DEFAULT '0',
-  `oi_height` int(11) NOT NULL DEFAULT '0',
-  `oi_bits` int(11) NOT NULL DEFAULT '0',
-  `oi_description` tinyblob NOT NULL,
-  `oi_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `oi_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `oi_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `oi_metadata` mediumblob NOT NULL,
-  `oi_media_type` enum('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE') DEFAULT NULL,
-  `oi_major_mime` enum('unknown','application','audio','image','text','video','message','model','multipart') NOT NULL DEFAULT 'unknown',
-  `oi_minor_mime` varbinary(100) NOT NULL DEFAULT 'unknown',
-  `oi_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `oi_sha1` varbinary(32) NOT NULL DEFAULT '',
-  KEY `oi_usertext_timestamp` (`oi_user_text`,`oi_timestamp`),
-  KEY `oi_name_timestamp` (`oi_name`,`oi_timestamp`),
-  KEY `oi_name_archive_name` (`oi_name`,`oi_archive_name`(14)),
-  KEY `oi_sha1` (`oi_sha1`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_oldimage`
---
-
-LOCK TABLES `mw_oldimage` WRITE;
-/*!40000 ALTER TABLE `mw_oldimage` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_oldimage` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_page`
---
-
-DROP TABLE IF EXISTS `mw_page`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_page` (
-  `page_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `page_namespace` int(11) NOT NULL,
-  `page_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `page_restrictions` tinyblob NOT NULL,
-  `page_counter` bigint(20) unsigned NOT NULL DEFAULT '0',
-  `page_is_redirect` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `page_is_new` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `page_random` double unsigned NOT NULL,
-  `page_touched` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `page_latest` int(10) unsigned NOT NULL,
-  `page_len` int(10) unsigned NOT NULL,
-  PRIMARY KEY (`page_id`),
-  UNIQUE KEY `name_title` (`page_namespace`,`page_title`),
-  KEY `page_random` (`page_random`),
-  KEY `page_len` (`page_len`)
-) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_page`
---
-
-LOCK TABLES `mw_page` WRITE;
-/*!40000 ALTER TABLE `mw_page` DISABLE KEYS */;
-INSERT INTO `mw_page` VALUES (1,0,'Main_Page','',3,0,1,0.045389076294,'20110107184113',1,438),(2,0,'TestResources','',0,0,1,0.227355086893,'20110110173217',2,57);
-/*!40000 ALTER TABLE `mw_page` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_page_props`
---
-
-DROP TABLE IF EXISTS `mw_page_props`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_page_props` (
-  `pp_page` int(11) NOT NULL,
-  `pp_propname` varbinary(60) NOT NULL,
-  `pp_value` blob NOT NULL,
-  UNIQUE KEY `pp_page_propname` (`pp_page`,`pp_propname`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_page_props`
---
-
-LOCK TABLES `mw_page_props` WRITE;
-/*!40000 ALTER TABLE `mw_page_props` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_page_props` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_page_restrictions`
---
-
-DROP TABLE IF EXISTS `mw_page_restrictions`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_page_restrictions` (
-  `pr_page` int(11) NOT NULL,
-  `pr_type` varbinary(60) NOT NULL,
-  `pr_level` varbinary(60) NOT NULL,
-  `pr_cascade` tinyint(4) NOT NULL,
-  `pr_user` int(11) DEFAULT NULL,
-  `pr_expiry` varbinary(14) DEFAULT NULL,
-  `pr_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  PRIMARY KEY (`pr_id`),
-  UNIQUE KEY `pr_pagetype` (`pr_page`,`pr_type`),
-  KEY `pr_typelevel` (`pr_type`,`pr_level`),
-  KEY `pr_level` (`pr_level`),
-  KEY `pr_cascade` (`pr_cascade`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_page_restrictions`
---
-
-LOCK TABLES `mw_page_restrictions` WRITE;
-/*!40000 ALTER TABLE `mw_page_restrictions` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_page_restrictions` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_pagelinks`
---
-
-DROP TABLE IF EXISTS `mw_pagelinks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_pagelinks` (
-  `pl_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `pl_namespace` int(11) NOT NULL DEFAULT '0',
-  `pl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  UNIQUE KEY `pl_from` (`pl_from`,`pl_namespace`,`pl_title`),
-  UNIQUE KEY `pl_namespace` (`pl_namespace`,`pl_title`,`pl_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_pagelinks`
---
-
-LOCK TABLES `mw_pagelinks` WRITE;
-/*!40000 ALTER TABLE `mw_pagelinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_pagelinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_protected_titles`
---
-
-DROP TABLE IF EXISTS `mw_protected_titles`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_protected_titles` (
-  `pt_namespace` int(11) NOT NULL,
-  `pt_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `pt_user` int(10) unsigned NOT NULL,
-  `pt_reason` tinyblob,
-  `pt_timestamp` binary(14) NOT NULL,
-  `pt_expiry` varbinary(14) NOT NULL DEFAULT '',
-  `pt_create_perm` varbinary(60) NOT NULL,
-  UNIQUE KEY `pt_namespace_title` (`pt_namespace`,`pt_title`),
-  KEY `pt_timestamp` (`pt_timestamp`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_protected_titles`
---
-
-LOCK TABLES `mw_protected_titles` WRITE;
-/*!40000 ALTER TABLE `mw_protected_titles` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_protected_titles` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_querycache`
---
-
-DROP TABLE IF EXISTS `mw_querycache`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_querycache` (
-  `qc_type` varbinary(32) NOT NULL,
-  `qc_value` int(10) unsigned NOT NULL DEFAULT '0',
-  `qc_namespace` int(11) NOT NULL DEFAULT '0',
-  `qc_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  KEY `qc_type` (`qc_type`,`qc_value`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_querycache`
---
-
-LOCK TABLES `mw_querycache` WRITE;
-/*!40000 ALTER TABLE `mw_querycache` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_querycache` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_querycache_info`
---
-
-DROP TABLE IF EXISTS `mw_querycache_info`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_querycache_info` (
-  `qci_type` varbinary(32) NOT NULL DEFAULT '',
-  `qci_timestamp` binary(14) NOT NULL DEFAULT '19700101000000',
-  UNIQUE KEY `qci_type` (`qci_type`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_querycache_info`
---
-
-LOCK TABLES `mw_querycache_info` WRITE;
-/*!40000 ALTER TABLE `mw_querycache_info` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_querycache_info` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_querycachetwo`
---
-
-DROP TABLE IF EXISTS `mw_querycachetwo`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_querycachetwo` (
-  `qcc_type` varbinary(32) NOT NULL,
-  `qcc_value` int(10) unsigned NOT NULL DEFAULT '0',
-  `qcc_namespace` int(11) NOT NULL DEFAULT '0',
-  `qcc_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `qcc_namespacetwo` int(11) NOT NULL DEFAULT '0',
-  `qcc_titletwo` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  KEY `qcc_type` (`qcc_type`,`qcc_value`),
-  KEY `qcc_title` (`qcc_type`,`qcc_namespace`,`qcc_title`),
-  KEY `qcc_titletwo` (`qcc_type`,`qcc_namespacetwo`,`qcc_titletwo`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_querycachetwo`
---
-
-LOCK TABLES `mw_querycachetwo` WRITE;
-/*!40000 ALTER TABLE `mw_querycachetwo` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_querycachetwo` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_recentchanges`
---
-
-DROP TABLE IF EXISTS `mw_recentchanges`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_recentchanges` (
-  `rc_id` int(11) NOT NULL AUTO_INCREMENT,
-  `rc_timestamp` varbinary(14) NOT NULL DEFAULT '',
-  `rc_cur_time` varbinary(14) NOT NULL DEFAULT '',
-  `rc_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `rc_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `rc_namespace` int(11) NOT NULL DEFAULT '0',
-  `rc_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `rc_comment` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `rc_minor` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rc_bot` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rc_new` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rc_cur_id` int(10) unsigned NOT NULL DEFAULT '0',
-  `rc_this_oldid` int(10) unsigned NOT NULL DEFAULT '0',
-  `rc_last_oldid` int(10) unsigned NOT NULL DEFAULT '0',
-  `rc_type` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rc_moved_to_ns` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rc_moved_to_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `rc_patrolled` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rc_ip` varbinary(40) NOT NULL DEFAULT '',
-  `rc_old_len` int(11) DEFAULT NULL,
-  `rc_new_len` int(11) DEFAULT NULL,
-  `rc_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rc_logid` int(10) unsigned NOT NULL DEFAULT '0',
-  `rc_log_type` varbinary(255) DEFAULT NULL,
-  `rc_log_action` varbinary(255) DEFAULT NULL,
-  `rc_params` blob,
-  PRIMARY KEY (`rc_id`),
-  KEY `rc_timestamp` (`rc_timestamp`),
-  KEY `rc_namespace_title` (`rc_namespace`,`rc_title`),
-  KEY `rc_cur_id` (`rc_cur_id`),
-  KEY `new_name_timestamp` (`rc_new`,`rc_namespace`,`rc_timestamp`),
-  KEY `rc_ip` (`rc_ip`),
-  KEY `rc_ns_usertext` (`rc_namespace`,`rc_user_text`),
-  KEY `rc_user_text` (`rc_user_text`,`rc_timestamp`)
-) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_recentchanges`
---
-
-LOCK TABLES `mw_recentchanges` WRITE;
-/*!40000 ALTER TABLE `mw_recentchanges` DISABLE KEYS */;
-INSERT INTO `mw_recentchanges` VALUES (1,'20110107184113','20110107184113',0,'MediaWiki Default',0,'Main_Page','',0,0,1,1,1,0,1,0,'',0,'::1',0,438,0,0,NULL,'',''),(2,'20110110173131','20110110173131',1,'WikiSysop',0,'TestResources','Created page with \"Test the the SimpleSelenium database was loaded correctly\"',0,0,1,2,2,0,1,0,'',1,'::1',0,57,0,0,NULL,'','');
-/*!40000 ALTER TABLE `mw_recentchanges` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_redirect`
---
-
-DROP TABLE IF EXISTS `mw_redirect`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_redirect` (
-  `rd_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `rd_namespace` int(11) NOT NULL DEFAULT '0',
-  `rd_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `rd_interwiki` varchar(32) DEFAULT NULL,
-  `rd_fragment` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
-  PRIMARY KEY (`rd_from`),
-  KEY `rd_ns_title` (`rd_namespace`,`rd_title`,`rd_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_redirect`
---
-
-LOCK TABLES `mw_redirect` WRITE;
-/*!40000 ALTER TABLE `mw_redirect` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_redirect` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_revision`
---
-
-DROP TABLE IF EXISTS `mw_revision`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_revision` (
-  `rev_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `rev_page` int(10) unsigned NOT NULL,
-  `rev_text_id` int(10) unsigned NOT NULL,
-  `rev_comment` tinyblob NOT NULL,
-  `rev_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `rev_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `rev_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `rev_minor_edit` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rev_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rev_len` int(10) unsigned DEFAULT NULL,
-  `rev_parent_id` int(10) unsigned DEFAULT NULL,
-  PRIMARY KEY (`rev_id`),
-  UNIQUE KEY `rev_page_id` (`rev_page`,`rev_id`),
-  KEY `rev_timestamp` (`rev_timestamp`),
-  KEY `page_timestamp` (`rev_page`,`rev_timestamp`),
-  KEY `user_timestamp` (`rev_user`,`rev_timestamp`),
-  KEY `usertext_timestamp` (`rev_user_text`,`rev_timestamp`)
-) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 MAX_ROWS=10000000 AVG_ROW_LENGTH=1024;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_revision`
---
-
-LOCK TABLES `mw_revision` WRITE;
-/*!40000 ALTER TABLE `mw_revision` DISABLE KEYS */;
-INSERT INTO `mw_revision` VALUES (1,1,1,'',0,'MediaWiki Default','20110107184113',0,0,438,0),(2,2,2,'Created page with \"Test the the SimpleSelenium database was loaded correctly\"',1,'WikiSysop','20110110173131',0,0,57,0);
-/*!40000 ALTER TABLE `mw_revision` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_searchindex`
---
-
-DROP TABLE IF EXISTS `mw_searchindex`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_searchindex` (
-  `si_page` int(10) unsigned NOT NULL,
-  `si_title` varchar(255) NOT NULL DEFAULT '',
-  `si_text` mediumtext NOT NULL,
-  UNIQUE KEY `si_page` (`si_page`),
-  FULLTEXT KEY `si_title` (`si_title`),
-  FULLTEXT KEY `si_text` (`si_text`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_searchindex`
---
-
-LOCK TABLES `mw_searchindex` WRITE;
-/*!40000 ALTER TABLE `mw_searchindex` DISABLE KEYS */;
-INSERT INTO `mw_searchindex` VALUES (1,'main page','  mediawiki hasu800 been successfully installed.  consult theu800 user user\'su800 guide foru800 information onu800 using theu800 wiki software. getting started getting started getting started configuration settings list mediawiki faqu800 mediawiki release mailing list '),(2,'testresources',' test theu800 theu800 simpleselenium database wasu800 loaded correctly ');
-/*!40000 ALTER TABLE `mw_searchindex` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_site_stats`
---
-
-DROP TABLE IF EXISTS `mw_site_stats`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_site_stats` (
-  `ss_row_id` int(10) unsigned NOT NULL,
-  `ss_total_views` bigint(20) unsigned DEFAULT '0',
-  `ss_total_edits` bigint(20) unsigned DEFAULT '0',
-  `ss_good_articles` bigint(20) unsigned DEFAULT '0',
-  `ss_total_pages` bigint(20) DEFAULT '-1',
-  `ss_users` bigint(20) DEFAULT '-1',
-  `ss_active_users` bigint(20) DEFAULT '-1',
-  `ss_admins` int(11) DEFAULT '-1',
-  `ss_images` int(11) DEFAULT '0',
-  UNIQUE KEY `ss_row_id` (`ss_row_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_site_stats`
---
-
-LOCK TABLES `mw_site_stats` WRITE;
-/*!40000 ALTER TABLE `mw_site_stats` DISABLE KEYS */;
-INSERT INTO `mw_site_stats` VALUES (1,3,2,1,2,1,-1,-1,0);
-/*!40000 ALTER TABLE `mw_site_stats` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_tag_summary`
---
-
-DROP TABLE IF EXISTS `mw_tag_summary`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_tag_summary` (
-  `ts_rc_id` int(11) DEFAULT NULL,
-  `ts_log_id` int(11) DEFAULT NULL,
-  `ts_rev_id` int(11) DEFAULT NULL,
-  `ts_tags` blob NOT NULL,
-  UNIQUE KEY `tag_summary_rc_id` (`ts_rc_id`),
-  UNIQUE KEY `tag_summary_log_id` (`ts_log_id`),
-  UNIQUE KEY `tag_summary_rev_id` (`ts_rev_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_tag_summary`
---
-
-LOCK TABLES `mw_tag_summary` WRITE;
-/*!40000 ALTER TABLE `mw_tag_summary` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_tag_summary` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_templatelinks`
---
-
-DROP TABLE IF EXISTS `mw_templatelinks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_templatelinks` (
-  `tl_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `tl_namespace` int(11) NOT NULL DEFAULT '0',
-  `tl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  UNIQUE KEY `tl_from` (`tl_from`,`tl_namespace`,`tl_title`),
-  UNIQUE KEY `tl_namespace` (`tl_namespace`,`tl_title`,`tl_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_templatelinks`
---
-
-LOCK TABLES `mw_templatelinks` WRITE;
-/*!40000 ALTER TABLE `mw_templatelinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_templatelinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_text`
---
-
-DROP TABLE IF EXISTS `mw_text`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_text` (
-  `old_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `old_text` mediumblob NOT NULL,
-  `old_flags` tinyblob NOT NULL,
-  PRIMARY KEY (`old_id`)
-) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 MAX_ROWS=10000000 AVG_ROW_LENGTH=10240;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_text`
---
-
-LOCK TABLES `mw_text` WRITE;
-/*!40000 ALTER TABLE `mw_text` DISABLE KEYS */;
-INSERT INTO `mw_text` VALUES (1,'\'\'\'MediaWiki has been successfully installed.\'\'\'\n\nConsult the [http://meta.wikimedia.org/wiki/Help:Contents User\'s Guide] for information on using the wiki software.\n\n== Getting started ==\n* [http://www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [http://www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]','utf-8'),(2,'Test the the SimpleSelenium database was loaded correctly','utf-8');
-/*!40000 ALTER TABLE `mw_text` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_trackbacks`
---
-
-DROP TABLE IF EXISTS `mw_trackbacks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_trackbacks` (
-  `tb_id` int(11) NOT NULL AUTO_INCREMENT,
-  `tb_page` int(11) DEFAULT NULL,
-  `tb_title` varchar(255) NOT NULL,
-  `tb_url` blob NOT NULL,
-  `tb_ex` text,
-  `tb_name` varchar(255) DEFAULT NULL,
-  PRIMARY KEY (`tb_id`),
-  KEY `tb_page` (`tb_page`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_trackbacks`
---
-
-LOCK TABLES `mw_trackbacks` WRITE;
-/*!40000 ALTER TABLE `mw_trackbacks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_trackbacks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_transcache`
---
-
-DROP TABLE IF EXISTS `mw_transcache`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_transcache` (
-  `tc_url` varbinary(255) NOT NULL,
-  `tc_contents` text,
-  `tc_time` binary(14) DEFAULT NULL,
-  UNIQUE KEY `tc_url_idx` (`tc_url`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_transcache`
---
-
-LOCK TABLES `mw_transcache` WRITE;
-/*!40000 ALTER TABLE `mw_transcache` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_transcache` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_updatelog`
---
-
-DROP TABLE IF EXISTS `mw_updatelog`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_updatelog` (
-  `ul_key` varchar(255) NOT NULL,
-  `ul_value` blob,
-  PRIMARY KEY (`ul_key`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_updatelog`
---
-
-LOCK TABLES `mw_updatelog` WRITE;
-/*!40000 ALTER TABLE `mw_updatelog` DISABLE KEYS */;
-INSERT INTO `mw_updatelog` VALUES ('cl_fields_update',NULL),('convert transcache field',NULL),('mime_minor_length',NULL),('populate category',NULL),('populate rev_len',NULL),('populate rev_parent_id',NULL),('updatelist-1.18alpha-1294425799','a:128:{i:0;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:6:\"ipb_id\";i:3;s:18:\"patch-ipblocks.sql\";}i:1;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:10:\"ipb_expiry\";i:3;s:20:\"patch-ipb_expiry.sql\";}i:2;a:1:{i:0;s:17:\"doInterwikiUpdate\";}i:3;a:1:{i:0;s:13:\"doIndexUpdate\";}i:4;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"hitcounter\";i:2;s:20:\"patch-hitcounter.sql\";}i:5;a:4:{i:0;s:8:\"addField\";i:1;s:13:\"recentchanges\";i:2;s:7:\"rc_type\";i:3;s:17:\"patch-rc_type.sql\";}i:6;a:4:{i:0;s:8:\"addField\";i:1;s:4:\"user\";i:2;s:14:\"user_real_name\";i:3;s:23:\"patch-user-realname.sql\";}i:7;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"querycache\";i:2;s:20:\"patch-querycache.sql\";}i:8;a:3:{i:0;s:8:\"addTable\";i:1;s:11:\"objectcache\";i:2;s:21:\"patch-objectcache.sql\";}i:9;a:3:{i:0;s:8:\"addTable\";i:1;s:13:\"categorylinks\";i:2;s:23:\"patch-categorylinks.sql\";}i:10;a:1:{i:0;s:16:\"doOldLinksUpdate\";}i:11;a:1:{i:0;s:22:\"doFixAncientImagelinks\";}i:12;a:4:{i:0;s:8:\"addField\";i:1;s:13:\"recentchanges\";i:2;s:5:\"rc_ip\";i:3;s:15:\"patch-rc_ip.sql\";}i:13;a:4:{i:0;s:8:\"addIndex\";i:1;s:5:\"image\";i:2;s:7:\"PRIMARY\";i:3;s:28:\"patch-image_name_primary.sql\";}i:14;a:4:{i:0;s:8:\"addField\";i:1;s:13:\"recentchanges\";i:2;s:5:\"rc_id\";i:3;s:15:\"patch-rc_id.sql\";}i:15;a:4:{i:0;s:8:\"addField\";i:1;s:13:\"recentchanges\";i:2;s:12:\"rc_patrolled\";i:3;s:19:\"patch-rc-patrol.sql\";}i:16;a:3:{i:0;s:8:\"addTable\";i:1;s:7:\"logging\";i:2;s:17:\"patch-logging.sql\";}i:17;a:4:{i:0;s:8:\"addField\";i:1;s:4:\"user\";i:2;s:10:\"user_token\";i:3;s:20:\"patch-user_token.sql\";}i:18;a:4:{i:0;s:8:\"addField\";i:1;s:9:\"watchlist\";i:2;s:24:\"wl_notificationtimestamp\";i:3;s:28:\"patch-email-notification.sql\";}i:19;a:1:{i:0;s:17:\"doWatchlistUpdate\";}i:20;a:4:{i:0;s:9:\"dropField\";i:1;s:4:\"user\";i:2;s:33:\"user_emailauthenticationtimestamp\";i:3;s:30:\"patch-email-authentication.sql\";}i:21;a:1:{i:0;s:21:\"doSchemaRestructuring\";}i:22;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"logging\";i:2;s:10:\"log_params\";i:3;s:20:\"patch-log_params.sql\";}i:23;a:4:{i:0;s:8:\"checkBin\";i:1;s:7:\"logging\";i:2;s:9:\"log_title\";i:3;s:23:\"patch-logging-title.sql\";}i:24;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"archive\";i:2;s:9:\"ar_rev_id\";i:3;s:24:\"patch-archive-rev_id.sql\";}i:25;a:4:{i:0;s:8:\"addField\";i:1;s:4:\"page\";i:2;s:8:\"page_len\";i:3;s:18:\"patch-page_len.sql\";}i:26;a:4:{i:0;s:9:\"dropField\";i:1;s:8:\"revision\";i:2;s:17:\"inverse_timestamp\";i:3;s:27:\"patch-inverse_timestamp.sql\";}i:27;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"revision\";i:2;s:11:\"rev_text_id\";i:3;s:21:\"patch-rev_text_id.sql\";}i:28;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"revision\";i:2;s:11:\"rev_deleted\";i:3;s:21:\"patch-rev_deleted.sql\";}i:29;a:4:{i:0;s:8:\"addField\";i:1;s:5:\"image\";i:2;s:9:\"img_width\";i:3;s:19:\"patch-img_width.sql\";}i:30;a:4:{i:0;s:8:\"addField\";i:1;s:5:\"image\";i:2;s:12:\"img_metadata\";i:3;s:22:\"patch-img_metadata.sql\";}i:31;a:4:{i:0;s:8:\"addField\";i:1;s:4:\"user\";i:2;s:16:\"user_email_token\";i:3;s:26:\"patch-user_email_token.sql\";}i:32;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"archive\";i:2;s:10:\"ar_text_id\";i:3;s:25:\"patch-archive-text_id.sql\";}i:33;a:1:{i:0;s:15:\"doNamespaceSize\";}i:34;a:4:{i:0;s:8:\"addField\";i:1;s:5:\"image\";i:2;s:14:\"img_media_type\";i:3;s:24:\"patch-img_media_type.sql\";}i:35;a:1:{i:0;s:17:\"doPagelinksUpdate\";}i:36;a:4:{i:0;s:9:\"dropField\";i:1;s:5:\"image\";i:2;s:8:\"img_type\";i:3;s:23:\"patch-drop_img_type.sql\";}i:37;a:1:{i:0;s:18:\"doUserUniqueUpdate\";}i:38;a:1:{i:0;s:18:\"doUserGroupsUpdate\";}i:39;a:4:{i:0;s:8:\"addField\";i:1;s:10:\"site_stats\";i:2;s:14:\"ss_total_pages\";i:3;s:27:\"patch-ss_total_articles.sql\";}i:40;a:3:{i:0;s:8:\"addTable\";i:1;s:12:\"user_newtalk\";i:2;s:22:\"patch-usernewtalk2.sql\";}i:41;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"transcache\";i:2;s:20:\"patch-transcache.sql\";}i:42;a:4:{i:0;s:8:\"addField\";i:1;s:9:\"interwiki\";i:2;s:8:\"iw_trans\";i:3;s:25:\"patch-interwiki-trans.sql\";}i:43;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"trackbacks\";i:2;s:20:\"patch-trackbacks.sql\";}i:44;a:1:{i:0;s:15:\"doWatchlistNull\";}i:45;a:4:{i:0;s:8:\"addIndex\";i:1;s:7:\"logging\";i:2;s:5:\"times\";i:3;s:29:\"patch-logging-times-index.sql\";}i:46;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:15:\"ipb_range_start\";i:3;s:25:\"patch-ipb_range_start.sql\";}i:47;a:1:{i:0;s:18:\"doPageRandomUpdate\";}i:48;a:4:{i:0;s:8:\"addField\";i:1;s:4:\"user\";i:2;s:17:\"user_registration\";i:3;s:27:\"patch-user_registration.sql\";}i:49;a:1:{i:0;s:21:\"doTemplatelinksUpdate\";}i:50;a:3:{i:0;s:8:\"addTable\";i:1;s:13:\"externallinks\";i:2;s:23:\"patch-externallinks.sql\";}i:51;a:3:{i:0;s:8:\"addTable\";i:1;s:3:\"job\";i:2;s:13:\"patch-job.sql\";}i:52;a:4:{i:0;s:8:\"addField\";i:1;s:10:\"site_stats\";i:2;s:9:\"ss_images\";i:3;s:19:\"patch-ss_images.sql\";}i:53;a:3:{i:0;s:8:\"addTable\";i:1;s:9:\"langlinks\";i:2;s:19:\"patch-langlinks.sql\";}i:54;a:3:{i:0;s:8:\"addTable\";i:1;s:15:\"querycache_info\";i:2;s:24:\"patch-querycacheinfo.sql\";}i:55;a:3:{i:0;s:8:\"addTable\";i:1;s:11:\"filearchive\";i:2;s:21:\"patch-filearchive.sql\";}i:56;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:13:\"ipb_anon_only\";i:3;s:23:\"patch-ipb_anon_only.sql\";}i:57;a:4:{i:0;s:8:\"addIndex\";i:1;s:13:\"recentchanges\";i:2;s:14:\"rc_ns_usertext\";i:3;s:31:\"patch-recentchanges-utindex.sql\";}i:58;a:4:{i:0;s:8:\"addIndex\";i:1;s:13:\"recentchanges\";i:2;s:12:\"rc_user_text\";i:3;s:28:\"patch-rc_user_text-index.sql\";}i:59;a:4:{i:0;s:8:\"addField\";i:1;s:4:\"user\";i:2;s:17:\"user_newpass_time\";i:3;s:27:\"patch-user_newpass_time.sql\";}i:60;a:3:{i:0;s:8:\"addTable\";i:1;s:8:\"redirect\";i:2;s:18:\"patch-redirect.sql\";}i:61;a:3:{i:0;s:8:\"addTable\";i:1;s:13:\"querycachetwo\";i:2;s:23:\"patch-querycachetwo.sql\";}i:62;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:20:\"ipb_enable_autoblock\";i:3;s:32:\"patch-ipb_optional_autoblock.sql\";}i:63;a:1:{i:0;s:26:\"doBacklinkingIndicesUpdate\";}i:64;a:4:{i:0;s:8:\"addField\";i:1;s:13:\"recentchanges\";i:2;s:10:\"rc_old_len\";i:3;s:16:\"patch-rc_len.sql\";}i:65;a:4:{i:0;s:8:\"addField\";i:1;s:4:\"user\";i:2;s:14:\"user_editcount\";i:3;s:24:\"patch-user_editcount.sql\";}i:66;a:1:{i:0;s:20:\"doRestrictionsUpdate\";}i:67;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"logging\";i:2;s:6:\"log_id\";i:3;s:16:\"patch-log_id.sql\";}i:68;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"revision\";i:2;s:13:\"rev_parent_id\";i:3;s:23:\"patch-rev_parent_id.sql\";}i:69;a:4:{i:0;s:8:\"addField\";i:1;s:17:\"page_restrictions\";i:2;s:5:\"pr_id\";i:3;s:35:\"patch-page_restrictions_sortkey.sql\";}i:70;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"revision\";i:2;s:7:\"rev_len\";i:3;s:17:\"patch-rev_len.sql\";}i:71;a:4:{i:0;s:8:\"addField\";i:1;s:13:\"recentchanges\";i:2;s:10:\"rc_deleted\";i:3;s:20:\"patch-rc_deleted.sql\";}i:72;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"logging\";i:2;s:11:\"log_deleted\";i:3;s:21:\"patch-log_deleted.sql\";}i:73;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"archive\";i:2;s:10:\"ar_deleted\";i:3;s:20:\"patch-ar_deleted.sql\";}i:74;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:11:\"ipb_deleted\";i:3;s:21:\"patch-ipb_deleted.sql\";}i:75;a:4:{i:0;s:8:\"addField\";i:1;s:11:\"filearchive\";i:2;s:10:\"fa_deleted\";i:3;s:20:\"patch-fa_deleted.sql\";}i:76;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"archive\";i:2;s:6:\"ar_len\";i:3;s:16:\"patch-ar_len.sql\";}i:77;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:15:\"ipb_block_email\";i:3;s:22:\"patch-ipb_emailban.sql\";}i:78;a:1:{i:0;s:28:\"doCategorylinksIndicesUpdate\";}i:79;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"oldimage\";i:2;s:11:\"oi_metadata\";i:3;s:21:\"patch-oi_metadata.sql\";}i:80;a:4:{i:0;s:8:\"addIndex\";i:1;s:7:\"archive\";i:2;s:18:\"usertext_timestamp\";i:3;s:28:\"patch-archive-user-index.sql\";}i:81;a:4:{i:0;s:8:\"addIndex\";i:1;s:5:\"image\";i:2;s:22:\"img_usertext_timestamp\";i:3;s:26:\"patch-image-user-index.sql\";}i:82;a:4:{i:0;s:8:\"addIndex\";i:1;s:8:\"oldimage\";i:2;s:21:\"oi_usertext_timestamp\";i:3;s:29:\"patch-oldimage-user-index.sql\";}i:83;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"archive\";i:2;s:10:\"ar_page_id\";i:3;s:25:\"patch-archive-page_id.sql\";}i:84;a:4:{i:0;s:8:\"addField\";i:1;s:5:\"image\";i:2;s:8:\"img_sha1\";i:3;s:18:\"patch-img_sha1.sql\";}i:85;a:3:{i:0;s:8:\"addTable\";i:1;s:16:\"protected_titles\";i:2;s:26:\"patch-protected_titles.sql\";}i:86;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:11:\"ipb_by_text\";i:3;s:21:\"patch-ipb_by_text.sql\";}i:87;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"page_props\";i:2;s:20:\"patch-page_props.sql\";}i:88;a:3:{i:0;s:8:\"addTable\";i:1;s:9:\"updatelog\";i:2;s:19:\"patch-updatelog.sql\";}i:89;a:3:{i:0;s:8:\"addTable\";i:1;s:8:\"category\";i:2;s:18:\"patch-category.sql\";}i:90;a:1:{i:0;s:20:\"doCategoryPopulation\";}i:91;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"archive\";i:2;s:12:\"ar_parent_id\";i:3;s:22:\"patch-ar_parent_id.sql\";}i:92;a:4:{i:0;s:8:\"addField\";i:1;s:12:\"user_newtalk\";i:2;s:19:\"user_last_timestamp\";i:3;s:29:\"patch-user_last_timestamp.sql\";}i:93;a:1:{i:0;s:18:\"doPopulateParentId\";}i:94;a:4:{i:0;s:8:\"checkBin\";i:1;s:16:\"protected_titles\";i:2;s:8:\"pt_title\";i:3;s:27:\"patch-pt_title-encoding.sql\";}i:95;a:1:{i:0;s:28:\"doMaybeProfilingMemoryUpdate\";}i:96;a:1:{i:0;s:26:\"doFilearchiveIndicesUpdate\";}i:97;a:4:{i:0;s:8:\"addField\";i:1;s:10:\"site_stats\";i:2;s:15:\"ss_active_users\";i:3;s:25:\"patch-ss_active_users.sql\";}i:98;a:1:{i:0;s:17:\"doActiveUsersInit\";}i:99;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:18:\"ipb_allow_usertalk\";i:3;s:28:\"patch-ipb_allow_usertalk.sql\";}i:100;a:1:{i:0;s:14:\"doUniquePlTlIl\";}i:101;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"change_tag\";i:2;s:20:\"patch-change_tag.sql\";}i:102;a:3:{i:0;s:8:\"addTable\";i:1;s:11:\"tag_summary\";i:2;s:20:\"patch-change_tag.sql\";}i:103;a:3:{i:0;s:8:\"addTable\";i:1;s:9:\"valid_tag\";i:2;s:20:\"patch-change_tag.sql\";}i:104;a:3:{i:0;s:8:\"addTable\";i:1;s:15:\"user_properties\";i:2;s:25:\"patch-user_properties.sql\";}i:105;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"log_search\";i:2;s:20:\"patch-log_search.sql\";}i:106;a:1:{i:0;s:21:\"doLogSearchPopulation\";}i:107;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"logging\";i:2;s:13:\"log_user_text\";i:3;s:23:\"patch-log_user_text.sql\";}i:108;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"l10n_cache\";i:2;s:20:\"patch-l10n_cache.sql\";}i:109;a:3:{i:0;s:8:\"addTable\";i:1;s:13:\"external_user\";i:2;s:23:\"patch-external_user.sql\";}i:110;a:4:{i:0;s:8:\"addIndex\";i:1;s:10:\"log_search\";i:2;s:12:\"ls_field_val\";i:3;s:33:\"patch-log_search-rename-index.sql\";}i:111;a:4:{i:0;s:8:\"addIndex\";i:1;s:10:\"change_tag\";i:2;s:17:\"change_tag_rc_tag\";i:3;s:28:\"patch-change_tag-indexes.sql\";}i:112;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"redirect\";i:2;s:12:\"rd_interwiki\";i:3;s:22:\"patch-rd_interwiki.sql\";}i:113;a:1:{i:0;s:23:\"doUpdateTranscacheField\";}i:114;a:1:{i:0;s:14:\"renameEuWikiId\";}i:115;a:1:{i:0;s:22:\"doUpdateMimeMinorField\";}i:116;a:1:{i:0;s:16:\"doPopulateRevLen\";}i:117;a:3:{i:0;s:8:\"addTable\";i:1;s:7:\"iwlinks\";i:2;s:17:\"patch-iwlinks.sql\";}i:118;a:4:{i:0;s:8:\"addIndex\";i:1;s:7:\"iwlinks\";i:2;s:21:\"iwl_prefix_title_from\";i:3;s:27:\"patch-rename-iwl_prefix.sql\";}i:119;a:4:{i:0;s:8:\"addField\";i:1;s:9:\"updatelog\";i:2;s:8:\"ul_value\";i:3;s:18:\"patch-ul_value.sql\";}i:120;a:4:{i:0;s:8:\"addField\";i:1;s:9:\"interwiki\";i:2;s:6:\"iw_api\";i:3;s:27:\"patch-iw_api_and_wikiid.sql\";}i:121;a:4:{i:0;s:9:\"dropIndex\";i:1;s:7:\"iwlinks\";i:2;s:10:\"iwl_prefix\";i:3;s:25:\"patch-kill-iwl_prefix.sql\";}i:122;a:4:{i:0;s:9:\"dropIndex\";i:1;s:7:\"iwlinks\";i:2;s:21:\"iwl_prefix_from_title\";i:3;s:22:\"patch-kill-iwl_pft.sql\";}i:123;a:4:{i:0;s:8:\"addField\";i:1;s:13:\"categorylinks\";i:2;s:12:\"cl_collation\";i:3;s:40:\"patch-categorylinks-better-collation.sql\";}i:124;a:1:{i:0;s:16:\"doClFieldsUpdate\";}i:125;a:1:{i:0;s:17:\"doCollationUpdate\";}i:126;a:3:{i:0;s:8:\"addTable\";i:1;s:12:\"msg_resource\";i:2;s:22:\"patch-msg_resource.sql\";}i:127;a:3:{i:0;s:8:\"addTable\";i:1;s:11:\"module_deps\";i:2;s:21:\"patch-module_deps.sql\";}}');
-/*!40000 ALTER TABLE `mw_updatelog` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user`
---
-
-DROP TABLE IF EXISTS `mw_user`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user` (
-  `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `user_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `user_real_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `user_password` tinyblob NOT NULL,
-  `user_newpassword` tinyblob NOT NULL,
-  `user_newpass_time` binary(14) DEFAULT NULL,
-  `user_email` tinytext NOT NULL,
-  `user_touched` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `user_token` binary(32) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `user_email_authenticated` binary(14) DEFAULT NULL,
-  `user_email_token` binary(32) DEFAULT NULL,
-  `user_email_token_expires` binary(14) DEFAULT NULL,
-  `user_registration` binary(14) DEFAULT NULL,
-  `user_editcount` int(11) DEFAULT NULL,
-  PRIMARY KEY (`user_id`),
-  UNIQUE KEY `user_name` (`user_name`),
-  KEY `user_email_token` (`user_email_token`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user`
---
-
-LOCK TABLES `mw_user` WRITE;
-/*!40000 ALTER TABLE `mw_user` DISABLE KEYS */;
-INSERT INTO `mw_user` VALUES (1,'WikiSysop','',':B:9c595470:df2c1237ae75896744457e7dfbeb7f90','',NULL,'','','20110110173136','5e3b582786fa8150118cfa78f18de0c5',NULL,'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',NULL,'20110107184113',1);
-/*!40000 ALTER TABLE `mw_user` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user_groups`
---
-
-DROP TABLE IF EXISTS `mw_user_groups`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user_groups` (
-  `ug_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `ug_group` varbinary(16) NOT NULL DEFAULT '',
-  UNIQUE KEY `ug_user_group` (`ug_user`,`ug_group`),
-  KEY `ug_group` (`ug_group`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user_groups`
---
-
-LOCK TABLES `mw_user_groups` WRITE;
-/*!40000 ALTER TABLE `mw_user_groups` DISABLE KEYS */;
-INSERT INTO `mw_user_groups` VALUES (1,'bureaucrat'),(1,'sysop');
-/*!40000 ALTER TABLE `mw_user_groups` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user_newtalk`
---
-
-DROP TABLE IF EXISTS `mw_user_newtalk`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user_newtalk` (
-  `user_id` int(11) NOT NULL DEFAULT '0',
-  `user_ip` varbinary(40) NOT NULL DEFAULT '',
-  `user_last_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  KEY `user_id` (`user_id`),
-  KEY `user_ip` (`user_ip`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user_newtalk`
---
-
-LOCK TABLES `mw_user_newtalk` WRITE;
-/*!40000 ALTER TABLE `mw_user_newtalk` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_user_newtalk` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user_properties`
---
-
-DROP TABLE IF EXISTS `mw_user_properties`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user_properties` (
-  `up_user` int(11) NOT NULL,
-  `up_property` varbinary(32) NOT NULL,
-  `up_value` blob,
-  UNIQUE KEY `user_properties_user_property` (`up_user`,`up_property`),
-  KEY `user_properties_property` (`up_property`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user_properties`
---
-
-LOCK TABLES `mw_user_properties` WRITE;
-/*!40000 ALTER TABLE `mw_user_properties` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_user_properties` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_valid_tag`
---
-
-DROP TABLE IF EXISTS `mw_valid_tag`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_valid_tag` (
-  `vt_tag` varchar(255) NOT NULL,
-  PRIMARY KEY (`vt_tag`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_valid_tag`
---
-
-LOCK TABLES `mw_valid_tag` WRITE;
-/*!40000 ALTER TABLE `mw_valid_tag` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_valid_tag` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_watchlist`
---
-
-DROP TABLE IF EXISTS `mw_watchlist`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_watchlist` (
-  `wl_user` int(10) unsigned NOT NULL,
-  `wl_namespace` int(11) NOT NULL DEFAULT '0',
-  `wl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `wl_notificationtimestamp` varbinary(14) DEFAULT NULL,
-  UNIQUE KEY `wl_user` (`wl_user`,`wl_namespace`,`wl_title`),
-  KEY `namespace_title` (`wl_namespace`,`wl_title`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_watchlist`
---
-
-LOCK TABLES `mw_watchlist` WRITE;
-/*!40000 ALTER TABLE `mw_watchlist` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_watchlist` ENABLE KEYS */;
-UNLOCK TABLES;
-/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
-
-/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
-/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
-/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
-/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
-/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
-/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
-/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-
--- Dump completed on 2011-01-10  9:34:34
diff --git a/tests/selenium/data/SimpleSeleniumTestImages.zip b/tests/selenium/data/SimpleSeleniumTestImages.zip
deleted file mode 100644 (file)
index 0374a1f..0000000
Binary files a/tests/selenium/data/SimpleSeleniumTestImages.zip and /dev/null differ
diff --git a/tests/selenium/data/Wikipedia-logo-v2-de.png b/tests/selenium/data/Wikipedia-logo-v2-de.png
deleted file mode 100644 (file)
index 7038524..0000000
Binary files a/tests/selenium/data/Wikipedia-logo-v2-de.png and /dev/null differ
diff --git a/tests/selenium/data/mediawiki118_fresh_installation.sql b/tests/selenium/data/mediawiki118_fresh_installation.sql
deleted file mode 100644 (file)
index 7beb9e6..0000000
+++ /dev/null
@@ -1,1543 +0,0 @@
--- MySQL dump 10.13  Distrib 5.1.41, for Win32 (ia32)
---
--- Host: localhost    Database: test_wiki
--- ------------------------------------------------------
--- Server version      5.1.41
-
-/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
-/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
-/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
-/*!40101 SET NAMES utf8 */;
-/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
-/*!40103 SET TIME_ZONE='+00:00' */;
-/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
-/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
-/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
-/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
-
---
--- Table structure for table `mw_archive`
---
-
-DROP TABLE IF EXISTS `mw_archive`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_archive` (
-  `ar_namespace` int(11) NOT NULL DEFAULT '0',
-  `ar_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `ar_text` mediumblob NOT NULL,
-  `ar_comment` tinyblob NOT NULL,
-  `ar_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `ar_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `ar_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `ar_minor_edit` tinyint(4) NOT NULL DEFAULT '0',
-  `ar_flags` tinyblob NOT NULL,
-  `ar_rev_id` int(10) unsigned DEFAULT NULL,
-  `ar_text_id` int(10) unsigned DEFAULT NULL,
-  `ar_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `ar_len` int(10) unsigned DEFAULT NULL,
-  `ar_page_id` int(10) unsigned DEFAULT NULL,
-  `ar_parent_id` int(10) unsigned DEFAULT NULL,
-  KEY `name_title_timestamp` (`ar_namespace`,`ar_title`,`ar_timestamp`),
-  KEY `usertext_timestamp` (`ar_user_text`,`ar_timestamp`),
-  KEY `ar_page_revid` (`ar_namespace`,`ar_title`,`ar_rev_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_archive`
---
-
-LOCK TABLES `mw_archive` WRITE;
-/*!40000 ALTER TABLE `mw_archive` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_archive` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_category`
---
-
-DROP TABLE IF EXISTS `mw_category`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_category` (
-  `cat_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `cat_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `cat_pages` int(11) NOT NULL DEFAULT '0',
-  `cat_subcats` int(11) NOT NULL DEFAULT '0',
-  `cat_files` int(11) NOT NULL DEFAULT '0',
-  `cat_hidden` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  PRIMARY KEY (`cat_id`),
-  UNIQUE KEY `cat_title` (`cat_title`),
-  KEY `cat_pages` (`cat_pages`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_category`
---
-
-LOCK TABLES `mw_category` WRITE;
-/*!40000 ALTER TABLE `mw_category` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_category` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_categorylinks`
---
-
-DROP TABLE IF EXISTS `mw_categorylinks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_categorylinks` (
-  `cl_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `cl_to` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `cl_sortkey` varbinary(230) NOT NULL DEFAULT '',
-  `cl_sortkey_prefix` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `cl_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-  `cl_collation` varbinary(32) NOT NULL DEFAULT '',
-  `cl_type` enum('page','subcat','file') NOT NULL DEFAULT 'page',
-  UNIQUE KEY `cl_from` (`cl_from`,`cl_to`),
-  KEY `cl_sortkey` (`cl_to`,`cl_type`,`cl_sortkey`,`cl_from`),
-  KEY `cl_timestamp` (`cl_to`,`cl_timestamp`),
-  KEY `cl_collation` (`cl_collation`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_categorylinks`
---
-
-LOCK TABLES `mw_categorylinks` WRITE;
-/*!40000 ALTER TABLE `mw_categorylinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_categorylinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_change_tag`
---
-
-DROP TABLE IF EXISTS `mw_change_tag`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_change_tag` (
-  `ct_rc_id` int(11) DEFAULT NULL,
-  `ct_log_id` int(11) DEFAULT NULL,
-  `ct_rev_id` int(11) DEFAULT NULL,
-  `ct_tag` varchar(255) NOT NULL,
-  `ct_params` blob,
-  UNIQUE KEY `change_tag_rc_tag` (`ct_rc_id`,`ct_tag`),
-  UNIQUE KEY `change_tag_log_tag` (`ct_log_id`,`ct_tag`),
-  UNIQUE KEY `change_tag_rev_tag` (`ct_rev_id`,`ct_tag`),
-  KEY `change_tag_tag_id` (`ct_tag`,`ct_rc_id`,`ct_rev_id`,`ct_log_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_change_tag`
---
-
-LOCK TABLES `mw_change_tag` WRITE;
-/*!40000 ALTER TABLE `mw_change_tag` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_change_tag` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_external_user`
---
-
-DROP TABLE IF EXISTS `mw_external_user`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_external_user` (
-  `eu_local_id` int(10) unsigned NOT NULL,
-  `eu_external_id` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  PRIMARY KEY (`eu_local_id`),
-  UNIQUE KEY `eu_external_id` (`eu_external_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_external_user`
---
-
-LOCK TABLES `mw_external_user` WRITE;
-/*!40000 ALTER TABLE `mw_external_user` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_external_user` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_externallinks`
---
-
-DROP TABLE IF EXISTS `mw_externallinks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_externallinks` (
-  `el_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `el_to` blob NOT NULL,
-  `el_index` blob NOT NULL,
-  KEY `el_from` (`el_from`,`el_to`(40)),
-  KEY `el_to` (`el_to`(60),`el_from`),
-  KEY `el_index` (`el_index`(60))
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_externallinks`
---
-
-LOCK TABLES `mw_externallinks` WRITE;
-/*!40000 ALTER TABLE `mw_externallinks` DISABLE KEYS */;
-INSERT INTO `mw_externallinks` VALUES (1,'http://meta.wikimedia.org/wiki/Help:Contents','http://org.wikimedia.meta./wiki/Help:Contents');
-INSERT INTO `mw_externallinks` VALUES (1,'http://www.mediawiki.org/wiki/Manual:Configuration_settings','http://org.mediawiki.www./wiki/Manual:Configuration_settings');
-INSERT INTO `mw_externallinks` VALUES (1,'http://www.mediawiki.org/wiki/Manual:FAQ','http://org.mediawiki.www./wiki/Manual:FAQ');
-INSERT INTO `mw_externallinks` VALUES (1,'https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce','https://org.wikimedia.lists./mailman/listinfo/mediawiki-announce');
-/*!40000 ALTER TABLE `mw_externallinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_filearchive`
---
-
-DROP TABLE IF EXISTS `mw_filearchive`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_filearchive` (
-  `fa_id` int(11) NOT NULL AUTO_INCREMENT,
-  `fa_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `fa_archive_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '',
-  `fa_storage_group` varbinary(16) DEFAULT NULL,
-  `fa_storage_key` varbinary(64) DEFAULT '',
-  `fa_deleted_user` int(11) DEFAULT NULL,
-  `fa_deleted_timestamp` binary(14) DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `fa_deleted_reason` text,
-  `fa_size` int(10) unsigned DEFAULT '0',
-  `fa_width` int(11) DEFAULT '0',
-  `fa_height` int(11) DEFAULT '0',
-  `fa_metadata` mediumblob,
-  `fa_bits` int(11) DEFAULT '0',
-  `fa_media_type` enum('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE') DEFAULT NULL,
-  `fa_major_mime` enum('unknown','application','audio','image','text','video','message','model','multipart') DEFAULT 'unknown',
-  `fa_minor_mime` varbinary(100) DEFAULT 'unknown',
-  `fa_description` tinyblob,
-  `fa_user` int(10) unsigned DEFAULT '0',
-  `fa_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
-  `fa_timestamp` binary(14) DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `fa_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  PRIMARY KEY (`fa_id`),
-  KEY `fa_name` (`fa_name`,`fa_timestamp`),
-  KEY `fa_storage_group` (`fa_storage_group`,`fa_storage_key`),
-  KEY `fa_deleted_timestamp` (`fa_deleted_timestamp`),
-  KEY `fa_user_timestamp` (`fa_user_text`,`fa_timestamp`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_filearchive`
---
-
-LOCK TABLES `mw_filearchive` WRITE;
-/*!40000 ALTER TABLE `mw_filearchive` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_filearchive` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_hitcounter`
---
-
-DROP TABLE IF EXISTS `mw_hitcounter`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_hitcounter` (
-  `hc_id` int(10) unsigned NOT NULL
-) ENGINE=MEMORY DEFAULT CHARSET=latin1 MAX_ROWS=25000;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_hitcounter`
---
-
-LOCK TABLES `mw_hitcounter` WRITE;
-/*!40000 ALTER TABLE `mw_hitcounter` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_hitcounter` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_image`
---
-
-DROP TABLE IF EXISTS `mw_image`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_image` (
-  `img_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `img_size` int(10) unsigned NOT NULL DEFAULT '0',
-  `img_width` int(11) NOT NULL DEFAULT '0',
-  `img_height` int(11) NOT NULL DEFAULT '0',
-  `img_metadata` mediumblob NOT NULL,
-  `img_bits` int(11) NOT NULL DEFAULT '0',
-  `img_media_type` enum('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE') DEFAULT NULL,
-  `img_major_mime` enum('unknown','application','audio','image','text','video','message','model','multipart') NOT NULL DEFAULT 'unknown',
-  `img_minor_mime` varbinary(100) NOT NULL DEFAULT 'unknown',
-  `img_description` tinyblob NOT NULL,
-  `img_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `img_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `img_timestamp` varbinary(14) NOT NULL DEFAULT '',
-  `img_sha1` varbinary(32) NOT NULL DEFAULT '',
-  PRIMARY KEY (`img_name`),
-  KEY `img_usertext_timestamp` (`img_user_text`,`img_timestamp`),
-  KEY `img_size` (`img_size`),
-  KEY `img_timestamp` (`img_timestamp`),
-  KEY `img_sha1` (`img_sha1`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_image`
---
-
-LOCK TABLES `mw_image` WRITE;
-/*!40000 ALTER TABLE `mw_image` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_image` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_imagelinks`
---
-
-DROP TABLE IF EXISTS `mw_imagelinks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_imagelinks` (
-  `il_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `il_to` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  UNIQUE KEY `il_from` (`il_from`,`il_to`),
-  UNIQUE KEY `il_to` (`il_to`,`il_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_imagelinks`
---
-
-LOCK TABLES `mw_imagelinks` WRITE;
-/*!40000 ALTER TABLE `mw_imagelinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_imagelinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_interwiki`
---
-
-DROP TABLE IF EXISTS `mw_interwiki`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_interwiki` (
-  `iw_prefix` varchar(32) NOT NULL,
-  `iw_url` blob NOT NULL,
-  `iw_api` blob NOT NULL,
-  `iw_wikiid` varchar(64) NOT NULL,
-  `iw_local` tinyint(1) NOT NULL,
-  `iw_trans` tinyint(4) NOT NULL DEFAULT '0',
-  UNIQUE KEY `iw_prefix` (`iw_prefix`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_interwiki`
---
-
-LOCK TABLES `mw_interwiki` WRITE;
-/*!40000 ALTER TABLE `mw_interwiki` DISABLE KEYS */;
-INSERT INTO `mw_interwiki` VALUES ('acronym','http://www.acronymfinder.com/af-query.asp?String=exact&Acronym=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('advogato','http://www.advogato.org/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('annotationwiki','http://www.seedwiki.com/page.cfm?wikiid=368&doc=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('arxiv','http://www.arxiv.org/abs/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('c2find','http://c2.com/cgi/wiki?FindPage&value=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('cache','http://www.google.com/search?q=cache:$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('commons','http://commons.wikimedia.org/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('corpknowpedia','http://corpknowpedia.org/wiki/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('dictionary','http://www.dict.org/bin/Dict?Database=*&Form=Dict1&Strategy=*&Query=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('disinfopedia','http://www.disinfopedia.org/wiki.phtml?title=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('docbook','http://wiki.docbook.org/topic/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('doi','http://dx.doi.org/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('drumcorpswiki','http://www.drumcorpswiki.com/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('dwjwiki','http://www.suberic.net/cgi-bin/dwj/wiki.cgi?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('elibre','http://enciclopedia.us.es/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('emacswiki','http://www.emacswiki.org/cgi-bin/wiki.pl?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('foldoc','http://foldoc.org/?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('foxwiki','http://fox.wikis.com/wc.dll?Wiki~$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('freebsdman','http://www.FreeBSD.org/cgi/man.cgi?apropos=1&query=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('gej','http://www.esperanto.de/cgi-bin/aktivikio/wiki.pl?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('gentoo-wiki','http://gentoo-wiki.com/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('google','http://www.google.com/search?q=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('googlegroups','http://groups.google.com/groups?q=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('hammondwiki','http://www.dairiki.org/HammondWiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('hewikisource','http://he.wikisource.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('hrwiki','http://www.hrwiki.org/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('imdb','http://us.imdb.com/Title?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('jargonfile','http://sunir.org/apps/meta.pl?wiki=JargonFile&redirect=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('jspwiki','http://www.jspwiki.org/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('keiki','http://kei.ki/en/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('kmwiki','http://kmwiki.wikispaces.com/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('linuxwiki','http://linuxwiki.de/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('lojban','http://www.lojban.org/tiki/tiki-index.php?page=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('lqwiki','http://wiki.linuxquestions.org/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('lugkr','http://lug-kr.sourceforge.net/cgi-bin/lugwiki.pl?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('mathsongswiki','http://SeedWiki.com/page.cfm?wikiid=237&doc=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('meatball','http://www.usemod.com/cgi-bin/mb.pl?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('mediawikiwiki','http://www.mediawiki.org/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('mediazilla','https://bugzilla.wikimedia.org/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('memoryalpha','http://www.memory-alpha.org/en/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('metawiki','http://sunir.org/apps/meta.pl?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('metawikimedia','http://meta.wikimedia.org/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('moinmoin','http://purl.net/wiki/moin/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('mozillawiki','http://wiki.mozilla.org/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('mw','http://www.mediawiki.org/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('oeis','http://www.research.att.com/cgi-bin/access.cgi/as/njas/sequences/eisA.cgi?Anum=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('openfacts','http://openfacts.berlios.de/index.phtml?title=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('openwiki','http://openwiki.com/?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('pmeg','http://www.bertilow.com/pmeg/$1.php','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('ppr','http://c2.com/cgi/wiki?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('pythoninfo','http://wiki.python.org/moin/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('rfc','http://www.rfc-editor.org/rfc/rfc$1.txt','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('s23wiki','http://is-root.de/wiki/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('seattlewiki','http://seattle.wikia.com/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('seattlewireless','http://seattlewireless.net/?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('senseislibrary','http://senseis.xmp.net/?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('sourceforge','http://sourceforge.net/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('squeak','http://wiki.squeak.org/squeak/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('susning','http://www.susning.nu/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('svgwiki','http://wiki.svg.org/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('tavi','http://tavi.sourceforge.net/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('tejo','http://www.tejo.org/vikio/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('theopedia','http://www.theopedia.com/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('tmbw','http://www.tmbw.net/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('tmnet','http://www.technomanifestos.net/?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('tmwiki','http://www.EasyTopicMaps.com/?page=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('twiki','http://twiki.org/cgi-bin/view/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('uea','http://www.tejo.org/uea/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('unreal','http://wiki.beyondunreal.com/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('usemod','http://www.usemod.com/cgi-bin/wiki.pl?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('vinismo','http://vinismo.com/en/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('webseitzwiki','http://webseitz.fluxent.com/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('why','http://clublet.com/c/c/why?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wiki','http://c2.com/cgi/wiki?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikia','http://www.wikia.com/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikibooks','http://en.wikibooks.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wikicities','http://www.wikia.com/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikif1','http://www.wikif1.org/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikihow','http://www.wikihow.com/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikimedia','http://wikimediafoundation.org/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikinews','http://en.wikinews.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wikinfo','http://www.wikinfo.org/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikipedia','http://en.wikipedia.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wikiquote','http://en.wikiquote.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wikisource','http://wikisource.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wikispecies','http://species.wikimedia.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wikitravel','http://wikitravel.org/en/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikiversity','http://en.wikiversity.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wikt','http://en.wiktionary.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wiktionary','http://en.wiktionary.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wlug','http://www.wlug.org.nz/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('zwiki','http://zwiki.org/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('zzz wiki','http://wiki.zzz.ee/index.php/$1','','',0,0);
-/*!40000 ALTER TABLE `mw_interwiki` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_ipblocks`
---
-
-DROP TABLE IF EXISTS `mw_ipblocks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_ipblocks` (
-  `ipb_id` int(11) NOT NULL AUTO_INCREMENT,
-  `ipb_address` tinyblob NOT NULL,
-  `ipb_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `ipb_by` int(10) unsigned NOT NULL DEFAULT '0',
-  `ipb_by_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `ipb_reason` tinyblob NOT NULL,
-  `ipb_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `ipb_auto` tinyint(1) NOT NULL DEFAULT '0',
-  `ipb_anon_only` tinyint(1) NOT NULL DEFAULT '0',
-  `ipb_create_account` tinyint(1) NOT NULL DEFAULT '1',
-  `ipb_enable_autoblock` tinyint(1) NOT NULL DEFAULT '1',
-  `ipb_expiry` varbinary(14) NOT NULL DEFAULT '',
-  `ipb_range_start` tinyblob NOT NULL,
-  `ipb_range_end` tinyblob NOT NULL,
-  `ipb_deleted` tinyint(1) NOT NULL DEFAULT '0',
-  `ipb_block_email` tinyint(1) NOT NULL DEFAULT '0',
-  `ipb_allow_usertalk` tinyint(1) NOT NULL DEFAULT '0',
-  PRIMARY KEY (`ipb_id`),
-  UNIQUE KEY `ipb_address` (`ipb_address`(255),`ipb_user`,`ipb_auto`,`ipb_anon_only`),
-  KEY `ipb_user` (`ipb_user`),
-  KEY `ipb_range` (`ipb_range_start`(8),`ipb_range_end`(8)),
-  KEY `ipb_timestamp` (`ipb_timestamp`),
-  KEY `ipb_expiry` (`ipb_expiry`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_ipblocks`
---
-
-LOCK TABLES `mw_ipblocks` WRITE;
-/*!40000 ALTER TABLE `mw_ipblocks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_ipblocks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_iwlinks`
---
-
-DROP TABLE IF EXISTS `mw_iwlinks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_iwlinks` (
-  `iwl_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `iwl_prefix` varbinary(20) NOT NULL DEFAULT '',
-  `iwl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  UNIQUE KEY `iwl_from` (`iwl_from`,`iwl_prefix`,`iwl_title`),
-  UNIQUE KEY `iwl_prefix_title_from` (`iwl_prefix`,`iwl_title`,`iwl_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_iwlinks`
---
-
-LOCK TABLES `mw_iwlinks` WRITE;
-/*!40000 ALTER TABLE `mw_iwlinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_iwlinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_job`
---
-
-DROP TABLE IF EXISTS `mw_job`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_job` (
-  `job_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `job_cmd` varbinary(60) NOT NULL DEFAULT '',
-  `job_namespace` int(11) NOT NULL,
-  `job_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `job_params` blob NOT NULL,
-  PRIMARY KEY (`job_id`),
-  KEY `job_cmd` (`job_cmd`,`job_namespace`,`job_title`,`job_params`(128))
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_job`
---
-
-LOCK TABLES `mw_job` WRITE;
-/*!40000 ALTER TABLE `mw_job` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_job` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_l10n_cache`
---
-
-DROP TABLE IF EXISTS `mw_l10n_cache`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_l10n_cache` (
-  `lc_lang` varbinary(32) NOT NULL,
-  `lc_key` varchar(255) NOT NULL,
-  `lc_value` mediumblob NOT NULL,
-  KEY `lc_lang_key` (`lc_lang`,`lc_key`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
-
-
---
--- Table structure for table `mw_langlinks`
---
-
-DROP TABLE IF EXISTS `mw_langlinks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_langlinks` (
-  `ll_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `ll_lang` varbinary(20) NOT NULL DEFAULT '',
-  `ll_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  UNIQUE KEY `ll_from` (`ll_from`,`ll_lang`),
-  KEY `ll_lang` (`ll_lang`,`ll_title`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_langlinks`
---
-
-LOCK TABLES `mw_langlinks` WRITE;
-/*!40000 ALTER TABLE `mw_langlinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_langlinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_log_search`
---
-
-DROP TABLE IF EXISTS `mw_log_search`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_log_search` (
-  `ls_field` varbinary(32) NOT NULL,
-  `ls_value` varchar(255) NOT NULL,
-  `ls_log_id` int(10) unsigned NOT NULL DEFAULT '0',
-  UNIQUE KEY `ls_field_val` (`ls_field`,`ls_value`,`ls_log_id`),
-  KEY `ls_log_id` (`ls_log_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_log_search`
---
-
-LOCK TABLES `mw_log_search` WRITE;
-/*!40000 ALTER TABLE `mw_log_search` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_log_search` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_logging`
---
-
-DROP TABLE IF EXISTS `mw_logging`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_logging` (
-  `log_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `log_type` varbinary(32) NOT NULL DEFAULT '',
-  `log_action` varbinary(32) NOT NULL DEFAULT '',
-  `log_timestamp` binary(14) NOT NULL DEFAULT '19700101000000',
-  `log_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `log_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `log_namespace` int(11) NOT NULL DEFAULT '0',
-  `log_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `log_page` int(10) unsigned DEFAULT NULL,
-  `log_comment` varchar(255) NOT NULL DEFAULT '',
-  `log_params` blob NOT NULL,
-  `log_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  PRIMARY KEY (`log_id`),
-  KEY `type_time` (`log_type`,`log_timestamp`),
-  KEY `user_time` (`log_user`,`log_timestamp`),
-  KEY `page_time` (`log_namespace`,`log_title`,`log_timestamp`),
-  KEY `times` (`log_timestamp`),
-  KEY `log_user_type_time` (`log_user`,`log_type`,`log_timestamp`),
-  KEY `log_page_id_time` (`log_page`,`log_timestamp`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_logging`
---
-
-LOCK TABLES `mw_logging` WRITE;
-/*!40000 ALTER TABLE `mw_logging` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_logging` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_math`
---
-
-DROP TABLE IF EXISTS `mw_math`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_math` (
-  `math_inputhash` varbinary(16) NOT NULL,
-  `math_outputhash` varbinary(16) NOT NULL,
-  `math_html_conservativeness` tinyint(4) NOT NULL,
-  `math_html` text,
-  `math_mathml` text,
-  UNIQUE KEY `math_inputhash` (`math_inputhash`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_math`
---
-
-LOCK TABLES `mw_math` WRITE;
-/*!40000 ALTER TABLE `mw_math` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_math` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_module_deps`
---
-
-DROP TABLE IF EXISTS `mw_module_deps`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_module_deps` (
-  `md_module` varbinary(255) NOT NULL,
-  `md_skin` varbinary(32) NOT NULL,
-  `md_deps` mediumblob NOT NULL,
-  UNIQUE KEY `md_module_skin` (`md_module`,`md_skin`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_module_deps`
---
-
-LOCK TABLES `mw_module_deps` WRITE;
-/*!40000 ALTER TABLE `mw_module_deps` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_module_deps` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_msg_resource`
---
-
-DROP TABLE IF EXISTS `mw_msg_resource`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_msg_resource` (
-  `mr_resource` varbinary(255) NOT NULL,
-  `mr_lang` varbinary(32) NOT NULL,
-  `mr_blob` mediumblob NOT NULL,
-  `mr_timestamp` binary(14) NOT NULL,
-  UNIQUE KEY `mr_resource_lang` (`mr_resource`,`mr_lang`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_msg_resource`
---
-
-LOCK TABLES `mw_msg_resource` WRITE;
-/*!40000 ALTER TABLE `mw_msg_resource` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_msg_resource` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_msg_resource_links`
---
-
-DROP TABLE IF EXISTS `mw_msg_resource_links`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_msg_resource_links` (
-  `mrl_resource` varbinary(255) NOT NULL,
-  `mrl_message` varbinary(255) NOT NULL,
-  UNIQUE KEY `mrl_message_resource` (`mrl_message`,`mrl_resource`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_msg_resource_links`
---
-
-LOCK TABLES `mw_msg_resource_links` WRITE;
-/*!40000 ALTER TABLE `mw_msg_resource_links` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_msg_resource_links` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_objectcache`
---
-
-DROP TABLE IF EXISTS `mw_objectcache`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_objectcache` (
-  `keyname` varbinary(255) NOT NULL DEFAULT '',
-  `value` mediumblob,
-  `exptime` datetime DEFAULT NULL,
-  PRIMARY KEY (`keyname`),
-  KEY `exptime` (`exptime`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_objectcache`
---
-
-LOCK TABLES `mw_objectcache` WRITE;
-/*!40000 ALTER TABLE `mw_objectcache` DISABLE KEYS */;
-INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:messages:en','K�2��.�2�R\ns\r\n���S�δ2��\ 5\0','2010-12-31 13:16:31');
-INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:pcache:idhash:1-0!*!*!!en!*','�V[o�F\14�g~��\ f��\12\ 6B��P��m\12)$TK�\ fU�\ 6�\0�����8$\e\7f�9�a\rI�l��X>��ܹ�q�\aSa,��ʕ�\vx��?[~ʃ|\ 6�.\18Z\1e��\ 3\1e$�8Y�\'�I�Y�K�\16�-\04�U����J�\'&�uB)�:I�\18��\10���E�m�\1csk`�`k\ 3�Q�v��a��\13�\rZ��t�0����+P%GE\a�ـ�JX;\n\10\12\18-\14s\ 4\19P�@\17�B�b\13���8~�첒\19$�\18�ea\10\12�υ��f��+���0[,�F\18�x��d�\1d\'�\14z�0��BJ���=���\17J��c�\\��:�\14�&B��T��\'��C��Fdÿ׆Fq����Gd����%8G�0��A\16�I�\ 2�;                Ԙ\1d`�7�5�LI\r\ 1��(���{�c�����\18g+��8Qr�&�ͦ��A)�V��ЕPT��\\UƧtn�\1e�Z�\ 3e�SfJZ\1f(V\ 1\ 1\ fP�}��\b��0��O�N     �=j�\\H�\v�y�\\�\1eU[h]T:�\f��bd��u��\10+�j%\'�6k��f:E�\1c;�@Y\18ך��\144���Ȁ�\b�q�\v��\7fZ�º6<b�3��TU(d�\17�,\n���Y|�e�\'\a�5��T�\ 1\13fU�8}�\"��\ 4m�\ 3��/\10���}Uk�\119o��;��\ 3��|*R?�n���   3d��g1��y�\\f8gk\1e�����w\ 2��=�\18\1c\16\ 4�:/Y7���ۋ�^<�Ō����\15v#���i����\ 6C�#��6\Z�.0�Ua$4\19\11�=\Z���;�\ 1�4����\ 1Y=���5��\ 6�:kpΐq��Ŧ4��X���C��q\1fYߵ-��Lj�����D�f��\e��\f�:�\1e��\19�(3t��14C��J�#����\ 5����\15��WXT���Δy:�^�6�v�7����I�U�Ee�\a�(�p0��ga�6\7fMj��Sc�,ѫ@��ޅ+R\ 5\ f����A��xХ\'6���utǷbۛ��\17`j�8ؚ�G�IC<KS��\ 65�|�krJ\ 6\ry�\\b3xP���\ 3��ua�@�\ f���$SS�`��tQ.gw\17W��\r\19@\'���w�� ��\bxZ(�>5\ 4{�\v\ f��\adw�>�=J)\r�6\15t ��X��\12��M��\b�B�\n�ŖT��\13��b>�qg���\12\v\ 47�\f�z�n\ e7��vwr�-%u�-Qi�iX1��Ne\13���A#�v��\15ӧ�3��?','2010-12-31 13:16:31');
-INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:pcache:idoptions:1','E��\ e�@\fD��\1f`�\v\"v�ƣ��Wh��,�b�!�\18⭙7�L+�\13\1c|}�t\f��I�$�<��\ 1�F\rpSl�4����OJN`\r\Z���\f\f\17ծ���)�\a�PY��$�K�\ f���գ9�Vjp72��E���c�Wp�2��\acVxu7\1e��\e        ����\b\12p#�r=.���[>y)\ f\ f\1fZp��\ 5','2010-12-31 13:16:31');
-INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:resourceloader:filter:minify-css:3832ee25d9c44988461f5f339b9b6a48','+�26�Rr�MM�LTH�ɩV\0�Z(��(3�\ 4(R�d\r\0','2038-01-19 03:14:07');
-INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:resourceloader:filter:minify-css:aa0df16258ad99a1d249e796b5067ed9','+�2��Rr�MM�LTH�ɩN��K-�Q.,�L�NJ,R\0��s򋬔�\12\r���V�\Z\0','2038-01-19 03:14:07');
-INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:resourceloader:filter:minify-js:22814eeadc9cf0a9ebcd844e14198e66','m��r�0\f��y\f��\19��r�&Qޡמ!\n�\18qQ�Xq;}���$��ވ� �c!]]].o5S�\n�)Fq\f\ e��L^\18\ e�?�s�F�\ 2!\1d�O\a�M\\�������\0���N��\18Ɂ���լ�\ e���:��-�j��F��{ۅ�G�\13\"i�\ e� \11\Z�6�K����!��Y]=�F[�\ f~竍\17\12��䶃\16\b\12���`��\a9N�Ǵ���@�K��\11\ f|z�?1�A��\1f@J#_ԁ�7\'�l\18�1)\vJ�͵�).�3\vz�f�T�A���H\ eњ�[#)�BzRA�7֌��\"T�*~SW�\a\11\1c�/P���B�Ŏ;\Z�ay�6\1c����+U��?.$�6��-u\1dT�v@h��s�&�����Nإb\e�fJ�~\ 5�]\ 36\19��p��/q)�\12>\ f�E�1�\ 4�͔A\ne�L�g\ZE�`cW�����`fJ�E�a\19��>��b\n�ӑd�.u�do�\e�[\e�\nt��b�+�\1f��l\1f\Z?X*��Y�\1f(�օ\10;\e�L�\1cJqť\ 6ɝ\10���d$\19�\"�WzG�-@b~\ f+�#�kǞَ�Ƃ~������P)B  ���\16�q�Җ2��\11�r�Rl�\15���\ 1`\1cz   �\ f4�����ÝX�m�;�X݁t;r.�sA�\15�R��\ 5y)�kA�\nR�JT��J�U��*�W��_ߟ�4@�vt��f���\7f>\15\ 6���x���\ 3','2038-01-19 03:14:07');
-INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:resourceloader:filter:minify-js:dd9440c19c575629ac5ec90e489cf62e','+�21�R�\ 2��Ԕ�����L���Ĕ�\"��ĒT�j��̒T%+���ĔJ�ZMk.%k\0','2038-01-19 03:14:07');
-/*!40000 ALTER TABLE `mw_objectcache` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_oldimage`
---
-
-DROP TABLE IF EXISTS `mw_oldimage`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_oldimage` (
-  `oi_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `oi_archive_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `oi_size` int(10) unsigned NOT NULL DEFAULT '0',
-  `oi_width` int(11) NOT NULL DEFAULT '0',
-  `oi_height` int(11) NOT NULL DEFAULT '0',
-  `oi_bits` int(11) NOT NULL DEFAULT '0',
-  `oi_description` tinyblob NOT NULL,
-  `oi_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `oi_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `oi_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `oi_metadata` mediumblob NOT NULL,
-  `oi_media_type` enum('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE') DEFAULT NULL,
-  `oi_major_mime` enum('unknown','application','audio','image','text','video','message','model','multipart') NOT NULL DEFAULT 'unknown',
-  `oi_minor_mime` varbinary(100) NOT NULL DEFAULT 'unknown',
-  `oi_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `oi_sha1` varbinary(32) NOT NULL DEFAULT '',
-  KEY `oi_usertext_timestamp` (`oi_user_text`,`oi_timestamp`),
-  KEY `oi_name_timestamp` (`oi_name`,`oi_timestamp`),
-  KEY `oi_name_archive_name` (`oi_name`,`oi_archive_name`(14)),
-  KEY `oi_sha1` (`oi_sha1`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_oldimage`
---
-
-LOCK TABLES `mw_oldimage` WRITE;
-/*!40000 ALTER TABLE `mw_oldimage` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_oldimage` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_page`
---
-
-DROP TABLE IF EXISTS `mw_page`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_page` (
-  `page_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `page_namespace` int(11) NOT NULL,
-  `page_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `page_restrictions` tinyblob NOT NULL,
-  `page_counter` bigint(20) unsigned NOT NULL DEFAULT '0',
-  `page_is_redirect` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `page_is_new` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `page_random` double unsigned NOT NULL,
-  `page_touched` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `page_latest` int(10) unsigned NOT NULL,
-  `page_len` int(10) unsigned NOT NULL,
-  PRIMARY KEY (`page_id`),
-  UNIQUE KEY `name_title` (`page_namespace`,`page_title`),
-  KEY `page_random` (`page_random`),
-  KEY `page_len` (`page_len`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_page`
---
-
-LOCK TABLES `mw_page` WRITE;
-/*!40000 ALTER TABLE `mw_page` DISABLE KEYS */;
-INSERT INTO `mw_page` VALUES (1,0,'Main_Page','',1,0,1,0.334989576352,'20101230131547',1,438);
-/*!40000 ALTER TABLE `mw_page` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_page_props`
---
-
-DROP TABLE IF EXISTS `mw_page_props`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_page_props` (
-  `pp_page` int(11) NOT NULL,
-  `pp_propname` varbinary(60) NOT NULL,
-  `pp_value` blob NOT NULL,
-  UNIQUE KEY `pp_page_propname` (`pp_page`,`pp_propname`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_page_props`
---
-
-LOCK TABLES `mw_page_props` WRITE;
-/*!40000 ALTER TABLE `mw_page_props` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_page_props` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_page_restrictions`
---
-
-DROP TABLE IF EXISTS `mw_page_restrictions`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_page_restrictions` (
-  `pr_page` int(11) NOT NULL,
-  `pr_type` varbinary(60) NOT NULL,
-  `pr_level` varbinary(60) NOT NULL,
-  `pr_cascade` tinyint(4) NOT NULL,
-  `pr_user` int(11) DEFAULT NULL,
-  `pr_expiry` varbinary(14) DEFAULT NULL,
-  `pr_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  PRIMARY KEY (`pr_id`),
-  UNIQUE KEY `pr_pagetype` (`pr_page`,`pr_type`),
-  KEY `pr_typelevel` (`pr_type`,`pr_level`),
-  KEY `pr_level` (`pr_level`),
-  KEY `pr_cascade` (`pr_cascade`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_page_restrictions`
---
-
-LOCK TABLES `mw_page_restrictions` WRITE;
-/*!40000 ALTER TABLE `mw_page_restrictions` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_page_restrictions` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_pagelinks`
---
-
-DROP TABLE IF EXISTS `mw_pagelinks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_pagelinks` (
-  `pl_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `pl_namespace` int(11) NOT NULL DEFAULT '0',
-  `pl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  UNIQUE KEY `pl_from` (`pl_from`,`pl_namespace`,`pl_title`),
-  UNIQUE KEY `pl_namespace` (`pl_namespace`,`pl_title`,`pl_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_pagelinks`
---
-
-LOCK TABLES `mw_pagelinks` WRITE;
-/*!40000 ALTER TABLE `mw_pagelinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_pagelinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_protected_titles`
---
-
-DROP TABLE IF EXISTS `mw_protected_titles`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_protected_titles` (
-  `pt_namespace` int(11) NOT NULL,
-  `pt_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `pt_user` int(10) unsigned NOT NULL,
-  `pt_reason` tinyblob,
-  `pt_timestamp` binary(14) NOT NULL,
-  `pt_expiry` varbinary(14) NOT NULL DEFAULT '',
-  `pt_create_perm` varbinary(60) NOT NULL,
-  UNIQUE KEY `pt_namespace_title` (`pt_namespace`,`pt_title`),
-  KEY `pt_timestamp` (`pt_timestamp`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_protected_titles`
---
-
-LOCK TABLES `mw_protected_titles` WRITE;
-/*!40000 ALTER TABLE `mw_protected_titles` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_protected_titles` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_querycache`
---
-
-DROP TABLE IF EXISTS `mw_querycache`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_querycache` (
-  `qc_type` varbinary(32) NOT NULL,
-  `qc_value` int(10) unsigned NOT NULL DEFAULT '0',
-  `qc_namespace` int(11) NOT NULL DEFAULT '0',
-  `qc_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  KEY `qc_type` (`qc_type`,`qc_value`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_querycache`
---
-
-LOCK TABLES `mw_querycache` WRITE;
-/*!40000 ALTER TABLE `mw_querycache` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_querycache` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_querycache_info`
---
-
-DROP TABLE IF EXISTS `mw_querycache_info`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_querycache_info` (
-  `qci_type` varbinary(32) NOT NULL DEFAULT '',
-  `qci_timestamp` binary(14) NOT NULL DEFAULT '19700101000000',
-  UNIQUE KEY `qci_type` (`qci_type`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_querycache_info`
---
-
-LOCK TABLES `mw_querycache_info` WRITE;
-/*!40000 ALTER TABLE `mw_querycache_info` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_querycache_info` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_querycachetwo`
---
-
-DROP TABLE IF EXISTS `mw_querycachetwo`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_querycachetwo` (
-  `qcc_type` varbinary(32) NOT NULL,
-  `qcc_value` int(10) unsigned NOT NULL DEFAULT '0',
-  `qcc_namespace` int(11) NOT NULL DEFAULT '0',
-  `qcc_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `qcc_namespacetwo` int(11) NOT NULL DEFAULT '0',
-  `qcc_titletwo` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  KEY `qcc_type` (`qcc_type`,`qcc_value`),
-  KEY `qcc_title` (`qcc_type`,`qcc_namespace`,`qcc_title`),
-  KEY `qcc_titletwo` (`qcc_type`,`qcc_namespacetwo`,`qcc_titletwo`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_querycachetwo`
---
-
-LOCK TABLES `mw_querycachetwo` WRITE;
-/*!40000 ALTER TABLE `mw_querycachetwo` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_querycachetwo` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_recentchanges`
---
-
-DROP TABLE IF EXISTS `mw_recentchanges`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_recentchanges` (
-  `rc_id` int(11) NOT NULL AUTO_INCREMENT,
-  `rc_timestamp` varbinary(14) NOT NULL DEFAULT '',
-  `rc_cur_time` varbinary(14) NOT NULL DEFAULT '',
-  `rc_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `rc_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `rc_namespace` int(11) NOT NULL DEFAULT '0',
-  `rc_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `rc_comment` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `rc_minor` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rc_bot` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rc_new` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rc_cur_id` int(10) unsigned NOT NULL DEFAULT '0',
-  `rc_this_oldid` int(10) unsigned NOT NULL DEFAULT '0',
-  `rc_last_oldid` int(10) unsigned NOT NULL DEFAULT '0',
-  `rc_type` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rc_moved_to_ns` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rc_moved_to_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `rc_patrolled` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rc_ip` varbinary(40) NOT NULL DEFAULT '',
-  `rc_old_len` int(11) DEFAULT NULL,
-  `rc_new_len` int(11) DEFAULT NULL,
-  `rc_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rc_logid` int(10) unsigned NOT NULL DEFAULT '0',
-  `rc_log_type` varbinary(255) DEFAULT NULL,
-  `rc_log_action` varbinary(255) DEFAULT NULL,
-  `rc_params` blob,
-  PRIMARY KEY (`rc_id`),
-  KEY `rc_timestamp` (`rc_timestamp`),
-  KEY `rc_namespace_title` (`rc_namespace`,`rc_title`),
-  KEY `rc_cur_id` (`rc_cur_id`),
-  KEY `new_name_timestamp` (`rc_new`,`rc_namespace`,`rc_timestamp`),
-  KEY `rc_ip` (`rc_ip`),
-  KEY `rc_ns_usertext` (`rc_namespace`,`rc_user_text`),
-  KEY `rc_user_text` (`rc_user_text`,`rc_timestamp`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_recentchanges`
---
-
-LOCK TABLES `mw_recentchanges` WRITE;
-/*!40000 ALTER TABLE `mw_recentchanges` DISABLE KEYS */;
-INSERT INTO `mw_recentchanges` VALUES (1,'20101230131547','20101230131547',0,'MediaWiki Default',0,'Main_Page','',0,0,1,1,1,0,1,0,'',0,'::1',0,438,0,0,NULL,'','');
-/*!40000 ALTER TABLE `mw_recentchanges` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_redirect`
---
-
-DROP TABLE IF EXISTS `mw_redirect`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_redirect` (
-  `rd_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `rd_namespace` int(11) NOT NULL DEFAULT '0',
-  `rd_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `rd_interwiki` varchar(32) DEFAULT NULL,
-  `rd_fragment` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
-  PRIMARY KEY (`rd_from`),
-  KEY `rd_ns_title` (`rd_namespace`,`rd_title`,`rd_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_redirect`
---
-
-LOCK TABLES `mw_redirect` WRITE;
-/*!40000 ALTER TABLE `mw_redirect` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_redirect` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_revision`
---
-
-DROP TABLE IF EXISTS `mw_revision`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_revision` (
-  `rev_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `rev_page` int(10) unsigned NOT NULL,
-  `rev_text_id` int(10) unsigned NOT NULL,
-  `rev_comment` tinyblob NOT NULL,
-  `rev_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `rev_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `rev_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `rev_minor_edit` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rev_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rev_len` int(10) unsigned DEFAULT NULL,
-  `rev_parent_id` int(10) unsigned DEFAULT NULL,
-  PRIMARY KEY (`rev_id`),
-  UNIQUE KEY `rev_page_id` (`rev_page`,`rev_id`),
-  KEY `rev_timestamp` (`rev_timestamp`),
-  KEY `page_timestamp` (`rev_page`,`rev_timestamp`),
-  KEY `user_timestamp` (`rev_user`,`rev_timestamp`),
-  KEY `usertext_timestamp` (`rev_user_text`,`rev_timestamp`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 MAX_ROWS=10000000 AVG_ROW_LENGTH=1024;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_revision`
---
-
-LOCK TABLES `mw_revision` WRITE;
-/*!40000 ALTER TABLE `mw_revision` DISABLE KEYS */;
-INSERT INTO `mw_revision` VALUES (1,1,1,'',0,'MediaWiki Default','20101230131547',0,0,438,0);
-/*!40000 ALTER TABLE `mw_revision` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_searchindex`
---
-
-DROP TABLE IF EXISTS `mw_searchindex`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_searchindex` (
-  `si_page` int(10) unsigned NOT NULL,
-  `si_title` varchar(255) NOT NULL DEFAULT '',
-  `si_text` mediumtext NOT NULL,
-  UNIQUE KEY `si_page` (`si_page`),
-  FULLTEXT KEY `si_title` (`si_title`),
-  FULLTEXT KEY `si_text` (`si_text`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_searchindex`
---
-
-LOCK TABLES `mw_searchindex` WRITE;
-/*!40000 ALTER TABLE `mw_searchindex` DISABLE KEYS */;
-INSERT INTO `mw_searchindex` VALUES (1,'main page','  mediawiki hasu800 been successfully installed.  consult theu800 user user\'su800 guide foru800 information onu800 using theu800 wiki software. getting started getting started getting started configuration settings list mediawiki faqu800 mediawiki release mailing list ');
-/*!40000 ALTER TABLE `mw_searchindex` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_site_stats`
---
-
-DROP TABLE IF EXISTS `mw_site_stats`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_site_stats` (
-  `ss_row_id` int(10) unsigned NOT NULL,
-  `ss_total_views` bigint(20) unsigned DEFAULT '0',
-  `ss_total_edits` bigint(20) unsigned DEFAULT '0',
-  `ss_good_articles` bigint(20) unsigned DEFAULT '0',
-  `ss_total_pages` bigint(20) DEFAULT '-1',
-  `ss_users` bigint(20) DEFAULT '-1',
-  `ss_active_users` bigint(20) DEFAULT '-1',
-  `ss_admins` int(11) DEFAULT '-1',
-  `ss_images` int(11) DEFAULT '0',
-  UNIQUE KEY `ss_row_id` (`ss_row_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_site_stats`
---
-
-LOCK TABLES `mw_site_stats` WRITE;
-/*!40000 ALTER TABLE `mw_site_stats` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_site_stats` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_tag_summary`
---
-
-DROP TABLE IF EXISTS `mw_tag_summary`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_tag_summary` (
-  `ts_rc_id` int(11) DEFAULT NULL,
-  `ts_log_id` int(11) DEFAULT NULL,
-  `ts_rev_id` int(11) DEFAULT NULL,
-  `ts_tags` blob NOT NULL,
-  UNIQUE KEY `tag_summary_rc_id` (`ts_rc_id`),
-  UNIQUE KEY `tag_summary_log_id` (`ts_log_id`),
-  UNIQUE KEY `tag_summary_rev_id` (`ts_rev_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_tag_summary`
---
-
-LOCK TABLES `mw_tag_summary` WRITE;
-/*!40000 ALTER TABLE `mw_tag_summary` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_tag_summary` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_templatelinks`
---
-
-DROP TABLE IF EXISTS `mw_templatelinks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_templatelinks` (
-  `tl_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `tl_namespace` int(11) NOT NULL DEFAULT '0',
-  `tl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  UNIQUE KEY `tl_from` (`tl_from`,`tl_namespace`,`tl_title`),
-  UNIQUE KEY `tl_namespace` (`tl_namespace`,`tl_title`,`tl_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_templatelinks`
---
-
-LOCK TABLES `mw_templatelinks` WRITE;
-/*!40000 ALTER TABLE `mw_templatelinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_templatelinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_text`
---
-
-DROP TABLE IF EXISTS `mw_text`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_text` (
-  `old_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `old_text` mediumblob NOT NULL,
-  `old_flags` tinyblob NOT NULL,
-  PRIMARY KEY (`old_id`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 MAX_ROWS=10000000 AVG_ROW_LENGTH=10240;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_text`
---
-
-LOCK TABLES `mw_text` WRITE;
-/*!40000 ALTER TABLE `mw_text` DISABLE KEYS */;
-INSERT INTO `mw_text` VALUES (1,'\'\'\'MediaWiki has been successfully installed.\'\'\'\n\nConsult the [http://meta.wikimedia.org/wiki/Help:Contents User\'s Guide] for information on using the wiki software.\n\n== Getting started ==\n* [http://www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [http://www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]','utf-8');
-/*!40000 ALTER TABLE `mw_text` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_trackbacks`
---
-
-DROP TABLE IF EXISTS `mw_trackbacks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_trackbacks` (
-  `tb_id` int(11) NOT NULL AUTO_INCREMENT,
-  `tb_page` int(11) DEFAULT NULL,
-  `tb_title` varchar(255) NOT NULL,
-  `tb_url` blob NOT NULL,
-  `tb_ex` text,
-  `tb_name` varchar(255) DEFAULT NULL,
-  PRIMARY KEY (`tb_id`),
-  KEY `tb_page` (`tb_page`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_trackbacks`
---
-
-LOCK TABLES `mw_trackbacks` WRITE;
-/*!40000 ALTER TABLE `mw_trackbacks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_trackbacks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_transcache`
---
-
-DROP TABLE IF EXISTS `mw_transcache`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_transcache` (
-  `tc_url` varbinary(255) NOT NULL,
-  `tc_contents` text,
-  `tc_time` binary(14) NOT NULL,
-  UNIQUE KEY `tc_url_idx` (`tc_url`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_transcache`
---
-
-LOCK TABLES `mw_transcache` WRITE;
-/*!40000 ALTER TABLE `mw_transcache` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_transcache` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_updatelog`
---
-
-DROP TABLE IF EXISTS `mw_updatelog`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_updatelog` (
-  `ul_key` varchar(255) NOT NULL,
-  `ul_value` blob,
-  PRIMARY KEY (`ul_key`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_updatelog`
---
-
-LOCK TABLES `mw_updatelog` WRITE;
-/*!40000 ALTER TABLE `mw_updatelog` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_updatelog` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user`
---
-
-DROP TABLE IF EXISTS `mw_user`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user` (
-  `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `user_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `user_real_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `user_password` tinyblob NOT NULL,
-  `user_newpassword` tinyblob NOT NULL,
-  `user_newpass_time` binary(14) DEFAULT NULL,
-  `user_email` tinytext NOT NULL,
-  `user_touched` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `user_token` binary(32) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `user_email_authenticated` binary(14) DEFAULT NULL,
-  `user_email_token` binary(32) DEFAULT NULL,
-  `user_email_token_expires` binary(14) DEFAULT NULL,
-  `user_registration` binary(14) DEFAULT NULL,
-  `user_editcount` int(11) DEFAULT NULL,
-  PRIMARY KEY (`user_id`),
-  UNIQUE KEY `user_name` (`user_name`),
-  KEY `user_email_token` (`user_email_token`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user`
---
-
-LOCK TABLES `mw_user` WRITE;
-/*!40000 ALTER TABLE `mw_user` DISABLE KEYS */;
-INSERT INTO `mw_user` VALUES (1,'WikiSysop','',':B:b1373470:f7e87db0c9596055f39a1225b0c31508','',NULL,'','','20101230131552','de4ddde7c4eef6e3609f4287324a0a18',NULL,'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',NULL,'20101230131547',0);
-/*!40000 ALTER TABLE `mw_user` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user_groups`
---
-
-DROP TABLE IF EXISTS `mw_user_groups`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user_groups` (
-  `ug_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `ug_group` varbinary(16) NOT NULL DEFAULT '',
-  UNIQUE KEY `ug_user_group` (`ug_user`,`ug_group`),
-  KEY `ug_group` (`ug_group`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user_groups`
---
-
-LOCK TABLES `mw_user_groups` WRITE;
-/*!40000 ALTER TABLE `mw_user_groups` DISABLE KEYS */;
-INSERT INTO `mw_user_groups` VALUES (1,'bureaucrat');
-INSERT INTO `mw_user_groups` VALUES (1,'sysop');
-/*!40000 ALTER TABLE `mw_user_groups` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user_newtalk`
---
-
-DROP TABLE IF EXISTS `mw_user_newtalk`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user_newtalk` (
-  `user_id` int(11) NOT NULL DEFAULT '0',
-  `user_ip` varbinary(40) NOT NULL DEFAULT '',
-  `user_last_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  KEY `user_id` (`user_id`),
-  KEY `user_ip` (`user_ip`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user_newtalk`
---
-
-LOCK TABLES `mw_user_newtalk` WRITE;
-/*!40000 ALTER TABLE `mw_user_newtalk` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_user_newtalk` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user_properties`
---
-
-DROP TABLE IF EXISTS `mw_user_properties`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user_properties` (
-  `up_user` int(11) NOT NULL,
-  `up_property` varbinary(32) NOT NULL,
-  `up_value` blob,
-  UNIQUE KEY `user_properties_user_property` (`up_user`,`up_property`),
-  KEY `user_properties_property` (`up_property`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user_properties`
---
-
-LOCK TABLES `mw_user_properties` WRITE;
-/*!40000 ALTER TABLE `mw_user_properties` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_user_properties` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_valid_tag`
---
-
-DROP TABLE IF EXISTS `mw_valid_tag`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_valid_tag` (
-  `vt_tag` varchar(255) NOT NULL,
-  PRIMARY KEY (`vt_tag`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_valid_tag`
---
-
-LOCK TABLES `mw_valid_tag` WRITE;
-/*!40000 ALTER TABLE `mw_valid_tag` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_valid_tag` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_watchlist`
---
-
-DROP TABLE IF EXISTS `mw_watchlist`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_watchlist` (
-  `wl_user` int(10) unsigned NOT NULL,
-  `wl_namespace` int(11) NOT NULL DEFAULT '0',
-  `wl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `wl_notificationtimestamp` varbinary(14) DEFAULT NULL,
-  UNIQUE KEY `wl_user` (`wl_user`,`wl_namespace`,`wl_title`),
-  KEY `namespace_title` (`wl_namespace`,`wl_title`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_watchlist`
---
-
-LOCK TABLES `mw_watchlist` WRITE;
-/*!40000 ALTER TABLE `mw_watchlist` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_watchlist` ENABLE KEYS */;
-UNLOCK TABLES;
-/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
-
-/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
-/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
-/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
-/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
-/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
-/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
-/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-
--- Dump completed on 2010-12-31  1:20:11
diff --git a/tests/selenium/installer/MediaWikiButtonsAvailabilityTestCase.php b/tests/selenium/installer/MediaWikiButtonsAvailabilityTestCase.php
deleted file mode 100644 (file)
index 4583360..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-<?php
-/**
- * MediaWikiButtonsAvailabilityTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID   : 30 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name :'Back' and 'Continue' button availability
- * Version        : MediaWiki 1.18alpha
- */
-class MediaWikiButtonsAvailabilityTestCase extends MediaWikiInstallationCommonFunction {
-       function setUp() {
-               parent::setUp();
-       }
-
-       // Verify only 'Continue' button available on 'Language' page
-       public function testOnlyContinueButtonAvailability() {
-               parent::navigateLanguagePage();
-
-               // Verify only 'Continue' button avaialble
-               $this->assertTrue( $this->isElementPresent( "submit-continue" ) );
-
-               // 'Back' button is not avaialble
-               $this->assertElementNotPresent( "submit-back" );
-       }
-
-       // Verify 'Continue' and 'Back' buttons availability
-       public function testBothButtonsAvailability() {
-               // Verify buttons availability on 'Welcome to MediaWiki' page
-               parent::navigateWelcometoMediaWikiPage();
-               $this->assertTrue( $this->isElementPresent( "submit-back" ) );
-               $this->assertTrue( $this->isElementPresent( "submit-continue" ) );
-               parent::restartInstallation();
-
-               // Verify buttons availability on 'Connect to Database' page
-               parent::navigateConnetToDatabasePage();
-               $this->assertTrue( $this->isElementPresent( "submit-back" ) );
-               $this->assertTrue( $this->isElementPresent( "submit-continue" ) );
-               parent::restartInstallation();
-
-               // Verify buttons availability on 'Database settings' page
-               $databaseName = DB_NAME_PREFIX . "_db_settings";
-               parent::navigateDatabaseSettingsPage( $databaseName );
-               $this->assertTrue( $this->isElementPresent( "submit-back" ) );
-               $this->assertTrue( $this->isElementPresent( "submit-continue" ) );
-               parent::restartInstallation();
-
-               // Verify buttons availability on 'Name' page
-               $databaseName = DB_NAME_PREFIX . "_name";
-               parent::navigateNamePage( $databaseName );
-               $this->assertTrue( $this->isElementPresent( "submit-back" ) );
-               $this->assertTrue( $this->isElementPresent( "submit-continue" ) );
-               parent::restartInstallation();
-
-               // Verify buttons availability on 'Options' page
-               $databaseName = DB_NAME_PREFIX . "_options";
-               parent::navigateOptionsPage( $databaseName );
-               $this->assertTrue( $this->isElementPresent( "submit-back" ) );
-               $this->assertTrue( $this->isElementPresent( "submit-continue" ) );
-               parent::restartInstallation();
-
-               // Verify buttons availability on 'Install' page
-               $databaseName = DB_NAME_PREFIX . "_install";
-               parent::navigateInstallPage( $databaseName );
-               $this->assertTrue( $this->isElementPresent( "submit-back" ) );
-               $this->assertTrue( $this->isElementPresent( "submit-continue" ) );
-       }
-}
diff --git a/tests/selenium/installer/MediaWikiDifferentDatabaseAccountTestCase.php b/tests/selenium/installer/MediaWikiDifferentDatabaseAccountTestCase.php
deleted file mode 100644 (file)
index 6375d66..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-/**
- * MediaWikiDifferentDatabaseAccountTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID   : 04 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Install MediaWiki with different Database accounts for web access.
- * Version        : MediaWiki 1.18alpha
- */
-class MediaWikiDifferentDatabaseAccountTestCase extends MediaWikiInstallationCommonFunction {
-       function setUp() {
-               parent::setUp();
-       }
-
-       // Install Mediawiki using 'MySQL' database type.
-       public function testDifferentDatabaseAccount() {
-               $databaseName = DB_NAME_PREFIX . "_dif_accounts";
-
-               // Navigate to the 'Database settings' page
-               parent::navigateDatabaseSettingsPage( $databaseName );
-
-               // Click on the 'Use the same account as for installation' check box
-               $this->click( "mysql__SameAccount" );
-
-               // Change the 'Database username'
-               $this->type( "mysql_wgDBuser", DB_WEB_USER );
-
-               // Enter 'Database password:'
-               $this->type( "mysql_wgDBpassword", DB_WEB_USER_PASSWORD );
-
-               // Select 'Create the account if it does not already exist' check box
-               $this->click( "mysql__CreateDBAccount" );
-               parent::clickContinueButton();
-
-               // 'Name' page
-               parent::completeNamePage();
-
-               // 'Options' page
-               parent::clickContinueButton();
-
-               // 'Install' page
-               $this->assertEquals( "Creating database user... done",
-                       $this->getText( LINK_FORM . "ul/li[3]" ) );
-               parent::clickContinueButton();
-
-               // 'Complete' page
-               parent::completePageSuccessfull();
-               $this->chooseCancelOnNextConfirmation();
-       }
-}
diff --git a/tests/selenium/installer/MediaWikiDifferntDatabasePrefixTestCase.php b/tests/selenium/installer/MediaWikiDifferntDatabasePrefixTestCase.php
deleted file mode 100644 (file)
index fad4e06..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php
-/**
- * MediaWikiDifferntDatabasePrefixTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID   : 02 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Install MediaWiki with the same database and the different
- *                  database prefixes(Share one database between multiple wikis).
- * Version        : MediaWiki 1.18alpha
- */
-class MediaWikiDifferntDatabasePrefixTestCase extends MediaWikiInstallationCommonFunction {
-       function setUp() {
-               parent::setUp();
-       }
-
-       // Install Mediawiki using 'MySQL' database type.
-       public function testDifferentDatabasePrefix() {
-               $databaseName = DB_NAME_PREFIX . "_db_prefix";
-               parent::navigateInstallPage( $databaseName );
-
-               // To 'Options' page
-               parent::clickBackButton();
-
-               // To 'Name' page
-               parent::clickBackButton();
-
-               // To 'Database settings' page
-               parent::clickBackButton();
-
-               // To 'Connect to database' page
-               parent::clickBackButton();
-
-               // From 'Connect to database' page without database prefix
-               parent::clickContinueButton();
-
-               // Verify upgrade existing message
-               $this->assertEquals( "Upgrade existing installation",
-                       $this->getText( LINK_DIV . "h2" ) );
-
-               // To 'Connect to database' page
-               parent::clickBackButton();
-
-               // Input the database prefix
-               $this->type( "mysql_wgDBprefix", DATABASE_PREFIX );
-
-               // From 'Connect to database' page with database prefix
-               parent::clickContinueButton();
-
-               // To 'Complete' page
-               parent::clickContinueButton();
-               parent::completeNamePage();
-               parent::clickContinueButton();
-
-               // Verify already installed warning message
-               $this->assertEquals( "Install",
-                       $this->getText( LINK_DIV . "h2" ) );
-               $this->assertEquals( "Warning: You seem to have already installed MediaWiki and are trying to install it again. Please proceed to the next page.",
-                       $this->getText( LINK_FORM . "div[1]" ) );
-
-               parent::clickContinueButton();
-               parent::completePageSuccessfull();
-               $this->chooseCancelOnNextConfirmation();
-               parent::restartInstallation();
-       }
-}
diff --git a/tests/selenium/installer/MediaWikiErrorsConnectToDatabasePageTestCase.php b/tests/selenium/installer/MediaWikiErrorsConnectToDatabasePageTestCase.php
deleted file mode 100644 (file)
index 37f5af2..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-<?php
-/**
- * MediaWikiErrorsConnectToDatabasePageTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID   : 09 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Invalid/ blank values for fields in 'Connect to database' page.
- * Version        : MediaWiki 1.18alpha
- */
-
-class MediaWikiErrorsConnectToDatabasePageTestCase extends MediaWikiInstallationCommonFunction {
-
-       function setUp() {
-               parent::setUp();
-       }
-
-       // Verify warning messages for the 'Connet to database' page
-       public function testErrorsConnectToDatabasePage() {
-               parent::navigateConnetToDatabasePage();
-
-               // Verify warning mesage for invalid database host
-               $this->type( "mysql_wgDBserver", INVALID_DB_HOST );
-               parent::clickContinueButton();
-               $this->assertEquals( "DB connection error: php_network_getaddresses: getaddrinfo failed: No such host is known. (" . INVALID_DB_HOST . ").",
-                       $this->getText( LINK_DIV . "div[2]/div[2]/p[1]" ) );
-               $this->assertEquals( "Check the host, username and password below and try again.",
-                       $this->getText( LINK_DIV . "div[2]/div[2]/p[2]" ) );
-               // Verify warning message for the blank database host
-               $this->type( "mysql_wgDBserver", "" );
-               parent::clickContinueButton();
-               $this->assertEquals( "MySQL 4.0.14 or later is required, you have .",
-                       $this->getText( LINK_DIV . "div[2]/div[2]" ) );
-
-               // Valid Database Host
-               $this->type( "mysql_wgDBserver", VALID_DB_HOST );
-
-               // Verify warning message for the invalid database name
-               $this->type( "mysql_wgDBname", INVALID_DB_NAME );
-               parent::clickContinueButton();
-               $this->assertEquals( "Invalid database name \"" . INVALID_DB_NAME . "\". Use only ASCII letters (a-z, A-Z), numbers (0-9) and underscores (_).",
-                       $this->getText( LINK_DIV . "div[2]/div[2]/p" ) );
-
-               // Verify warning message for the blank database name
-               $this->type( "mysql_wgDBname", "" );
-               parent::clickContinueButton();
-               $this->assertEquals( "You must enter a value for \"Database name\"",
-                       $this->getText( LINK_DIV . "div[2]/div[2]" ) );
-
-               // valid Database name
-               $this->type( "mysql_wgDBname", VALID_DB_NAME );
-
-               // Verify warning message for the invalid databaase prefix
-               $this->type( "mysql_wgDBprefix", INVALID_DB_PREFIX );
-               parent::clickContinueButton();
-               $this->assertEquals( "Invalid database prefix \"" . INVALID_DB_PREFIX . "\". Use only ASCII letters (a-z, A-Z), numbers (0-9) and underscores (_).",
-                       $this->getText( LINK_DIV . "div[2]/div[2]" ) );
-
-               // Valid Database prefix
-               $this->type( "mysql_wgDBprefix", VALID_DB_PREFIX );
-
-               // Verify warning message for the invalid database user name
-               $this->type( "mysql__InstallUser", INVALID_DB_USER_NAME );
-               parent::clickContinueButton();
-               $this->assertEquals( "DB connection error: Access denied for user '" . INVALID_DB_USER_NAME . "'@'localhost' (using password: NO) (localhost).",
-                       $this->getText( LINK_DIV . "div[2]/div[2]/p[1]" ) );
-               $this->assertEquals( "Check the host, username and password below and try again.",
-                       $this->getText( LINK_DIV . "div[2]/div[2]/p[2]" ) );
-
-               // Verify warning message for the blank database user name
-               $this->type( "mysql__InstallUser", "" );
-               parent::clickContinueButton();
-               $this->assertEquals( "DB connection error: Access denied for user 'SYSTEM'@'localhost' (using password: NO) (localhost).",
-                       $this->getText( LINK_DIV . "div[2]/div[2]/p[1]" ) );
-               $this->assertEquals( "Check the host, username and password below and try again.",
-                       $this->getText( LINK_DIV . "div[2]/div[2]/p[2]" ) );
-
-               // Valid Database username
-               $this->type( "mysql__InstallUser", VALID_DB_USER_NAME );
-
-               // Verify warning message for the invalid password
-               $this->type( "mysql__InstallPassword", INVALID_DB_PASSWORD );
-               parent::clickContinueButton();
-
-               $this->assertEquals( "DB connection error: Access denied for user 'root'@'localhost' (using password: YES) (localhost).",
-                       $this->getText( LINK_DIV . "div[2]/div[2]/p[1]" ) );
-               $this->assertEquals( "Check the host, username and password below and try again.",
-                       $this->getText( LINK_DIV . "div[2]/div[2]/p[2]" ) );
-
-               // Verify warning message for the invalid username and password
-               $this->type( "mysql__InstallUser", INVALID_DB_USER_NAME );
-               $this->type( "mysql__InstallPassword", INVALID_DB_PASSWORD );
-               parent::clickContinueButton();
-               $this->assertEquals( "DB connection error: Access denied for user '" . INVALID_DB_USER_NAME . "'@'localhost' (using password: YES) (localhost).",
-                       $this->getText( LINK_DIV . "div[2]/div[2]/p[1]" ) );
-               $this->assertEquals( "Check the host, username and password below and try again.",
-                       $this->getText( LINK_DIV . "div[2]/div[2]/p[2]" ) );
-
-               // Valid username and valid password
-               $this->type( "mysql__InstallUser", VALID_DB_USER_NAME );
-               $this->type( "mysql__InstallPassword", "" );
-               parent::clickContinueButton();
-
-               // successfully completes the 'Connect to database' page
-               $this->assertEquals( "Database settings",
-                       $this->getText( LINK_DIV . "h2" ) );
-       }
-}
diff --git a/tests/selenium/installer/MediaWikiErrorsNamepageTestCase.php b/tests/selenium/installer/MediaWikiErrorsNamepageTestCase.php
deleted file mode 100644 (file)
index 536ceb6..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-<?php
-/**
- * MediaWikiErrorsNamepageTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID   : 10 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Invalid/ blank values for fields in 'Name' page.
- * Version        : MediaWiki 1.18alpha
- */
-class MediaWikiErrorsNamepageTestCase extends MediaWikiInstallationCommonFunction {
-       function setUp() {
-               parent::setUp();
-       }
-
-       // Verify warning message for the 'Name' page
-       public function testErrorsNamePage() {
-
-               $databaseName = DB_NAME_PREFIX . "_error_name";
-
-               parent::navigateNamePage( $databaseName );
-
-               // Verify warning message for all blank fields
-               parent::clickContinueButton();
-               $this->assertEquals( "Enter a site name.",
-                       $this->getText( LINK_DIV . "div[2]/div[2]" ) );
-               $this->assertEquals( "Enter an administrator username.",
-                       $this->getText( LINK_DIV . "div[3]/div[2]" ) );
-               $this->assertEquals( "Enter a password for the administrator account.",
-                       $this->getText( LINK_DIV . "div[4]/div[2]" ) );
-
-               // Verify warning message for the blank 'Site name'
-               $this->type( "config__AdminName", VALID_YOUR_NAME );
-               $this->type( "config__AdminPassword", VALID_PASSWORD );
-               $this->type( "config__AdminPassword2", VALID_PASSWORD_AGAIN );
-               parent::clickContinueButton();
-               $this->assertEquals( "Enter a site name.",
-                       $this->getText( LINK_DIV . "div[2]/div[2]" ) );
-
-               // Input valid 'Site name'
-               $this->type( "config_wgSitename", VALID_WIKI_NAME );
-
-               // Verify warning message for the invalid "Project namespace'
-               $this->click( "config__NamespaceType_other" );
-               $this->type( "config_wgMetaNamespace", INVALID_NAMESPACE );
-               parent::clickContinueButton();
-               $this->assertEquals( "The specified namespace \"\" is invalid. Specify a different project namespace.",
-                       $this->getText( LINK_DIV . "div[2]/div[2]" ) );
-
-               // Verify warning message for the blank 'Project namespace'
-               $this->type( "config_wgSitename", VALID_WIKI_NAME );
-               $this->click( "config__NamespaceType_other" );
-               $this->type( "config_wgMetaNamespace", "" );
-               parent::clickContinueButton();
-               $this->assertEquals( "The specified namespace \"\" is invalid. Specify a different project namespace.",
-                       $this->getText( LINK_DIV . "div[2]/div[2]" ) );
-
-               // Valid 'Project namespace'
-               $this->click( "config__NamespaceType_other" );
-               $this->type( "config_wgMetaNamespace", VALID_NAMESPACE );
-               parent::clickContinueButton();
-
-               // Valid 'Site name'
-               $this->click( "config__NamespaceType_site-name" );
-               $this->type( "config_wgSitename", VALID_WIKI_NAME );
-
-               // Verify warning message for blank 'Your name'
-               $this->type( "config__AdminName", " " );
-               parent::clickContinueButton();
-               $this->assertEquals( "Enter an administrator username.",
-                       $this->getText( LINK_DIV . "div[2]/div[2]" ) );
-
-               $this->type( "config_wgSitename", VALID_WIKI_NAME );
-               // Verify warning message for blank 'Password'
-               $this->type( "config__AdminName", VALID_YOUR_NAME );
-               $this->type( "config__AdminPassword", " " );
-               parent::clickContinueButton();
-               $this->assertEquals( "Enter a password for the administrator account.",
-                       $this->getText( LINK_DIV . "div[2]/div[2]" ) );
-
-               // Verify warning message for the blank 'Password again'
-               $this->type( "config_wgSitename", VALID_WIKI_NAME );
-               $this->type( "config__AdminPassword", VALID_PASSWORD );
-               $this->type( "config__AdminPassword2", " " );
-               parent::clickContinueButton();
-               $this->assertEquals( "The two passwords you entered do not match.",
-                       $this->getText( LINK_DIV . "div[2]/div[2]" ) );
-
-               // Verify warning message for the different'Password' and 'Password again'
-               $this->type( "config_wgSitename", VALID_WIKI_NAME );
-               $this->type( "config__AdminPassword", VALID_PASSWORD );
-               $this->type( "config__AdminPassword2", INVALID_PASSWORD_AGAIN );
-               parent::clickContinueButton();
-               $this->assertEquals( "The two passwords you entered do not match.",
-                       $this->getText( LINK_DIV . "div[2]/div[2]" ) );
-       }
-}
diff --git a/tests/selenium/installer/MediaWikiHelpFieldHintTestCase.php b/tests/selenium/installer/MediaWikiHelpFieldHintTestCase.php
deleted file mode 100644 (file)
index f0efce6..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-<?php
-/**
- * MediaWikiHelpFieldHintTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID   : 29 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Help field hint availability for the fields.
- * Version        : MediaWiki 1.18alpha
- */
-class MediaWikiHelpFieldHintTestCase extends MediaWikiInstallationCommonFunction {
-       function setUp() {
-               parent::setUp();
-       }
-
-       // Verify help field availability for the fields
-       public function testMySQLConnectToDatabaseFieldHint() {
-
-               parent::navigateConnetToDatabasePage();
-
-               // Verify help field for 'Database host'
-               $this->click( "//div[@id='DB_wrapper_mysql']/div/div[1]/div/span[1]" );
-               $this->assertEquals( MYSQL_DATABASE_HOST_HELP,
-                       $this->getText( "//div[@id='DB_wrapper_mysql']/div/div[1]/div/span[2]" ) );
-
-               // Verify help field for 'Database name'
-               $this->click( "//div[@id='DB_wrapper_mysql']/fieldset[1]/div[1]/div[1]/div/span[1]" );
-               $this->assertEquals( MYSQL_DATABASE_NAME_HELP,
-                       $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[1]/div[1]/div[1]/div/span[2]" ) );
-
-
-               // Verify help field for 'Database table prefix'
-               $this->click( "//div[@id='DB_wrapper_mysql']/fieldset[1]/div[2]/div[1]/div/span[1]" );
-               $this->assertEquals( MYSQL_DATABASE_TABLE_PREFIX_HELP,
-                       $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[1]/div[1]/div[1]/div/span[2]/p[1]" ) );
-
-               // Verify help field for 'Database username'
-               $this->click( "//div[@id='DB_wrapper_mysql']/fieldset[2]/div[1]/div[1]/div/span[1]" );
-               $this->assertEquals( MYSQL_DATBASE_USERNAME_HELP,
-                       $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[2]/div[1]/div[1]/div/span[2]" ) );
-
-               // Verify help field for 'Database password'
-               $this->click( "//div[@id='DB_wrapper_mysql']/fieldset[2]/div[2]/div[1]/div/span[1]" );
-               $this->assertEquals( MYSQL_DATABASE_PASSWORD_HELP,
-                       $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[2]/div[2]/div[1]/div/span[2]/p" ) );
-       }
-
-       public function testSQLiteConnectToDatabaseFieldHint() {
-               parent::navigateConnetToDatabasePage();
-               $this->click( "DBType_sqlite" );
-
-               //  Verify help field for 'SQLite data directory'
-               $this->click( "//div[@id='DB_wrapper_sqlite']/div[1]/div[1]/div/span[1]" );
-               $this->assertEquals( SQLITE_DATA_DIRECTORY_HELP,
-                       $this->getText( "//div[@id='DB_wrapper_sqlite']/div[1]/div[1]/div/span[2]" ) );
-
-               // Verify help field for 'Database name'
-               $this->click( "//div[@id='DB_wrapper_sqlite']/div[2]/div[1]/div/span[1]" );
-               $this->assertEquals( SQLITE_DATABASE_NAME_HELP, $this->getText( "//div[@id='DB_wrapper_sqlite']/div[2]/div[1]/div/span[2]/p" ) );
-       }
-
-       public function testDatabaseSettingsFieldHint() {
-
-               $databaseName = DB_NAME_PREFIX . "_db_field";
-               parent::navigateDatabaseSettingsPage( $databaseName );
-
-               // Verify help field for 'Search engine'
-               $this->click( LINK_FORM . "div[2]/span[1]" );
-               $this->assertEquals( SEARCH_ENGINE_HELP,
-                       $this->getText( LINK_FORM . "div[2]/span[2]" ) );
-
-               // Verify help field for 'Database character set'
-               $this->click( LINK_FORM . "div[4]/span[1]" );
-               $this->assertEquals( DATABASE_CHARACTER_SET_HELP,
-                       $this->getText( LINK_FORM . "div[4]/span[2]" ) );
-               parent::restartInstallation();
-       }
-
-       public function testNameFieldHint() {
-               $databaseName = DB_NAME_PREFIX . "_name_field";
-               parent::navigateNamePage( $databaseName );
-
-               // Verify help field for 'Name of Wiki'
-               $this->click( LINK_FORM . "div[1]/div[1]/div/span[1]" );
-               $this->assertEquals( NAME_OF_WIKI_HELP,
-                       $this->getText( LINK_FORM . "div[1]/div[1]/div/span[2]/p" ) );
-
-               // Verify help field for 'Project namespace'
-               $this->click( LINK_FORM . "div[2]/div[1]/div/span[1]" );
-               $this->assertEquals( PROJECT_NAMESPACE_HELP,
-                       $this->getText( LINK_FORM . "div[2]/div[1]/div/span[2]/p" ) );
-
-               // Verify help field for 'Your Name'
-               $this->click( LINK_FORM . "fieldset/div[1]/div[1]/div/span[1]" );
-               $this->assertEquals( USER_NAME_HELP,
-                       $this->getText( LINK_FORM . "fieldset/div[1]/div[1]/div/span[2]/p" ) );
-
-               // Verify help field for 'E mail address'
-               $this->click( LINK_FORM . "fieldset/div[4]/div[1]/div/span[1]" );
-               $this->assertEquals( EMAIL_ADDRESS_HELP,
-                       $this->getText( LINK_FORM . "fieldset/div[4]/div[1]/div/span[2]/p" ) );
-
-               parent::restartInstallation();
-       }
-}
-
diff --git a/tests/selenium/installer/MediaWikiInstallationCommonFunction.php b/tests/selenium/installer/MediaWikiInstallationCommonFunction.php
deleted file mode 100644 (file)
index a9a8fc3..0000000
+++ /dev/null
@@ -1,259 +0,0 @@
-<?php
-/**
- * MediaWikiInstallationCommonFunction
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
-require_once ( __DIR__ . '/MediaWikiInstallationConfig.php' );
-require_once ( __DIR__ . '/MediaWikiInstallationMessage.php' );
-require_once ( __DIR__ . '/MediaWikiInstallationVariables.php' );
-
-class MediaWikiInstallationCommonFunction extends PHPUnit_Extensions_SeleniumTestCase {
-       function setUp() {
-               $this->setBrowser( TEST_BROWSER );
-               $this->setBrowserUrl( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/" );
-       }
-
-       public function navigateInitialpage() {
-               $this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/" );
-       }
-
-       // Navigate to the 'Language' page
-       public function navigateLanguagePage() {
-               $this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
-       }
-
-       // Navigate to the 'Welcome to MediaWiki' page
-       public function navigateWelcometoMediaWikiPage() {
-               $this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
-               $this->click( "submit-continue " );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-       }
-
-       // Navigate yo 'Connect to Database' page
-       public function navigateConnetToDatabasePage() {
-               $this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
-
-               // 'Welcome to MediaWiki!' page
-               $this->click( "submit-continue" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-               // 'Connect to Database' page
-               $this->click( "submit-continue" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-       }
-
-       // Navigate to the 'Database Settings' page
-       public function navigateDatabaseSettingsPage( $databaseName ) {
-               $this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
-
-               // 'Welcome to MediaWiki!' page
-               $this->click( "submit-continue" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-               // 'Connect to Database' page
-               $this->click( "submit-continue" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-               $this->type( "mysql_wgDBname", $databaseName );
-               $this->click( "submit-continue" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-       }
-
-       // Navigate to the 'Name' page
-       public function navigateNamePage( $databaseName ) {
-               $this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
-
-               // 'Welcome to MediaWiki!' page
-               $this->click( "submit-continue" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-               // 'Connect to Database' page
-               $this->click( "submit-continue" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-               $this->type( "mysql_wgDBname", $databaseName );
-               $this->click( "submit-continue" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-               // Database settings
-               $this->click( "submit-continue" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-       }
-
-       // Navigate 'Options' page
-       public function navigateOptionsPage( $databaseName ) {
-               $this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
-
-               // 'Welcome to MediaWiki!' page
-               $this->click( "submit-continue" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-               // 'Connect to Database' page
-               $this->click( "submit-continue" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-               $this->type( "mysql_wgDBname", $databaseName );
-               $this->click( "submit-continue" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-               // Database settings
-               $this->click( "submit-continue" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-               // Name
-               $this->type( "config_wgSitename", NAME_OF_WIKI );
-               $this->type( "config__AdminName", ADMIN_USER_NAME );
-               $this->type( "config__AdminPassword", ADMIN_PASSWORD );
-               $this->type( "config__AdminPassword2", ADMIN_RETYPE_PASSWORD );
-               $this->type( "config__AdminEmail", ADMIN_EMAIL_ADDRESS );
-
-               $this->click( "submit-continue" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-       }
-
-       // Navigate 'Install' page
-       public function navigateInstallPage( $databaseName ) {
-               $this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
-
-               // 'Welcome to MediaWiki!' page
-               $this->click( "submit-continue" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-               // 'Connect to Database' page
-               $this->click( "submit-continue" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-               $this->type( "mysql_wgDBname", $databaseName );
-               $this->click( "submit-continue" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-               // Database settings
-               $this->click( "submit-continue" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-               // Name
-               $this->type( "config_wgSitename", NAME_OF_WIKI );
-               $this->type( "config__AdminName", ADMIN_USER_NAME );
-               $this->type( "config__AdminPassword", ADMIN_PASSWORD );
-               $this->type( "config__AdminPassword2", ADMIN_RETYPE_PASSWORD );
-               $this->type( "config__AdminEmail", ADMIN_EMAIL_ADDRESS );
-
-               $this->click( "submit-continue" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-               // Options page
-               $this->click( "submit-continue" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-       }
-
-       // Navigate to 'Complete' page
-       public function navigateCompletePage( $databaseName ) {
-               $this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
-
-               // 'Welcome to MediaWiki!' page
-               $this->click( "submit-continue" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-               // 'Connect to Database' page
-               $this->click( "submit-continue" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-               $this->type( "mysql_wgDBname", $databaseName );
-               $this->click( "submit-continue" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-               // Database settings
-               $this->click( "submit-continue" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-               // Name
-               $this->type( "config_wgSitename", NAME_OF_WIKI );
-               $this->type( "config__AdminName", ADMIN_USER_NAME );
-               $this->type( "config__AdminPassword", ADMIN_PASSWORD );
-               $this->type( "config__AdminPassword2", ADMIN_RETYPE_PASSWORD );
-               $this->type( "config__AdminEmail", ADMIN_EMAIL_ADDRESS );
-
-               $this->click( "submit-continue" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-               // Options page
-               $this->click( "submit-continue" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-               // Install page
-               $this->click( "submit-continue" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-               $this->chooseCancelOnNextConfirmation();
-       }
-
-       // Complete the Name page fields
-       public function completeNamePage() {
-               $this->type( "config_wgSitename", NAME_OF_WIKI );
-               $this->type( "config__AdminName", ADMIN_USER_NAME );
-               $this->type( "config__AdminPassword", ADMIN_PASSWORD );
-               $this->type( "config__AdminPassword2", ADMIN_RETYPE_PASSWORD );
-               $this->type( "config__AdminEmail", ADMIN_EMAIL_ADDRESS );
-               $this->click( "submit-continue" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-       }
-
-       // Clicking on the 'Continue' button in any MediaWiki page
-       public function clickContinueButton() {
-               $this->click( "submit-continue" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-       }
-
-       // Clicking on the 'Back' button in any MediaWiki page
-       public function clickBackButton() {
-               $this->click( "submit-back" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-       }
-
-       // Restarting the installation
-       public function restartInstallation() {
-               $this->click( "link=Restart installation" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-               $this->click( "submit-restart" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-       }
-
-       // Verify 'MediaWiki' logo available in the initial screen
-       public function mediaWikiLogoPresentInitialScreen() {
-               $this->assertTrue( $this->isElementPresent( "//img[@alt='The MediaWiki logo']" ) );
-       }
-
-       // Verify 'MediaWiki' logo available
-       public function mediaWikiLogoPresent() {
-               $this->assertTrue( $this->isElementPresent( "//div[@id='p-logo']/a" ) );
-       }
-
-       public function completePageSuccessfull() {
-               $this->assertEquals( "Complete!",
-                       $this->getText( "//div[@id='bodyContent']/div/div/h2" ) );
-
-               // 'Congratulations!' text should be available in the 'Complete!' page.
-               $this->assertEquals( "Congratulations!",
-                       $this->getText( "//div[@id='bodyContent']/div/div/div[2]/form/div[1]/div[2]/p[1]/b" ) );
-       }
-}
diff --git a/tests/selenium/installer/MediaWikiInstallationConfig.php b/tests/selenium/installer/MediaWikiInstallationConfig.php
deleted file mode 100644 (file)
index 86a4624..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-/**
- * MediaWikiInstallationConfig
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-
-/**
- * MediaWikiInstallerTestSuite.php can be run one time successfully
- * with current value of the 'DB_NAME_PREFIX'.
- * If you wish to run the suite more than one time, you need to change
- * the value of the 'DB_NAME_PREFIX'.
- */
-define( 'DB_NAME_PREFIX', "database_name" );
-define( 'DIRECTORY_NAME', "mediawiki" );
-define( 'PORT', "8080" );
-define( 'HOST_NAME', "localhost" );
-
-/**
- *  Use the followings to run the test suite in different browsers.
- *  Firefox : *firefox
- *  IE :  *iexplore
- *  Google chrome : *googlechrome
- *  Opera :  *opera
- */
-define ( 'TEST_BROWSER', "*firefox" );
diff --git a/tests/selenium/installer/MediaWikiInstallationMessage.php b/tests/selenium/installer/MediaWikiInstallationMessage.php
deleted file mode 100644 (file)
index 2b7d48e..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-/**
- * MediaWikiInstallationConfig
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-
-// 'MySQL' database type help field hint
-define( 'MYSQL_DATABASE_HOST_HELP', "If your database server is on different server, enter the host name or IP address here. \nIf you are using shared web hosting, your hosting provider should give you the correct host name in their documentation. \nIf you are installing on a Windows server and using MySQL, using \"localhost\" may not work for the server name. If it does not, try \"127.0.0.1\" for the local IP address." );
-define( 'MYSQL_DATABASE_NAME_HELP', "Choose a name that identifies your wiki. It should not contain spaces or hyphens. \nIf you are using shared web hosting, your hosting provider will either give you a specific database name to use or let you create databases via a control panel." );
-define( 'MYSQL_DATABASE_TABLE_PREFIX_HELP', "Choose a name that identifies your wiki. It should not contain spaces or hyphens." );
-define( 'MYSQL_DATBASE_USERNAME_HELP', "Enter the username that will be used to connect to the database during the installation process. This is not the username of the MediaWiki account; this is the username for your database." );
-define( 'MYSQL_DATABASE_PASSWORD_HELP', "Enter the password that will be used to connect to the database during the installation process. This is not the password for the MediaWiki account; this is the password for your database." );
-
-
-// 'SQLite' database type help field hint
-define( 'SQLITE_DATA_DIRECTORY_HELP', "SQLite stores all data in a single file. \nThe directory you provide must be writable by the webserver during installation. \nIt should not be accessible via the web, this is why we're not putting it where your PHP files are. \nThe installer will write a .htaccess file along with it, but if that fails someone can gain access to your raw database. That includes raw user data (e-mail addresses, hashed passwords) as well as deleted revisions and other restricted data on the wiki. \nConsider putting the database somewhere else altogether, for example in /var/lib/mediawiki/yourwiki." );
-define( 'SQLITE_DATABASE_NAME_HELP', "Choose a name that identifies your wiki. Do not use spaces or hyphens. This will be used for the SQLite data file name." );
-
-
-// 'Database settings' page hel0p field hint
-define( 'SEARCH_ENGINE_HELP', "InnoDB is almost always the best option, since it has good concurrency support. \nMyISAM may be faster in single-user or read-only installations. MyISAM databases tend to get corrupted more often than InnoDB databases." );
-define( 'DATABASE_CHARACTER_SET_HELP', "In binary mode, MediaWiki stores UTF-8 text to the database in binary fields. This is more efficient than MySQL's UTF-8 mode, and allows you to use the full range of Unicode characters. \nIn UTF-8 mode, MySQL will know what character set your data is in, and can present and convert it appropriately, but it will not let you store characters above the Basic Multilingual Plane." );
-
-
-// 'Name' page help field hint
-define( 'NAME_OF_WIKI_HELP', "This will appear in the title bar of the browser and in various other places." );
-define( 'PROJECT_NAMESPACE_HELP', "Following Wikipedia's example, many wikis keep their policy pages separate from their content pages, in a \"project namespace\". All page titles in this namespace start with a certain prefix, which you can specify here. Traditionally, this prefix is derived from the name of the wiki, but it cannot contain punctuation characters such as \"#\" or \":\"." );
-define( 'USER_NAME_HELP', "Enter your preferred username here, for example \"Joe Bloggs\". This is the name you will use to log in to the wiki." );
-define( 'EMAIL_ADDRESS_HELP', "Enter an e-mail address here to allow you to receive e-mail from other users on the wiki, reset your password, and be notified of changes to pages on your watchlist." );
-define( 'SUBSCRIBE_MAILING_LIST_HELP', "This is a low-volume mailing list used for release announcements, including important security announcements. You should subscribe to it and update your MediaWiki installation when new versions come out." );
-
-
-
diff --git a/tests/selenium/installer/MediaWikiInstallationVariables.php b/tests/selenium/installer/MediaWikiInstallationVariables.php
deleted file mode 100644 (file)
index 3d7996b..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-/**
- * MediaWikiInstallationConfig
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-
-// Common variables
-define( 'PAGE_LOAD_TIME', "80000" );
-
-// Common links
-define( 'LINK_DIV', "//div[@id='bodyContent']/div/div/" );
-define( 'LINK_FORM', "//div[@id='bodyContent']/div/div/div[2]/form/" );
-define( 'LINK_RIGHT_FRAMEWORK', "//div[@id='bodyContent']/div/div/div[1]/ul[1]/" );
-
-// 'Name' page input values
-define( 'NAME_OF_WIKI', "Site Name" );
-define( 'ADMIN_USER_NAME', "My Name" );
-define( 'ADMIN_PASSWORD', "12345" );
-define ( 'ADMIN_RETYPE_PASSWORD', "12345" );
-define ( 'ADMIN_EMAIL_ADDRESS', "admin@example.com" );
-
-
-// 'Name' page input values for warning messages
-define( 'VALID_WIKI_NAME', "MyWiki" );
-define( 'VALID_YOUR_NAME', "FirstName LastName" );
-define( 'VALID_PASSWORD', "12345" );
-define( 'VALID_PASSWORD_AGAIN', "12345" );
-define( 'INVALID_PASSWORD_AGAIN', "123" );
-define( 'VALID_NAMESPACE', "Mynamespace" );
-define( 'INVALID_NAMESPACE', "##..##" );
-
-
-// 'Database settings' page input values
-define( 'DB_WEB_USER', "different" );
-define( 'DB_WEB_USER_PASSWORD', "12345" );
-
-
-// 'Connet to database' page input values
-define( 'DATABASE_PREFIX', "databaseprefix" );
-
-
-// 'Connet to database' page input values for warning messages
-define( 'VALID_DB_HOST', "localhost" );
-define( 'INVALID_DB_HOST', "local" );
-define( 'INVALID_DB_NAME', "my-wiki" );
-define( 'VALID_DB_NAME', "my_wiki1" );
-define( 'INVALID_DB_PREFIX', "database prefix" );
-define( 'VALID_DB_PREFIX', "database_prefix" );
-define( 'INVALID_DB_USER_NAME', "roots" );
-define( 'VALID_DB_USER_NAME', "root" );
-define( 'INVALID_DB_PASSWORD', "12345" );
-
-
diff --git a/tests/selenium/installer/MediaWikiInstallerTestSuite.php b/tests/selenium/installer/MediaWikiInstallerTestSuite.php
deleted file mode 100644 (file)
index 6946cc7..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-/**
- * MediaWikiInstallerTestSuite
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-if ( PHP_SAPI != 'cli' ) {
-       die( "Run me from the command line please.\n" );
-}
-
-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' );
-
-$suite = new PHPUnit_Framework_TestSuite( 'ArrayTest' );
-$result = new PHPUnit_Framework_TestResult;
-
-$suite->run( $result );
diff --git a/tests/selenium/installer/MediaWikiMySQLDataBaseTestCase.php b/tests/selenium/installer/MediaWikiMySQLDataBaseTestCase.php
deleted file mode 100644 (file)
index 92f26d0..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-<?php
-/**
- * MediaWikiOnAlreadyInstalledTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID   : 01 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Install Mediawiki using 'MySQL' database type successfully
- * Version        : MediaWiki 1.18alpha
- */
-
-class MediaWikiMySQLDataBaseTestCase extends MediaWikiInstallationCommonFunction {
-       function setUp() {
-               parent::setUp();
-       }
-
-       // Verify  MediaWiki installation using 'MySQL' database type
-       public function testMySQLDatabaseSuccess() {
-               $databaseName = DB_NAME_PREFIX . "_sql_db";
-
-               parent::navigateConnetToDatabasePage();
-
-               // Verify 'MySQL" is selected as the default database type
-               $this->assertEquals( "MySQL settings", $this->getText( "//div[@id='DB_wrapper_mysql']/h3" ) );
-
-               // Change 'Database name'
-               $defaultDbName = $this->getText( "mysql_wgDBname" );
-               $this->type( "mysql_wgDBname", " " );
-               $this->type( "mysql_wgDBname", $databaseName );
-               $this->assertNotEquals( $defaultDbName, $databaseName );
-
-               // 'Database settings' page
-               parent::clickContinueButton();
-
-               // 'Name' page
-               parent::clickContinueButton();
-               parent::completeNamePage();
-
-               // 'Options page
-               parent::clickContinueButton();
-
-               // 'Install' page
-               parent::clickContinueButton();
-
-               // 'Complete' page
-               parent::completePageSuccessfull();
-               parent::restartInstallation();
-       }
-}
diff --git a/tests/selenium/installer/MediaWikiMySQLiteDataBaseTestCase.php b/tests/selenium/installer/MediaWikiMySQLiteDataBaseTestCase.php
deleted file mode 100644 (file)
index e9be370..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-/**
- * MediaWikiMySQLiteataBaseTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID   : 06 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Install Mediawiki using 'MySQL' database type successfully
- * Version        : MediaWiki 1.18alpha
- */
-
-class MediaWikiMySQLiteDataBaseTestCase extends MediaWikiInstallationCommonFunction {
-       function setUp() {
-               parent::setUp();
-       }
-
-       // Verify  MediaWiki installation using 'MySQL' database type
-       public function testMySQLDatabaseSuccess() {
-               $databaseName = DB_NAME_PREFIX . "_sqlite_db";
-
-               parent::navigateConnetToDatabasePage();
-               $this->click( "DBType_sqlite" );
-
-               // Select 'SQLite' database type
-               $this->assertEquals( "SQLite settings", $this->getText( "//div[@id='DB_wrapper_sqlite']/h3" ) );
-
-               // Change database name
-               $defaultDbName = $this->getText( "sqlite_wgDBname" );
-               $this->type( "sqlite_wgDBname", " " );
-               $this->type( "sqlite_wgDBname", $databaseName );
-               $this->assertNotEquals( $defaultDbName, $databaseName );
-
-               // 'Database settings' page
-               parent::clickContinueButton();
-
-               // 'Name' page
-               parent::clickContinueButton();
-               parent::completeNamePage();
-
-               // 'Options page
-               parent::clickContinueButton();
-
-               // 'Install' page
-               parent::clickContinueButton();
-
-               // 'Complete' page
-               parent::completePageSuccessfull();
-               parent::restartInstallation();
-       }
-}
diff --git a/tests/selenium/installer/MediaWikiOnAlreadyInstalledTestCase.php b/tests/selenium/installer/MediaWikiOnAlreadyInstalledTestCase.php
deleted file mode 100644 (file)
index ce27500..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-
-/**
- * Test Case ID   : 03 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Install mediawiki on a already installed Mediawiki.]
- * Version        : MediaWiki 1.18alpha
- */
-
-class MediaWikiOnAlreadyInstalledTestCase extends MediaWikiInstallationCommonFunction {
-       function setUp() {
-               parent::setUp();
-       }
-
-       // Install Mediawiki using 'MySQL' database type.
-       public function testInstallOnAlreadyInstalled() {
-               $databaseName = DB_NAME_PREFIX . "_already_installed";
-               parent::navigateInstallPage( $databaseName );
-
-               // 'Options' page
-               parent::clickBackButton();
-
-               // Install page
-               parent::clickContinueButton();
-
-               // 'Install' page should display after the 'Option' page
-               $this->assertEquals( "Install", $this->getText( LINK_DIV . "h2" ) );
-
-               // Verify warning text displayed
-               $this->assertEquals( "Warning: You seem to have already installed MediaWiki and are trying to install it again. Please proceed to the next page.",
-                       $this->getText( LINK_FORM . "div[1]/div[2]" ) );
-
-               // Complete page
-               parent::clickContinueButton();
-               parent::completePageSuccessfull();
-               $this->chooseCancelOnNextConfirmation();
-               parent::restartInstallation();
-       }
-}
diff --git a/tests/selenium/installer/MediaWikiRestartInstallationTestCase.php b/tests/selenium/installer/MediaWikiRestartInstallationTestCase.php
deleted file mode 100644 (file)
index f34210c..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-<?php
-/**
- * MediaWikiRestartInstallationTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID   : 11, 12 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Install mediawiki on a already installed Mediawiki.
- * Version        : MediaWiki 1.18alpha
- */
-class MediaWikiRestartInstallationTestCase extends MediaWikiInstallationCommonFunction {
-       function setUp() {
-               parent::setUp();
-       }
-
-       // Verify restarting the installation
-       public function testSuccessRestartInstallation() {
-               $dbNameBeforeRestart = DB_NAME_PREFIX . "_db_before";
-               parent::navigateDatabaseSettingsPage( $dbNameBeforeRestart );
-
-               // Verify 'Restart installation' link available
-               $this->assertTrue( $this->isElementPresent( "link=Restart installation" ) );
-
-               // Click 'Restart installation'
-               $this->click( "link=Restart installation " );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-               // 'Restart Installation' page displayed
-               $this->assertEquals( "Restart installation", $this->getText( LINK_DIV . "h2" ) );
-
-               // Restart warning message displayed
-               $this->assertTrue( $this->isTextPresent( "exact:Do you want to clear all saved data that you have entered and restart the installation process?" ) );
-
-               // Click on the 'Yes, restart' button
-               $this->click( "submit-restart" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-               // Navigate to the initial installation page(Language).
-               $this->assertEquals( "Language", $this->getText( LINK_DIV . "h2" ) );
-
-               // 'Welcome to MediaWiki!' page
-               parent::clickContinueButton();
-
-               // 'Connect to database' page
-               parent::clickContinueButton();
-
-               // saved data should be deleted
-               $dbNameAfterRestart = $this->getValue( "mysql_wgDBname" );
-               $this->assertNotEquals( $dbNameBeforeRestart, $dbNameAfterRestart );
-       }
-
-       // Verify cancelling restart
-       public function testCancelRestartInstallation() {
-               $dbNameBeforeRestart = DB_NAME_PREFIX . "_cancel_restart";
-
-               parent::navigateDatabaseSettingsPage( $dbNameBeforeRestart );
-               // Verify 'Restart installation' link available
-               $this->assertTrue( $this->isElementPresent( "link=Restart installation" ) );
-
-               $this->click( "link=Restart installation" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-               // 'Restart Installation' page displayed
-               $this->assertEquals( "Restart installation", $this->getText( LINK_DIV . "h2" ) );
-
-               // Restart warning message displayed
-               $this->assertTrue( $this->isTextPresent( "Do you want to clear all saved data that you have entered and restart the installation process?" ) );
-
-               // Click on the 'Back' button
-               parent::clickBackButton();
-
-               // Navigates to the previous page
-               $this->assertEquals( "Database settings", $this->getText( LINK_DIV . "h2" ) );
-
-               // 'Connect to database' page
-               parent::clickBackButton();
-
-               // Saved data remain on the page.
-               $dbNameAfterRestart = $this->getValue( "mysql_wgDBname" );
-               $this->assertEquals( $dbNameBeforeRestart, $dbNameAfterRestart );
-       }
-}
diff --git a/tests/selenium/installer/MediaWikiRightFrameworkLinksTestCase.php b/tests/selenium/installer/MediaWikiRightFrameworkLinksTestCase.php
deleted file mode 100644 (file)
index 039d71a..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-/**
- * MediaWikiRightFrameworkLinksTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID   : 14, 15, 16, 17 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : User selects 'Read me' link.
- *                  User selects 'Release notes' link.
- *                  User selects 'Copying' link.
- *                  User selects 'Upgrading' link.
- * Version        : MediaWiki 1.18alpha
- */
-class MediaWikiRightFrameworkLinksTestCase extends MediaWikiInstallationCommonFunction {
-       function setUp() {
-               parent::setUp();
-       }
-
-       public function testLinksAvailability() {
-               $this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
-
-               // Verify 'Read me' link availability
-               $this->assertTrue( $this->isElementPresent( "link=Read me" ) );
-
-               // Verify 'Release notes' link availability
-               $this->assertTrue( $this->isElementPresent( "link=Release notes" ) );
-
-               //  Verify 'Copying' link availability
-               $this->assertTrue( $this->isElementPresent( "link=Copying" ) );
-       }
-
-       public function testPageNavigation() {
-               $this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
-
-               // Navigate to the 'Read me' page
-               $this->click( "link=Read me" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-               $this->assertEquals( "Read me", $this->getText( LINK_DIV . "h2[1]" ) );
-               $this->assertTrue( $this->isElementPresent( "submit-back" ) );
-               parent::clickBackButton();
-
-               // Navigate to the 'Release notes' page
-               $this->click( "link=Release notes" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-               $this->assertEquals( "Release notes", $this->getText( LINK_DIV . "h2[1]" ) );
-               $this->assertTrue( $this->isElementPresent( "submit-back" ) );
-               parent::clickBackButton();
-
-               // Navigate to the 'Copying' page
-               $this->click( "link=Copying" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-               $this->assertEquals( "Copying", $this->getText( LINK_DIV . "h2[1]" ) );
-               $this->assertTrue( $this->isElementPresent( "submit-back" ) );
-               parent::clickBackButton();
-
-               // Navigate to the 'Upgrading' page
-               $this->click( "link=Upgrading" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-               $this->assertEquals( "Upgrading", $this->getText( LINK_DIV . "h2[1]" ) );
-       }
-}
diff --git a/tests/selenium/installer/MediaWikiUpgradeExistingDatabaseTestCase.php b/tests/selenium/installer/MediaWikiUpgradeExistingDatabaseTestCase.php
deleted file mode 100644 (file)
index cd901d1..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-<?php
-/**
- * MediaWikiUpgradeExistingDatabaseTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID   : 05 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Install Mediawiki by updating the existing database.
- * Version        : MediaWiki 1.18alpha
- */
-class MediaWikiUpgradeExistingDatabaseTestCase extends MediaWikiInstallationCommonFunction {
-       function setUp() {
-               parent::setUp();
-       }
-
-       // Install Mediawiki using 'MySQL' database type.
-       public function testUpgradeExistingDatabase() {
-
-               $databaseName = DB_NAME_PREFIX . "_upgrade_existing";
-               parent::navigateInstallPage( $databaseName );
-
-               $this->open( "http://localhost:" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
-               $this->assertEquals( "Install", $this->getText( LINK_DIV . "h2" ) );
-               $this->assertEquals(
-                       "Warning: You seem to have already installed MediaWiki and are trying to install it again. Please proceed to the next page.",
-                       $this->getText( LINK_DIV . "div[2]/form/div[1]/div[2]" )
-               );
-
-               // 'Optionis' page
-               parent::clickBackButton();
-
-               // 'Name' page
-               parent::clickBackButton();
-
-               // 'Database settings' page
-               parent::clickBackButton();
-
-               // 'Connect to database' page
-               parent::clickBackButton();
-               $this->type( "mysql_wgDBname", $databaseName );
-               parent::clickContinueButton();
-
-               // 'Upgrade existing installation' page  displayed next to the 'Connect to database' page.
-               $this->assertEquals( "Upgrade existing installation", $this->getText( LINK_DIV . "h2" ) );
-
-               // Warning message displayed.
-               $this->assertEquals( "There are MediaWiki tables in this database. To upgrade them to MediaWiki 1.18alpha, click Continue.",
-                       $this->getText( LINK_DIV . "div[2]/form/div[1]/div[2]" ) );
-
-               parent::clickContinueButton();
-               $this->assertEquals( "Upgrade existing installation",
-                       $this->getText( LINK_DIV . "h2" ) );
-
-               // 'Upgrade complete.' text display
-               $this->assertEquals( "Upgrade complete.",
-                       $this->getText( "//div[@id='bodyContent']/div/div[1]/div[4]/form/div[1]/div[2]/p[1]" ) );
-
-               $this->assertEquals( "You can now Folder/index.php start using your wiki.",
-                       $this->getText( "//div[@id='bodyContent']/div/div[1]/div[4]/form/div[1]/div[2]/p[2]" ) );
-
-               $this->assertEquals( "Folder/index.php start using your wiki",
-                       $this->getText( "link=Folder/index.php start using your wiki" ) );
-
-               $this->assertTrue( $this->isElementPresent( "submit-regenerate" ) );
-               $this->click( "submit-regenerate" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-               $this->assertEquals( "Database settings",
-                       $this->getText( LINK_DIV . "h2" ) );
-
-               // 'Database settings' page
-               parent::clickContinueButton();
-
-               // Name page
-               parent::completeNamePage();
-
-               // Options page
-               parent::clickContinueButton();
-
-               // Install page
-               $this->assertEquals( "Warning: You seem to have already installed MediaWiki and are trying to install it again. Please proceed to the next page.",
-                       $this->getText( LINK_FORM . "div[1]/div[2]" ) );
-               parent::clickContinueButton();
-
-               // complete
-               parent::completePageSuccessfull();
-               $this->chooseCancelOnNextConfirmation();
-               parent::restartInstallation();
-       }
-}
diff --git a/tests/selenium/installer/MediaWikiUserInterfaceTestCase.php b/tests/selenium/installer/MediaWikiUserInterfaceTestCase.php
deleted file mode 100644 (file)
index 9733152..0000000
+++ /dev/null
@@ -1,494 +0,0 @@
-<?php
-/**
- * MediaWikiUserInterfaceTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID   : 18 - 27 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : UI of MediaWiki initial/ Language/ Welcome to MediaWiki!/ Connect to database/
- * Database settings/ Name/ Options/ Install/ Complete/ Restart Inslation pages
- * Version        : MediaWiki 1.18alpha
- */
-class MediaWikiUserInterfaceTestCase extends MediaWikiInstallationCommonFunction {
-       function setUp() {
-               parent::setUp();
-       }
-
-       public function testInitialPageUI() {
-
-               parent::navigateInitialpage();
-
-               // MediaWiki logo available
-               $this->assertTrue( $this->isElementPresent( "//img[@alt='The MediaWiki logo']" ) );
-
-               // 'MediaWiki 1.18alpha' text available
-               $this->assertEquals( "MediaWiki 1.18alpha", $this->getText( "//h1" ) );
-
-               // 'LocalSettings.php not found.' text available
-               $this->assertEquals( "LocalSettings.php not found.", $this->getText( "//p[1]" ) );
-
-               // 'Please set up the wiki first' text available
-               $this->assertEquals( "Please set up the wiki first.", $this->getText( "//p[2]" ) );
-
-               // 'set up the wiki' link available
-               $this->assertTrue( $this->isElementPresent( "link=set up the wiki" ) );
-       }
-
-       public function testlanguagePageUI() {
-               parent::navigateLanguagePage();
-
-               // Verify 'Language' heading
-               $this->assertEquals( "Language", $this->getText( LINK_DIV . "h2" ) );
-
-               // 'Your language' label available
-               $this->assertEquals( "Your language:",
-                       $this->getText( LINK_FORM . "div[1]/div[1]/label" ) );
-
-               // 'Your language' dropdown available
-               $this->assertTrue( $this->isElementPresent( "UserLang" ) );
-
-               // 'Wiki language' label available
-               $this->assertEquals( "Wiki language:",
-                       $this->getText( LINK_FORM . "div[2]/div[1]/label" ) );
-
-               // 'Wiki language' dropdown available
-               $this->assertTrue( $this->isElementPresent( "ContLang" ) );
-       }
-
-       public function testWelcometoMediaWikiUI() {
-               parent::navigateWelcometoMediaWikiPage();
-
-               // Verify 'Welcome to MediaWiki!' heading
-               $this->assertEquals( "Welcome to MediaWiki!",
-                       $this->getText( LINK_DIV . "h2" ) );
-
-               // Verify environment ok text displayed.
-               $this->assertEquals( "The environment has been checked.You can install MediaWiki.",
-                       $this->getText( LINK_DIV . "div[6]/span" ) );
-       }
-
-       public function testConnectToDatabaseUI() {
-               parent::navigateConnetToDatabasePage();
-
-               //  'MYSQL radio button available
-               $this->assertEquals( "MySQL",
-                       $this->getText( LINK_FORM . "div[2]/div[2]/ul/li[1]/label" ) );
-               $this->assertTrue( $this->isElementPresent( LINK_FORM . "div[2]/div[2]/ul/li[1]" ) );
-
-               // 'SQLite' radio button available
-               $this->assertTrue( $this->isElementPresent( LINK_FORM . "div[2]/div[2]/ul/li[2]" ) );
-               $this->assertEquals( "SQLite", $this->getText( LINK_FORM . "div[2]/div[2]/ul/li[2]/label " ) );
-
-               // 'Database host' label available
-               $this->assertEquals( "Database host:", $this->getText( "//div[@id='DB_wrapper_mysql']/div/div[1]/label" ) );
-
-               // 'Database host' text box default to 'localhost'
-               $this->assertEquals( "localhost", $this->getValue( "mysql_wgDBserver" ) );
-
-               // 'Identify this wiki' section available
-               $this->assertTrue( $this->isElementPresent( "//div[@id='DB_wrapper_mysql']/fieldset[1]/legend" ) );
-
-               // 'Identify this wiki' label available
-               $this->assertEquals( "Identify this wiki", $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[1]/legend" ) );
-
-               // 'Database name' lable available
-               $this->assertEquals( "Database name:",
-                       $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[1]/div[1]/div[1]/label" ) );
-
-               // Verify 'Database name:' text box is default to 'my_wiki'
-               $this->assertEquals( "my_wiki", $this->getValue( "mysql_wgDBname" ) );
-
-               // Verify 'Database table prefix:' label available
-               $this->assertEquals( "Database table prefix:",
-                       $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[1]/div[2]/div[1]/label" ) );
-
-               // 'User account for installation' section available
-               $this->assertTrue( $this->isElementPresent( "//div[@id='DB_wrapper_mysql']/fieldset[2]/legend" ) );
-
-               // 'User account for installation' label available
-               $this->assertEquals( "User account for installation", $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[2]/legend" ) );
-
-               // 'Database username' label available
-               $this->assertEquals( "Database username:",
-                       $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[2]/div[1]/div[1]/label" ) );
-
-               // 'Database username' text box defaults to 'root'
-               $this->assertEquals( "root", $this->getValue( "mysql__InstallUser" ) );
-
-               // 'Database password' label available
-               $this->assertEquals( "Database password:",
-                       $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[2]/div[2]/div[1]/label" ) );
-       }
-
-       public function testDatabaseSettingsUI() {
-               $databaseName = DB_NAME_PREFIX . "_db_settings_UI";
-               parent::navigateDatabaseSettingsPage( $databaseName );
-
-               // 'Database settings' text available.
-               $this->assertEquals( "Database settings", $this->getText( LINK_DIV . "h2" ) );
-
-               // 'Database account for web access' section available
-               $this->assertTrue( $this->isElementPresent( LINK_FORM . "fieldset" ) );
-
-               // 'Database account for web access' label available
-               $this->assertEquals( "Database account for web access", $this->getText( LINK_FORM . "fieldset/legend" ) );
-
-               // 'Use the same account as for installation' check box available
-               $this->assertEquals( "Use the same account as for installation", $this->getText( LINK_FORM . "fieldset/div[1]/label" ) );
-
-               // 'Use the same account as for installation' check box is selected by default
-               $this->assertEquals( "on", $this->getValue( "mysql__SameAccount" ) );
-
-               // 'Use the same account as for installation' check box deselected
-               $this->click( "mysql__SameAccount" );
-
-               // verify 'Use the same account as for installation' check box is not selected
-               $this->assertEquals( "off", $this->getValue( "mysql__SameAccount" ) );
-
-               // 'Database username' label available
-               $this->assertEquals( "Database username:", $this->getText( "//div[@id='dbOtherAccount']/div[1]/div[1]/label" ) );
-
-               // 'Database username' text box is default to the 'wikiuser'
-               $this->assertEquals( "wikiuser", $this->getValue( "mysql_wgDBuser" ) );
-
-               // 'Database password' label available
-               $this->assertEquals( "Database password:", $this->getText( "//div[@id='dbOtherAccount']/div[2]/div[1]/label" ) );
-
-               // 'Create the account if it does not already exist' label available
-               $this->assertEquals( "Create the account if it does not already exist", $this->getText( "//div[@id='dbOtherAccount']/div[4]/label" ) );
-
-               // 'Create the account if it does not already exist' check box is not selected by default
-               $this->assertEquals( "off", $this->getValue( "mysql__CreateDBAccount" ) );
-
-               //  'Create the account if it does not already exist' check box selected
-               $this->click( "mysql__CreateDBAccount" );
-
-               // Verify  'Create the account if it does not already exist' check box is selected
-               $this->assertEquals( "on", $this->getValue( "mysql__CreateDBAccount" ) );
-               $this->click( "mysql__SameAccount" );
-               $this->assertEquals( "on", $this->getValue( "mysql__SameAccount" ) );
-
-               // 'Storage engine' label available
-               $this->assertEquals( "Storage engine:",
-                       $this->getText( LINK_FORM . "div[1]/div[1]/label" ) );
-
-               // 'InnoDB' label available
-               $this->assertEquals( "InnoDB",
-                       $this->getText( LINK_FORM . "div[1]/div[2]/ul/li[1]/label" ) );
-
-               // 'InnoDB' radio button available
-               $this->assertTrue( $this->isElementPresent( "mysql__MysqlEngine_InnoDB" ) );
-
-               // 'MyISAM' label available
-               $this->assertEquals( "MyISAM", $this->getText( LINK_FORM . "div[1]/div[2]/ul/li[2]/label" ) );
-
-               // 'MyISAM' radio button available
-               $this->assertTrue( $this->isElementPresent( "mysql__MysqlEngine_MyISAM" ) );
-
-               // 'Database character set' label available
-               $this->assertEquals( "Database character set:",
-                       $this->getText( LINK_FORM . "div[3]/div[1]/label" ) );
-
-               // 'Binary' radio button available
-               $this->assertTrue( $this->isElementPresent( "mysql__MysqlCharset_binary" ) );
-
-               // 'Binary' radio button available
-               $this->assertEquals( "Binary", $this->getText( LINK_FORM . "div[3]/div[2]/ul/li[1]/label" ) );
-
-               // 'UTF-8' radio button available
-               $this->assertTrue( $this->isElementPresent( "mysql__MysqlCharset_utf8" ) );
-
-               // 'UTF-8' label available
-               $this->assertEquals( "UTF-8", $this->getText( LINK_FORM . "div[3]/div[2]/ul/li[2]/label" ) );
-
-               // 'Binary' radio button is selected
-               $this->assertEquals( "on", $this->getValue( "mysql__MysqlCharset_binary" ) );
-       }
-
-       public function testNamePageUI() {
-               $databaseName = DB_NAME_PREFIX . "_name_UI";
-               parent::navigateNamePage( $databaseName );
-
-               // 'Name of wiki' text box available
-               $this->assertEquals( "Name of wiki:",
-                       $this->getText( LINK_FORM . "div[1]/div[1]/label" ) );
-
-               $this->assertTrue( $this->isElementPresent( "config_wgSitename" ) );
-
-               // 'Project namespace' label available
-               $this->assertEquals( "Project namespace:",
-                       $this->getText( LINK_FORM . "div[2]/div[1]/label" ) );
-
-               // 'Same as the wiki name' radio button available
-               $this->assertTrue( $this->isElementPresent( "config__NamespaceType_site-name" ) );
-
-               // 'Project' radio button available
-               $this->assertTrue( $this->isElementPresent( "config__NamespaceType_generic" ) );
-
-               // 'Project' radio button available
-               $this->assertTrue( $this->isElementPresent( "config__NamespaceType_other" ) );
-
-               // 'Same as the wiki name' label available
-               $this->assertEquals( "Same as the wiki name:",
-                       $this->getText( LINK_FORM . "div[2]/div[2]/ul/li[1]/label" ) );
-
-               // 'Project' label available
-               $this->assertEquals( "Project",
-                       $this->getText( LINK_FORM . "div[2]/div[2]/ul/li[2]/label" ) );
-
-               // 'Project' label available
-               $this->assertEquals( "Other (specify)",
-                       $this->getText( LINK_FORM . "div[2]/div[2]/ul/li[3]/label" ) );
-
-               //  'Same as the wiki name' radio button selected by default
-               $this->assertEquals( "on", $this->getValue( "config__NamespaceType_site-name" ) );
-
-               // 'Administrator account' section available
-               $this->assertTrue( $this->isElementPresent( LINK_FORM . "fieldset" ) );
-
-               // 'Administrator account' label available
-               $this->assertEquals( "Administrator account",
-                       $this->getText( LINK_FORM . "fieldset/legend" ) );
-
-               // 'Your Name' label available
-               $this->assertEquals( "Your name:",
-                       $this->getText( LINK_FORM . "fieldset/div[1]/div[1]/label" ) );
-
-               // 'Your Name' text box available
-               $this->assertTrue( $this->isElementPresent( "config__AdminName" ) );
-
-               // 'Password' label available
-               $this->assertEquals( "Password:",
-                       $this->getText( LINK_FORM . "fieldset/div[2]/div[1]/label" ) );
-
-               // 'Password' text box available
-               $this->assertTrue( $this->isElementPresent( "config__AdminPassword" ) );
-
-               // 'Password again' label available
-               $this->assertEquals( "Password again:",
-                       $this->getText( LINK_FORM . "fieldset/div[3]/div[1]/label" ) );
-
-               // 'Password again' text box available
-               $this->assertTrue( $this->isElementPresent( "config__AdminPassword2" ) );
-
-               // 'Email address' label avaialble
-               $this->assertEquals( "E-mail address:",
-                       $this->getText( LINK_FORM . "fieldset/div[4]/div[1]/label" ) );
-
-               // 'Email address' text box available
-               $this->assertTrue( $this->isElementPresent( "config__AdminEmail" ) );
-
-               // Message displayed
-               $this->assertEquals( "You are almost done! You can now skip the remaining configuration and install the wiki right now.",
-                       $this->getText( LINK_FORM . "/div[4]/div[2]/p" ) );
-
-               // 'Ask me more questions.' radio button available
-               $this->assertTrue( $this->isElementPresent( "config__SkipOptional_continue" ) );
-
-               // 'Ask me more questions.' label available
-               $this->assertEquals( "Ask me more questions.",
-                       $this->getText( LINK_FORM . "div[5]/div[2]/ul/li[1]/label" ) );
-
-               // 'I'm bored already, just install the wiki' radio button is avaiable
-               $this->assertTrue( $this->isElementPresent( "config__SkipOptional_skip" ) );
-
-               // 'I'm bored already, just install the wiki' label available
-               $this->assertEquals( "I'm bored already, just install the wiki.",
-                       $this->getText( LINK_FORM . "div[5]/div[2]/ul/li[2]/label" ) );
-
-               //  'Ask me more questions.' radio button is default selected
-               $this->assertEquals( "on", $this->getValue( "config__SkipOptional_continue" ) );
-       }
-
-       public function testOptionPageUI() {
-               $databaseName = DB_NAME_PREFIX . "_options_UI";
-               parent::navigateOptionsPage( $databaseName );
-
-               // 'Options' label available
-               $this->assertEquals( "Options", $this->getText( LINK_DIV . "h2" ) );
-
-               // 'Return e-mail address' label available
-               $this->assertEquals( "Return e-mail address:", $this->getText( "//div[@id='emailwrapper']/div[1]/div[1]/label" ) );
-
-               //    'Return e-mail address' text box available
-               $this->assertTrue( $this->isElementPresent( "config_wgPasswordSender" ) );
-
-               // Text 'apache@localhost' is default value of the 'Return e-mail address' text box
-               $this->assertEquals( "apache@localhost", $this->getValue( "config_wgPasswordSender" ) );
-
-               // 'Logo URL' label available
-               $this->assertEquals( "Logo URL:", $this->getText( LINK_FORM . "fieldset[2]/div[3]/div[1]/label" ) );
-
-               // 'Logo URL' text box available
-               $this->assertTrue( $this->isElementPresent( "config_wgLogo" ) );
-
-               // Correct path available in the 'Logo URL' text box
-               $this->assertEquals( "/wiki/skins/common/images/wiki.png", $this->getValue( "config_wgLogo" ) );
-
-               // 'Enable file uploads' radio button available
-               $this->assertTrue( $this->isElementPresent( "config_wgEnableUploads" ) );
-
-               // 'Enable file uploads' label available
-               $this->assertEquals( "Enable file uploads",
-                       $this->getText( LINK_FORM . "fieldset[2]/div[1]/label" ) );
-
-               // 'Enable file uploads' check box is not selected
-               $this->assertEquals( "off", $this->getValue( "config_wgEnableUploads" ) );
-
-               $this->click( "config_wgEnableUploads" );
-
-               // 'Directory for deleted files' label available
-               $this->assertEquals( "Directory for deleted files:",
-                       $this->getText( "//div[@id='uploadwrapper']/div/div[1]/label" ) );
-
-               // 'Directory for deleted files' text box available
-               $this->assertTrue( $this->isElementPresent( "config_wgDeletedDirectory" ) );
-
-               // Correct path available in the 'Directory for deleted files' text box
-               $this->assertEquals( "C:\\wamp\\www\\" . DIRECTORY_NAME . "/images/deleted",
-                       $this->getValue( "config_wgDeletedDirectory" ) );
-       }
-
-       public function testInstallPageUI() {
-               $databaseName = DB_NAME_PREFIX . "_install_UI";
-               parent::navigateInstallPage( $databaseName );
-
-               // Verify installation done messages display
-               $this->assertEquals( "Setting up database... done",
-                       $this->getText( LINK_FORM . "ul/li[1]" ) );
-               $this->assertEquals( "Creating tables... done",
-                       $this->getText( LINK_FORM . "ul/li[2]" ) );
-               $this->assertEquals( "Creating database user... done",
-                       $this->getText( LINK_FORM . "ul/li[3]" ) );
-               $this->assertEquals( "Populating default interwiki table... done",
-                       $this->getText( LINK_FORM . "ul/li[4]" ) );
-               $this->assertEquals( "Generating secret key... done",
-                       $this->getText( LINK_FORM . "ul/li[5]" ) );
-               $this->assertEquals( "Generating default upgrade key... done",
-                       $this->getText( LINK_FORM . "ul/li[6]" ) );
-               $this->assertEquals( "Creating administrator user account... done",
-                       $this->getText( LINK_FORM . "ul/li[7]" ) );
-               $this->assertEquals( "Creating main page with default content... done",
-                       $this->getText( LINK_FORM . "ul/li[8]" ) );
-       }
-
-       public function testCompletePageUI() {
-               $databaseName = DB_NAME_PREFIX . "_complete_UI";
-               parent::navigateCompletePage( $databaseName );
-
-               // 'Congratulations!' text display
-               $this->assertEquals( "Congratulations!",
-                       $this->getText( LINK_FORM . "div[1]/div[2]/p[1]/b" ) );
-               // 'LocalSettings.php' generated message display
-               $this->assertEquals( "The installer has generated a LocalSettings.php file. It contains all your configuration.",
-                       $this->getText( LINK_FORM . "div[1]/div[2]/p[2]" ) );
-
-               // 'Download LocalSettings.php'' link available
-               $this->assertTrue( $this->isElementPresent( "link=Download LocalSettings.php" ) );
-
-               // 'enter your wiki' link available
-               $this->assertTrue( $this->isElementPresent( "link=Folder/index.php enter your wiki" ) );
-       }
-
-       public function testRestartInstallation() {
-               parent::navigateConnetToDatabasePage();
-               $this->click( "link=Restart installation" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-               // Restart installation' label should be available.
-               $this->assertEquals( "Restart installation", $this->getText( LINK_DIV . "h2" ) );
-
-               //'Do you want to clear all saved data that you have entered and restart the installation process?' label available
-               $this->assertEquals( "Do you want to clear all saved data that you have entered and restart the installation process?",
-                       $this->getText( "//*[@id='bodyContent']/div/div/div[2]/form/div[1]/div[2]" ) );
-               // 'Back' button available
-               $this->assertTrue( $this->isElementPresent( "submit-back" ) );
-
-               // 'Restart' button available
-               $this->assertTrue( $this->isElementPresent( "submit-restart" ) );
-       }
-
-       public function testMediaWikiLogoAvailability() {
-               $databaseName = DB_NAME_PREFIX . "_mediawiki_logo";
-               parent::navigateInitialpage();
-               parent::mediaWikiLogoPresentInitialScreen();
-               $this->click( "link=set up the wiki" );
-               $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-               // 'Language' page
-               parent::mediaWikiLogoPresent();
-               parent::clickContinueButton();
-
-               // 'Welcome to MediaWiki' page
-               parent::mediaWikiLogoPresent();
-               parent::clickContinueButton();
-
-               // 'Connet to database' page
-               parent::mediaWikiLogoPresent();
-               $this->type( "mysql_wgDBname", $databaseName );
-               parent::clickContinueButton();
-
-               // 'Database setting' page
-               parent::mediaWikiLogoPresent();
-               parent::clickContinueButton();
-
-               // 'Name' page
-               parent::mediaWikiLogoPresent();
-               parent::completeNamePage();
-               parent::clickContinueButton();
-
-               // 'Options' page
-               parent::mediaWikiLogoPresent();
-               parent::clickContinueButton();
-
-               // 'Install' page
-               parent::mediaWikiLogoPresent();
-       }
-
-       public function testRightFramework() {
-               parent::navigateLanguagePage();
-               // Verfy right framework texts display
-               $this->assertEquals( "Language",
-                       $this->getText( LINK_RIGHT_FRAMEWORK . "li[1]" ) );
-               $this->assertEquals( "Existing wiki",
-                       $this->getText( LINK_RIGHT_FRAMEWORK . "li[2]" ) );
-               $this->assertEquals( "Welcome to MediaWiki!",
-                       $this->getText( LINK_RIGHT_FRAMEWORK . "li[3]" ) );
-               $this->assertEquals( "Connect to database",
-                       $this->getText( LINK_RIGHT_FRAMEWORK . "li[4]" ) );
-               $this->assertEquals( "Upgrade existing installation",
-                       $this->getText( LINK_RIGHT_FRAMEWORK . "li[5]" ) );
-               $this->assertEquals( "Database settings",
-                       $this->getText( LINK_RIGHT_FRAMEWORK . "li[6]" ) );
-               $this->assertEquals( "Name",
-                       $this->getText( LINK_RIGHT_FRAMEWORK . "li[7]" ) );
-               $this->assertEquals( "Options",
-                       $this->getText( LINK_RIGHT_FRAMEWORK . "li[8]" ) );
-               $this->assertEquals( "Install",
-                       $this->getText( LINK_RIGHT_FRAMEWORK . "li[9]" ) );
-               $this->assertEquals( "Complete!",
-                       $this->getText( LINK_RIGHT_FRAMEWORK . "li[10]/span" ) );
-       }
-}
diff --git a/tests/selenium/installer/README.txt b/tests/selenium/installer/README.txt
deleted file mode 100644 (file)
index bc880a8..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-== Details==
-
-Automated Selenium test scripts written for MediaWiki Installer is available at https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/core.git;a=tree;f=tests/selenium/installer;hb=HEAD.
-Detailed test cases available at http://www.mediawiki.org/wiki/New_installer/Test_plan.
-
-Version : MediaWiki 1.18alpha
-Date   : 27/12/2010
-
-== Running tests ==
-
-Test cases can be run independently or can run all the test cases using MediaWikiInstallerTestSuite.php within PHPUnit/Selenium.
-
-
-== Dependencies == 
-
-MediaWikiInstallationConfig.php
-
-Value of the 'DB_NAME_PREFIX' should be replace with the database name prefix. Several DB instances will get created to cover different installation scenarios starting with the above prefix.
-You need to change the value of the 'DB_NAME_PREFIX' in MediaWikiInstallationConfig everytime you planned to
-run the tests.
-'DIRECTORY_NAME', 'PORT' and the 'HOST_NAME' should be replaced with your local values.
-You may specify the test browser you wish to run the test using 'TEST_BROWSER'.  Default browser is Firefox.
-
-Note : MediaWikiInstallerTestSuite.php has no dependency on 'Selenium' test framework.
-
-
-== Known problems ==
-
-If you run the MediaWikiInstallerTestSuite.php twice without changing the name of the database, the second run should be falied.
-(Please read the more information on how to change the database name which is avaialable under 'Dependencies' section)
-
-
diff --git a/tests/selenium/selenium_settings.ini.sample b/tests/selenium/selenium_settings.ini.sample
deleted file mode 100644 (file)
index b1d8819..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-[SeleniumSettings]
-
-; Set up the available browsers that Selenium can control.
-browsers[firefox]      = "*firefox"
-browsers[iexplorer] = "*iexploreproxy"
-browsers[chrome]       = "*chrome"
-
-; The simple configurations above usually work on Linux, but Windows and
-; Mac OS X hosts may need to specify a full path:
-;browsers[firefox] = "*firefox /Applications/Firefox.app/Contents/MacOS/firefox-bin"
-;browsers[firefox] = "*firefox C:\Program Files\Mozilla Firefox\firefox.exe"
-
-host                           = "localhost"
-port                           = "4444"
-wikiUrl                        = "http://localhost/deployment"
-username                       = "wikiuser"
-userPassword           = "wikipass"
-testBrowser            = "firefox"
-startserver                    =
-stopserver                     =
-jUnitLogFile           =
-runAgainstGrid         = false
-
-; To let the test runner start and stop the selenium server, it needs the full
-; path to selenium-server.jar from the selenium-remote-control package.
-seleniumserverexecpath = "/opt/local/selenium-remote-control-1.0.3/selenium-server-1.0.3/selenium-server.jar"
-
-[SeleniumTests]
-
-testSuite[SimpleSeleniumTestSuite] = "tests/selenium/suites/SimpleSeleniumTestSuite.php"
-testSuite[WikiEditorTestSuite] = "extensions/WikiEditor/selenium/WikiEditorTestSuite.php"
-
diff --git a/tests/selenium/selenium_settings_grid.ini.sample b/tests/selenium/selenium_settings_grid.ini.sample
deleted file mode 100644 (file)
index 3bbd534..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-[SeleniumSettings]
-
-host                   = "grid.tesla.usability.wikimedia.org"
-port                   = "4444"
-wikiUrl                        = "http://208.80.152.253:5001"
-username               = "wikiuser"
-userPassword   = "wikipass"
-testBrowser            = "Safari on OS X Snow Leopard"
-jUnitLogFile   =
-runAgainstGrid = true
-startserver = false
-stopserver = false
-
-[SeleniumTests]
-
-testSuite[SimpleSeleniumTestSuite]     = "tests/selenium/suites/SimpleSeleniumTestSuite.php"
diff --git a/tests/selenium/suites/AddContentToNewPageTestCase.php b/tests/selenium/suites/AddContentToNewPageTestCase.php
deleted file mode 100644 (file)
index 2803ff2..0000000
+++ /dev/null
@@ -1,173 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-class AddContentToNewPageTestCase extends SeleniumTestCase {
-       // Add bold text and verify output
-       public function testAddBoldText() {
-               $this->getExistingPage();
-               $this->clickEditLink();
-               $this->loadWikiEditor();
-               $this->clearWikiEditor();
-               $this->click( "//*[@id='mw-editbutton-bold']" );
-               $this->clickShowPreviewBtn();
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify bold text displayed on mediawiki preview
-               $this->assertTrue( $this->isElementPresent( "//div[@id='wikiPreview']/p/b" ) );
-               $this->assertTrue( $this->isTextPresent( "Bold text" ) );
-       }
-
-       // Add italic text and verify output
-       public function testAddItalicText() {
-               $this->getExistingPage();
-               $this->clickEditLink();
-               $this->loadWikiEditor();
-               $this->clearWikiEditor();
-               $this->click( "//*[@id='mw-editbutton-italic']" );
-               $this->clickShowPreviewBtn();
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify italic text displayed on mediawiki preview
-               $this->assertTrue( $this->isElementPresent( "//div[@id='wikiPreview']/p/i" ) );
-               $this->assertTrue( $this->isTextPresent( "Italic text" ) );
-       }
-
-       // Add internal link for a new page and verify output in the preview
-       public function testAddInternalLinkNewPage() {
-               $this->getExistingPage();
-               $this->clickEditLink();
-               $this->loadWikiEditor();
-               $this->clearWikiEditor();
-               $this->click( "//*[@id='mw-editbutton-link']" );
-               $this->clickShowPreviewBtn();
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify internal link displayed on mediawiki preview
-               $source = $this->getText( "//*[@id='wikiPreview']/p/a" );
-               $correct = strstr( $source, "Link title" );
-               $this->assertEquals( $correct, true );
-
-               $this->click( SeleniumTestConstants::LINK_START . "Link title" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify internal link open as a new page - editing mode
-               $source = $this->getText( "firstHeading" );
-               $correct = strstr( $source, "Editing Link title" );
-               $this->assertEquals( $correct, true );
-       }
-
-       // Add external link and verify output in the preview
-       public function testAddExternalLink() {
-               $this->getExistingPage();
-               $this->clickEditLink();
-               $this->loadWikiEditor();
-               $this->clearWikiEditor();
-               $this->click( "//*[@id='mw-editbutton-extlink']" );
-               $this->type( SeleniumTestConstants::TEXT_EDITOR, "[http://www.google.com Google]" );
-               $this->clickShowPreviewBtn();
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify external links displayed on mediawiki preview
-               $source = $this->getText( "//*[@id='wikiPreview']/p/a" );
-               $correct = strstr( $source, "Google" );
-               $this->assertEquals( $correct, true );
-
-               $this->click( SeleniumTestConstants::LINK_START . "Google" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify external link opens
-               $source = $this->getTitle();
-               $correct = strstr( $source, "Google" );
-               $this->assertEquals( $correct, true );
-       }
-
-       // Add level 2 headline and verify output in the preview
-       public function testAddLevel2HeadLine() {
-               $blnElementPresent = false;
-               $blnTextPresent = false;
-               $this->getExistingPage();
-               $this->clickEditLink();
-               $this->loadWikiEditor();
-               $this->clearWikiEditor();
-               $this->click( "mw-editbutton-headline" );
-               $this->clickShowPreviewBtn();
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-               $this->assertTrue( $this->isElementPresent( "//div[@id='wikiPreview']/h2" ) );
-
-               // Verify level 2 headline displayed on mediawiki preview
-               $source = $this->getText( "//*[@id='Headline_text']" );
-               $correct = strstr( $source, "Headline text" );
-               $this->assertEquals( $correct, true );
-       }
-
-       // Add text with ignore wiki format and verify output the preview
-       public function testAddNoWikiFormat() {
-               $this->getExistingPage();
-               $this->clickEditLink();
-               $this->loadWikiEditor();
-               $this->clearWikiEditor();
-               $this->click( "//*[@id='mw-editbutton-nowiki']" );
-               $this->clickShowPreviewBtn();
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify ignore wiki format text displayed on mediawiki preview
-               $source = $this->getText( "//div[@id='wikiPreview']/p" );
-               $correct = strstr( $source, "Insert non-formatted text here" );
-               $this->assertEquals( $correct, true );
-       }
-
-       // Add signature and verify output in the preview
-       public function testAddUserSignature() {
-               $this->getExistingPage();
-               $this->clickEditLink();
-               $this->loadWikiEditor();
-               $this->clearWikiEditor();
-               $this->click( "mw-editbutton-signature" );
-               $this->clickShowPreviewBtn();
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify signature displayed on mediawiki preview
-               $source = $this->getText( "//*[@id='wikiPreview']/p/a" );
-               $username = $this->getText( "//*[@id='pt-userpage']/a" );
-               $correct = strstr( $source, $username );
-               $this->assertEquals( $correct, true );
-       }
-
-       // Add horizontal line and verify output in the preview
-       public function testHorizontalLine() {
-               $this->getExistingPage();
-               $this->clickEditLink();
-               $this->loadWikiEditor();
-               $this->clearWikiEditor();
-               $this->click( "mw-editbutton-hr" );
-
-               $this->clickShowPreviewBtn();
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify horizontal line displayed on mediawiki preview
-               $this->assertTrue( $this->isElementPresent( "//div[@id='wikiPreview']/hr" ) );
-               $this->deletePage( "new" );
-       }
-}
diff --git a/tests/selenium/suites/AddNewPageTestCase.php b/tests/selenium/suites/AddNewPageTestCase.php
deleted file mode 100644 (file)
index c70af33..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-class AddNewPageTestCase extends SeleniumTestCase {
-       // Verify adding a new page
-       public function testAddNewPage() {
-               $newPage = "new";
-               $displayName = "New";
-               $this->open( $this->getUrl() .
-                       '/index.php?title=Main_Page&action=edit' );
-               $this->type( "searchInput", $newPage );
-               $this->click( "searchGoButton" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify 'Search results' text available
-               $source = $this->gettext( "firstHeading" );
-               $correct = strstr( $source, "Search results" );
-               $this->assertEquals( $correct, true );
-
-               // Verify  'Create the page "<page name>" on this wiki' text available
-               $source = $this->gettext( "//div[@id='bodyContent']/div[4]/p/b" );
-               $correct = strstr( $source, "Create the page \"New\" on this wiki!" );
-               $this->assertEquals( $correct, true );
-
-               $this->click( SeleniumTestConstants::LINK_START . $displayName );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               $this->assertTrue( $this->isElementPresent( SeleniumTestConstants::LINK_START . "Create" ) );
-               $this->type( "wpTextbox1", "add new test page" );
-               $this->click( SeleniumTestConstants::BUTTON_SAVE );
-
-               // Verify new page added
-               $source = $this->gettext( "firstHeading" );
-               $correct = strstr( $source, $displayName );
-               $this->assertEquals( $correct, true );
-       }
-}
diff --git a/tests/selenium/suites/CreateAccountTestCase.php b/tests/selenium/suites/CreateAccountTestCase.php
deleted file mode 100644 (file)
index a603f99..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-Class CreateAccountTestCase extends SeleniumTestCase {
-       // Change these values before run the test
-       private $userName = "yourname4000";
-       private $password = "yourpass4000";
-
-       // Verify 'Log in/create account' link existance in Main page.
-       public function testMainPageLink() {
-
-               $this->click( "link=Log out" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               $this->open( $this->getUrl() . '/index.php?title=Main_Page' );
-               $this->assertTrue( $this->isElementPresent( "link=Log in / create account" ) );
-       }
-
-       // Verify 'Create an account' link existance in 'Log in / create account' Page.
-       public function testCreateAccountPageLink() {
-
-               $this->click( "link=Log out" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               $this->open( $this->getUrl() . '/index.php?title=Main_Page' );
-
-               // click Log in / create account link to open Log in / create account' page
-               $this->click( "link=Log in / create account" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-               $this->assertTrue( $this->isElementPresent( "link=Create an account" ) );
-       }
-
-       // Verify Create account
-       public function testCreateAccount() {
-
-               $this->click( "link=Log out" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               $this->open( $this->getUrl() . '/index.php?title=Main_Page' );
-
-               $this->click( "link=Log in / create account" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               $this->click( "link=Create an account" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify for blank user name
-               $this->type( "wpName2", "" );
-               $this->click( "wpCreateaccount" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-               $this->assertEquals( "Login error\n You have not specified a valid user name.",
-                       $this->getText( "//div[@id='bodyContent']/div[4]" ) );
-
-               // Verify for invalid user name
-               $this->type( "wpName2", "@" );
-               $this->click( "wpCreateaccount" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-               $this->assertEquals( "Login error\n You have not specified a valid user name.",
-                       $this->getText( "//div[@id='bodyContent']/div[4]" ) );
-
-               // start of test for blank password
-               $this->type( "wpName2", $this->userName );
-               $this->type( "wpPassword2", "" );
-               $this->click( "wpCreateaccount" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-               $this->assertEquals( "Login error\n Passwords must be at least 1 character.",
-                       $this->getText( "//div[@id='bodyContent']/div[4]" ) );
-
-               $this->type( "wpName2", $this->userName );
-               $this->type( "wpPassword2", $this->password );
-               $this->click( "wpCreateaccount" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-               $this->assertEquals( "Login error\n The passwords you entered do not match.",
-                       $this->getText( "//div[@id='bodyContent']/div[4]" ) );
-
-               $this->type( "wpName2", $this->userName );
-               $this->type( "wpPassword2", $this->password );
-               $this->type( "wpRetype", $this->password );
-               $this->click( "wpCreateaccount" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify successful account creation for valid combination of 'Username', 'Password', 'Retype password'
-               $this->assertEquals( "Welcome, " . ucfirst( $this->userName ) . "!",
-                       $this->getText( "Welcome,_" . ucfirst( $this->userName ) . "!" ) );
-       }
-}
-
diff --git a/tests/selenium/suites/DeletePageAdminTestCase.php b/tests/selenium/suites/DeletePageAdminTestCase.php
deleted file mode 100644 (file)
index f0005cd..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-class DeletePageAdminTestCase extends SeleniumTestCase {
-       // Verify adding a new page
-       public function testDeletePage() {
-
-               $newPage = "new";
-               $displayName = "New";
-
-               $this->open( $this->getUrl() . '/index.php?title=Main_Page' );
-
-               $this->type( "searchInput", $newPage );
-               $this->click( "searchGoButton" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-               $this->click( SeleniumTestConstants::LINK_START . $displayName );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-               $this->type( SeleniumTestConstants::TEXT_EDITOR, $newPage . " text" );
-               $this->click( SeleniumTestConstants::BUTTON_SAVE );
-
-               $this->open( $this->getUrl() .
-                       '/index.php?title=Main_Page&action=edit' );
-               $this->click( SeleniumTestConstants::LINK_START . "Log out" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-               $this->click( SeleniumTestConstants::LINK_START . "Log in / create account" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               $this->type( "wpName1", $this->selenium->getUser() );
-               $this->type( "wpPassword1", $this->selenium->getPass() );
-               $this->click( "wpLoginAttempt" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-               $this->type( "searchInput", "new" );
-               $this->click( "searchGoButton" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify  'Delete' link displayed
-               $source = $this->gettext( SeleniumTestConstants::LINK_START . "Delete" );
-               $correct = strstr( $source, "Delete" );
-               $this->assertEquals( $correct, true );
-
-               $this->click( SeleniumTestConstants::LINK_START . "Delete" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify 'Delete' button available
-               $this->assertTrue( $this->isElementPresent( "wpConfirmB" ) );
-
-               $this->click( "wpConfirmB" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify  'Action complete' text displayed
-               $source = $this->gettext( "firstHeading" );
-               $correct = strstr( $source, "Action complete" );
-               $this->assertEquals( $correct, true );
-
-               // Verify  '<Page Name> has been deleted. See deletion log for a record of recent deletions.' text displayed
-               $source = $this->gettext( "//div[@id='bodyContent']/p[1]" );
-               $correct = strstr( $source, "\"New\" has been deleted. See deletion log for a record of recent deletions." );
-               $this->assertEquals( $correct, true );
-       }
-}
diff --git a/tests/selenium/suites/EmailPasswordTestCase.php b/tests/selenium/suites/EmailPasswordTestCase.php
deleted file mode 100644 (file)
index 77282e4..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-class EmailPasswordTestCase extends SeleniumTestCase {
-       // change user name for each and every test (with in 24 hours)
-       private $userName = "test1";
-
-       public function testEmailPasswordButton() {
-               $this->click( SeleniumTestConstants::LINK_START . "Log out" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               $this->open( $this->getUrl() . '/index.php?title=Main_Page' );
-
-               // click Log in / create account link to open Log in / create account' page
-               $this->click( SeleniumTestConstants::LINK_START . "Log in / create account" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-               $this->assertTrue( $this->isElementPresent( "wpMailmypassword" ) );
-       }
-
-       // Verify Email password functionality
-       public function testEmailPasswordMessages() {
-               $this->click( SeleniumTestConstants::LINK_START . "Log out" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               $this->open( $this->getUrl() . '/index.php?title=Main_Page' );
-
-               // click Log in / create account link to open Log in / create account' page
-               $this->click( SeleniumTestConstants::LINK_START . "Log in / create account" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               $this->type( "wpName1", "" );
-               $this->click( "wpMailmypassword" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-               $this->assertEquals( "Login error\n You have not specified a valid user name.",
-                       $this->getText( "//div[@id='bodyContent']/div[4]" ) );
-
-               $this->type( "wpName1", $this->userName );
-               $this->click( "wpMailmypassword" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               //  Can not run on localhost
-               $this->assertEquals( "A new password has been sent to the e-mail address registered for " . ucfirst( $this->userName ) . ". Please log in again after you receive it.",
-                       $this->getText( "//div[@id='bodyContent']/div[4]" ) );
-
-               $this->type( "wpName1", $this->userName );
-               $this->click( "wpMailmypassword" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-               $this->assertEquals( "Login error\n A password reminder has already been sent, within the last 24 hours. To prevent abuse, only one password reminder will be sent per 24 hours.",
-                       $this->getText( "//div[@id='bodyContent']/div[4]" ) );
-       }
-}
-
diff --git a/tests/selenium/suites/MediaWikiEditorConfig.php b/tests/selenium/suites/MediaWikiEditorConfig.php
deleted file mode 100644 (file)
index 7fd8e07..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-class MediaWikiEditorConfig {
-       public static function getSettings( &$includeFiles, &$globalConfigs ) {
-               $includes = array(
-                       //files that needed to be included would go here
-                       //commenting out because this does not exist
-                       //'tests/selenium/suites/MediaWikiCommonFunction.php'
-               );
-               $configs = array(
-                       'wgPageLoadTime' => "600000"
-               );
-               $includeFiles = array_merge( $includeFiles, $includes );
-               $globalConfigs = array_merge( $globalConfigs, $configs );
-               return true;
-       }
-}
-
diff --git a/tests/selenium/suites/MediaWikiEditorTestSuite.php b/tests/selenium/suites/MediaWikiEditorTestSuite.php
deleted file mode 100644 (file)
index f9cfb7f..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-
-class MediaWikiEditorTestSuite extends SeleniumTestSuite {
-       public function setUp() {
-               $this->setLoginBeforeTests( true );
-               parent::setUp();
-       }
-
-       public function addTests() {
-               $testFiles = array(
-                       'tests/selenium/suites/AddNewPageTestCase.php',
-                       'tests/selenium/suites/AddContentToNewPageTestCase.php',
-                       'tests/selenium/suites/PreviewPageTestCase.php',
-                       'tests/selenium/suites/SavePageTestCase.php',
-               );
-               parent::addTestFiles( $testFiles );
-       }
-}
-
diff --git a/tests/selenium/suites/MediaWikiExtraTestSuite.php b/tests/selenium/suites/MediaWikiExtraTestSuite.php
deleted file mode 100644 (file)
index 8993907..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-
-class MediaWikiExtraTestSuite extends SeleniumTestSuite {
-       public function setUp() {
-               $this->setLoginBeforeTests( true );
-               parent::setUp();
-       }
-
-       public function addTests() {
-               $testFiles = array(
-                       'tests/selenium/suites/MyContributionsTestCase.php',
-                       'tests/selenium/suites/MyWatchListTestCase.php',
-                       'tests/selenium/suites/UserPreferencesTestCase.php',
-                       'tests/selenium/suites/MovePageTestCase.php',
-                       'tests/selenium/suites/PageSearchTestCase.php',
-                       'tests/selenium/suites/EmailPasswordTestCase.php',
-                       'tests/selenium/suites/CreateAccountTestCase.php'
-               );
-               parent::addTestFiles( $testFiles );
-       }
-}
diff --git a/tests/selenium/suites/MediawikiCoreSmokeTestCase.php b/tests/selenium/suites/MediawikiCoreSmokeTestCase.php
deleted file mode 100644 (file)
index 4491afd..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-/*
- * Stub of tests be need as part of the hack-a-ton
- */
-class MediawikiCoreSmokeTestCase extends SeleniumTestCase {
-       public function testUserLogin() {
-
-       }
-
-       public function testChangeUserPreference() {
-
-       }
-
-       /**
-        * TODO: generalize this test to be reusable for different skins
-        */
-       public function testCreateNewPageVector() {
-
-       }
-
-       /**
-        * TODO: generalize this test to be reusable for different skins
-        */
-       public function testEditExistingPageVector() {
-
-       }
-
-       /**
-        * TODO: generalize this test to be reusable for different skins
-        */
-       public function testCreateNewPageMonobook() {
-
-       }
-
-       /**
-        * TODO: generalize this test to be reusable for different skins
-        */
-       public function testEditExistingPageMonobook() {
-
-       }
-
-       public function testImageUpload() {
-               $this->login();
-               $this->open( $this->getUrl() .
-                       '/index.php?title=Special:Upload' );
-               $this->type( 'wpUploadFile', __DIR__ .
-                       "\\..\\data\\Wikipedia-logo-v2-de.png" );
-               $this->check( 'wpIgnoreWarning' );
-               $this->click( 'wpUpload' );
-               $this->waitForPageToLoad( 30000 );
-
-               $this->assertSeleniumHTMLContains(
-                       '//h1[@class="firstHeading"]', "Wikipedia-logo-v2-de.png"
-               );
-
-               /*
-               $this->open( $this->getUrl() . '/index.php?title=Image:'
-                       . ucfirst( $this->filename ) . '&action=delete' );
-               $this->type( 'wpReason', 'Remove test file' );
-               $this->click( 'mw-filedelete-submit' );
-               $this->waitForPageToLoad( 10000 );
-
-               // Todo: This message is localized
-               $this->assertSeleniumHTMLContains( '//div[@id="bodyContent"]/p',
-                       ucfirst( $this->filename ) . '.*has been deleted.' );
-                */
-       }
-
-
-}
diff --git a/tests/selenium/suites/MediawikiCoreSmokeTestSuite.php b/tests/selenium/suites/MediawikiCoreSmokeTestSuite.php
deleted file mode 100644 (file)
index fc69e3c..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-/**
- * Stubs for now. We're going to start populating this test.
- */
-class MediawikiCoreSmokeTestSuite extends SeleniumTestSuite {
-       public function setUp() {
-               $this->setLoginBeforeTests( false );
-               parent::setUp();
-       }
-
-       public function addTests() {
-               $testFiles = array(
-                       'tests/selenium/suites/MediawikiCoreSmokeTestCase.php'
-               );
-               parent::addTestFiles( $testFiles );
-       }
-
-
-}
diff --git a/tests/selenium/suites/MovePageTestCase.php b/tests/selenium/suites/MovePageTestCase.php
deleted file mode 100644 (file)
index d2eaa40..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-class MovePageTestCase extends SeleniumTestCase {
-       // Verify move(rename) wiki page
-       public function testMovePage() {
-               $newPage = "mypage99";
-               $displayName = "Mypage99";
-
-               $this->open( $this->getUrl() .
-                       '/index.php?title=Main_Page&action=edit' );
-               $this->type( "searchInput", $newPage );
-               $this->click( "searchGoButton" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-               $this->click( "link=" . $displayName );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-               $this->type( SeleniumTestConstants::TEXT_EDITOR, $newPage . " text" );
-               $this->click( SeleniumTestConstants::BUTTON_SAVE );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify link 'Move' available
-               $this->assertTrue( $this->isElementPresent( "link=Move" ) );
-
-               $this->click( "link=Move" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify correct page name displayed under 'Move Page' field
-               $this->assertEquals( $displayName,
-                       $this->getText( "//table[@id='mw-movepage-table']/tbody/tr[1]/td[2]/strong/a" ) );
-               $movePageName = $this->getText( "//table[@id='mw-movepage-table']/tbody/tr[1]/td[2]/strong/a" );
-
-               // Verify 'To new title' field has current page name as the default name
-               $newTitle = $this->getValue( "wpNewTitle" );
-               $correct = strstr( $movePageName, $newTitle );
-               $this->assertEquals( $correct, true );
-
-               $this->type( "wpNewTitle", $displayName );
-               $this->click( "wpMove" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify warning message for the same source and destination titles
-               $this->assertEquals( "Source and destination titles are the same; cannot move a page over itself.",
-                       $this->getText( "//div[@id='bodyContent']/p[4]/strong" ) );
-
-               // Verify warning message for the blank title
-               $this->type( "wpNewTitle", "" );
-               $this->click( "wpMove" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify warning message for the blank title
-               $this->assertEquals( "The requested page title was invalid, empty, or an incorrectly linked inter-language or inter-wiki title. It may contain one or more characters which cannot be used in titles.",
-                       $this->getText( "//div[@id='bodyContent']/p[4]/strong" ) );
-
-               //  Verify warning messages for the invalid titles
-               $this->type( "wpNewTitle", "# < > [ ] | { }" );
-               $this->click( "wpMove" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-               $this->assertEquals( "The requested page title was invalid, empty, or an incorrectly linked inter-language or inter-wiki title. It may contain one or more characters which cannot be used in titles.",
-                       $this->getText( "//div[@id='bodyContent']/p[4]/strong" ) );
-
-               $this->type( "wpNewTitle", $displayName . "move" );
-               $this->click( "wpMove" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify move success message displayed correctly
-               $this->assertEquals( "\"" . $displayName . "\" has been moved to \"" . $displayName . "move" . "\"",
-                       $this->getText( "//div[@id='bodyContent']/p[1]/b" ) );
-
-               $this->type( "searchInput", $newPage . "move" );
-               $this->click( "searchGoButton" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify search using new page name
-               $this->assertEquals( $displayName . "move", $this->getText( "firstHeading" ) );
-
-               $this->type( "searchInput", $newPage );
-               $this->click( "searchGoButton" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify search using old page name
-               $redirectPageName = $this->getText( "//*[@id='contentSub']" );
-               $this->assertEquals( "(Redirected from " . $displayName . ")", $redirectPageName );
-
-               // newpage delete
-               $this->deletePage( $newPage . "move" );
-               $this->deletePage( $newPage );
-       }
-}
-
diff --git a/tests/selenium/suites/MyContributionsTestCase.php b/tests/selenium/suites/MyContributionsTestCase.php
deleted file mode 100644 (file)
index 81e3a4d..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once dirname( __DIR__ ) . '/SeleniumTestConstants.php';
-
-class MyContributionsTestCase extends SeleniumTestCase {
-       // Verify user contributions
-       public function testRecentChangesAvailability() {
-               $newPage = $this->createNewTestPage( "MyContributionsTest" );
-
-               // Verify My contributions Link available
-               $this->assertTrue( $this->isElementPresent( "link=Contributions" ) );
-
-
-               $this->click( "link=Contributions" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify recent page adding available on My Contributions list
-               $this->assertEquals( $newPage, $this->getText( "link=" . $newPage ) );
-
-               $this->type( SeleniumTestConstants::INPUT_SEARCH_BOX, $newPage );
-               $this->click( SeleniumTestConstants::BUTTON_SEARCH );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               $this->click( SeleniumTestConstants::LINK_EDIT );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-               $this->type( SeleniumTestConstants::TEXT_EDITOR, $newPage . " text changed" );
-               $this->click( SeleniumTestConstants::BUTTON_SAVE );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-               $this->click( "link=Contributions" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify recent page changes available on My Contributions
-               $this->assertTrue( $this->isTextPresent( $newPage ) );
-       }
-}
-
diff --git a/tests/selenium/suites/MyWatchListTestCase.php b/tests/selenium/suites/MyWatchListTestCase.php
deleted file mode 100644 (file)
index 842108f..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once dirname( __DIR__ ) . '/SeleniumTestConstants.php';
-
-class MyWatchListTestCase extends SeleniumTestCase {
-       // Verify user watchlist
-       public function testMyWatchlist() {
-               $pageName = $this->createNewTestPage( "MyWatchListTest", true );
-               // Verify link 'My Watchlist' available
-               $this->assertTrue( $this->isElementPresent( SeleniumTestConstants::LINK_START . "Watchlist" ) );
-
-               $this->click( SeleniumTestConstants::LINK_START . "Watchlist" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify newly added page to the watchlist is available
-               $this->assertEquals( $pageName, $this->getText( SeleniumTestConstants::LINK_START . $pageName ) );
-
-               $this->click( SeleniumTestConstants::LINK_START . $pageName );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-               $this->click( SeleniumTestConstants::LINK_EDIT );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-               $this->click( "wpWatchthis" );
-               $this->click( SeleniumTestConstants::BUTTON_SAVE );
-               $this->assertFalse( $this->isElementPresent( SeleniumTestConstants::LINK_START . $pageName ) );
-               //todo watch using the dropdown menu
-       }
-}
-
diff --git a/tests/selenium/suites/PageDeleteTestSuite.php b/tests/selenium/suites/PageDeleteTestSuite.php
deleted file mode 100644 (file)
index e43ffa8..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-class PageDeleteTestSuite extends SeleniumTestSuite {
-       public function setUp() {
-               $this->setLoginBeforeTests( true );
-               parent::setUp();
-       }
-
-       public function addTests() {
-               $testFiles = array(
-                       'tests/selenium/suites/DeletePageAdminTestCase.php'
-               );
-               parent::addTestFiles( $testFiles );
-       }
-}
diff --git a/tests/selenium/suites/PageSearchTestCase.php b/tests/selenium/suites/PageSearchTestCase.php
deleted file mode 100644 (file)
index 5fdc5c8..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-class PageSearchTestCase extends SeleniumTestCase {
-       // Verify the functionality of the 'Go' button
-       public function testPageSearchBtnGo() {
-
-               $this->open( $this->getUrl() .
-                       '/index.php?title=Main_Page&action=edit' );
-               $this->type( SeleniumTestConstants::INPUT_SEARCH_BOX, "calcey qa" );
-               $this->click( "searchGoButton" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify  no page matched with the entered search text
-               $source = $this->gettext( "//div[@id='bodyContent']/div[4]/p/b" );
-               $correct = strstr( $source, "Create the page \"Calcey qa\" on this wiki!" );
-               $this->assertEquals( $correct, true );
-
-               $this->click( "link=Calcey qa" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               $this->type( SeleniumTestConstants::TEXT_EDITOR, "Calcey QA team" );
-               $this->click( "wpSave" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-       }
-
-       // Verify the functionality of the 'Search' button
-       public function testPageSearchBtnSearch() {
-               $this->open( $this->getUrl() .
-                       '/index.php?title=Main_Page&action=edit' );
-               $this->type( SeleniumTestConstants::INPUT_SEARCH_BOX, "Calcey web" );
-               $this->click( SeleniumTestConstants::BUTTON_SEARCH );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify  no page is available as the search text
-               $source = $this->gettext( "//div[@id='bodyContent']/div[4]/p[2]/b" );
-               $correct = strstr( $source, "Create the page \"Calcey web\" on this wiki!" );
-               $this->assertEquals( $correct, true );
-
-               $this->click( "link=Calcey web" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               $this->type( SeleniumTestConstants::TEXT_EDITOR, "Calcey web team" );
-               $this->click( SeleniumTestConstants::BUTTON_SAVE );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify saved page is opened  when the exact page name is given
-               $this->type( SeleniumTestConstants::INPUT_SEARCH_BOX, "Calcey web" );
-               $this->click( SeleniumTestConstants::BUTTON_SEARCH );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify exact page matched with the entered search text using 'Search' button
-               $source = $this->getText( "//*[@id='bodyContent']/div[4]/p/b" );
-               $correct = strstr( $source, "There is a page named \"Calcey web\" on this wiki." );
-               $this->assertEquals( $correct, true );
-
-               // Verify resutls available when partial page name is entered as the search text
-               $this->type( SeleniumTestConstants::INPUT_SEARCH_BOX, "Calcey" );
-               $this->click( SeleniumTestConstants::BUTTON_SEARCH );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               //  Verify text avaialble in the search result under the page titles
-               if ( $this->isElementPresent( "Page_title_matches" ) ) {
-                       $textPageTitle = $this->getText( "//*[@id='bodyContent']/div[4]/ul[1]/li[1]/div[1]/a" );
-                       $this->assertContains( 'Calcey', $textPageTitle );
-               }
-
-               //  Verify text avaialble in the search result under the page text
-               if ( $this->isElementPresent( "Page_text_matches" ) ) {
-                       $textPageText = $this->getText( "//*[@id='bodyContent']/div[4]/ul[2]/li[2]/div[2]/span" );
-                       $this->assertContains( 'Calcey', $textPageText );
-               }
-               $this->deletePage( "Calcey QA" );
-               $this->deletePage( "Calcey web" );
-       }
-}
diff --git a/tests/selenium/suites/PreviewPageTestCase.php b/tests/selenium/suites/PreviewPageTestCase.php
deleted file mode 100644 (file)
index 036201f..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-class PreviewPageTestCase extends SeleniumTestCase {
-       // Verify adding a new page
-       public function testPreviewPage() {
-               $wikiText = "Adding this page to test the \n Preview button functionality";
-               $newPage = "Test Preview Page";
-               $this->open( $this->getUrl() .
-                       '/index.php?title=Main_Page&action=edit' );
-               $this->getNewPage( $newPage );
-               $this->type( SeleniumTestConstants::TEXT_EDITOR, $wikiText . "" );
-               $this->assertTrue( $this->isElementPresent( "//*[@id='wpPreview']" ) );
-
-               $this->click( "wpPreview" );
-
-               // Verify saved page available
-               $source = $this->gettext( "firstHeading" );
-               $correct = strstr( $source, "Test Preview Page" );
-               $this->assertEquals( $correct, true );
-
-               // Verify page content previewed succesfully
-               $contentOfPreviewPage = $this->getText( "//*[@id='content']" );
-               $this->assertContains( $wikiText, $contentOfPreviewPage );
-       }
-}
diff --git a/tests/selenium/suites/SavePageTestCase.php b/tests/selenium/suites/SavePageTestCase.php
deleted file mode 100644 (file)
index 1e4cc2d..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-class SavePageTestCase extends SeleniumTestCase {
-       // Verify adding a new page
-       public function testSavePage() {
-               $wikiText = "Adding this page to test the Save button functionality";
-               $newPage = "Test Save Page";
-
-               $this->open( $this->getUrl() .
-                       '/index.php?title=Main_Page&action=edit' );
-               $this->getNewPage( $newPage );
-               $this->type( SeleniumTestConstants::TEXT_EDITOR, $wikiText );
-
-               // verify 'Save' button available
-               $this->assertTrue( $this->isElementPresent( SeleniumTestConstants::BUTTON_SAVE ) );
-               $this->click( SeleniumTestConstants::BUTTON_SAVE );
-
-               // Verify saved page available
-               $source = $this->gettext( "firstHeading" );
-               $correct = strstr( $source, "Test Save Page" );
-
-               // Verify Saved page name displayed correctly
-               $this->assertEquals( $correct, true );
-
-               // Verify page content saved succesfully
-               $contentOfSavedPage = $this->getText( "//*[@id='content']" );
-               $this->assertContains( $wikiText, $contentOfSavedPage );
-               $this->deletePage( $newPage );
-       }
-}
diff --git a/tests/selenium/suites/SimpleSeleniumConfig.php b/tests/selenium/suites/SimpleSeleniumConfig.php
deleted file mode 100644 (file)
index a693511..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-class SimpleSeleniumConfig {
-
-       public static function getSettings( &$includeFiles, &$globalConfigs, &$resourceFiles ) {
-               global $IP;
-               $includes = array(
-                       //files that needed to be included would go here
-               );
-               $configs = array(
-                       'wgDBprefix' => 'mw_',
-                       'wgDBTableOptions' => 'ENGINE=InnoDB, DEFAULT CHARSET=binary',
-                       'wgDBmysql5' => 'false',
-                       'wgMainCacheType' => 'CACHE_NONE',
-                       'wgParserCacheType' => 'CACHE_NONE',
-                       'wgMemCachedServers' => array(),
-                       'wgLanguageCode' => 'en',
-                       'wgSitename' => 'test_wiki',
-                       'wgDefaultSkin' => 'chick'
-               );
-               $resources = array(
-                       'db' => "$IP/tests/selenium/data/SimpleSeleniumTestDB.sql",
-                       'images' => "$IP/tests/selenium/data/SimpleSeleniumTestImages.zip"
-               );
-
-               $includeFiles = array_merge( $includeFiles, $includes );
-               $globalConfigs = array_merge( $globalConfigs, $configs );
-               $resourceFiles = array_merge( $resourceFiles, $resources );
-               return true;
-       }
-}
diff --git a/tests/selenium/suites/SimpleSeleniumTestCase.php b/tests/selenium/suites/SimpleSeleniumTestCase.php
deleted file mode 100644 (file)
index 14c9e6b..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-/*
- * This test case is part of the SimpleSeleniumTestSuite.
- * Configuration for these tests are documented as part of SimpleSeleniumTestSuite.php
- */
-class SimpleSeleniumTestCase extends SeleniumTestCase {
-       public function testBasic() {
-               $this->open( $this->getUrl() .
-                       '/index.php?title=Selenium&action=edit' );
-               $this->type( "wpTextbox1", "This is a basic test" );
-               $this->click( "wpPreview" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // check result
-               $source = $this->getText( "//div[@id='wikiPreview']/p" );
-               $correct = strstr( $source, "This is a basic test" );
-               $this->assertEquals( $correct, true );
-       }
-
-       /**
-        * All this test really does is verify that a global var was set.
-        * It depends on $wgDefaultSkin = 'chick'; being set
-        */
-       public function testGlobalVariableForDefaultSkin() {
-               $this->open( $this->getUrl() . '/index.php' );
-               $bodyClass = $this->getAttribute( "//body/@class" );
-               $this->assertContains( 'skin-chick', $bodyClass, 'Chick skin not set' );
-       }
-
-       /**
-        * Just verify that the test db was loaded correctly
-        */
-       public function testDatabaseResourceLoadedCorrectly() {
-               $this->open( $this->getUrl() . '/index.php/TestResources?action=purge' );
-               $testString = $this->gettext( "//body//*[@id='firstHeading']" );
-               $this->assertEquals( 'TestResources', $testString, 'Article that should be present in the test db was not found.' );
-       }
-
-}
diff --git a/tests/selenium/suites/SimpleSeleniumTestSuite.php b/tests/selenium/suites/SimpleSeleniumTestSuite.php
deleted file mode 100644 (file)
index 446836a..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-/**
- * 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");
- * $wgSeleniumTestConfigs['SimpleSeleniumTestSuite'] = 'SimpleSeleniumConfig::getSettings';
- * OR
- * 2) Add the following to your Localsettings.php
- * $wgDefaultSkin = 'chick';
- */
-class SimpleSeleniumTestSuite extends SeleniumTestSuite {
-       public function setUp() {
-               $this->setLoginBeforeTests( false );
-               parent::setUp();
-       }
-
-       public function addTests() {
-               $testFiles = array(
-                       'selenium/suites/SimpleSeleniumTestCase.php'
-               );
-               parent::addTestFiles( $testFiles );
-       }
-
-
-}
diff --git a/tests/selenium/suites/UserPreferencesTestCase.php b/tests/selenium/suites/UserPreferencesTestCase.php
deleted file mode 100644 (file)
index c70e38f..0000000
+++ /dev/null
@@ -1,170 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-class UserPreferencesTestCase extends SeleniumTestCase {
-       // Verify user information
-       public function testUserInfoDisplay() {
-
-               $this->open( $this->getUrl() .
-                       '/index.php?title=Main_Page&action=edit' );
-               $this->click( SeleniumTestConstants::LINK_START . "My preferences" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify correct username displayed in User Preferences
-               $this->assertEquals( $this->getText( "//li[@id='pt-userpage']/a" ),
-                       $this->getText( "//table[@id='mw-htmlform-info']/tbody/tr[1]/td[2]" ) );
-
-               // Verify existing Signature Displayed correctly
-               $this->assertEquals( $this->selenium->getUser(),
-                       $this->getTable( "mw-htmlform-signature.0.1" ) );
-       }
-
-       // Verify change password
-       public function testChangePassword() {
-
-               $this->open( $this->getUrl() .
-                       '/index.php?title=Main_Page&action=edit' );
-               $this->click( SeleniumTestConstants::LINK_START . "My preferences" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               $this->click( SeleniumTestConstants::LINK_START . "Change password" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               $this->type( "wpPassword", "12345" );
-               $this->type( "wpNewPassword", "54321" );
-               $this->type( "wpRetype", "54321" );
-               $this->click( "//input[@value='Change password']" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               $this->assertEquals( "Preferences", $this->getText( "firstHeading" ) );
-
-               $this->click( SeleniumTestConstants::LINK_START . "Change password" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               $this->type( "wpPassword", "54321" );
-               $this->type( "wpNewPassword", "12345" );
-               $this->type( "wpRetype", "12345" );
-               $this->click( "//input[@value='Change password']" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-               $this->assertEquals( "Preferences", $this->getText( "firstHeading" ) );
-
-               $this->click( SeleniumTestConstants::LINK_START . "Change password" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               $this->type( "wpPassword", "54321" );
-               $this->type( "wpNewPassword", "12345" );
-               $this->type( "wpRetype", "12345" );
-               $this->click( "//input[@value='Change password']" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-       }
-
-       // Verify successful preferences save
-       public function testSuccessfullSave() {
-
-               $this->open( $this->getUrl() .
-                       '/index.php?title=Main_Page&action=edit' );
-               $this->click( SeleniumTestConstants::LINK_START . "My preferences" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               $this->type( "mw-input-realname", "Test User" );
-               $this->click( "prefcontrol" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify  "Your preferences have been saved." message
-               $this->assertEquals( "Your preferences have been saved.",
-                       $this->getText( "//div[@id='bodyContent']/div[4]/strong/p" ) );
-               $this->type( "mw-input-realname", "" );
-               $this->click( "prefcontrol" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-       }
-
-       // Verify change signature
-       public function testChangeSignature() {
-               $this->open( $this->getUrl() .
-                       '/index.php?title=Main_Page&action=edit' );
-               $this->click( SeleniumTestConstants::LINK_START . "My preferences" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               $this->type( "mw-input-nickname", "TestSignature" );
-               $this->click( "prefcontrol" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify change user signature
-               $this->assertEquals( "TestSignature", $this->getText( SeleniumTestConstants::LINK_START . "TestSignature" ) );
-               $this->type( "mw-input-nickname", "Test" );
-               $this->click( "prefcontrol" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-       }
-
-       // Verify change date format
-       public function testChangeDateFormatTimeZone() {
-               $this->open( $this->getUrl() .
-                       '/index.php?title=Main_Page&action=edit' );
-
-               $this->click( SeleniumTestConstants::LINK_START . "My preferences" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-               $this->click( SeleniumTestConstants::LINK_START . "Date and time" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               $this->click( "mw-input-date-dmy" );
-               $this->select( "mw-input-timecorrection", "label=Asia/Colombo" );
-               $this->click( "prefcontrol" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify Date format and time zome saved
-               $this->assertEquals( "Your preferences have been saved.",
-                       $this->getText( "//div[@id='bodyContent']/div[4]/strong/p" ) );
-       }
-
-       // Verify restoring all default settings
-       public function testSetAllDefault() {
-               $this->open( $this->getUrl() .
-                       '/index.php?title=Main_Page&action=edit' );
-               $this->click( SeleniumTestConstants::LINK_START . "My preferences" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify restoring all default settings
-               $this->assertEquals( "Restore all default settings",
-                       $this->getText( SeleniumTestConstants::LINK_START . "Restore all default settings" ) );
-
-               $this->click( "//*[@id='preferences']/div/a" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify 'This can not be undone' warning message displayed
-               $this->assertTrue( $this->isElementPresent( "//input[@value='Restore all default settings']" ) );
-
-               // Verify 'Restore all default settings' button available
-               $this->assertEquals( "You can use this page to reset your preferences to the site defaults. This cannot be undone.",
-                       $this->getText( "//div[@id='bodyContent']/p" ) );
-
-               $this->click( "//input[@value='Restore all default settings']" );
-               $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-               // Verify preferences saved successfully
-               $this->assertEquals( "Your preferences have been saved.",
-                       $this->getText( "//div[@id='bodyContent']/div[4]/strong/p" ) );
-       }
-}
-
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';