Merge "skin: Revert font-weight on successbox and move to preferences"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 7 May 2013 21:57:45 +0000 (21:57 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 7 May 2013 21:57:45 +0000 (21:57 +0000)
866 files changed:
.gitignore
.jshintignore
RELEASE-NOTES-1.21
RELEASE-NOTES-1.22
docs/hooks.txt
docs/skin.txt
includes/AjaxDispatcher.php
includes/Article.php
includes/AutoLoader.php
includes/Autopromote.php
includes/Block.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/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/Message.php
includes/Metadata.php
includes/MimeMagic.php
includes/OutputHandler.php
includes/OutputPage.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/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/StatCounter.php
includes/Status.php
includes/StringUtils.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/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/ApiEditPage.php
includes/api/ApiExpandTemplates.php
includes/api/ApiFeedContributions.php
includes/api/ApiFeedWatchlist.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/ApiPurge.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllCategories.php
includes/api/ApiQueryAllImages.php
includes/api/ApiQueryAllMessages.php
includes/api/ApiQueryAllPages.php
includes/api/ApiQueryAllUsers.php
includes/api/ApiQueryBacklinks.php
includes/api/ApiQueryBase.php
includes/api/ApiQueryBlocks.php
includes/api/ApiQueryCategoryMembers.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryDuplicateFiles.php
includes/api/ApiQueryExtLinksUsage.php
includes/api/ApiQueryExternalLinks.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryLangBacklinks.php
includes/api/ApiQueryLangLinks.php
includes/api/ApiQueryLogEvents.php
includes/api/ApiQueryQueryPage.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQuerySearch.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryUserContributions.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiQueryUsers.php
includes/api/ApiQueryWatchlist.php
includes/api/ApiSetNotificationTimestamp.php
includes/api/ApiUpload.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/SquidUpdate.php
includes/cache/UserCache.php
includes/clientpool/RedisConnectionPool.php
includes/content/ContentHandler.php
includes/content/WikitextContent.php
includes/context/RequestContext.php
includes/db/CloneDatabase.php
includes/db/Database.php
includes/db/DatabaseMssql.php
includes/db/DatabaseMysql.php
includes/db/DatabaseOracle.php
includes/db/DatabasePostgres.php
includes/db/DatabaseSqlite.php
includes/db/LBFactory.php
includes/db/LoadBalancer.php
includes/db/LoadMonitor.php
includes/debug/Debug.php
includes/diff/DairikiDiff.php
includes/diff/DifferenceEngine.php
includes/externalstore/ExternalStoreDB.php
includes/filebackend/FSFileBackend.php
includes/filebackend/FileBackend.php
includes/filebackend/FileBackendGroup.php
includes/filebackend/FileBackendStore.php
includes/filebackend/FileOp.php
includes/filebackend/SwiftFileBackend.php
includes/filebackend/filejournal/DBFileJournal.php
includes/filebackend/lockmanager/DBLockManager.php
includes/filebackend/lockmanager/LockManager.php
includes/filebackend/lockmanager/LockManagerGroup.php
includes/filebackend/lockmanager/RedisLockManager.php [new file with mode: 0644]
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/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/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/JobQueueAggregatorMemc.php
includes/job/JobQueueDB.php
includes/job/JobQueueFederated.php [new file with mode: 0644]
includes/job/JobQueueRedis.php
includes/job/jobs/AssembleUploadChunksJob.php
includes/job/jobs/DuplicateJob.php
includes/job/jobs/EnotifNotifyJob.php
includes/job/jobs/HTMLCacheUpdateJob.php
includes/job/jobs/PublishStashedFileJob.php
includes/job/jobs/RefreshLinksJob.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/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/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/XCF.php
includes/media/XMP.php
includes/media/XMPInfo.php
includes/objectcache/BagOStuff.php
includes/objectcache/MemcachedBagOStuff.php
includes/objectcache/MemcachedClient.php
includes/objectcache/ObjectCache.php
includes/objectcache/ObjectCacheSessionHandler.php
includes/objectcache/RedisBagOStuff.php
includes/parser/CacheTime.php
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/Preprocessor_DOM.php
includes/parser/Preprocessor_Hash.php
includes/parser/Tidy.php
includes/profiler/Profiler.php
includes/profiler/ProfilerSimpleUDP.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php
includes/resourceloader/ResourceLoaderUserGroupsModule.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/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/SpecialMergeHistory.php
includes/specials/SpecialMovepage.php
includes/specials/SpecialNewimages.php
includes/specials/SpecialNewpages.php
includes/specials/SpecialPasswordReset.php
includes/specials/SpecialPopularpages.php
includes/specials/SpecialPrefixindex.php
includes/specials/SpecialProtectedpages.php
includes/specials/SpecialProtectedtitles.php
includes/specials/SpecialRandompage.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/SpecialSpecialpages.php
includes/specials/SpecialStatistics.php
includes/specials/SpecialTags.php
includes/specials/SpecialUnblock.php
includes/specials/SpecialUncategorizedpages.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUploadStash.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWatchlist.php
includes/specials/SpecialWhatlinkshere.php
includes/specials/SpecialWithoutinterwiki.php
includes/templates/Usercreate.php
includes/templates/UsercreateVForm.php [new file with mode: 0644]
includes/templates/Userlogin.php
includes/templates/UserloginVForm.php
includes/upload/UploadBase.php
includes/upload/UploadFromChunks.php
includes/upload/UploadFromFile.php
includes/upload/UploadFromStash.php
includes/upload/UploadFromUrl.php
includes/upload/UploadStash.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/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/MessagesAm.php
languages/messages/MessagesAn.php
languages/messages/MessagesAng.php
languages/messages/MessagesAr.php
languages/messages/MessagesAs.php
languages/messages/MessagesAst.php
languages/messages/MessagesAzb.php
languages/messages/MessagesBa.php
languages/messages/MessagesBcl.php
languages/messages/MessagesBe.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesBg.php
languages/messages/MessagesBn.php
languages/messages/MessagesBr.php
languages/messages/MessagesCa.php
languages/messages/MessagesCe.php
languages/messages/MessagesCkb.php
languages/messages/MessagesCs.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/MessagesEl.php
languages/messages/MessagesEn.php
languages/messages/MessagesEo.php
languages/messages/MessagesEs.php
languages/messages/MessagesEt.php
languages/messages/MessagesFa.php
languages/messages/MessagesFi.php
languages/messages/MessagesFo.php
languages/messages/MessagesFr.php
languages/messages/MessagesFrp.php
languages/messages/MessagesFrr.php
languages/messages/MessagesFur.php
languages/messages/MessagesGan_hant.php
languages/messages/MessagesGl.php
languages/messages/MessagesGsw.php
languages/messages/MessagesGu.php
languages/messages/MessagesGv.php
languages/messages/MessagesHak.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/MessagesHu.php
languages/messages/MessagesHy.php
languages/messages/MessagesIa.php
languages/messages/MessagesId.php
languages/messages/MessagesIlo.php
languages/messages/MessagesInh.php
languages/messages/MessagesIs.php
languages/messages/MessagesIt.php
languages/messages/MessagesJa.php
languages/messages/MessagesJam.php
languages/messages/MessagesJv.php
languages/messages/MessagesKa.php
languages/messages/MessagesKab.php
languages/messages/MessagesKiu.php
languages/messages/MessagesKk_cyrl.php
languages/messages/MessagesKm.php
languages/messages/MessagesKn.php
languages/messages/MessagesKo.php
languages/messages/MessagesKrc.php
languages/messages/MessagesKsh.php
languages/messages/MessagesKy.php
languages/messages/MessagesLa.php
languages/messages/MessagesLb.php
languages/messages/MessagesLez.php
languages/messages/MessagesLi.php
languages/messages/MessagesLij.php
languages/messages/MessagesLt.php
languages/messages/MessagesLus.php
languages/messages/MessagesLv.php
languages/messages/MessagesLzh.php
languages/messages/MessagesMai.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/MessagesMr.php
languages/messages/MessagesMs.php
languages/messages/MessagesMt.php
languages/messages/MessagesNb.php
languages/messages/MessagesNds_nl.php
languages/messages/MessagesNl.php
languages/messages/MessagesNn.php
languages/messages/MessagesOr.php
languages/messages/MessagesOs.php
languages/messages/MessagesPa.php
languages/messages/MessagesPfl.php
languages/messages/MessagesPl.php
languages/messages/MessagesPms.php
languages/messages/MessagesPnb.php
languages/messages/MessagesPs.php
languages/messages/MessagesPt.php
languages/messages/MessagesPt_br.php
languages/messages/MessagesQqq.php
languages/messages/MessagesQu.php
languages/messages/MessagesRm.php
languages/messages/MessagesRo.php
languages/messages/MessagesRoa_tara.php
languages/messages/MessagesRu.php
languages/messages/MessagesSa.php
languages/messages/MessagesSah.php
languages/messages/MessagesSat.php
languages/messages/MessagesScn.php
languages/messages/MessagesSh.php
languages/messages/MessagesSi.php
languages/messages/MessagesSk.php
languages/messages/MessagesSl.php
languages/messages/MessagesSo.php
languages/messages/MessagesSq.php
languages/messages/MessagesSr_ec.php
languages/messages/MessagesSr_el.php
languages/messages/MessagesSv.php
languages/messages/MessagesSw.php
languages/messages/MessagesSzl.php
languages/messages/MessagesTe.php
languages/messages/MessagesTet.php
languages/messages/MessagesTh.php
languages/messages/MessagesTl.php
languages/messages/MessagesTr.php
languages/messages/MessagesTt_cyrl.php
languages/messages/MessagesUg_arab.php
languages/messages/MessagesUk.php
languages/messages/MessagesUr.php
languages/messages/MessagesUz.php
languages/messages/MessagesVec.php
languages/messages/MessagesVi.php
languages/messages/MessagesVmf.php
languages/messages/MessagesVo.php
languages/messages/MessagesVro.php
languages/messages/MessagesWar.php
languages/messages/MessagesYi.php
languages/messages/MessagesYo.php
languages/messages/MessagesYue.php
languages/messages/MessagesZh_hans.php
languages/messages/MessagesZh_hant.php
languages/utils/CLDRPluralRuleEvaluator.php
maintenance/Maintenance.php
maintenance/backup.inc
maintenance/backupPrefetch.inc
maintenance/backupTextPass.inc
maintenance/cdb.php
maintenance/checkSyntax.php
maintenance/cleanupAncientTables.php
maintenance/cleanupPreferences.php
maintenance/cleanupRemovedModules.php
maintenance/cleanupTitles.php
maintenance/cleanupUploadStash.php
maintenance/cleanupWatchlist.php
maintenance/compareParsers.php
maintenance/convertLinks.php
maintenance/copyFileBackend.php
maintenance/createAndPromote.php
maintenance/deleteArchivedFiles.inc
maintenance/deleteDefaultMessages.php
maintenance/deleteEqualMessages.php
maintenance/deleteImageMemcached.php
maintenance/deleteOrphanedRevisions.php
maintenance/deleteSelfExternals.php
maintenance/dev/includes/router.php
maintenance/doMaintenance.php
maintenance/dumpBackup.php
maintenance/dumpIterator.php
maintenance/dumpLinks.php
maintenance/dumpSisterSites.php
maintenance/fetchText.php
maintenance/fileOpPerfTest.php
maintenance/fixSlaveDesync.php
maintenance/fuzz-tester.php
maintenance/generateSitemap.php
maintenance/getConfiguration.php
maintenance/getLagTimes.php
maintenance/importDump.php
maintenance/importImages.inc
maintenance/importImages.php
maintenance/initSiteStats.php
maintenance/install.php
maintenance/jsduck/categories.json
maintenance/jsduck/config.json
maintenance/jsparse.php
maintenance/language/StatOutputs.php
maintenance/language/checkDupeMessages.php
maintenance/language/checkLanguage.inc
maintenance/language/langmemusage.php
maintenance/language/languages.inc
maintenance/language/messageTypes.inc
maintenance/language/messages.inc
maintenance/language/transstat.php
maintenance/language/writeMessagesArray.inc
maintenance/mcc.php
maintenance/mctest.php
maintenance/mergeMessageFileList.php
maintenance/mwdoc-filter.php
maintenance/mwdocgen.php
maintenance/namespaceDupes.php
maintenance/nukeNS.php
maintenance/nukePage.php
maintenance/oracle/alterSharedConstraints.php
maintenance/oracle/tables.sql
maintenance/orphans.php
maintenance/parse.php
maintenance/populateFilearchiveSha1.php
maintenance/populateLogSearch.php
maintenance/populateParentId.php
maintenance/populateRevisionLength.php
maintenance/populateRevisionSha1.php
maintenance/preprocessDump.php
maintenance/preprocessorFuzzTest.php
maintenance/protect.php
maintenance/proxyCheck.php
maintenance/purgeDeletedFiles.php
maintenance/purgeList.php
maintenance/reassignEdits.php
maintenance/rebuildFileCache.php
maintenance/rebuildLocalisationCache.php
maintenance/rebuildmessages.php
maintenance/rebuildrecentchanges.php
maintenance/rebuildtextindex.php
maintenance/refreshImageMetadata.php
maintenance/refreshLinks.php
maintenance/renderDump.php
maintenance/runBatchedQuery.php
maintenance/runJobs.php
maintenance/showJobs.php
maintenance/showSiteStats.php
maintenance/sql.php
maintenance/sqlite.inc
maintenance/storage/checkStorage.php
maintenance/storage/compressOld.php
maintenance/storage/dumpRev.php
maintenance/storage/recompressTracked.php
maintenance/syncFileBackend.php
maintenance/update.php
maintenance/updateSearchIndex.php
maintenance/updateSpecialPages.php
maintenance/userDupes.inc
maintenance/userOptions.inc
resources/Resources.php
resources/jquery.chosen/LICENSE [new file with mode: 0644]
resources/jquery.chosen/chosen-sprite.png [new file with mode: 0644]
resources/jquery.chosen/chosen-sprite@2x.png [new file with mode: 0644]
resources/jquery.chosen/chosen.css [new file with mode: 0644]
resources/jquery.chosen/chosen.jquery.js [new file with mode: 0644]
resources/jquery.ui/themes/vector/images/button-blue-hover-large.png [deleted file]
resources/jquery.ui/themes/vector/images/button-blue-hover.png [deleted file]
resources/jquery.ui/themes/vector/images/button-blue-large.png [deleted file]
resources/jquery.ui/themes/vector/images/button-blue.png [deleted file]
resources/jquery.ui/themes/vector/images/button-disabled-blue.png [deleted file]
resources/jquery.ui/themes/vector/images/button-disabled-green.png [deleted file]
resources/jquery.ui/themes/vector/images/button-disabled-red.png [deleted file]
resources/jquery.ui/themes/vector/images/button-disabled.png [deleted file]
resources/jquery.ui/themes/vector/images/button-down-blue.png [deleted file]
resources/jquery.ui/themes/vector/images/button-down-green.png [deleted file]
resources/jquery.ui/themes/vector/images/button-down-red.png [deleted file]
resources/jquery.ui/themes/vector/images/button-down.png [deleted file]
resources/jquery.ui/themes/vector/images/button-green-hover-large.png [deleted file]
resources/jquery.ui/themes/vector/images/button-green-hover.png [deleted file]
resources/jquery.ui/themes/vector/images/button-green-large.png [deleted file]
resources/jquery.ui/themes/vector/images/button-green.png [deleted file]
resources/jquery.ui/themes/vector/images/button-large-disabled-green.png [deleted file]
resources/jquery.ui/themes/vector/images/button-large-off-green.png [deleted file]
resources/jquery.ui/themes/vector/images/button-off-blue.png [deleted file]
resources/jquery.ui/themes/vector/images/button-off-green.png [deleted file]
resources/jquery.ui/themes/vector/images/button-off-red.png [deleted file]
resources/jquery.ui/themes/vector/images/button-off.png [deleted file]
resources/jquery.ui/themes/vector/images/button-orange-hover-large.png [deleted file]
resources/jquery.ui/themes/vector/images/button-orange-hover.png [deleted file]
resources/jquery.ui/themes/vector/images/button-orange-large.png [deleted file]
resources/jquery.ui/themes/vector/images/button-orange.png [deleted file]
resources/jquery.ui/themes/vector/images/button-over-blue.png [deleted file]
resources/jquery.ui/themes/vector/images/button-over-green.png [deleted file]
resources/jquery.ui/themes/vector/images/button-over-red.png [deleted file]
resources/jquery.ui/themes/vector/images/button-over.png [deleted file]
resources/jquery.ui/themes/vector/images/button-red-hover-large.png [deleted file]
resources/jquery.ui/themes/vector/images/button-red-hover.png [deleted file]
resources/jquery.ui/themes/vector/images/button-red-large.png [deleted file]
resources/jquery.ui/themes/vector/images/button-red.png [deleted file]
resources/jquery.ui/themes/vector/jquery.ui.button.css [changed mode: 0644->0755]
resources/jquery/jquery.badge.css
resources/jquery/jquery.makeCollapsible.js
resources/jquery/jquery.tablesorter.js
resources/mediawiki.action/mediawiki.action.edit.js
resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js
resources/mediawiki.special/images/arrow-collapsed-ltr.png
resources/mediawiki.special/images/arrow-collapsed-rtl.png
resources/mediawiki.special/images/arrow-expanded.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-pages.png [new file with mode: 0644]
resources/mediawiki.special/mediawiki.special.changeslist.css
resources/mediawiki.special/mediawiki.special.createAccount.vform.css [new file with mode: 0644]
resources/mediawiki.special/mediawiki.special.createAccount.vform.js [new file with mode: 0644]
resources/mediawiki.special/mediawiki.special.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/mediawiki.htmlform.js
resources/mediawiki/mediawiki.js
resources/mediawiki/mediawiki.log.js
resources/mediawiki/mediawiki.searchSuggest.js
resources/mediawiki/mediawiki.user.js
resources/mediawiki/mediawiki.util.js
resources/startup.js
skins/CologneBlue.php
skins/Modern.php
skins/MonoBook.php
skins/Vector.php
skins/common/commonElements.css
skins/common/commonPrint.css
skins/common/oldshared.css
skins/common/shared.css
skins/common/wikibits.js
skins/common/wikiprintable.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/vector/screen.css
tests/RunSeleniumTests.php
tests/TestsAutoLoader.php
tests/parser/ParserTestResult.php [new file with mode: 0644]
tests/parser/parserTest.inc
tests/parser/parserTests.txt
tests/parserTests.php
tests/phpunit/MediaWikiLangTestCase.php
tests/phpunit/MediaWikiPHPUnitCommand.php
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/bootstrap.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/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/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/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_ContentHandlerUseDB.php
tests/phpunit/includes/RevisionTest.php
tests/phpunit/includes/SanitizerTest.php
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/WikiPageTest.php
tests/phpunit/includes/WikiPageTest_ContentHandlerUseDB.php
tests/phpunit/includes/api/ApiAccountCreationTest.php
tests/phpunit/includes/api/ApiBlockTest.php
tests/phpunit/includes/api/ApiEditPageTest.php
tests/phpunit/includes/api/ApiOptionsTest.php
tests/phpunit/includes/api/ApiParseTest.php
tests/phpunit/includes/api/ApiPurgeTest.php
tests/phpunit/includes/api/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/query/ApiQueryContinueTestBase.php
tests/phpunit/includes/api/query/ApiQueryTest.php
tests/phpunit/includes/api/query/ApiQueryTestBase.php
tests/phpunit/includes/cache/ProcessCacheLRUTest.php
tests/phpunit/includes/content/ContentHandlerTest.php
tests/phpunit/includes/content/CssContentTest.php
tests/phpunit/includes/content/JavaScriptContentTest.php
tests/phpunit/includes/content/TextContentTest.php
tests/phpunit/includes/content/WikitextContentHandlerTest.php
tests/phpunit/includes/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/jobqueue/JobQueueTest.php
tests/phpunit/includes/json/FormatJsonTest.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/SpecialRecentchangesTest.php
tests/phpunit/includes/specials/SpecialSearchTest.php
tests/phpunit/includes/upload/UploadFromUrlTest.php
tests/phpunit/includes/upload/UploadTest.php
tests/phpunit/languages/LanguageClassesTestCase.php
tests/phpunit/languages/LanguageTest.php
tests/phpunit/languages/LanguageTrTest.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/phpunit.php
tests/phpunit/resources/ResourcesTest.php
tests/phpunit/skins/SideBarTest.php
tests/phpunit/suites/UploadFromUrlTestSuite.php
tests/qunit/data/testrunner.js
tests/qunit/suites/resources/jquery/jquery.makeCollapsible.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/suites/AddContentToNewPageTestCase.php
tests/testHelpers.inc

index ca87d93..dbe20fc 100644 (file)
@@ -7,6 +7,8 @@
 # Editors
 *.kate-swp
 *~
+\#*#
+.#*
 .*.swp
 .project
 cscope.files
index 30b6ee1..64add55 100644 (file)
@@ -23,6 +23,7 @@ resources/jquery.effects/
 resources/jquery.tipsy/
 resources/jquery.ui/
 resources/mediawiki.libs/
+resources/jquery.chosen/chosen.jquery.js
 
 # legacy scripts
 skins/common/
index 2ab652b..717906a 100644 (file)
@@ -18,7 +18,6 @@ production.
 * $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
@@ -122,14 +121,11 @@ production.
 * (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 42649) PHP Fatal error: Call to a member function isLocal() on a
+  non-object in Title.php
+* (bug 46493) Special:ProtectedPages results in whitepage when a bad title is protected
 * (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.
@@ -214,6 +210,9 @@ production.
 * (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.
+* (bug 47489) Installer now automatically selects the next-best database type if
+  the PHP mysql extension is not loaded, preventing fatal errors in some cases.
+* (bug 47202) wikibits: FF2Fixes.css should not be loaded in Firefox 20.
 
 === API changes in 1.21 ===
 * prop=revisions can now report the contentmodel and contentformat.
@@ -281,15 +280,9 @@ production.
 * (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.
@@ -344,7 +337,6 @@ changes to languages because of Bugzilla reports.
   - 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
@@ -356,9 +348,6 @@ changes to languages because of Bugzilla reports.
    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 ==
 
index b360979..161084f 100644 (file)
@@ -12,7 +12,9 @@ production.
 * $wgRedirectScript was removed. It was unused.
 * Removed $wgLocalMessageCacheSerialized, it is now always true.
 * When $wgUseVFormUserLogin is true, the redesign of Special:UserLogin is
-  activated.
+  activated; when $wgUseVFormCreateAccount is true, the redesign of
+  Special:UserLogin/signup is activated.
+* $wgVectorUseIconWatch is now enabled by default.
 
 === New features in 1.22 ===
 * (bug 44525) mediawiki.jqueryMsg can now parse (whitelisted) HTML elements and attributes.
@@ -23,19 +25,89 @@ 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. They are opt-in for now, controlled by
+  the $wgUseVFormUserLogin and $wgUseVFormCreateAccount settings or a 'useNew'
+  URL parameter trigger.
+* (bug 23343) Implemented ability to apply IP blocks to the contents of X-Forwarded-For headers
+  by adding a new configuration variable $wgApplyIpBlocksToXff (disabled by default).
+* The new hook 'APIGetPossibleErrors' to modify the list of possible errors was
+  added.
+* (bug 25592) LogEventsList::showLogExtract() will now ignore various
+  Pager-related WebRequest parameters by default, as this is overwhelmingly
+  likely to be what was intended by users of the method. If any caller wishes
+  to use these parameters, the new param 'useRequestParams' may be set to true.
+* mw.util.addPortletLink: Tooltip is no longer required to be plain (without
+  an accesskey in it already). As such it now rountrips. Creating a link with a
+  message as tooltip, grabbing the title attribute and using it to create
+  another portlet will work as expected.
+* (bug 6747) {{ROOTPAGENAME}} introduced, contains the name of the topmost
+  page without namespace.
+* BREAKING CHANGE: (bug 41729) Display editsection links next to headings. Also
+  change their class name from .editsection to .mw-editsection and place them at
+  the end of the heading element instead of the beginning. Client-side code and
+  screen-scrapers will have to be adjusted to handle both cases (old HTML will
+  still be visible on cached page renders until they are purged); extensions
+  using the DoEditSectionLink or EditSectionLink hooks might need adjustments as
+  well.
+* (bug 45535) introduced the new 'LanguageLinks' hook for manipulating the
+  language links associated with a page before display.
+* Chosen (http://harvesthq.github.io/chosen/) was added as module 'jquery.chosen'
+* HTMLForm will turn multiselect checkboxes into a Chosen interface when setting cssclass 'mw-chosen'
+* rebuildLocalisationCache learned --lang option. Let you rebuild l10n caches
+  of the specified languages instead of all of them.
+* New GetNewMessagesAlert hook allowing extensions to disable or modify the new
+  messages alert
+* New wgUserNewMsgRevisionId JS global for logged in users. This will be null
+  if the user has no new talk page messages. Otherwise it will be set to the
+  revision ID of the oldest new talk page message. This will allow gadgets and
+  extensions to create their own new message alerts on the client side.
+* mediawiki.log: Added log.warn wrapper (uses console.warn and console.trace).
+* mediawiki.log: Implemented log.deprecate. This method defines a property and
+  uses ES5 getter/setter to emit a warning when they are used.
 
 === Bug fixes in 1.22 ===
 * Disable Special:PasswordReset when $wgEnableEmail. 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.
 
 === API changes in 1.22 ===
 * (bug 46626) xmldoublequote parameter was removed. Because of a bug, the
   parameter has had no effect since MediaWiki 1.16, and so its removal is
   unlikely to impact existing clients.
+* (bug 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
 
 === Languages updated in 1.22===
 
@@ -47,8 +119,10 @@ changes to languages because of Bugzilla reports.
 * 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
@@ -59,6 +133,14 @@ 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.
+* 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.
 
 == Compatibility ==
 
index c266dcc..a292997 100644 (file)
@@ -270,6 +270,12 @@ $reason: the reason for the move (added in 1.13)
 $user: the User object about to be created (read-only, incomplete)
 &$msg: out parameter: HTML to display on abort
 
+'AbortChangePassword': Return false to cancel password change.
+$user: the User object to which the password change is occuring
+$mOldpass: the old password provided by the user
+$newpass: the new password provided by the user
+&$abortMsg: the message identifier for abort reason
+
 'ActionBeforeFormDisplay': Before executing the HTMLForm object.
 $name: name of the action
 &$form: HTMLForm object
@@ -371,6 +377,11 @@ result.
 &$module: ApiBase Module object
 &$properties: Array of properties
 
+'APIGetPossibleErrors': Use this hook to modify the module's list of possible
+errors.
+$module: ApiBase Module object
+&$possibleErrors: Array of possible errors
+
 'APIQueryAfterExecute': After calling the execute() method of an
 action=query submodule. Use this to extend core API modules.
 &$module: Module object
@@ -482,7 +493,8 @@ $logEntry: the ManualLogEntry used to record the deletion
 
 'ArticleEditUpdateNewTalk': Before updating user_newtalk when a user talk page
 was changed.
-$wikiPage: WikiPage (object) of the user talk page
+&$wikiPage: WikiPage (object) of the user talk page
+$recipient: User (object) who's talk page was edited
 
 'ArticleEditUpdates': When edit updates (mainly link tracking) are made when an
 article has been changed.
@@ -1132,6 +1144,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 +1193,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 +1398,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
index fab27b8..2f414cb 100644 (file)
@@ -1,40 +1,41 @@
 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
+  currently bundled skins, largely rewritten in 2012 while keeping the looks.
 
-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: Monobook without the CSS. The idea was that you customise it using
+  user or site CSS.
 
-* Modern: An attractive blue/grey theme with sidebar and top bar.
 
 == Custom CSS/JS ==
 
@@ -42,16 +43,16 @@ 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:
 
 * [[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
 
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..87b94ae 100644 (file)
@@ -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;
@@ -609,7 +609,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 +673,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
@@ -875,7 +875,7 @@ class Article implements Page {
                        }
                        if ( Block::newFromTarget( $specificTarget, $vagueTarget ) instanceof Block ) {
                                return array(
-                                       'index'  => 'noindex',
+                                       'index' => 'noindex',
                                        'follow' => 'nofollow'
                                );
                        }
@@ -884,19 +884,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'
                        );
                }
@@ -1100,7 +1100,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
index 88bb21b..8c7b542 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,6 +111,7 @@ $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',
@@ -171,6 +167,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',
@@ -541,6 +538,13 @@ $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',
@@ -575,6 +579,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',
@@ -655,6 +660,7 @@ $wgAutoloadLocalClasses = array(
        'JobQueueAggregatorRedis' => 'includes/job/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
@@ -813,6 +819,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',
@@ -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',
@@ -1002,6 +1012,7 @@ $wgAutoloadLocalClasses = array(
        'UserloginTemplate' => 'includes/templates/Userlogin.php',
        'UserloginTemplateVForm' => 'includes/templates/UserloginVForm.php',
        'UsercreateTemplate' => 'includes/templates/Usercreate.php',
+       'UsercreateTemplateVForm' => 'includes/templates/UsercreateVForm.php',
 
        # includes/upload
        'UploadBase' => 'includes/upload/UploadBase.php',
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..47ddc7d 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;
+                                       }
                                }
                        }
                }
@@ -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:
@@ -812,7 +814,7 @@ class Block {
         * @return String IP in Hex form
         */
        public function getRangeEnd() {
-               switch( $this->type ) {
+               switch ( $this->type ) {
                        case self::TYPE_USER:
                                return '';
                        case self::TYPE_IP:
@@ -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;
                        }
                }
@@ -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 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..166242a 100644 (file)
@@ -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 e900e34..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,8 +172,8 @@ 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 &&
@@ -185,17 +185,19 @@ class ChangesFeed {
                        }
                }
 
-               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 79e2d0b..73d3b61 100644 (file)
@@ -99,7 +99,7 @@ class ChangesList extends ContextSource {
                $user = $context->getUser();
                $sk = $context->getSkin();
                $list = null;
-               if( wfRunHooks( 'FetchChangesList', array( $user, &$sk, &$list ) ) ) {
+               if ( wfRunHooks( 'FetchChangesList', array( $user, &$sk, &$list ) ) ) {
                        $new = $context->getRequest()->getBool( 'enhanced', $user->getOption( 'usenewrc' ) );
                        return $new ? new EnhancedChangesList( $context ) : new OldChangesList( $context );
                } else {
@@ -120,9 +120,11 @@ class ChangesList extends ContextSource {
         * they are called often, we call them once and save them in $this->message
         */
        private function preCacheMessages() {
-               if( !isset( $this->message ) ) {
-                       foreach ( explode( ' ', 'cur diff hist last blocklink history ' .
-                       'semicolon-separator pipe-separator' ) as $msg ) {
+               if ( !isset( $this->message ) ) {
+                       foreach ( array(
+                               'cur', 'diff', 'hist', 'last', 'blocklink', 'history',
+                               'semicolon-separator', 'pipe-separator' ) as $msg
+                       ) {
                                $this->message[$msg] = $this->msg( $msg )->escaped();
                        }
                }
@@ -136,7 +138,7 @@ class ChangesList extends ContextSource {
         */
        protected function recentChangesFlags( $flags, $nothing = '&#160;' ) {
                $f = '';
-               foreach( array( 'newpage', 'minor', 'bot', 'unpatrolled' ) as $flag ) {
+               foreach ( array( 'newpage', 'minor', 'bot', 'unpatrolled' ) as $flag ) {
                        $f .= isset( $flags[$flag] ) && $flags[$flag]
                                ? self::flag( $flag )
                                : $nothing;
@@ -162,7 +164,7 @@ class ChangesList extends ContextSource {
                                'botedit' => array( 'boteditletter', 'recentchanges-label-bot' ),
                                'unpatrolled' => array( 'unpatrolledletter', 'recentchanges-label-unpatrolled' ),
                        );
-                       foreach( $messages as &$value ) {
+                       foreach ( $messages as &$value ) {
                                $value[0] = wfMessage( $value[0] )->escaped();
                                $value[1] = wfMessage( $value[1] )->escaped();
                        }
@@ -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,7 +334,7 @@ class ChangesList extends ContextSource {
                                'oldid' => $rc->mAttribs['rc_last_oldid']
                        );
 
-                       if( $unpatrolled ) {
+                       if ( $unpatrolled ) {
                                $query['rcid'] = $rc->mAttribs['rc_id'];
                        };
 
@@ -378,7 +380,7 @@ class ChangesList extends ContextSource {
                        array( 'class' => 'mw-changeslist-title' ),
                        $params
                );
-               if( $this->isDeleted( $rc, Revision::DELETED_TEXT ) ) {
+               if ( $this->isDeleted( $rc, Revision::DELETED_TEXT ) ) {
                        $articlelink = '<span class="history-deleted">' . $articlelink . '</span>';
                }
                # To allow for boldening pages watched by this user
@@ -421,7 +423,7 @@ class ChangesList extends ContextSource {
         * @param &$rc RecentChange
         */
        public function insertUserRelatedLinks( &$s, &$rc ) {
-               if( $this->isDeleted( $rc, Revision::DELETED_USER ) ) {
+               if ( $this->isDeleted( $rc, Revision::DELETED_USER ) ) {
                        $s .= ' <span class="history-deleted">' . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
                } else {
                        $s .= $this->getLanguage()->getDirMark() . Linker::userLink( $rc->mAttribs['rc_user'],
@@ -450,8 +452,8 @@ class ChangesList extends ContextSource {
         * @return string
         */
        public function insertComment( $rc ) {
-               if( $rc->mAttribs['rc_type'] != RC_MOVE && $rc->mAttribs['rc_type'] != RC_MOVE_OVER_REDIRECT ) {
-                       if( $this->isDeleted( $rc, Revision::DELETED_COMMENT ) ) {
+               if ( $rc->mAttribs['rc_type'] != RC_MOVE && $rc->mAttribs['rc_type'] != RC_MOVE_OVER_REDIRECT ) {
+                       if ( $this->isDeleted( $rc, Revision::DELETED_COMMENT ) ) {
                                return ' <span class="history-deleted">' . $this->msg( 'rev-deleted-comment' )->escaped() . '</span>';
                        } else {
                                return Linker::commentBlock( $rc->mAttribs['rc_comment'], $rc->getTitle() );
@@ -475,8 +477,8 @@ class ChangesList extends ContextSource {
         */
        protected function numberofWatchingusers( $count ) {
                static $cache = array();
-               if( $count > 0 ) {
-                       if( !isset( $cache[$count] ) ) {
+               if ( $count > 0 ) {
+                       if ( !isset( $cache[$count] ) ) {
                                $cache[$count] = $this->msg( 'number_of_watching_users_RCview' )->numParams( $count )->escaped();
                        }
                        return $cache[$count];
@@ -504,7 +506,7 @@ class ChangesList extends ContextSource {
         * @return Boolean
         */
        public static function userCan( $rc, $field, User $user = null ) {
-               if( $rc->mAttribs['rc_type'] == RC_LOG ) {
+               if ( $rc->mAttribs['rc_type'] == RC_LOG ) {
                        return LogEventsList::userCanBitfield( $rc->mAttribs['rc_deleted'], $field, $user );
                } else {
                        return Revision::userCanBitfield( $rc->mAttribs['rc_deleted'], $field, $user );
@@ -517,7 +519,7 @@ class ChangesList extends ContextSource {
         * @return string
         */
        protected function maybeWatchedLink( $link, $watched = false ) {
-               if( $watched ) {
+               if ( $watched ) {
                        return '<strong class="mw-watched">' . $link . '</strong>';
                } else {
                        return '<span class="mw-rc-unwatched">' . $link . '</span>';
@@ -530,7 +532,7 @@ class ChangesList extends ContextSource {
         * @param $rc RecentChange
         */
        public function insertRollback( &$s, &$rc ) {
-               if( $rc->mAttribs['rc_type'] != RC_NEW && $rc->mAttribs['rc_this_oldid'] && $rc->mAttribs['rc_cur_id'] ) {
+               if ( $rc->mAttribs['rc_type'] != RC_NEW && $rc->mAttribs['rc_this_oldid'] && $rc->mAttribs['rc_cur_id'] ) {
                        $page = $rc->getTitle();
                        /** Check for rollback and edit permissions, disallow special pages, and only
                          * show a link on the top-most revision */
@@ -554,8 +556,9 @@ class ChangesList extends ContextSource {
         * @param $classes
         */
        public function insertTags( &$s, &$rc, &$classes ) {
-               if ( empty( $rc->mAttribs['ts_tags'] ) )
+               if ( empty( $rc->mAttribs['ts_tags'] ) ) {
                        return;
+               }
 
                list( $tagSummary, $newClasses ) = ChangeTags::formatSummaryRow( $rc->mAttribs['ts_tags'], 'changeslist' );
                $classes = array_merge( $classes, $newClasses );
@@ -605,11 +608,10 @@ 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';
                        }
                }
@@ -619,15 +621,15 @@ class OldChangesList extends ChangesList {
                $classes[] = $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 +675,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'] );
                }
 
@@ -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,14 @@ 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 ) {
+               } elseif ( $rc->unpatrolled && $type == RC_NEW ) {
                        $clink = Linker::linkKnown( $rc->getTitle(), null, array(),
                                array( 'rcid' => $rc->mAttribs['rc_id'] ) );
                // Log entries
-               } elseif( $type == RC_LOG ) {
-                       if( $logType ) {
+               } elseif ( $type == RC_LOG ) {
+                       if ( $logType ) {
                                $logtitle = SpecialPage::getTitleFor( 'Log', $logType );
                                $logpage = new LogPage( $logType );
                                $logname = $logpage->getName()->escaped();
@@ -763,7 +765,7 @@ class EnhancedChangesList extends ChangesList {
                        }
                        $watched = false;
                // Log entries (old format) and special pages
-               } elseif( $rc->mAttribs['rc_namespace'] == NS_SPECIAL ) {
+               } elseif ( $rc->mAttribs['rc_namespace'] == NS_SPECIAL ) {
                        wfDebug( "Unexpected special page in recentchanges\n" );
                        $clink = '';
                // Edits
@@ -786,7 +788,7 @@ 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 ) {
+               if ( $rc->unpatrolled ) {
                        $rcIdQuery = array( 'rcid' => $rc->mAttribs['rc_id'] );
                } else {
                        $rcIdQuery = array();
@@ -795,10 +797,10 @@ class EnhancedChangesList extends ChangesList {
                $querydiff = $curIdEq + array( 'diff' => $thisOldid, 'oldid' =>
                        $lastOldid ) + $rcIdQuery;
 
-               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,9 +816,9 @@ 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'],
@@ -824,7 +826,7 @@ class EnhancedChangesList extends ChangesList {
                }
 
                # 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 +841,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 );
                } 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();
                        }
 
@@ -893,39 +895,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 +938,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 );
@@ -965,9 +967,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 +987,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 +1008,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,27 +1025,27 @@ 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> ';
@@ -1054,7 +1056,7 @@ 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'];
@@ -1070,18 +1072,18 @@ 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) {
+                               if ( $rcObj->unpatrolled && $type == RC_NEW ) {
                                        $params['rcid'] = $rcObj->mAttribs['rc_id'];
                                }
 
@@ -1091,7 +1093,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 +1194,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'] );
@@ -1206,7 +1208,7 @@ class EnhancedChangesList extends ChangesList {
 
                $r .= '<td class="mw-enhanced-rc"><span class="mw-enhancedchanges-arrow-space"></span>';
                # Flag and Timestamp
-               if( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
+               if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
                        $r .= '&#160;&#160;&#160;&#160;'; // 4 flags -> 4 spaces
                } else {
                        $r .= $this->recentChangesFlags( array(
@@ -1218,7 +1220,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 +1274,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 723b38e..ed8a031 100644 (file)
@@ -40,7 +40,7 @@ abstract class Collation {
         * @return Collation
         */
        static function factory( $collationName ) {
-               switch( $collationName ) {
+               switch ( $collationName ) {
                        case 'uppercase':
                                return new UppercaseCollation;
                        case 'identity':
@@ -349,15 +349,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 +430,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 +456,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 293d53d..78af1c1 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;
@@ -617,16 +628,18 @@ 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++) );
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 d74a074..053e3a8 100644 (file)
@@ -1873,7 +1873,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
@@ -2829,12 +2829,22 @@ $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.
+ * Use compact vertical form ("VForm") design for Special:Userlogin.  This can
+ * be overridden by a useNew bool in the query string.  For instance, if it is
+ * globally false, you can try it with useNew=1.
+ *
+ * @since 1.22
  */
 $wgUseVFormUserLogin = false;
 
+/**
+ * Use compact vertical form ("VForm") design for account creation
+ * (Special:Userlogin?type=signup).
+ *
+ * @since 1.22
+ */
+$wgUseVFormCreateAccount = false;
+
 /**
  * Display user edit counts in various prominent places.
  */
@@ -3295,7 +3305,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 }
 
@@ -3573,7 +3583,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.
  */
@@ -5009,6 +5020,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
  *
index 6718442..c97431a 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' );
@@ -986,7 +988,9 @@ class EditPage {
                }
                $revision = $this->mArticle->getRevisionFetched();
                if ( $revision === null ) {
-                       if ( !$this->contentModel ) $this->contentModel = $this->getTitle()->getContentModel();
+                       if ( !$this->contentModel ) {
+                               $this->contentModel = $this->getTitle()->getContentModel();
+                       }
                        $handler = ContentHandler::getForModelID( $this->contentModel );
 
                        return $handler->makeEmptyContent();
@@ -1008,7 +1012,9 @@ class EditPage {
                $content = $rev ? $rev->getContent( Revision::RAW ) : null;
 
                if ( $content === false || $content === null ) {
-                       if ( !$this->contentModel ) $this->contentModel = $this->getTitle()->getContentModel();
+                       if ( !$this->contentModel ) {
+                               $this->contentModel = $this->getTitle()->getContentModel();
+                       }
                        $handler = ContentHandler::getForModelID( $this->contentModel );
 
                        return $handler->makeEmptyContent();
@@ -1214,7 +1220,7 @@ class EditPage {
 
                        case self::AS_SUCCESS_NEW_ARTICLE:
                                $query = $resultDetails['redirect'] ? 'redirect=no' : '';
-                               $anchor = isset ( $resultDetails['sectionanchor'] ) ? $resultDetails['sectionanchor'] : '';
+                               $anchor = isset( $resultDetails['sectionanchor'] ) ? $resultDetails['sectionanchor'] : '';
                                $wgOut->redirect( $this->mTitle->getFullURL( $query ) . $anchor );
                                return false;
 
@@ -1934,14 +1940,14 @@ 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() ) {
+                               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
                                                ) );
@@ -2167,7 +2173,7 @@ class EditPage {
                }
 
                # When the summary is hidden, also hide them on preview/show changes
-               if( $this->nosummary ) {
+               if ( $this->nosummary ) {
                        $wgOut->addHTML( Html::hidden( 'nosummary', true ) );
                }
 
@@ -2708,9 +2714,9 @@ HTML
 
                $oldtitlemsg = 'currentrev';
                # if message does not exist, show diff against the preloaded default
-               if( $this->mTitle->getNamespace() == NS_MEDIAWIKI && !$this->mTitle->exists() ) {
+               if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI && !$this->mTitle->exists() ) {
                        $oldtext = $this->mTitle->getDefaultMessageText();
-                       if( $oldtext !== false ) {
+                       if ( $oldtext !== false ) {
                                $oldtitlemsg = 'defaultmessagetext';
                                $oldContent = $this->toEditContent( $oldtext );
                        } else {
@@ -3034,9 +3040,9 @@ HTML
 
                        # don't parse non-wikitext pages, show message about preview
                        if ( $this->mTitle->isCssJsSubpage() || $this->mTitle->isCssOrJsPage() ) {
-                               if( $this->mTitle->isCssJsSubpage() ) {
+                               if ( $this->mTitle->isCssJsSubpage() ) {
                                        $level = 'user';
-                               } elseif( $this->mTitle->isCssOrJsPage() ) {
+                               } elseif ( $this->mTitle->isCssOrJsPage() ) {
                                        $level = 'site';
                                } else {
                                        $level = false;
@@ -3052,7 +3058,7 @@ HTML
 
                                # Used messages to make sure grep find them:
                                # Messages: usercsspreview, userjspreview, sitecsspreview, sitejspreview
-                               if( $level && $format ) {
+                               if ( $level && $format ) {
                                        $note = "<div id='mw-{$level}{$format}preview'>" . wfMessage( "{$level}{$format}preview" )->text() . "</div>";
                                }
                        }
@@ -3512,7 +3518,7 @@ HTML
                global $wgOut, $wgLang;
                $this->textbox2 = $this->textbox1;
 
-               if( is_array( $match ) ) {
+               if ( is_array( $match ) ) {
                        $match = $wgLang->listToText( $match );
                }
                $wgOut->prepareErrorPage( wfMessage( 'spamprotectiontitle' ) );
index 93fddac..c513ef7 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 );
        }
 }
 
index 996c14b..e533dbc 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";
                }
 
@@ -1187,7 +1191,7 @@ class Dump7ZipOutput extends DumpPipeOutput {
                // Suppress annoying useless crap from p7zip
                // Unfortunately this could suppress real error messages too
                $command .= ' >' . wfGetNull() . ' 2>&1';
-               return( $command );
+               return $command;
        }
 
        /**
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 4842c38..1d3b3c8 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,7 +77,7 @@ 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();
                }
@@ -121,12 +121,12 @@ 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 ) {
+               if ( $oldid ) {
                        wfProfileIn( __METHOD__ . "-dodiff" );
 
                        #$diffText = $de->getDiff( wfMessage( 'revisionasof',
@@ -171,7 +171,7 @@ class FeedUtils {
                        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..9fc70eb 100644 (file)
@@ -82,18 +82,18 @@ class FileDeleteForm {
                # Flag to hide all contents of the archived revisions
                $suppress = $wgRequest->getVal( 'wpSuppress' ) && $wgUser->isAllowed( 'suppressrevision' );
 
-               if( $this->oldimage ) {
+               if ( $this->oldimage ) {
                        $this->oldfile = RepoGroup::singleton()->getLocalRepo()->newFromArchiveName( $this->title, $this->oldimage );
                }
 
-               if( !self::haveDeletableFile( $this->file, $this->oldfile, $this->oldimage ) ) {
+               if ( !self::haveDeletableFile( $this->file, $this->oldfile, $this->oldimage ) ) {
                        $wgOut->addHTML( $this->prepareMessage( 'filedelete-nofile' ) );
                        $wgOut->addReturnTo( $this->title );
                        return;
                }
 
                // Perform the deletion if appropriate
-               if( $wgRequest->wasPosted() && $wgUser->matchEditToken( $token, $this->oldimage ) ) {
+               if ( $wgRequest->wasPosted() && $wgUser->matchEditToken( $token, $this->oldimage ) ) {
                        $deleteReasonList = $wgRequest->getText( 'wpDeleteReasonList' );
                        $deleteReason = $wgRequest->getText( 'wpReason' );
 
@@ -109,11 +109,11 @@ class FileDeleteForm {
 
                        $status = self::doDelete( $this->title, $this->file, $this->oldimage, $reason, $suppress, $wgUser );
 
-                       if( !$status->isGood() ) {
+                       if ( !$status->isGood() ) {
                                $wgOut->addHTML( '<h2>' . $this->prepareMessage( 'filedeleteerror-short' ) . "</h2>\n" );
                                $wgOut->addWikiText( '<div class="error">' . $status->getWikiText( 'filedeleteerror-short', 'filedeleteerror-long' ) . '</div>' );
                        }
-                       if( $status->ok ) {
+                       if ( $status->ok ) {
                                $wgOut->setPageTitle( wfMessage( 'actioncomplete' ) );
                                $wgOut->addHTML( $this->prepareMessage( 'filedelete-success' ) );
                                // Return to the main page if we just deleted all versions of the
@@ -153,13 +153,13 @@ class FileDeleteForm {
                        $user = $wgUser;
                }
 
-               if( $oldimage ) {
+               if ( $oldimage ) {
                        $page = null;
                        $status = $file->deleteOld( $oldimage, $reason, $suppress );
-                       if( $status->ok ) {
+                       if ( $status->ok ) {
                                // Need to do a log item
                                $logComment = wfMessage( 'deletedrevision', $oldimage )->inContentLanguage()->text();
-                               if( trim( $reason ) != '' ) {
+                               if ( trim( $reason ) != '' ) {
                                        $logComment .= wfMessage( 'colon-separator' )
                                                ->inContentLanguage()->text() . $reason;
                                }
@@ -187,7 +187,7 @@ class FileDeleteForm {
                                // or revision is missing, so check for isOK() rather than isGood()
                                if ( $deleteStatus->isOK() ) {
                                        $status = $file->delete( $reason, $suppress );
-                                       if( $status->isOK() ) {
+                                       if ( $status->isOK() ) {
                                                $dbw->commit( __METHOD__ );
                                        } else {
                                                $dbw->rollback( __METHOD__ );
@@ -213,7 +213,7 @@ class FileDeleteForm {
        private function showForm() {
                global $wgOut, $wgUser, $wgRequest;
 
-               if( $wgUser->isAllowed( 'suppressrevision' ) ) {
+               if ( $wgUser->isAllowed( 'suppressrevision' ) ) {
                        $suppress = "<tr id=\"wpDeleteSuppressRow\">
                                        <td></td>
                                        <td class='mw-input'><strong>" .
@@ -258,7 +258,7 @@ class FileDeleteForm {
                                "</td>
                        </tr>
                        {$suppress}";
-               if( $wgUser->isLoggedIn() ) {
+               if ( $wgUser->isLoggedIn() ) {
                        $form .= "
                        <tr>
                                <td></td>
@@ -314,7 +314,7 @@ class FileDeleteForm {
         */
        private function prepareMessage( $message ) {
                global $wgLang;
-               if( $this->oldimage ) {
+               if ( $this->oldimage ) {
                        return wfMessage(
                                "{$message}-old", # To ensure grep will find them: 'filedelete-intro-old', 'filedelete-nofile-old', 'filedelete-success-old'
                                wfEscapeWikiText( $this->title->getText() ),
@@ -375,7 +375,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..a54b807 100644 (file)
@@ -120,6 +120,32 @@ class GitInfo {
                return $sha1;
        }
 
+       /**
+        * Return the commit date of HEAD entry of the git code repository
+        *
+        * @since 1.22
+        * @return int|bool Commit date (UNIX timestamp) or false
+        */
+       public function getHeadCommitDate() {
+               global $wgGitBin;
+
+               if ( !is_file( $wgGitBin ) || !is_executable( $wgGitBin ) ) {
+                       return false;
+               }
+
+               $environment = array( "GIT_DIR" => $this->basedir );
+               $cmd = wfEscapeShellArg( $wgGitBin ) . " show -s --format=format:%ct HEAD";
+               $retc = false;
+               $commitDate = wfShellExec( $cmd, $retc, $environment );
+
+               if ( $retc !== 0 ) {
+                       return false;
+               } else {
+                       return (int)$commitDate;
+               }
+
+        }
+
        /**
         * Return the name of the current branch, or HEAD if not found
         * @return string The branch name, HEAD, or false
@@ -151,7 +177,7 @@ class GitInfo {
                if ( isset( $configArray['remote origin'] ) ) {
                        $remote = $configArray['remote origin'];
                } else {
-                       foreach( $configArray as $sectionName => $sectionConf ) {
+                       foreach ( $configArray as $sectionName => $sectionConf ) {
                                if ( substr( $sectionName, 0, 6 ) == 'remote' ) {
                                        $remote = $sectionConf;
                                }
@@ -166,7 +192,7 @@ class GitInfo {
                if ( substr( $url, -4 ) !== '.git' ) {
                        $url .= '.git';
                }
-               foreach( self::getViewers() as $repo => $viewer ) {
+               foreach ( self::getViewers() as $repo => $viewer ) {
                        $pattern = '#^' . $repo . '$#';
                        if ( preg_match( $pattern, $url ) ) {
                                $viewerUrl = preg_replace( $pattern, $viewer, $url );
@@ -212,7 +238,7 @@ class GitInfo {
        protected static function getViewers() {
                global $wgGitRepositoryViewers;
 
-               if( self::$viewers === false ) {
+               if ( self::$viewers === false ) {
                        self::$viewers = $wgGitRepositoryViewers;
                        wfRunHooks( 'GitViewers', array( &self::$viewers ) );
                }
index 0075bf5..51c67a6 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
@@ -138,7 +138,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 +262,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 ) {
@@ -322,8 +322,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 +480,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 +1011,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 +1031,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();
@@ -1310,27 +1310,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 +1463,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 +1486,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 +1535,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 +1562,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 +1646,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 +1658,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 +1674,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 +1688,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 +1703,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 );
        }
 
@@ -1750,7 +1750,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 +1762,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 +1809,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 +1849,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 +1866,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 +1964,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 +2004,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 +2166,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 +2181,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 +2223,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 +2231,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 +2258,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 +2288,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 +2311,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 +2418,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 +2433,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 +2504,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 +2532,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 +2547,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 +2600,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;
 }
@@ -2647,19 +2649,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 +2736,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 +2757,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 +2787,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 +2912,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 +2941,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 +2993,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 +3107,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 +3135,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 +3188,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 ||
@@ -3204,39 +3216,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 +3265,7 @@ function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1, $lowercase = t
                $result = strrev( $result );
        }
 
-       if( !$lowercase ) {
+       if ( !$lowercase ) {
                $result = strtoupper( $result );
        }
 
@@ -3279,9 +3291,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 +3345,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 +3570,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 +3583,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 +3728,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 +3755,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 +3790,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 +3868,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 );
 }
 
@@ -3916,19 +3928,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 +3949,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..5e3bb06 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 :(
@@ -277,7 +276,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
@@ -1092,7 +1093,6 @@ class HTMLForm extends ContextSource {
                $this->mAction = $action;
                return $this;
        }
-
 }
 
 /**
@@ -1110,6 +1110,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 +1208,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 +1228,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 +1280,10 @@ abstract class HTMLFormField {
                if ( isset( $params['flatlist'] ) ) {
                        $this->mClass .= ' mw-htmlform-flatlist';
                }
+
+               if ( isset( $params['hidelabel'] ) ) {
+                       $this->mShowEmptyLabels = false;
+               }
        }
 
        /**
@@ -1325,9 +1344,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 +1480,7 @@ abstract class HTMLFormField {
        }
 
        function getLabel() {
-               return $this->mLabel;
+               return is_null( $this->mLabel ) ? '' : $this->mLabel;
        }
 
        function getLabelHtml( $cellAttributes = array() ) {
@@ -1468,20 +1492,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 +1657,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 ) {
@@ -1978,10 +2017,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 ) {
@@ -2530,14 +2570,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 +2601,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 +2608,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() {
diff --git a/includes/HashRing.php b/includes/HashRing.php
new file mode 100644 (file)
index 0000000..227a287
--- /dev/null
@@ -0,0 +1,114 @@
+<?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 ) {
+               $sum = array_sum( $map );
+               if ( !count( $map ) || $sum <= 0 ) {
+                       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
+               $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..ed8b3ed 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+
 /**
  * A tool for running hook functions.
  *
@@ -37,40 +38,43 @@ class MWHookException extends MWException {}
  */
 class Hooks {
 
+       /**
+        * Array of events mapped to an array of callbacks to be run
+        * when that event is triggered.
+        */
        protected static $handlers = array();
 
        /**
-        * Clears hooks registered via Hooks::register(). Does not touch $wgHooks.
-        * This is intended for use while testing and will fail if MW_PHPUNIT_TEST is not defined.
+        * Attach an event handler to a given hook.
         *
-        * @since 1.21
-        *
-        * @param string $name the name of the hook to clear.
+        * @param string $name Name of hook
+        * @param mixed $callback Callback function to attach
         *
-        * @throws MWException if not in testing mode.
+        * @since 1.18
         */
-       public static function clear( $name ) {
-               if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
-                       throw new MWException( 'can not reset hooks in operation.' );
+       public static function register( $name, $callback ) {
+               if ( !isset( self::$handlers[$name] ) ) {
+                       self::$handlers[$name] = array();
                }
 
-               unset( self::$handlers[$name] );
+               self::$handlers[$name][] = $callback;
        }
 
        /**
-        * Attach an event handler to a given hook
+        * Clears hooks registered via Hooks::register(). Does not touch $wgHooks.
+        * This is intended for use while testing and will fail if MW_PHPUNIT_TEST is not defined.
         *
-        * @since 1.18
+        * @param string $name the name of the hook to clear.
         *
-        * @param string $name name of hook
-        * @param $callback Mixed: callback function to attach
+        * @since 1.21
+        * @throws MWException if not in testing mode.
         */
-       public static function register( $name, $callback ) {
-               if( !isset( self::$handlers[$name] ) ) {
-                       self::$handlers[$name] = array();
+       public static function clear( $name ) {
+               if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
+                       throw new MWException( 'Cannot reset hooks in operation.' );
                }
 
-               self::$handlers[$name][] = $callback;
+               unset( self::$handlers[$name] );
        }
 
        /**
@@ -79,221 +83,143 @@ class Hooks {
         *
         * @since 1.18
         *
-        * @param string $name name of hook
-        * @return Boolean: true if the hook has a function registered to it
+        * @param string $name Name of hook
+        * @return bool True if the hook has a function registered to it
         */
        public static function isRegistered( $name ) {
                global $wgHooks;
-
                return !empty( $wgHooks[$name] ) || !empty( self::$handlers[$name] );
        }
 
        /**
         * Returns an array of all the event functions attached to a hook
         * This combines functions registered via Hooks::register and with $wgHooks.
-        * @since 1.18
         *
-        * @throws MWException
-        * @throws FatalError
-        * @param string $name name of the hook
+        * @since 1.18
         *
+        * @param string $name Name of the hook
         * @return array
         */
        public static function getHandlers( $name ) {
                global $wgHooks;
 
-               // Return quickly in the most common case
-               if ( empty( self::$handlers[$name] ) && empty( $wgHooks[$name] ) ) {
+               if ( !self::isRegistered( $name ) ) {
                        return array();
-               }
-
-               if ( !is_array( self::$handlers ) ) {
-                       throw new MWException( "Local hooks array is not an array!\n" );
-               }
-
-               if ( !is_array( $wgHooks ) ) {
-                       throw new MWException( "Global hooks array is not an array!\n" );
-               }
-
-               if ( empty( Hooks::$handlers[$name] ) ) {
-                       $hooks = $wgHooks[$name];
-               } elseif ( empty( $wgHooks[$name] ) ) {
-                       $hooks = Hooks::$handlers[$name];
+               } elseif ( !isset( self::$handlers[$name] ) ) {
+                       return $wgHooks[$name];
+               } elseif ( !isset( $wgHooks[$name] ) ) {
+                       return self::$handlers[$name];
                } else {
-                       // so they are both not empty...
-                       $hooks = array_merge( Hooks::$handlers[$name], $wgHooks[$name] );
+                       return array_merge( self::$handlers[$name], $wgHooks[$name] );
                }
-
-               if ( !is_array( $hooks ) ) {
-                       throw new MWException( "Hooks array for event '$name' is not an array!\n" );
-               }
-
-               return $hooks;
        }
 
        /**
-        * Call hook functions defined in Hooks::register
+        * Call hook functions defined in Hooks::register and $wgHooks.
         *
-        * @param string $event event name
-        * @param $args  Array: parameters passed to hook functions
+        * For a certain hook event, fetch the array of hook events and
+        * process them. Determine the proper callback for each hook and
+        * then call the actual hook using the appropriate arguments.
+        * Finally, process the return value and return/throw accordingly.
+        *
+        * @param string $event Event name
+        * @param array $args  Array of parameters passed to hook functions
+        * @return bool True if no handler aborted the hook
         *
         * @throws MWException
         * @throws FatalError
-        * @return Boolean True if no handler aborted the hook
         */
-       public static function run( $event, $args = array() ) {
-               global $wgHooks;
-
-               // Return quickly in the most common case
-               if ( empty( self::$handlers[$event] ) && empty( $wgHooks[$event] ) ) {
-                       return true;
-               }
-
+       public static function run( $event, array $args = array() ) {
                wfProfileIn( 'hook: ' . $event );
-               $hooks = self::getHandlers( $event );
+               foreach ( self::getHandlers( $event ) as $hook ) {
+                       // Turn non-array values into an array. (Can't use casting because of objects.)
+                       if ( !is_array( $hook ) ) {
+                               $hook = array( $hook );
+                       }
 
-               foreach ( $hooks as $hook ) {
-                       $object = null;
-                       $method = null;
-                       $func = null;
-                       $data = null;
-                       $have_data = false;
-                       $closure = false;
-                       $badhookmsg = false;
+                       if ( !array_filter( $hook ) ) {
+                               // Either array is empty or it's an array filled with null/false/empty.
+                               continue;
+                       } elseif ( is_array( $hook[0] ) ) {
+                               // First element is an array, meaning the developer intended
+                               // the first element to be a callback. Merge it in so that
+                               // processing can be uniform.
+                               $hook = array_merge( $hook[0], array_slice( $hook, 1 ) );
+                       }
 
                        /**
                         * $hook can be: a function, an object, an array of $function and
                         * $data, an array of just a function, an array of object and
                         * method, or an array of object, method, and data.
                         */
-                       if ( is_array( $hook ) ) {
-                               if ( count( $hook ) < 1 ) {
-                                       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 ( $badhookmsg !== null ) {
+                               // Exception was thrown from Hooks::hookErrorHandler.
+                               throw new MWException(
+                                       'Detected bug in an extension! ' .
+                                       "Hook $func has invalid call signature; " . $badhookmsg
+                               );
+                       } elseif ( $retval === null ) {
+                               // Null was returned. Error.
+                               throw new MWException(
+                                       'Detected bug in an extension! ' .
+                                       "Hook $func failed to return a value; " .
+                                       'should return true to continue hook processing or false to abort.'
+                               );
                        } elseif ( !$retval ) {
                                wfProfileOut( 'hook: ' . $event );
+                               // False was returned. Stop processing, but no error.
                                return false;
                        }
                }
@@ -303,18 +229,21 @@ class Hooks {
        }
 
        /**
+        * Handle PHP errors issued inside a hook. Catch errors that have to do with
+        * a function expecting a reference, and let all others pass through.
+        *
         * This REALLY should be protected... but it's public for compatibility
         *
         * @since 1.18
         *
-        * @param int $errno Unused
-        * @param string $errstr error message
-        * @throws MWHookException
-        * @return Boolean: false
+        * @param int $errno Error number (unused)
+        * @param string $errstr Error message
+        * @throws MWHookException If the error has to do with the function signature
+        * @return bool Always returns false
         */
        public static function hookErrorHandler( $errno, $errstr ) {
                if ( strpos( $errstr, 'expected to be a reference, value given' ) !== false ) {
-                       throw new MWHookException( $errstr );
+                       throw new MWHookException( $errstr, $errno );
                }
                return false;
        }
index 07bb42b..cb082a1 100644 (file)
@@ -207,7 +207,7 @@ class Html {
                        );
 
                        // Allow more input types in HTML5 mode
-                       if( $wgHtml5 ) {
+                       if ( $wgHtml5 ) {
                                $validTypes = array_merge( $validTypes, array(
                                        'datetime',
                                        'datetime-local',
@@ -340,7 +340,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 );
@@ -962,7 +962,7 @@ class Html {
         */
        static function srcSet( $urls ) {
                $candidates = array();
-               foreach( $urls as $density => $url ) {
+               foreach ( $urls as $density => $url ) {
                        // Image candidate syntax per current whatwg live spec, 2012-09-23:
                        // http://www.whatwg.org/specs/web-apps/current-work/multipage/embedded-content-1.html#attr-img-srcset
                        $candidates[] = "{$url} {$density}x";
index acf9baa..2da368c 100644 (file)
@@ -232,7 +232,7 @@ class MWHttpRequest {
                } else {
                        $this->timeout = $wgHTTPTimeout;
                }
-               if( isset( $options['userAgent'] ) ) {
+               if ( isset( $options['userAgent'] ) ) {
                        $this->setUserAgent( $options['userAgent'] );
                }
 
@@ -280,7 +280,7 @@ class MWHttpRequest {
                                ' Http::$httpEngine is set to "curl"' );
                }
 
-               switch( Http::$httpEngine ) {
+               switch ( Http::$httpEngine ) {
                        case 'curl':
                                return new CurlHttpRequest( $url, $options );
                        case 'php':
@@ -774,7 +774,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 +841,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";
                        }
                }
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 8f8022f..43cf7f6 100644 (file)
@@ -282,11 +282,11 @@ class ImageGallery {
                                $img = false;
                        }
 
-                       if( !$img ) {
+                       if ( !$img ) {
                                # We're dealing with a non-image, spit out the name and be done with it.
                                $thumbhtml = "\n\t\t\t" . '<div style="height: ' . ( self::THUMB_PADDING + $this->mHeights ) . 'px;">'
                                        . htmlspecialchars( $nt->getText() ) . '</div>';
-                       } elseif( $this->mHideBadImages && wfIsBadImage( $nt->getDBkey(), $this->getContextTitle() ) ) {
+                       } elseif ( $this->mHideBadImages && wfIsBadImage( $nt->getDBkey(), $this->getContextTitle() ) ) {
                                # The image is blacklisted, just show it as a text link.
                                $thumbhtml = "\n\t\t\t" . '<div style="height: ' . ( self::THUMB_PADDING + $this->mHeights ) . 'px;">' .
                                        Linker::link(
@@ -297,7 +297,7 @@ 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>';
@@ -334,8 +334,8 @@ class ImageGallery {
                        // $linkTarget = Title::newFromText( $wgContLang->getNsText( MWNamespace::getUser() ) . ":{$ut}" );
                        // $ul = Linker::link( $linkTarget, $ut );
 
-                       if( $this->mShowBytes ) {
-                               if( $img ) {
+                       if ( $this->mShowBytes ) {
+                               if ( $img ) {
                                        $fileSize = htmlspecialchars( $lang->formatSize( $img->getSize() ) );
                                } else {
                                        $fileSize = wfMessage( 'filemissing' )->escaped();
index 5e51878..e687046 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 );
@@ -597,7 +597,7 @@ EOT
                $descText = $this->mPage->getFile()->getDescriptionText();
 
                /* Add canonical to head if there is no local page for this shared file */
-               if( $descUrl && $this->mPage->getID() == 0 ) {
+               if ( $descUrl && $this->mPage->getID() == 0 ) {
                        $out->setCanonicalUrl( $descUrl );
                }
 
@@ -753,7 +753,7 @@ EOT
 
                // Create links for every element
                $currentCount = 0;
-               foreach( $rows as $element ) {
+               foreach ( $rows as $element ) {
                        $currentCount++;
                        if ( $currentCount > $limit ) {
                                break;
index b9ec6e0..eeec5cd 100644 (file)
@@ -41,12 +41,12 @@ abstract class ImageQueryPage extends QueryPage {
         * @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 ) {
index 03a1cfe..7b078db 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,11 +420,11 @@ 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;
                        }
                }
 
@@ -441,9 +441,15 @@ 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' ) {
+                       libxml_disable_entity_loader( $oldDisable );
                        throw new MWException( "Expected <mediawiki> tag, got " .
                                $this->reader->name );
                }
@@ -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..835ffdb 100644 (file)
@@ -166,7 +166,7 @@ class MWInit {
        static function classExists( $class ) {
                try {
                        $r = new ReflectionClass( $class );
-               } catch( ReflectionException $r ) {
+               } catch ( ReflectionException $r ) {
                        $r = false;
                }
                return $r !== false;
@@ -187,7 +187,7 @@ class MWInit {
        static function methodExists( $class, $method ) {
                try {
                        $r = new ReflectionMethod( $class, $method );
-               } catch( ReflectionException $r ) {
+               } catch ( ReflectionException $r ) {
                        $r = false;
                }
                return $r !== false;
@@ -204,7 +204,7 @@ class MWInit {
        static function functionExists( $function ) {
                try {
                        $r = new ReflectionFunction( $function );
-               } catch( ReflectionException $r ) {
+               } catch ( ReflectionException $r ) {
                        $r = false;
                }
                return $r !== false;
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..4003efb 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 f54487a..8c6d762 100644 (file)
@@ -354,7 +354,7 @@ class LinksUpdate extends SqlDataUpdate {
         */
        private function getLinkInsertions( $existing = array() ) {
                $arr = array();
-               foreach( $this->mLinks as $ns => $dbkeys ) {
+               foreach ( $this->mLinks as $ns => $dbkeys ) {
                        $diffs = isset( $existing[$ns] )
                                ? array_diff_key( $dbkeys, $existing[$ns] )
                                : $dbkeys;
@@ -376,7 +376,7 @@ class LinksUpdate extends SqlDataUpdate {
         */
        private function getTemplateInsertions( $existing = array() ) {
                $arr = array();
-               foreach( $this->mTemplates as $ns => $dbkeys ) {
+               foreach ( $this->mTemplates as $ns => $dbkeys ) {
                        $diffs = isset( $existing[$ns] ) ? array_diff_key( $dbkeys, $existing[$ns] ) : $dbkeys;
                        foreach ( $diffs as $dbk => $id ) {
                                $arr[] = array(
@@ -398,7 +398,7 @@ class LinksUpdate extends SqlDataUpdate {
        private function getImageInsertions( $existing = array() ) {
                $arr = array();
                $diffs = array_diff_key( $this->mImages, $existing );
-               foreach( $diffs as $iname => $dummy ) {
+               foreach ( $diffs as $iname => $dummy ) {
                        $arr[] = array(
                                'il_from' => $this->mId,
                                'il_to' => $iname
@@ -415,8 +415,8 @@ class LinksUpdate extends SqlDataUpdate {
        private function getExternalInsertions( $existing = array() ) {
                $arr = array();
                $diffs = array_diff_key( $this->mExternals, $existing );
-               foreach( $diffs as $url => $dummy ) {
-                       foreach( wfMakeUrlIndexes( $url ) as $index ) {
+               foreach ( $diffs as $url => $dummy ) {
+                       foreach ( wfMakeUrlIndexes( $url ) as $index ) {
                                $arr[] = array(
                                        'el_from' => $this->mId,
                                        'el_to' => $url,
@@ -481,7 +481,7 @@ class LinksUpdate extends SqlDataUpdate {
        private function getInterlangInsertions( $existing = array() ) {
                $diffs = array_diff_assoc( $this->mInterlangs, $existing );
                $arr = array();
-               foreach( $diffs as $lang => $title ) {
+               foreach ( $diffs as $lang => $title ) {
                        $arr[] = array(
                                'll_from' => $this->mId,
                                'll_lang' => $lang,
@@ -517,7 +517,7 @@ class LinksUpdate extends SqlDataUpdate {
         */
        private function getInterwikiInsertions( $existing = array() ) {
                $arr = array();
-               foreach( $this->mInterwikis as $prefix => $dbkeys ) {
+               foreach ( $this->mInterwikis as $prefix => $dbkeys ) {
                        $diffs = isset( $existing[$prefix] ) ? array_diff_key( $dbkeys, $existing[$prefix] ) : $dbkeys;
                        foreach ( $diffs as $dbk => $id ) {
                                $arr[] = array(
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 86508ec..f9457c3 100644 (file)
@@ -138,6 +138,8 @@ class MagicWord {
                'numberofactiveusers',
                'numberofpages',
                'currentversion',
+               'rootpagename',
+               'rootpagenamee',
                'basepagename',
                'basepagenamee',
                'currenttimestamp',
@@ -327,9 +329,10 @@ class MagicWord {
                usort( $synonyms, array( $this, 'compareStringLength' ) );
 
                $escSyn = array();
-               foreach ( $synonyms as $synonym )
+               foreach ( $synonyms as $synonym ) {
                        // In case a magic word contains /, like that's going to happen;)
                        $escSyn[] = preg_quote( $synonym, '/' );
+               }
                $this->mBaseRegex = implode( '|', $escSyn );
 
                $case = $this->mCaseSensitive ? '' : 'iu';
@@ -382,8 +385,9 @@ class MagicWord {
         * @return string
         */
        function getRegexCase() {
-               if ( $this->mRegex === '' )
+               if ( $this->mRegex === '' ) {
                        $this->initRegex();
+               }
 
                return $this->mCaseSensitive ? '' : 'iu';
        }
@@ -598,7 +602,7 @@ 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;
index 5719f83..531551d 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,7 +641,7 @@ 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;
@@ -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 11fc574..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]
@@ -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 );
@@ -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,
@@ -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..e7928cc 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 );
index 8bf6443..4a2b17a 100644 (file)
@@ -319,7 +319,7 @@ class OutputPage extends ContextSource {
         * @param string $text or array of strings
         */
        function addKeyword( $text ) {
-               if( is_array( $text ) ) {
+               if ( is_array( $text ) ) {
                        $this->mKeywords = array_merge( $this->mKeywords, $text );
                } else {
                        array_push( $this->mKeywords, $text );
@@ -413,13 +413,14 @@ class OutputPage extends ContextSource {
        public function addScriptFile( $file, $version = null ) {
                global $wgStylePath, $wgStyleVersion;
                // See if $file parameter is an absolute URL or begins with a slash
-               if( substr( $file, 0, 1 ) == '/' || preg_match( '#^[a-z]*://#i', $file ) ) {
+               if ( substr( $file, 0, 1 ) == '/' || preg_match( '#^[a-z]*://#i', $file ) ) {
                        $path = $file;
                } else {
                        $path = "{$wgStylePath}/common/{$file}";
                }
-               if ( is_null( $version ) )
+               if ( is_null( $version ) ) {
                        $version = $wgStyleVersion;
+               }
                $this->addScript( Html::linkedScript( wfAppendQuery( $path, $version ) ) );
        }
 
@@ -452,9 +453,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 +688,17 @@ class OutputPage extends ContextSource {
         * @return Boolean: true iff cache-ok headers was sent.
         */
        public function checkLastModified( $timestamp ) {
-               global $wgCachePages, $wgCacheEpoch;
+               global $wgCachePages, $wgCacheEpoch, $wgUseSquid, $wgSquidMaxage;
 
                if ( !$timestamp || $timestamp == '19700101000000' ) {
                        wfDebug( __METHOD__ . ": CACHE DISABLED, NO TIMESTAMP\n" );
                        return false;
                }
-               if( !$wgCachePages ) {
+               if ( !$wgCachePages ) {
                        wfDebug( __METHOD__ . ": CACHE DISABLED\n", false );
                        return false;
                }
-               if( $this->getUser()->getOption( 'nocache' ) ) {
+               if ( $this->getUser()->getOption( 'nocache' ) ) {
                        wfDebug( __METHOD__ . ": USER DISABLED CACHE\n", false );
                        return false;
                }
@@ -708,6 +709,10 @@ class OutputPage extends ContextSource {
                        'user' => $this->getUser()->getTouched(),
                        'epoch' => $wgCacheEpoch
                );
+               if ( $wgUseSquid ) {
+                       // bug 44570: the core page itself may not change, but resources might
+                       $modifiedTimes['sepoch'] = wfTimestamp( TS_MW, time() - $wgSquidMaxage );
+               }
                wfRunHooks( 'OutputPageCheckLastModified', array( &$modifiedTimes ) );
 
                $maxModified = max( $modifiedTimes );
@@ -746,7 +751,7 @@ class OutputPage extends ContextSource {
                        wfTimestamp( TS_ISO_8601, $clientHeaderTime ) . "\n", false );
                wfDebug( __METHOD__ . ": effective Last-Modified: " .
                        wfTimestamp( TS_ISO_8601, $maxModified ) . "\n", false );
-               if( $clientHeaderTime < $maxModified ) {
+               if ( $clientHeaderTime < $maxModified ) {
                        wfDebug( __METHOD__ . ": STALE, $info\n", false );
                        return false;
                }
@@ -788,10 +793,10 @@ class OutputPage extends ContextSource {
        public function setRobotPolicy( $policy ) {
                $policy = Article::formatRobotPolicy( $policy );
 
-               if( isset( $policy['index'] ) ) {
+               if ( isset( $policy['index'] ) ) {
                        $this->setIndexPolicy( $policy['index'] );
                }
-               if( isset( $policy['follow'] ) ) {
+               if ( isset( $policy['follow'] ) ) {
                        $this->setFollowPolicy( $policy['follow'] );
                }
        }
@@ -805,7 +810,7 @@ class OutputPage extends ContextSource {
         */
        public function setIndexPolicy( $policy ) {
                $policy = trim( $policy );
-               if( in_array( $policy, array( 'index', 'noindex' ) ) ) {
+               if ( in_array( $policy, array( 'index', 'noindex' ) ) ) {
                        $this->mIndexPolicy = $policy;
                }
        }
@@ -819,7 +824,7 @@ class OutputPage extends ContextSource {
         */
        public function setFollowPolicy( $policy ) {
                $policy = trim( $policy );
-               if( in_array( $policy, array( 'follow', 'nofollow' ) ) ) {
+               if ( in_array( $policy, array( 'follow', 'nofollow' ) ) ) {
                        $this->mFollowPolicy = $policy;
                }
        }
@@ -1306,7 +1311,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 +1609,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 +1657,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 +1781,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 +1816,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 +1838,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 +1923,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 +1954,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 {
@@ -1981,7 +1989,7 @@ class OutputPage extends ContextSource {
        public function output() {
                global $wgLanguageCode, $wgDebugRedirects, $wgMimeType, $wgVaryOnXFP;
 
-               if( $this->mDoNothing ) {
+               if ( $this->mDoNothing ) {
                        return;
                }
 
@@ -1996,9 +2004,9 @@ class OutputPage extends ContextSource {
                        $redirect = $this->mRedirect;
                        $code = $this->mRedirectCode;
 
-                       if( wfRunHooks( "BeforePageRedirect", array( $this, &$redirect, &$code ) ) ) {
-                               if( $code == '301' || $code == '303' ) {
-                                       if( !$wgDebugRedirects ) {
+                       if ( wfRunHooks( "BeforePageRedirect", array( $this, &$redirect, &$code ) ) ) {
+                               if ( $code == '301' || $code == '303' ) {
+                                       if ( !$wgDebugRedirects ) {
                                                $message = HttpStatus::getMessage( $code );
                                                $response->header( "HTTP/1.1 $code $message" );
                                        }
@@ -2010,7 +2018,7 @@ class OutputPage extends ContextSource {
                                $this->sendCacheControl();
 
                                $response->header( "Content-Type: text/html; charset=utf-8" );
-                               if( $wgDebugRedirects ) {
+                               if ( $wgDebugRedirects ) {
                                        $url = htmlspecialchars( $redirect );
                                        print "<html>\n<head>\n<title>Redirect</title>\n</head>\n<body>\n";
                                        print "<p>Location: <a href=\"$url\">$url</a></p>\n";
@@ -2119,7 +2127,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 +2268,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 +2316,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 +2329,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 +2355,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 +2379,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 +2423,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;
@@ -2502,20 +2510,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";
@@ -2552,7 +2569,7 @@ $templates
 
                        wfRunHooks( 'AjaxAddScript', array( &$this ) );
 
-                       if( $wgAjaxWatch && $this->getUser()->isLoggedIn() ) {
+                       if ( $wgAjaxWatch && $this->getUser()->isLoggedIn() ) {
                                $this->addModules( 'mediawiki.page.watch.ajax' );
                        }
 
@@ -2752,7 +2769,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 +2780,7 @@ $templates
                                }
                        }
 
-                       if( $group == 'noscript' ) {
+                       if ( $group == 'noscript' ) {
                                $links .= Html::rawElement( 'noscript', array(), $link ) . "\n";
                        } else {
                                $links .= $link . "\n";
@@ -2874,7 +2891,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 +2963,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( 'jQuery.ready();' );
+
                if ( !$wgResourceLoaderExperimentalAsyncLoading ) {
-                       return $this->getScriptsForBottomQueue( false );
-               } else {
-                       return '';
+                       $html .= $this->getScriptsForBottomQueue( false );
                }
+
+               return $html;
        }
 
        /**
@@ -3038,6 +3062,7 @@ $templates
                        'wgCategories' => $this->getCategories(),
                        'wgBreakFrames' => $this->getFrameOptions() == 'DENY',
                        'wgPageContentLanguage' => $lang->getCode(),
+                       'wgPageContentModel' => $title->getContentModel(),
                        'wgSeparatorTransformTable' => $compactSeparatorTransTable,
                        'wgDigitTransformTable' => $compactDigitTransTable,
                        'wgDefaultDateFormat' => $lang->getDefaultDateFormat(),
@@ -3050,6 +3075,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();
@@ -3137,7 +3166,7 @@ $templates
                ) );
 
                $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(
@@ -3285,7 +3314,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 +3349,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'.
                                        );
                                }
@@ -3387,13 +3416,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 +3434,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 +3464,7 @@ $templates
                if ( $wgUseSiteCss ) {
                        $moduleStyles[] = 'site';
                        $moduleStyles[] = 'noscript';
-                       if( $this->getUser()->isLoggedIn() ) {
+                       if ( $this->getUser()->isLoggedIn() ) {
                                $moduleStyles[] = 'user.groups';
                        }
                }
@@ -3516,9 +3545,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 +3563,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 +3589,7 @@ $templates
 
                $link = Html::linkedStyle( $url, $media );
 
-               if( isset( $options['condition'] ) ) {
+               if ( isset( $options['condition'] ) ) {
                        $condition = htmlspecialchars( $options['condition'] );
                        $link = "<!--[if $condition]>$link<![endif]-->";
                }
@@ -3585,11 +3614,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,7 +3629,7 @@ $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;
                                        }
                                }
@@ -3608,13 +3637,13 @@ $templates
                }
 
                // Expand longer media queries as iPhone doesn't grok 'handheld'
-               if( $wgHandheldForIPhone ) {
+               if ( $wgHandheldForIPhone ) {
                        $mediaAliases = array(
                                'screen' => 'screen and (min-device-width: 481px)',
                                'handheld' => 'handheld, only screen and (max-device-width: 480px)',
                        );
 
-                       if( isset( $mediaAliases[$media] ) ) {
+                       if ( isset( $mediaAliases[$media] ) ) {
                                $media = $mediaAliases[$media];
                        }
                }
index d2ac904..696c11b 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";
                }
 
@@ -685,7 +698,9 @@ abstract class IndexPager extends ContextSource implements Pager {
         *
         * @return Array
         */
-       protected function getExtraSortFields() { return array(); }
+       protected function getExtraSortFields() {
+               return array();
+       }
 
        /**
         * Return the default sorting direction: false for ascending, true for
@@ -706,7 +721,9 @@ abstract class IndexPager extends ContextSource implements Pager {
         *
         * @return Boolean
         */
-       protected function getDefaultDirections() { return false; }
+       protected function getDefaultDirections() {
+               return false;
+       }
 }
 
 /**
@@ -726,7 +743,7 @@ abstract class AlphabeticPager extends IndexPager {
                        return '';
                }
 
-               if( isset( $this->mNavigationBar ) ) {
+               if ( isset( $this->mNavigationBar ) ) {
                        return $this->mNavigationBar;
                }
 
@@ -749,7 +766,7 @@ abstract class AlphabeticPager extends IndexPager {
                        $this->msg( 'viewprevnext' )->rawParams( $pagingLinks['prev'],
                                $pagingLinks['next'], $limits )->escaped();
 
-               if( !is_array( $this->getIndexField() ) ) {
+               if ( !is_array( $this->getIndexField() ) ) {
                        # Early return to avoid undue nesting
                        return $this->mNavigationBar;
                }
@@ -757,14 +774,14 @@ abstract class AlphabeticPager extends IndexPager {
                $extra = '';
                $first = true;
                $msgs = $this->getOrderTypeMessages();
-               foreach( array_keys( $msgs ) as $order ) {
-                       if( $first ) {
+               foreach ( array_keys( $msgs ) as $order ) {
+                       if ( $first ) {
                                $first = false;
                        } else {
                                $extra .= $this->msg( 'pipe-separator' )->escaped();
                        }
 
-                       if( $order == $this->mOrderType ) {
+                       if ( $order == $this->mOrderType ) {
                                $extra .= $this->msg( $msgs[$order] )->escaped();
                        } else {
                                $extra .= $this->makeLink(
@@ -774,7 +791,7 @@ abstract class AlphabeticPager extends IndexPager {
                        }
                }
 
-               if( $extra !== '' ) {
+               if ( $extra !== '' ) {
                        $extra = ' ' . $this->msg( 'parentheses' )->rawParams( $extra )->escaped();
                        $this->mNavigationBar .= $extra;
                }
@@ -857,7 +874,7 @@ abstract class ReverseChronologicalPager extends IndexPager {
                        // If no year given, assume the current one
                        $year = gmdate( 'Y' );
                        // If this month hasn't happened yet this year, go back to last year's month
-                       if( $this->mMonth > gmdate( 'n' ) ) {
+                       if ( $this->mMonth > gmdate( 'n' ) ) {
                                $year--;
                        }
                }
@@ -904,7 +921,9 @@ abstract class TablePager extends IndexPager {
                }
 
                $this->mSort = $this->getRequest()->getText( 'sort' );
-               if ( !array_key_exists( $this->mSort, $this->getFieldNames() ) ) {
+               if ( !array_key_exists( $this->mSort, $this->getFieldNames() )
+                       || !$this->isFieldSortable( $this->mSort )
+               ) {
                        $this->mSort = $this->getDefaultSort();
                }
                if ( $this->getRequest()->getBool( 'asc' ) ) {
@@ -922,16 +941,15 @@ abstract class TablePager extends IndexPager {
         */
        function getStartBody() {
                global $wgStylePath;
-               $tableClass = htmlspecialchars( $this->getTableClass() );
-               $sortClass = htmlspecialchars( $this->getSortHeaderClass() );
+               $sortClass = $this->getSortHeaderClass();
 
-               $s = "<table style='border:1px;' class=\"mw-datatable $tableClass\"><thead><tr>\n";
+               $s = '';
                $fields = $this->getFieldNames();
 
                # Make table header
                foreach ( $fields as $field => $name ) {
                        if ( strval( $name ) == '' ) {
-                               $s .= "<th>&#160;</th>\n";
+                               $s .= Html::rawElement( 'th', array(), '&#160;' ) . "\n";
                        } elseif ( $this->isFieldSortable( $field ) ) {
                                $query = array( 'sort' => $field, 'limit' => $this->mLimit );
                                if ( $field == $this->mSort ) {
@@ -950,20 +968,26 @@ abstract class TablePager extends IndexPager {
                                                $query['desc'] = '1';
                                                $alt = $this->msg( 'ascending_abbrev' )->escaped();
                                        }
-                                       $image = htmlspecialchars( "$wgStylePath/common/images/$image" );
+                                       $image = "$wgStylePath/common/images/$image";
                                        $link = $this->makeLink(
-                                               "<img width=\"12\" height=\"12\" alt=\"$alt\" src=\"$image\" />" .
-                                                       htmlspecialchars( $name ), $query );
-                                       $s .= "<th class=\"$sortClass\">$link</th>\n";
+                                               Html::element( 'img', array( 'width' => 12, 'height' => 12,
+                                                       'alt' => $alt, 'src' => $image ) ) . htmlspecialchars( $name ), $query );
+                                       $s .= Html::rawElement( 'th', array( 'class' => $sortClass ), $link ) . "\n";
                                } else {
-                                       $s .= '<th>' . $this->makeLink( htmlspecialchars( $name ), $query ) . "</th>\n";
+                                       $s .= Html::rawElement( 'th', array(),
+                                               $this->makeLink( htmlspecialchars( $name ), $query ) ) . "\n";
                                }
                        } else {
-                               $s .= '<th>' . htmlspecialchars( $name ) . "</th>\n";
+                               $s .= Html::element( 'th', array(), $name ) . "\n";
                        }
                }
-               $s .= "</tr></thead><tbody>\n";
-               return $s;
+
+               $tableClass = $this->getTableClass();
+               $ret = Html::openElement( 'table', array( 'style' => 'border:1px;', 'class' => "mw-datatable $tableClass" ) );
+               $ret .= Html::rawElement( 'thead', array(), Html::rawElement( 'tr', array(), "\n" . $s . "\n" ) );
+               $ret .= Html::openElement( 'tbody' ) . "\n";
+
+               return $ret;
        }
 
        /**
@@ -980,8 +1004,9 @@ abstract class TablePager extends IndexPager {
         */
        function getEmptyBody() {
                $colspan = count( $this->getFieldNames() );
-               $msgEmpty = $this->msg( 'table_pager_empty' )->escaped();
-               return "<tr><td colspan=\"$colspan\">$msgEmpty</td></tr>\n";
+               $msgEmpty = $this->msg( 'table_pager_empty' )->text();
+               return Html::rawElement( 'tr', array(),
+                       Html::element( 'td', array( 'colspan' => $colspan ), $msgEmpty ) );
        }
 
        /**
@@ -991,7 +1016,7 @@ abstract class TablePager extends IndexPager {
         */
        function formatRow( $row ) {
                $this->mCurrentRow = $row; // In case formatValue etc need to know
-               $s = Xml::openElement( 'tr', $this->getRowAttrs( $row ) );
+               $s = Html::openElement( 'tr', $this->getRowAttrs( $row ) ) . "\n";
                $fieldNames = $this->getFieldNames();
 
                foreach ( $fieldNames as $field => $name ) {
@@ -1002,10 +1027,10 @@ abstract class TablePager extends IndexPager {
                                $formatted = '&#160;';
                        }
 
-                       $s .= Xml::tags( 'td', $this->getCellAttrs( $field, $value ), $formatted );
+                       $s .= Html::rawElement( 'td', $this->getCellAttrs( $field, $value ), $formatted ) . "\n";
                }
 
-               $s .= "</tr>\n";
+               $s .= Html::closeElement( 'tr' ) . "\n";
 
                return $s;
        }
@@ -1117,7 +1142,7 @@ abstract class TablePager extends IndexPager {
                        'next' => 'arrow_disabled_right_25.png',
                        'last' => 'arrow_disabled_last_25.png',
                );
-               if( $this->getLanguage()->isRTL() ) {
+               if ( $this->getLanguage()->isRTL() ) {
                        $keys = array_keys( $labels );
                        $images = array_combine( $keys, array_reverse( $images ) );
                        $disabledImages = array_combine( $keys, array_reverse( $disabledImages ) );
@@ -1127,18 +1152,20 @@ abstract class TablePager extends IndexPager {
                $disabledTexts = array();
                foreach ( $labels as $type => $label ) {
                        $msgLabel = $this->msg( $label )->escaped();
-                       $linkTexts[$type] = "<img src=\"$path/{$images[$type]}\" alt=\"$msgLabel\"/><br />$msgLabel";
-                       $disabledTexts[$type] = "<img src=\"$path/{$disabledImages[$type]}\" alt=\"$msgLabel\"/><br />$msgLabel";
+                       $linkTexts[$type] = Html::element( 'img', array( 'src' => "$path/{$images[$type]}",
+                               'alt' => $msgLabel ) ) . "<br />$msgLabel";
+                       $disabledTexts[$type] = Html::element( 'img', array( 'src' => "$path/{$disabledImages[$type]}",
+                               'alt' => $msgLabel ) ) . "<br />$msgLabel";
                }
                $links = $this->getPagingLinks( $linkTexts, $disabledTexts );
 
-               $navClass = htmlspecialchars( $this->getNavClass() );
-               $s = "<table class=\"$navClass\"><tr>\n";
+               $s = Html::openElement( 'table', array( 'class' => $this->getNavClass() ) );
+               $s .= Html::openElement( 'tr' ) . "\n";
                $width = 100 / count( $links ) . '%';
                foreach ( $labels as $type => $label ) {
-                       $s .= "<td style='width:$width;'>{$links[$type]}</td>\n";
+                       $s .= Html::rawElement( 'td', array( 'style' => "width:$width;" ), $links[$type] ) . "\n";
                }
-               $s .= "</tr></table>\n";
+               $s .= Html::closeElement( 'tr' ) . Html::closeElement( 'table' ) . "\n";
                return $s;
        }
 
@@ -1148,28 +1175,40 @@ abstract class TablePager extends IndexPager {
         * @return String: HTML fragment
         */
        public function getLimitSelect() {
+               $select = new XmlSelect( 'limit', false, $this->mLimit );
+               $select->addOptions( $this->getLimitSelectList() );
+               return $select->getHTML();
+       }
+
+       /**
+        * Get a list of items to show in a "<select>" element of limits.
+        * This can be passed directly to XmlSelect::addOptions().
+        *
+        * @since 1.22
+        * @return array
+        */
+       public function getLimitSelectList() {
                # Add the current limit from the query string
                # to avoid that the limit is lost after clicking Go next time
                if ( !in_array( $this->mLimit, $this->mLimitsShown ) ) {
                        $this->mLimitsShown[] = $this->mLimit;
                        sort( $this->mLimitsShown );
                }
-               $s = Html::openElement( 'select', array( 'name' => 'limit' ) ) . "\n";
+               $ret = array();
                foreach ( $this->mLimitsShown as $key => $value ) {
                        # The pair is either $index => $limit, in which case the $value
                        # will be numeric, or $limit => $text, in which case the $value
                        # will be a string.
-                       if( is_int( $value ) ) {
+                       if ( is_int( $value ) ) {
                                $limit = $value;
                                $text = $this->getLanguage()->formatNum( $limit );
                        } else {
                                $limit = $key;
                                $text = $value;
                        }
-                       $s .= Xml::option( $text, $limit, $limit == $this->mLimit ) . "\n";
+                       $ret[$text] = $limit;
                }
-               $s .= Html::closeElement( 'select' );
-               return $s;
+               return $ret;
        }
 
        /**
@@ -1188,9 +1227,7 @@ abstract class TablePager extends IndexPager {
                }
                $s = '';
                foreach ( $query as $name => $value ) {
-                       $encName = htmlspecialchars( $name );
-                       $encValue = htmlspecialchars( $value );
-                       $s .= "<input type=\"hidden\" name=\"$encName\" value=\"$encValue\"/>\n";
+                       $s .= Html::hidden( $name, $value ) . "\n";
                }
                return $s;
        }
@@ -1203,12 +1240,14 @@ abstract class TablePager extends IndexPager {
        function getLimitForm() {
                global $wgScript;
 
-               return Xml::openElement(
+               return Html::rawElement(
                        'form',
                        array(
                                'method' => 'get',
                                'action' => $wgScript
-                       ) ) . "\n" . $this->getLimitDropdown() . "</form>\n";
+                       ),
+                       "\n" . $this->getLimitDropdown()
+               ) . "\n";
        }
 
        /**
index fc891bb..435e09e 100644 (file)
@@ -141,10 +141,10 @@ class PathRouter {
                }
 
                $pattern = (object)array(
-                       'path'    => $path,
-                       'params'  => $params,
+                       'path' => $path,
+                       'params' => $params,
                        'options' => $options,
-                       'key'     => $key,
+                       'key' => $key,
                );
                $pattern->weight = self::makeWeight( $pattern );
                $this->patterns[] = $pattern;
@@ -185,7 +185,7 @@ class PathRouter {
         */
        protected function sortByWeight() {
                $weights = array();
-               foreach( $this->patterns as $key => $pattern ) {
+               foreach ( $this->patterns as $key => $pattern ) {
                        $weights[$key] = $pattern->weight;
                }
                array_multisort( $weights, SORT_DESC, SORT_NUMERIC, $this->patterns );
@@ -203,7 +203,7 @@ class PathRouter {
                $path = explode( '/', $pattern->path );
 
                # For each level of the path
-               foreach( $path as $piece ) {
+               foreach ( $path as $piece ) {
                        if ( preg_match( '/^\$(\d+|key)$/u', $piece ) ) {
                                # For a piece that is only a $1 variable add 1 points of weight
                                $weight += 1;
index 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 79c3dd3..0d765fa 100644 (file)
@@ -310,23 +310,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 +334,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 +378,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';
                        }
@@ -674,7 +674,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 ) {
@@ -1012,8 +1012,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 +1093,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 +1352,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 +1409,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 );
index e422a3b..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
                }
 
@@ -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 de5e9db..9439b90 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,12 +320,12 @@ class ProtectionForm {
                 *             you can also return an array of message name and its parameters
                 */
                $errorMsg = '';
-               if( !wfRunHooks( 'ProtectionForm::save', array( $this->mArticle, &$errorMsg ) ) ) {
+               if ( !wfRunHooks( 'ProtectionForm::save', array( $this->mArticle, &$errorMsg ) ) ) {
                        if ( $errorMsg == '' ) {
                                $errorMsg = array( 'hookaborted' );
                        }
                }
-               if( $errorMsg != '' ) {
+               if ( $errorMsg != '' ) {
                        $this->show( $errorMsg );
                        return false;
                }
@@ -356,7 +358,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,7 +370,7 @@ 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>" .
@@ -412,7 +414,7 @@ class ProtectionForm {
                                wfMessage( 'protect-othertime-op' )->text(),
                                "othertime"
                        ) . "\n";
-                       foreach( explode( ',', $scExpiryOptions ) as $option ) {
+                       foreach ( explode( ',', $scExpiryOptions ) as $option ) {
                                if ( strpos( $option, ":" ) === false ) {
                                        $show = $value = $option;
                                } else {
@@ -423,7 +425,7 @@ class ProtectionForm {
                                $expiryFormOptions .= Xml::option( $show, $value, $this->mExpirySelection[$action] === $value ) . "\n";
                        }
                        # Add expiry dropdown
-                       if( $showProtectOptions && !$this->disabled ) {
+                       if ( $showProtectOptions && !$this->disabled ) {
                                $out .= "
                                        <table><tr>
                                                <td class='mw-label'>
@@ -463,7 +465,7 @@ class ProtectionForm {
                $out .= Xml::closeElement( 'tbody' ) . Xml::closeElement( 'table' );
 
                // JavaScript will add another row with a value-chaining checkbox
-               if( $this->mTitle->exists() ) {
+               if ( $this->mTitle->exists() ) {
                        $out .= Xml::openElement( 'table', array( 'id' => 'mw-protect-table2' ) ) .
                                Xml::openElement( 'tbody' );
                        $out .= '<tr>
@@ -481,7 +483,7 @@ class ProtectionForm {
                }
 
                # Add manual and custom reason field/selects as well as submit
-               if( !$this->disabled ) {
+               if ( !$this->disabled ) {
                        $out .= Xml::openElement( 'table', array( 'id' => 'mw-protect-table3' ) ) .
                                Xml::openElement( 'tbody' );
                        $out .= "
@@ -506,7 +508,7 @@ class ProtectionForm {
                                        "</td>
                                </tr>";
                        # Disallow watching is user is not logged in
-                       if( $wgUser->isLoggedIn() ) {
+                       if ( $wgUser->isLoggedIn() ) {
                                $out .= "
                                <tr>
                                        <td></td>
@@ -562,15 +564,17 @@ class ProtectionForm {
                global $wgRestrictionLevels, $wgUser;
 
                $levels = array();
-               foreach( $wgRestrictionLevels as $key ) {
+               foreach ( $wgRestrictionLevels as $key ) {
                        //don't let them choose levels above their own (aka so they can still unprotect and edit the page). but only when the form isn't disabled
-                       if( $key == 'sysop' ) {
+                       if ( $key == 'sysop' ) {
                                //special case, rewrite sysop to protect and editprotected
-                               if( !$wgUser->isAllowedAny( 'protect', 'editprotected' ) && !$this->disabled )
+                               if ( !$wgUser->isAllowedAny( 'protect', 'editprotected' ) && !$this->disabled ) {
                                        continue;
+                               }
                        } else {
-                               if( !$wgUser->isAllowed( $key ) && !$this->disabled )
+                               if ( !$wgUser->isAllowed( $key ) && !$this->disabled ) {
                                        continue;
+                               }
                        }
                        $levels[] = $key;
                }
@@ -584,7 +588,7 @@ class ProtectionForm {
                        ) + $this->disabledAttrib;
 
                $out = Xml::openElement( 'select', $attribs );
-               foreach( $levels as $key ) {
+               foreach ( $levels as $key ) {
                        $out .= Xml::option( $this->getOptionLabel( $key ), $key, $key == $selected );
                }
                $out .= Xml::closeElement( 'select' );
@@ -598,11 +602,11 @@ class ProtectionForm {
         * @return String
         */
        private function getOptionLabel( $permission ) {
-               if( $permission == '' ) {
+               if ( $permission == '' ) {
                        return wfMessage( 'protect-default' )->text();
                } else {
                        $msg = wfMessage( "protect-level-{$permission}" );
-                       if( $msg->exists() ) {
+                       if ( $msg->exists() ) {
                                return $msg->text();
                        }
                        return wfMessage( 'protect-fallback', $permission )->text();
@@ -613,7 +617,7 @@ class ProtectionForm {
                global $wgRestrictionLevels, $wgOut;
 
                $cascadeableLevels = array();
-               foreach( $wgRestrictionLevels as $key ) {
+               foreach ( $wgRestrictionLevels as $key ) {
                        if ( User::groupHasPermission( $key, 'protect' )
                                || $key == 'protect'
                        ) {
index a4a1ffb..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,
index faad391..b5d4a1c 100644 (file)
@@ -825,6 +825,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 ) {
index 3ea5da4..1a7d825 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,7 +554,7 @@ 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
 
@@ -714,10 +714,10 @@ class Revision implements IDBAccessObject {
         * @return Title|null
         */
        public function getTitle() {
-               if( isset( $this->mTitle ) ) {
+               if ( isset( $this->mTitle ) ) {
                        return $this->mTitle;
                }
-               if( !is_null( $this->mId ) ) { //rev_id is defined as NOT NULL, but this revision may not yet have been inserted.
+               if ( !is_null( $this->mId ) ) { //rev_id is defined as NOT NULL, but this revision may not yet have been inserted.
                        $dbr = wfGetDB( DB_SLAVE );
                        $row = $dbr->selectRow(
                                array( 'page', 'revision' ),
@@ -769,9 +769,9 @@ class Revision implements IDBAccessObject {
         * @return Integer
         */
        public function getUser( $audience = self::FOR_PUBLIC, User $user = null ) {
-               if( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_USER ) ) {
+               if ( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_USER ) ) {
                        return 0;
-               } elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_USER, $user ) ) {
+               } elseif ( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_USER, $user ) ) {
                        return 0;
                } else {
                        return $this->mUser;
@@ -801,9 +801,9 @@ class Revision implements IDBAccessObject {
         * @return string
         */
        public function getUserText( $audience = self::FOR_PUBLIC, User $user = null ) {
-               if( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_USER ) ) {
+               if ( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_USER ) ) {
                        return '';
-               } elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_USER, $user ) ) {
+               } elseif ( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_USER, $user ) ) {
                        return '';
                } else {
                        return $this->getRawUserText();
@@ -841,9 +841,9 @@ class Revision implements IDBAccessObject {
         * @return String
         */
        function getComment( $audience = self::FOR_PUBLIC, User $user = null ) {
-               if( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_COMMENT ) ) {
+               if ( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_COMMENT ) ) {
                        return '';
-               } elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_COMMENT, $user ) ) {
+               } elseif ( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_COMMENT, $user ) ) {
                        return '';
                } else {
                        return $this->mComment;
@@ -870,17 +870,17 @@ class Revision implements IDBAccessObject {
         * @return Integer rcid of the unpatrolled row, zero if there isn't one
         */
        public function isUnpatrolled() {
-               if( $this->mUnpatrolled !== null ) {
+               if ( $this->mUnpatrolled !== null ) {
                        return $this->mUnpatrolled;
                }
                $dbr = wfGetDB( DB_SLAVE );
                $this->mUnpatrolled = $dbr->selectField( 'recentchanges',
                        'rc_id',
                        array( // Add redundant user,timestamp condition so we can use the existing index
-                               'rc_user_text'  => $this->getRawUserText(),
-                               'rc_timestamp'  => $dbr->timestamp( $this->getTimestamp() ),
+                               'rc_user_text' => $this->getRawUserText(),
+                               'rc_timestamp' => $dbr->timestamp( $this->getTimestamp() ),
                                'rc_this_oldid' => $this->getId(),
-                               'rc_patrolled'  => 0
+                               'rc_patrolled' => 0
                        ),
                        __METHOD__
                );
@@ -943,9 +943,9 @@ class Revision implements IDBAccessObject {
         * @return Content|null
         */
        public function getContent( $audience = self::FOR_PUBLIC, User $user = null ) {
-               if( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_TEXT ) ) {
+               if ( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_TEXT ) ) {
                        return null;
-               } elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_TEXT, $user ) ) {
+               } elseif ( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_TEXT, $user ) ) {
                        return null;
                } else {
                        return $this->getContentInternal();
@@ -996,9 +996,9 @@ class Revision implements IDBAccessObject {
         * @return Content|null the Revision's content, or null on failure.
         */
        protected function getContentInternal() {
-               if( is_null( $this->mContent ) ) {
+               if ( is_null( $this->mContent ) ) {
                        // Revision is immutable. Load on demand:
-                       if( is_null( $this->mText ) ) {
+                       if ( is_null( $this->mText ) ) {
                                $this->mText = $this->loadText();
                        }
 
@@ -1097,9 +1097,9 @@ class Revision implements IDBAccessObject {
         * @return Revision|null
         */
        public function getPrevious() {
-               if( $this->getTitle() ) {
+               if ( $this->getTitle() ) {
                        $prev = $this->getTitle()->getPreviousRevisionID( $this->getId() );
-                       if( $prev ) {
+                       if ( $prev ) {
                                return self::newFromTitle( $this->getTitle(), $prev );
                        }
                }
@@ -1112,7 +1112,7 @@ class Revision implements IDBAccessObject {
         * @return Revision or null
         */
        public function getNext() {
-               if( $this->getTitle() ) {
+               if ( $this->getTitle() ) {
                        $next = $this->getTitle()->getNextRevisionID( $this->getId() );
                        if ( $next ) {
                                return self::newFromTitle( $this->getTitle(), $next );
@@ -1129,11 +1129,11 @@ class Revision implements IDBAccessObject {
         * @return Integer
         */
        private function getPreviousRevisionId( $db ) {
-               if( is_null( $this->mPage ) ) {
+               if ( is_null( $this->mPage ) ) {
                        return 0;
                }
                # Use page_latest if ID is not given
-               if( !$this->mId ) {
+               if ( !$this->mId ) {
                        $prevId = $db->selectField( 'page', 'page_latest',
                                array( 'page_id' => $this->mPage ),
                                __METHOD__ );
@@ -1166,13 +1166,13 @@ class Revision implements IDBAccessObject {
                $textField = $prefix . 'text';
                $flagsField = $prefix . 'flags';
 
-               if( isset( $row->$flagsField ) ) {
+               if ( isset( $row->$flagsField ) ) {
                        $flags = explode( ',', $row->$flagsField );
                } else {
                        $flags = array();
                }
 
-               if( isset( $row->$textField ) ) {
+               if ( isset( $row->$textField ) ) {
                        $text = $row->$textField;
                } else {
                        wfProfileOut( __METHOD__ );
@@ -1183,7 +1183,7 @@ class Revision implements IDBAccessObject {
                if ( in_array( 'external', $flags ) ) {
                        $url = $text;
                        $parts = explode( '://', $url, 2 );
-                       if( count( $parts ) == 1 || $parts[1] == '' ) {
+                       if ( count( $parts ) == 1 || $parts[1] == '' ) {
                                wfProfileOut( __METHOD__ );
                                return false;
                        }
@@ -1192,14 +1192,14 @@ class Revision implements IDBAccessObject {
 
                // If the text was fetched without an error, convert it
                if ( $text !== false ) {
-                       if( in_array( 'gzip', $flags ) ) {
+                       if ( in_array( 'gzip', $flags ) ) {
                                # Deal with optional compression of archived pages.
                                # This can be done periodically via maintenance/compressOld.php, and
                                # as pages are saved if $wgCompressRevisions is set.
                                $text = gzinflate( $text );
                        }
 
-                       if( in_array( 'object', $flags ) ) {
+                       if ( in_array( 'object', $flags ) ) {
                                # Generic compressed storage
                                $obj = unserialize( $text );
                                if ( !is_object( $obj ) ) {
@@ -1211,7 +1211,7 @@ class Revision implements IDBAccessObject {
                        }
 
                        global $wgLegacyEncoding;
-                       if( $text !== false && $wgLegacyEncoding
+                       if ( $text !== false && $wgLegacyEncoding
                                && !in_array( 'utf-8', $flags ) && !in_array( 'utf8', $flags ) )
                        {
                                # Old revisions kept around in a legacy encoding?
@@ -1244,8 +1244,8 @@ class Revision implements IDBAccessObject {
                # on load if $wgLegacyCharset is set in the future.
                $flags[] = 'utf-8';
 
-               if( $wgCompressRevisions ) {
-                       if( function_exists( 'gzdeflate' ) ) {
+               if ( $wgCompressRevisions ) {
+                       if ( function_exists( 'gzdeflate' ) ) {
                                $text = gzdeflate( $text );
                                $flags[] = 'gzip';
                        } else {
@@ -1274,33 +1274,35 @@ class Revision implements IDBAccessObject {
                $flags = self::compressRevisionText( $data );
 
                # Write to external storage if required
-               if( $wgDefaultExternalStore ) {
+               if ( $wgDefaultExternalStore ) {
                        // Store and get the URL
                        $data = ExternalStore::insertToDefault( $data );
-                       if( !$data ) {
+                       if ( !$data ) {
                                wfProfileOut( __METHOD__ );
                                throw new MWException( "Unable to store text to external storage" );
                        }
-                       if( $flags ) {
+                       if ( $flags ) {
                                $flags .= ',';
                        }
                        $flags .= 'external';
                }
 
                # Record the text (or external storage URL) to the text table
-               if( !isset( $this->mTextId ) ) {
+               if ( !isset( $this->mTextId ) ) {
                        $old_id = $dbw->nextSequenceValue( 'text_old_id_seq' );
                        $dbw->insert( 'text',
                                array(
-                                       'old_id'    => $old_id,
-                                       'old_text'  => $data,
+                                       'old_id' => $old_id,
+                                       'old_text' => $data,
                                        'old_flags' => $flags,
                                ), __METHOD__
                        );
                        $this->mTextId = $dbw->insertId();
                }
 
-               if ( $this->mComment === null ) $this->mComment = "";
+               if ( $this->mComment === null ) {
+                       $this->mComment = "";
+               }
 
                # Record the edit in revisions
                $rev_id = isset( $this->mId )
@@ -1424,9 +1426,9 @@ class Revision implements IDBAccessObject {
                global $wgRevisionCacheExpiry, $wgMemc;
                $textId = $this->getTextId();
                $key = wfMemcKey( 'revisiontext', 'textid', $textId );
-               if( $wgRevisionCacheExpiry ) {
+               if ( $wgRevisionCacheExpiry ) {
                        $text = $wgMemc->get( $key );
-                       if( is_string( $text ) ) {
+                       if ( is_string( $text ) ) {
                                wfDebug( __METHOD__ . ": got id $textId from cache\n" );
                                wfProfileOut( __METHOD__ );
                                return $text;
@@ -1441,7 +1443,7 @@ class Revision implements IDBAccessObject {
                        $row = null;
                }
 
-               if( !$row ) {
+               if ( !$row ) {
                        // Text data is immutable; check slaves first.
                        $dbr = wfGetDB( DB_SLAVE );
                        $row = $dbr->selectRow( 'text',
@@ -1450,7 +1452,7 @@ class Revision implements IDBAccessObject {
                                __METHOD__ );
                }
 
-               if( !$row && wfGetLB()->getServerCount() > 1 ) {
+               if ( !$row && wfGetLB()->getServerCount() > 1 ) {
                        // Possible slave lag!
                        $dbw = wfGetDB( DB_MASTER );
                        $row = $dbw->selectRow( 'text',
@@ -1462,7 +1464,7 @@ class Revision implements IDBAccessObject {
                $text = self::getRevisionText( $row );
 
                # No negative caching -- negative hits on text rows may be due to corrupted slave servers
-               if( $wgRevisionCacheExpiry && $text !== false ) {
+               if ( $wgRevisionCacheExpiry && $text !== false ) {
                        $wgMemc->set( $key, $text, $wgRevisionCacheExpiry );
                }
 
@@ -1507,7 +1509,7 @@ class Revision implements IDBAccessObject {
                                ),
                        __METHOD__ );
 
-               if( $current ) {
+               if ( $current ) {
                        $row = array(
                                'page'       => $pageId,
                                'comment'    => $summary,
@@ -1560,7 +1562,7 @@ class Revision implements IDBAccessObject {
         * @return Boolean
         */
        public static function userCanBitfield( $bitfield, $field, User $user = null ) {
-               if( $bitfield & $field ) { // aspect is deleted
+               if ( $bitfield & $field ) { // aspect is deleted
                        if ( $bitfield & self::DELETED_RESTRICTED ) {
                                $permission = 'suppressrevision';
                        } elseif ( $field & self::DELETED_TEXT ) {
@@ -1613,7 +1615,7 @@ class Revision implements IDBAccessObject {
        static function countByPageId( $db, $id ) {
                $row = $db->selectRow( 'revision', array( 'revCount' => 'COUNT(*)' ),
                        array( 'rev_page' => $id ), __METHOD__ );
-               if( $row ) {
+               if ( $row ) {
                        return $row->revCount;
                }
                return 0;
@@ -1628,7 +1630,7 @@ class Revision implements IDBAccessObject {
         */
        static function countByTitle( $db, $title ) {
                $id = $title->getArticleID();
-               if( $id ) {
+               if ( $id ) {
                        return self::countByPageId( $db, $id );
                }
                return 0;
@@ -1650,7 +1652,9 @@ class Revision implements IDBAccessObject {
         * @return bool True if the given user was the only one to edit since the given timestamp
         */
        public static function userWasLastToEdit( $db, $pageId, $userId, $since ) {
-               if ( !$userId ) return false;
+               if ( !$userId ) {
+                       return false;
+               }
 
                if ( is_int( $db ) ) {
                        $db = wfGetDB( $db );
index 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..e757021 100644 (file)
@@ -405,7 +405,7 @@ class Sanitizer {
                                '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 +446,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 +537,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 +572,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 +606,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 +623,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.
@@ -714,7 +715,7 @@ class Sanitizer {
                $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 ) ) {
@@ -731,7 +732,7 @@ class Sanitizer {
 
                        # 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 );
                        }
 
@@ -800,9 +801,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 ) );
@@ -925,7 +927,7 @@ class Sanitizer {
         * @return String
         */
        static function fixTagAttributes( $text, $element ) {
-               if( trim( $text ) == '' ) {
+               if ( trim( $text ) == '' ) {
                        return '';
                }
 
@@ -933,7 +935,7 @@ class Sanitizer {
                $stripped = Sanitizer::validateTagAttributes( $decoded, $element );
 
                $attribs = array();
-               foreach( $stripped as $attribute => $value ) {
+               foreach ( $stripped as $attribute => $value ) {
                        $encAttribute = htmlspecialchars( $attribute );
                        $encValue = Sanitizer::safeEncodeAttribute( $value );
 
@@ -1111,13 +1113,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 +1127,7 @@ class Sanitizer {
                        return $attribs;
                }
 
-               foreach( $pairs as $set ) {
+               foreach ( $pairs as $set ) {
                        $attribute = strtolower( $set[1] );
                        $value = Sanitizer::getTagAttributeCallback( $set );
 
@@ -1148,19 +1150,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 +1238,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 +1281,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 +1294,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;
@@ -1356,11 +1358,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 +1377,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 +1396,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;";
@@ -1662,7 +1664,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 +1686,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.
@@ -1754,7 +1756,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 08ab143..1ceee49 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,7 +340,7 @@ if ( !$wgEnotifMinorEdits ) {
 }
 
 # $wgDisabledActions is deprecated as of 1.18
-foreach( $wgDisabledActions as $action ) {
+foreach ( $wgDisabledActions as $action ) {
        $wgActions[$action] = false;
 }
 
@@ -432,7 +450,7 @@ if ( is_null( $wgLocaltimezone ) ) {
 }
 
 date_default_timezone_set( $wgLocaltimezone );
-if( is_null( $wgLocalTZoffset ) ) {
+if ( is_null( $wgLocalTZoffset ) ) {
        $wgLocalTZoffset = date( 'Z' ) / 60;
 }
 
@@ -538,10 +556,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..63c3d34 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 ) == '+' ) {
@@ -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 4de7333..66bc9ee 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,7 +226,7 @@ class SiteStats {
         * @return bool
         */
        private static function isSane( $row ) {
-               if(
+               if (
                        $row === false
                        || $row->ss_total_pages < $row->ss_good_articles
                        || $row->ss_total_edits < $row->ss_total_pages
@@ -234,9 +234,9 @@ class SiteStats {
                        return false;
                }
                // Now check for underflow/overflow
-               foreach( array( 'total_views', 'total_edits', 'good_articles',
+               foreach ( array( 'total_views', 'total_edits', 'good_articles',
                'total_pages', 'users', 'images' ) as $member ) {
-                       if(
+                       if (
                                $row->{"ss_$member"} > 2000000000
                                || $row->{"ss_$member"} < 0
                        ) {
@@ -592,19 +592,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..1aa1f05 100644 (file)
@@ -81,7 +81,7 @@ 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;
@@ -291,7 +291,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 +668,7 @@ abstract class Skin extends ContextSource {
 
                                                if ( $c > 1 ) {
                                                        $subpages .= $wgLang->getDirMarkEntity() . $this->msg( 'pipe-separator' )->escaped();
-                                               } else  {
+                                               } else {
                                                        $subpages .= '&lt; ';
                                                }
 
@@ -1015,7 +1015,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 +1294,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 +1353,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 +1381,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 +1401,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 +1421,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 +1542,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 9014c7f..e53d424 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,6 +122,49 @@ class SkinTemplate extends Skin {
                return new $classname();
        }
 
+       /**
+        * Generates array of language links for the current page
+        *
+        * @return array
+        * @public
+        */
+       public function getLanguages() {
+               global $wgHideInterlanguageLinks;
+               $out = $this->getOutput();
+
+               # Language links
+               $language_urls = array();
+
+               if ( !$wgHideInterlanguageLinks ) {
+                       foreach ( $out->getLanguageLinks() as $languageLinkText ) {
+                               $languageLinkParts = explode( ':', $languageLinkText, 2 );
+                               $class = 'interwiki-' . $languageLinkParts[0];
+                               unset( $languageLinkParts );
+                               $languageLinkTitle = Title::newFromText( $languageLinkText );
+                               if ( $languageLinkTitle ) {
+                                       $ilInterwikiCode = $languageLinkTitle->getInterwiki();
+                                       $ilLangName = Language::fetchLanguageName( $ilInterwikiCode );
+
+                                       if ( strval( $ilLangName ) === '' ) {
+                                               $ilLangName = $languageLinkText;
+                                       } else {
+                                               $ilLangName = $this->formatLanguageName( $ilLangName );
+                                       }
+
+                                       $language_urls[] = array(
+                                               'href' => $languageLinkTitle->getFullURL(),
+                                               'text' => $ilLangName,
+                                               'title' => $languageLinkTitle->getText(),
+                                               'class' => $class,
+                                               'lang' => $ilInterwikiCode,
+                                               'hreflang' => $ilInterwikiCode
+                                       );
+                               }
+                       }
+               }
+               return $language_urls;
+       }
+
        /**
         * initialize various variables and generate the template
         *
@@ -132,7 +175,7 @@ class SkinTemplate extends Skin {
                global $wgScript, $wgStylePath;
                global $wgMimeType, $wgJsMimeType;
                global $wgXhtmlDefaultNamespace, $wgXhtmlNamespaces, $wgHtml5Version;
-               global $wgDisableCounters, $wgSitename, $wgLogo, $wgHideInterlanguageLinks;
+               global $wgDisableCounters, $wgSitename, $wgLogo;
                global $wgMaxCredits, $wgShowCreditsIfMax;
                global $wgPageShowWatchingUsers;
                global $wgArticlePath, $wgScriptPath, $wgServer;
@@ -229,9 +272,9 @@ class SkinTemplate extends Skin {
                }
 
                $tpl->set( 'catlinks', $this->getCategories() );
-               if( $out->isSyndicated() ) {
+               if ( $out->isSyndicated() ) {
                        $feeds = array();
-                       foreach( $out->getSyndicationLinks() as $format => $link ) {
+                       foreach ( $out->getSyndicationLinks() as $format => $link ) {
                                $feeds[$format] = array(
                                        'text' => $this->msg( "feed-$format" )->text(),
                                        'href' => $link
@@ -409,36 +452,7 @@ class SkinTemplate extends Skin {
                $out->mBodytext = Html::rawElement( 'div', $realBodyAttribs, $out->mBodytext );
                $tpl->setRef( 'bodytext', $out->mBodytext );
 
-               # Language links
-               $language_urls = array();
-
-               if ( !$wgHideInterlanguageLinks ) {
-                       foreach( $out->getLanguageLinks() as $languageLinkText ) {
-                               $languageLinkParts = explode( ':', $languageLinkText, 2 );
-                               $class = 'interwiki-' . $languageLinkParts[0];
-                               unset( $languageLinkParts );
-                               $languageLinkTitle = Title::newFromText( $languageLinkText );
-                               if ( $languageLinkTitle ) {
-                                       $ilInterwikiCode = $languageLinkTitle->getInterwiki();
-                                       $ilLangName = Language::fetchLanguageName( $ilInterwikiCode );
-
-                                       if ( strval( $ilLangName ) === '' ) {
-                                               $ilLangName = $languageLinkText;
-                                       } else {
-                                               $ilLangName = $this->formatLanguageName( $ilLangName );
-                                       }
-
-                                       $language_urls[] = array(
-                                               'href' => $languageLinkTitle->getFullURL(),
-                                               'text' => $ilLangName,
-                                               'title' => $languageLinkTitle->getText(),
-                                               'class' => $class,
-                                               'lang' => $ilInterwikiCode,
-                                               'hreflang' => $ilInterwikiCode
-                                       );
-                               }
-                       }
-               }
+               $language_urls = $this->getLanguages();
                if ( count( $language_urls ) ) {
                        $tpl->setRef( 'language_urls', $language_urls );
                } else {
@@ -469,7 +483,7 @@ class SkinTemplate extends Skin {
                $tpl->set( 'reporttime', wfReportTime() );
 
                // original version by hansm
-               if( !wfRunHooks( 'SkinTemplateOutputPageBeforeExec', array( &$this, &$tpl ) ) ) {
+               if ( !wfRunHooks( 'SkinTemplateOutputPageBeforeExec', array( &$this, &$tpl ) ) ) {
                        wfDebug( __METHOD__ . ": Hook SkinTemplateOutputPageBeforeExec broke outputPage execution!\n" );
                }
 
@@ -568,7 +582,7 @@ class SkinTemplate extends Skin {
                if ( strval( $page ) !== '' ) {
                        $a['returnto'] = $page;
                        $query = $request->getVal( 'returntoquery', $this->thisquery );
-                       if( $query != '' ) {
+                       if ( $query != '' ) {
                                $a['returntoquery'] = $query;
                        }
                }
@@ -578,7 +592,7 @@ class SkinTemplate extends Skin {
                }
 
                $returnto = wfArrayToCgi( $a );
-               if( $this->loggedin ) {
+               if ( $this->loggedin ) {
                        $personal_urls['userpage'] = array(
                                'text' => $this->username,
                                'href' => &$this->userpageUrlDetails['href'],
@@ -614,7 +628,7 @@ class SkinTemplate extends Skin {
                        # thickens, because the Title object is altered for special pages,
                        # so it doesn't contain the original alias-with-subpage.
                        $origTitle = Title::newFromText( $request->getText( 'title' ) );
-                       if( $origTitle instanceof Title && $origTitle->isSpecialPage() ) {
+                       if ( $origTitle instanceof Title && $origTitle->isSpecialPage() ) {
                                list( $spName, $spPar ) = SpecialPageFactory::resolveAlias( $origTitle->getText() );
                                $active = $spName == 'Contributions'
                                        && ( ( $spPar && $spPar == $this->username )
@@ -662,7 +676,7 @@ class SkinTemplate extends Skin {
                                'class' => $wgSecureLogin ? 'link-https' : ''
                        );
 
-                       if( $this->showIPinHeader() ) {
+                       if ( $this->showIPinHeader() ) {
                                $href = &$this->userpageUrlDetails['href'];
                                $personal_urls['anonuserpage'] = array(
                                        'text' => $this->username,
@@ -705,10 +719,10 @@ class SkinTemplate extends Skin {
         */
        function tabAction( $title, $message, $selected, $query = '', $checkEdit = false ) {
                $classes = array();
-               if( $selected ) {
+               if ( $selected ) {
                        $classes[] = 'selected';
                }
-               if( $checkEdit && !$title->isKnown() ) {
+               if ( $checkEdit && !$title->isKnown() ) {
                        $classes[] = 'new';
                        if ( $query !== '' ) {
                                $query = 'action=edit&redlink=1&' . $query;
@@ -733,7 +747,7 @@ class SkinTemplate extends Skin {
                }
 
                $result = array();
-               if( !wfRunHooks( 'SkinTemplateTabAction', array( &$this,
+               if ( !wfRunHooks( 'SkinTemplateTabAction', array( &$this,
                                $title, $message, $selected, $checkEdit,
                                &$classes, &$query, &$text, &$result ) ) ) {
                        return $result;
@@ -748,7 +762,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();
@@ -831,7 +845,7 @@ class SkinTemplate extends Skin {
                wfRunHooks( 'SkinTemplatePreventOtherActiveTabs', array( &$this, &$preventActiveTabs ) );
 
                // Checks if page is some kind of content
-               if( $title->canExist() ) {
+               if ( $title->canExist() ) {
                        // Gets page objects for the related namespaces
                        $subjectPage = $title->getSubjectPage();
                        $talkPage = $title->getTalkPage();
@@ -1018,14 +1032,9 @@ class SkinTemplate extends Skin {
                                                $params = array();
                                        }
                                        // Loops over each variant
-                                       foreach( $variants as $code ) {
+                                       foreach ( $variants as $code ) {
                                                // Gets variant name from language code
                                                $varname = $pageLang->getVariantname( $code );
-                                               // Checks if the variant is marked as disabled
-                                               if( $varname == 'disable' ) {
-                                                       // Skips this variant
-                                                       continue;
-                                               }
                                                // Appends variant link
                                                $content_navigation['variants'][] = array(
                                                        'class' => ( $code == $preferred ) ? 'selected' : false,
@@ -1156,9 +1165,9 @@ class SkinTemplate extends Skin {
 
                $nav_urls = array();
                $nav_urls['mainpage'] = array( 'href' => self::makeMainPageUrl() );
-               if( $wgUploadNavigationUrl ) {
+               if ( $wgUploadNavigationUrl ) {
                        $nav_urls['upload'] = array( 'href' => $wgUploadNavigationUrl );
-               } elseif( UploadBase::isEnabled() && UploadBase::isAllowed( $this->getUser() ) === true ) {
+               } elseif ( UploadBase::isEnabled() && UploadBase::isAllowed( $this->getUser() ) === true ) {
                        $nav_urls['upload'] = array( 'href' => self::makeSpecialUrl( 'Upload' ) );
                } else {
                        $nav_urls['upload'] = false;
@@ -1508,8 +1517,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 +1558,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 +1630,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 +1819,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 +1827,7 @@ abstract class BaseTemplate extends QuickTemplate {
        }
 
        function makeSearchButton( $mode, $attrs = array() ) {
-               switch( $mode ) {
+               switch ( $mode ) {
                        case 'go':
                        case 'fulltext':
                                $realAttrs = array(
@@ -1872,10 +1883,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..c2814e6 100644 (file)
@@ -445,7 +445,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 +457,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 +469,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 +481,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 +493,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
@@ -917,11 +932,20 @@ 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
index a53b901..3c4e61d 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';
                        }
 
@@ -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 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 d8ea24a..64a3c60 100644 (file)
@@ -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'],
@@ -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 21a392a..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;
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..70e8cd4 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 );
        }
 
        /**
@@ -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" );
@@ -1954,8 +1960,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 +1993,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 +2042,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 +2055,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 +2143,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 +2228,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 );
@@ -2446,7 +2423,7 @@ class Title {
                $restrictionTypes = $this->getRestrictionTypes();
 
                # Special pages have inherent protection
-               if( $this->isSpecialPage() ) {
+               if ( $this->isSpecialPage() ) {
                        return true;
                }
 
@@ -2693,7 +2670,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 +2689,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 +2777,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
+                       );
+               } );
        }
 
        /**
@@ -3302,7 +3282,7 @@ class Title {
                        array(
                                "{$prefix}_from=page_id",
                                "{$prefix}_namespace" => $this->getNamespace(),
-                               "{$prefix}_title"     => $this->getDBkey() ),
+                               "{$prefix}_title" => $this->getDBkey() ),
                        __METHOD__,
                        $options
                );
@@ -3367,7 +3347,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' ),
@@ -3712,12 +3694,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 +3813,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 +3843,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 +3948,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 +4004,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 +4306,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 +4401,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
@@ -4509,14 +4493,15 @@ class Title {
                        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 );
index 6219b3d..20ec302 100644 (file)
@@ -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 ed97deb..d114b99 100644 (file)
@@ -286,7 +286,7 @@ class User {
                                $this->loadFromId();
                                break;
                        case 'session':
-                               if( !$this->loadFromSession() ) {
+                               if ( !$this->loadFromSession() ) {
                                        // Loading from session failed. Load defaults.
                                        $this->loadDefaults();
                                }
@@ -426,7 +426,7 @@ class User {
                        'user_email_token' => md5( $code ),
                        'user_email_token_expires > ' . $dbr->addQuotes( $dbr->timestamp() ),
                        ) );
-               if( $id !== false ) {
+               if ( $id !== false ) {
                        return User::newFromId( $id );
                } else {
                        return null;
@@ -495,7 +495,7 @@ class User {
         */
        public static function idFromName( $name ) {
                $nt = Title::makeTitleSafe( NS_USER, $name );
-               if( is_null( $nt ) ) {
+               if ( is_null( $nt ) ) {
                        # Illegal name
                        return null;
                }
@@ -576,7 +576,7 @@ class User {
                // Ensure that the name can't be misresolved as a different title,
                // such as with extra namespace keys at the start.
                $parsed = Title::newFromText( $name );
-               if( is_null( $parsed )
+               if ( is_null( $parsed )
                        || $parsed->getNamespace()
                        || strcmp( $name, $parsed->getPrefixedText() ) ) {
                        wfDebugLog( 'username', __METHOD__ .
@@ -594,7 +594,7 @@ class User {
                        '\x{3000}' .          # ideographic space
                        '\x{e000}-\x{f8ff}' . # private use
                        ']/u';
-               if( preg_match( $unicodeBlacklist, $name ) ) {
+               if ( preg_match( $unicodeBlacklist, $name ) ) {
                        wfDebugLog( 'username', __METHOD__ .
                                ": '$name' invalid due to blacklisted characters" );
                        return false;
@@ -657,15 +657,15 @@ class User {
                // Ensure that the username isn't longer than 235 bytes, so that
                // (at least for the builtin skins) user javascript and css files
                // will work. (bug 23080)
-               if( strlen( $name ) > 235 ) {
+               if ( strlen( $name ) > 235 ) {
                        wfDebugLog( 'username', __METHOD__ .
                                ": '$name' invalid due to length" );
                        return false;
                }
 
                // Preg yells if you try to give it an empty string
-               if( $wgInvalidUsernameCharacters !== '' ) {
-                       if( preg_match( '/[' . preg_quote( $wgInvalidUsernameCharacters, '/' ) . ']/', $name ) ) {
+               if ( $wgInvalidUsernameCharacters !== '' ) {
+                       if ( preg_match( '/[' . preg_quote( $wgInvalidUsernameCharacters, '/' ) . ']/', $name ) ) {
                                wfDebugLog( 'username', __METHOD__ .
                                        ": '$name' invalid due to wgInvalidUsernameCharacters" );
                                return false;
@@ -702,11 +702,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 +720,7 @@ class User {
                                //a valid password.
                                return true;
                        }
-               } elseif( $result === true ) {
+               } elseif ( $result === true ) {
                        return true;
                } else {
                        return $result; //the isValidPassword hook set a string $result and returned true
@@ -779,14 +780,15 @@ class User {
                # 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
                $t = ( $validate === 'valid' ) ?
                        Title::newFromText( $name ) : Title::makeTitle( NS_USER, $name );
                # Check for invalid titles
-               if( is_null( $t ) ) {
+               if ( is_null( $t ) ) {
                        return false;
                }
 
@@ -870,7 +872,7 @@ class User {
                $this->mOptionsLoaded = false;
 
                $loggedOut = $this->getRequest()->getCookie( 'LoggedOut' );
-               if( $loggedOut !== null ) {
+               if ( $loggedOut !== null ) {
                        $this->mTouched = wfTimestamp( TS_MW, $loggedOut );
                } else {
                        $this->mTouched = '1'; # Allow any pages to be cached
@@ -934,7 +936,7 @@ class User {
 
                if ( $cookieId !== null ) {
                        $sId = intval( $cookieId );
-                       if( $sessId !== null && $cookieId != $sessId ) {
+                       if ( $sessId !== null && $cookieId != $sessId ) {
                                wfDebugLog( 'loginSessions', "Session user ID ($sessId) and
                                        cookie user ID ($sId) don't match!" );
                                return false;
@@ -962,7 +964,7 @@ class User {
                }
 
                global $wgBlockDisablesLogin;
-               if( $wgBlockDisablesLogin && $proposedUser->isBlocked() ) {
+               if ( $wgBlockDisablesLogin && $proposedUser->isBlocked() ) {
                        # User blocked and we've disabled blocked user logins
                        return false;
                }
@@ -1004,7 +1006,7 @@ class User {
                $this->mId = intval( $this->mId );
 
                /** Anonymous user */
-               if( !$this->mId ) {
+               if ( !$this->mId ) {
                        $this->loadDefaults();
                        return false;
                }
@@ -1228,7 +1230,7 @@ class User {
                # default language setting
                $defOpt['variant'] = $wgContLang->getCode();
                $defOpt['language'] = $wgContLang->getCode();
-               foreach( SearchEngine::searchableNamespaces() as $nsnum => $nsname ) {
+               foreach ( SearchEngine::searchableNamespaces() as $nsnum => $nsname ) {
                        $defOpt['searchNs' . $nsnum] = !empty( $wgNamespacesToBeSearchedDefault[$nsnum] );
                }
                $defOpt['skin'] = $wgDefaultSkin;
@@ -1246,7 +1248,7 @@ class User {
         */
        public static function getDefaultOption( $opt ) {
                $defOpts = self::getDefaultOptions();
-               if( isset( $defOpts[$opt] ) ) {
+               if ( isset( $defOpts[$opt] ) ) {
                        return $defOpts[$opt];
                } else {
                        return null;
@@ -1356,11 +1358,13 @@ class User {
                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 );
@@ -1378,15 +1382,15 @@ class User {
 
                $found = false;
                // @todo FIXME: IPv6 ???  (http://bugs.php.net/bug.php?id=33170)
-               if( IP::isIPv4( $ip ) ) {
+               if ( IP::isIPv4( $ip ) ) {
                        # Reverse IP, bug 21255
                        $ipReversed = implode( '.', array_reverse( explode( '.', $ip ) ) );
 
-                       foreach( (array)$bases as $base ) {
+                       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 ) {
+                               if ( is_array( $base ) ) {
+                                       if ( count( $base ) >= 2 ) {
                                                # Access key is 1, base URL is 0
                                                $host = "{$base[1]}.$ipReversed.{$base[0]}";
                                        } else {
@@ -1399,7 +1403,7 @@ class User {
                                # 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;
@@ -1454,7 +1458,7 @@ class User {
         */
        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.
@@ -1476,18 +1480,19 @@ class User {
        public function pingLimiter( $action = 'edit' ) {
                # 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() )
+               if ( !$this->isPingLimitable() ) {
                        return false;
+               }
 
                global $wgMemc, $wgRateLimitLog;
                wfProfileIn( __METHOD__ );
@@ -1498,22 +1503,22 @@ class User {
                $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'] ) ) {
                                $keys["mediawiki:limiter:$action:ip:$ip"] = $limits['ip'];
                        }
                        $matches = array();
-                       if( isset( $limits['subnet'] ) && preg_match( '/^(\d+\.\d+\.\d+)\.\d+$/', $ip, $matches ) ) {
+                       if ( isset( $limits['subnet'] ) && preg_match( '/^(\d+\.\d+\.\d+)\.\d+$/', $ip, $matches ) ) {
                                $subnet = $matches[1];
                                $keys["mediawiki:limiter:$action:subnet:$subnet"] = $limits['subnet'];
                        }
@@ -1529,20 +1534,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();
@@ -1645,13 +1651,13 @@ class User {
         * @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;
@@ -1666,7 +1672,7 @@ class User {
         * @return Bool True if locked, false otherwise
         */
        public function isLocked() {
-               if( $this->mLocked !== null ) {
+               if ( $this->mLocked !== null ) {
                        return $this->mLocked;
                }
                global $wgAuth;
@@ -1681,11 +1687,11 @@ class User {
         * @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();
@@ -1698,11 +1704,10 @@ class User {
         * @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();
                }
@@ -1770,21 +1775,21 @@ class User {
                $this->load();
 
                # Load the newtalk status if it is unloaded (mNewtalk=-1)
-               if( $this->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 ) {
+                       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 +1807,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,6 +1831,28 @@ 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 Integer 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
         *
@@ -1895,14 +1925,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 +1941,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 );
@@ -1947,7 +1977,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 +1999,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 +2009,7 @@ class User {
                                        $dbw->update( 'user',
                                                array( 'user_touched' => $dbw->timestamp( $touched ) ),
                                                array( 'user_id' => $userid, 'user_touched < ' . $encTouched ),
-                                               __METHOD__
+                                               $method
                                        );
                                }
                        } );
@@ -2025,12 +2056,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 +2075,7 @@ class User {
                        }
                }
 
-               if( !$wgAuth->setPassword( $this, $str ) ) {
+               if ( !$wgAuth->setPassword( $this, $str ) ) {
                        throw new PasswordError( wfMessage( 'externaldberror' )->text() );
                }
 
@@ -2064,7 +2095,7 @@ class User {
                $this->load();
                $this->setToken();
 
-               if( $str === null ) {
+               if ( $str === null ) {
                        // Save an invalid hash...
                        $this->mPassword = '';
                } else {
@@ -2157,7 +2188,7 @@ class User {
         */
        public function setEmail( $str ) {
                $this->load();
-               if( $str == $this->mEmail ) {
+               if ( $str == $this->mEmail ) {
                        return;
                }
                $this->mEmail = $str;
@@ -2241,7 +2272,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 +2298,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;
                        }
                }
@@ -2298,7 +2329,7 @@ class User {
         */
        public function getIntOption( $oname, $defaultOverride = 0 ) {
                $val = $this->getOption( $oname );
-               if( $val == '' ) {
+               if ( $val == '' ) {
                        $val = $defaultOverride;
                }
                return intval( $val );
@@ -2314,7 +2345,7 @@ class User {
                $this->loadOptions();
 
                // Explicitly NULL values should refer to defaults
-               if( is_null( $val ) ) {
+               if ( is_null( $val ) ) {
                        $val = self::getDefaultOption( $oname );
                }
 
@@ -2410,9 +2441,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';
@@ -2598,14 +2629,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;
                        }
                }
@@ -2632,7 +2663,7 @@ class User {
                                __METHOD__
                        );
 
-                       if( $count === null ) {
+                       if ( $count === null ) {
                                // it has not been initialized. do so.
                                $count = $this->initEditCount();
                        }
@@ -2648,9 +2679,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 +2693,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 +2708,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(
@@ -2723,8 +2757,8 @@ class User {
         */
        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 +2772,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;
                        }
                }
@@ -2756,10 +2790,11 @@ class User {
                        return true; // In the spirit of DWIM
                }
                # Patrolling may not be enabled
-               if( $action === 'patrol' || $action === 'autopatrol' ) {
+               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'
@@ -2781,7 +2816,7 @@ class User {
         */
        public function useNPPatrol() {
                global $wgUseRCPatrol, $wgUseNPPatrol;
-               return( ( $wgUseRCPatrol || $wgUseNPPatrol ) && ( $this->isAllowedAny( 'patrol', 'patrolmarks' ) ) );
+               return ( ( $wgUseRCPatrol || $wgUseNPPatrol ) && ( $this->isAllowedAny( 'patrol', 'patrolmarks' ) ) );
        }
 
        /**
@@ -2867,22 +2902,23 @@ class User {
                global $wgUseEnotif, $wgShowUpdatedMarker;
 
                # Do nothing if the database is locked to writes
-               if( wfReadOnly() ) {
+               if ( wfReadOnly() ) {
                        return;
                }
 
-               if( $title->getNamespace() == NS_USER_TALK &&
+               if ( $title->getNamespace() == NS_USER_TALK &&
                        $title->getText() == $this->getName() ) {
-                       if( !wfRunHooks( 'UserClearNewTalkNotification', array( &$this ) ) )
+                       if ( !wfRunHooks( 'UserClearNewTalkNotification', array( &$this ) ) ) {
                                return;
+                       }
                        $this->setNewtalk( false );
                }
 
-               if( !$wgUseEnotif && !$wgShowUpdatedMarker ) {
+               if ( !$wgUseEnotif && !$wgShowUpdatedMarker ) {
                        return;
                }
 
-               if( $this->isAnon() ) {
+               if ( $this->isAnon() ) {
                        // Nothing else to do...
                        return;
                }
@@ -2917,7 +2953,7 @@ class User {
                        return;
                }
                $id = $this->getId();
-               if( $id != 0 ) {
+               if ( $id != 0 ) {
                        $dbw = wfGetDB( DB_MASTER );
                        $dbw->update( 'watchlist',
                                array( /* SET */
@@ -2939,8 +2975,9 @@ class User {
         */
        private function decodeOptions( $str ) {
                wfDeprecated( __METHOD__, '1.19' );
-               if( !$str )
+               if ( !$str ) {
                        return;
+               }
 
                $this->mOptionsLoaded = true;
                $this->mOptionOverrides = array();
@@ -3048,7 +3085,7 @@ class User {
         * Log this user out.
         */
        public function logout() {
-               if( wfRunHooks( 'UserLogout', array( &$this ) ) ) {
+               if ( wfRunHooks( 'UserLogout', array( &$this ) ) ) {
                        $this->doLogout();
                }
        }
@@ -3078,8 +3115,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() ) {
@@ -3118,7 +3159,9 @@ class User {
         */
        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__ );
@@ -3245,7 +3288,7 @@ 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!" );
+                                       "to insert user '{$this->mName}' row, but it was not present in select!" );
                        }
                        return Status::newFatal( 'userexists' );
                }
@@ -3308,7 +3351,7 @@ class User {
                wfDeprecated( __METHOD__, '1.17' );
 
                global $wgRenderHashAppend, $wgLang, $wgContLang;
-               if( $this->mHash ) {
+               if ( $this->mHash ) {
                        return $this->mHash;
                }
 
@@ -3346,7 +3389,7 @@ class User {
         */
        public function isBlockedFromCreateAccount() {
                $this->getBlockedStatus();
-               if( $this->mBlock && $this->mBlock->prevents( 'createaccount' ) ) {
+               if ( $this->mBlock && $this->mBlock->prevents( 'createaccount' ) ) {
                        return $this->mBlock;
                }
 
@@ -3420,16 +3463,16 @@ 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() ) {
+               } elseif ( $wgAuth->strict() ) {
                        /* Auth plugin doesn't allow local authentication */
                        return false;
-               } elseif( $wgAuth->strictUserAuth( $this->getName() ) ) {
+               } elseif ( $wgAuth->strictUserAuth( $this->getName() ) ) {
                        /* Auth plugin doesn't allow local authentication for this user name */
                        return false;
                }
@@ -3460,7 +3503,7 @@ class User {
                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;
                        }
@@ -3509,7 +3552,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;
@@ -3604,7 +3647,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 {
@@ -3726,7 +3769,7 @@ class User {
         */
        public function canSendEmail() {
                global $wgEnableEmail, $wgEnableUserEmail;
-               if( !$wgEnableEmail || !$wgEnableUserEmail || !$this->isAllowed( 'sendemail' ) ) {
+               if ( !$wgEnableEmail || !$wgEnableUserEmail || !$this->isAllowed( 'sendemail' ) ) {
                        return false;
                }
                $canSend = $this->isEmailConfirmed();
@@ -3757,14 +3800,14 @@ class User {
                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;
@@ -3807,7 +3850,7 @@ class User {
         *     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 +3859,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 +3875,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] ) ) );
                        }
@@ -3953,10 +3996,11 @@ class User {
         */
        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;
        }
@@ -3970,11 +4014,11 @@ class User {
         * @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;
@@ -3990,11 +4034,11 @@ class User {
         * @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 +4059,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 +4120,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 +4143,7 @@ class User {
                );
                $addergroups = $this->getEffectiveGroups();
 
-               foreach( $addergroups as $addergroup ) {
+               foreach ( $addergroups as $addergroup ) {
                        $groups = array_merge_recursive(
                                $groups, $this->changeableByGroup( $addergroup )
                        );
@@ -4116,7 +4160,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 +4170,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.
@@ -4216,11 +4260,11 @@ class User {
                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 );
                        }
@@ -4244,7 +4288,7 @@ class User {
                $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;
                }
 
@@ -4283,7 +4327,7 @@ class User {
         */
        public function addNewUserLogEntry( $action = false, $reason = '' ) {
                global $wgUser, $wgNewUserLog;
-               if( empty( $wgNewUserLog ) ) {
+               if ( empty( $wgNewUserLog ) ) {
                        return true; // disabled
                }
 
@@ -4363,11 +4407,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,13 +4451,13 @@ 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 ) {
+               foreach ( $saveOptions as $key => $value ) {
                        # Don't bother storing default values
                        $defaultOption = self::getDefaultOption( $key );
                        if ( ( is_null( $defaultOption ) &&
@@ -4428,8 +4472,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' ) );
        }
 
        /**
index 2eb8429..370bac9 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 );
@@ -338,7 +338,7 @@ class UserMailer {
                        #
                        # PHP mail()
                        #
-                       if( count( $to ) > 1 ) {
+                       if ( count( $to ) > 1 ) {
                                $headers['To'] = 'undisclosed-recipients:;';
                        }
                        $headers = self::arrayToHeaderString( $headers, $endl );
@@ -409,7 +409,7 @@ class UserMailer {
         */
        public static function quotedPrintable( $string, $charset = '' ) {
                # Probably incomplete; see RFC 2045
-               if( empty( $charset ) ) {
+               if ( empty( $charset ) ) {
                        $charset = 'UTF-8';
                }
                $charset = strtoupper( $charset );
@@ -417,7 +417,7 @@ class UserMailer {
 
                $illegal = '\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\xff=';
                $replace = $illegal . '\t ?_';
-               if( !preg_match( "/[$illegal]/", $string ) ) {
+               if ( !preg_match( "/[$illegal]/", $string ) ) {
                        return $string;
                }
                $out = "=?$charset?Q?";
@@ -703,14 +703,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 +791,9 @@ class EmailNotification {
        function compose( $user ) {
                global $wgEnotifImpersonal;
 
-               if ( !$this->composed_common )
+               if ( !$this->composed_common ) {
                        $this->composeCommonMailtext();
+               }
 
                if ( $wgEnotifImpersonal ) {
                        $this->mailTargets[] = new MailAddress( $user );
index cd5dff8..56bb73f 100644 (file)
@@ -74,7 +74,7 @@ class UserRightsProxy {
         */
        public static function whoIs( $database, $id, $ignoreInvalidDB = false ) {
                $user = self::newFromId( $database, $id, $ignoreInvalidDB );
-               if( $user ) {
+               if ( $user ) {
                        return $user->name;
                } else {
                        return false;
@@ -114,12 +114,12 @@ class UserRightsProxy {
         */
        private static function newFromLookup( $database, $field, $value, $ignoreInvalidDB = false ) {
                $db = self::getDB( $database, $ignoreInvalidDB );
-               if( $db ) {
+               if ( $db ) {
                        $row = $db->selectRow( 'user',
                                array( 'user_id', 'user_name' ),
                                array( $field => $value ),
                                __METHOD__ );
-                       if( $row !== false ) {
+                       if ( $row !== false ) {
                                return new UserRightsProxy( $db, $database,
                                        $row->user_name,
                                        intval( $row->user_id ) );
@@ -138,8 +138,8 @@ class UserRightsProxy {
         */
        public static function getDB( $database, $ignoreInvalidDB = false ) {
                global $wgDBname;
-               if( self::validDatabase( $database ) ) {
-                       if( $database == $wgDBname ) {
+               if ( self::validDatabase( $database ) ) {
+                       if ( $database == $wgDBname ) {
                                // Hmm... this shouldn't happen though. :)
                                return wfGetDB( DB_MASTER );
                        } else {
index 5ac92f7..01376a0 100644 (file)
@@ -268,7 +268,7 @@ class WatchedItem {
                        );
                }
 
-               if( empty( $values ) ) {
+               if ( empty( $values ) ) {
                        // Nothing to do
                        return true;
                }
index 3bdf645..e85bf9c 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,12 +335,12 @@ 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 );
                                }
                        }
@@ -364,10 +364,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 +414,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 +433,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 +615,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 +630,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 +651,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 +739,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 +893,7 @@ class WebRequest {
         * @return Mixed
         */
        public function getSessionData( $key ) {
-               if( !isset( $_SESSION[$key] ) ) {
+               if ( !isset( $_SESSION[$key] ) ) {
                        return null;
                }
                return $_SESSION[$key];
@@ -1268,13 +1268,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;
                }
        }
@@ -1359,7 +1359,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..d1f645c 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,7 @@ class FauxResponse extends WebResponse {
                } else {
                        list( $key, $val ) = array_map( 'trim', explode( ":", $string, 2 ) );
 
-                       if( $replace || !isset( $this->headers[$key] ) ) {
+                       if ( $replace || !isset( $this->headers[$key] ) ) {
                                $this->headers[$key] = $val;
                        }
                }
index e6f3135..3b7d701 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,7 +84,7 @@ 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__ );
@@ -129,7 +129,7 @@ if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
        # 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 ) ) {
+       if ( !file_exists( MW_CONFIG_FILE ) ) {
                require_once( "$IP/includes/templates/NoLocalSettings.php" );
                die();
        }
index f8f699c..3f7e19c 100644 (file)
@@ -126,7 +126,7 @@ class MediaWiki {
         * @return Title
         */
        public function getTitle() {
-               if( $this->context->getTitle() === null ) {
+               if ( $this->context->getTitle() === null ) {
                        $this->context->setTitle( $this->parseTitle() );
                }
                return $this->context->getTitle();
@@ -227,7 +227,7 @@ class MediaWiki {
                if ( $title->getInterwiki() != '' ) {
                        $rdfrom = $request->getVal( 'rdfrom' );
                        if ( $rdfrom ) {
-                               $url = $title->getFullURL( 'rdfrom=' . urlencode( $rdfrom ) );
+                               $url = $title->getFullURL( array( 'rdfrom' => $rdfrom ) );
                        } else {
                                $query = $request->getValues();
                                unset( $query['title'] );
@@ -480,7 +480,7 @@ class MediaWiki {
                                $resp->header( 'Retry-After: ' . max( intval( $maxLag ), 5 ) );
                                $resp->header( 'X-Database-Lag: ' . intval( $lag ) );
                                $resp->header( 'Content-Type: text/plain' );
-                               if( $wgShowHostnames ) {
+                               if ( $wgShowHostnames ) {
                                        echo "Waiting for $host: $lag seconds lagged\n";
                                } else {
                                        echo "Waiting for a database server: $lag seconds lagged\n";
@@ -599,7 +599,7 @@ class MediaWiki {
         * Do a job from the job queue
         */
        private function doJobs() {
-               global $wgJobRunRate;
+               global $wgJobRunRate, $wgPhpCli, $IP;
 
                if ( $wgJobRunRate <= 0 || wfReadOnly() ) {
                        return;
@@ -615,23 +615,36 @@ class MediaWiki {
                        $n = intval( $wgJobRunRate );
                }
 
-               $group = JobQueueGroup::singleton();
-               do {
-                       $job = $group->pop( JobQueueGroup::USE_CACHE ); // job from any queue
-                       if ( $job ) {
-                               $output = $job->toString() . "\n";
-                               $t = - microtime( true );
-                               $success = $job->run();
-                               $group->ack( $job ); // done
-                               $t += microtime( true );
-                               $t = round( $t * 1000 );
-                               if ( !$success ) {
-                                       $output .= "Error: " . $job->getLastError() . ", Time: $t ms\n";
-                               } else {
-                                       $output .= "Success, Time: $t ms\n";
+               if ( !wfShellExecDisabled() && is_executable( $wgPhpCli ) ) {
+                       // Start a background process to run some of the jobs.
+                       // This will be asynchronous on *nix though not on Windows.
+                       wfProfileIn( __METHOD__ . '-exec' );
+                       $retVal = 1;
+                       $cmd = wfShellWikiCmd( "$IP/maintenance/runJobs.php", array( '--maxjobs', $n ) );
+                       wfShellExec( "$cmd &", $retVal );
+                       wfProfileOut( __METHOD__ . '-exec' );
+               } else {
+                       // Fallback to running the jobs here while the user waits
+                       $group = JobQueueGroup::singleton();
+                       do {
+                               $job = $group->pop( JobQueueGroup::USE_CACHE ); // job from any queue
+                               if ( $job ) {
+                                       $output = $job->toString() . "\n";
+                                       $t = - microtime( true );
+                                       wfProfileIn( __METHOD__ . '-' . get_class( $job ) );
+                                       $success = $job->run();
+                                       wfProfileOut( __METHOD__ . '-' . get_class( $job ) );
+                                       $group->ack( $job ); // done
+                                       $t += microtime( true );
+                                       $t = round( $t * 1000 );
+                                       if ( $success === false ) {
+                                               $output .= "Error: " . $job->getLastError() . ", Time: $t ms\n";
+                                       } else {
+                                               $output .= "Success, Time: $t ms\n";
+                                       }
+                                       wfDebugLog( 'jobqueue', $output );
                                }
-                               wfDebugLog( 'jobqueue', $output );
-                       }
-               } while ( --$n && $job );
+                       } while ( --$n && $job );
+               }
        }
 }
index 6278121..08eb800 100644 (file)
@@ -143,7 +143,7 @@ class WikiXmlError extends WikiError {
        }
 
        function _extractContext( $context, $offset ) {
-               if( is_null( $context ) ) {
+               if ( is_null( $context ) ) {
                        return null;
                } else {
                        // Hopefully integer overflow will be handled transparently here
index ab3d68d..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,
index 228f295..f2c9c29 100644 (file)
@@ -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();
        }
@@ -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;
                }
 
@@ -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;
                        }
@@ -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 );
                }
 
@@ -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();
                        }
                }
 
@@ -2121,17 +2120,20 @@ class WikiPage implements Page, IDBAccessObject {
                        && $shortTitle != $user->getTitleKey()
                        && !( $revision->isMinor() && $user->isAllowed( 'nominornewtalk' ) )
                ) {
-                       if ( wfRunHooks( 'ArticleEditUpdateNewTalk', array( &$this ) ) ) {
-                               $other = User::newFromName( $shortTitle, false );
-                               if ( !$other ) {
-                                       wfDebug( __METHOD__ . ": invalid username\n" );
-                               } elseif ( User::isIP( $shortTitle ) ) {
-                                       // An anonymous user
-                                       $other->setNewtalk( true, $revision );
-                               } elseif ( $other->isLoggedIn() ) {
-                                       $other->setNewtalk( true, $revision );
-                               } else {
-                                       wfDebug( __METHOD__ . ": don't need to notify a nonexistent user\n" );
+                       $recipient = User::newFromName( $shortTitle, false );
+                       if ( !$recipient ) {
+                               wfDebug( __METHOD__ . ": invalid username\n" );
+                       } else {
+                               // Allow extensions to prevent user notification when a new message is added to their talk page
+                               if ( wfRunHooks( 'ArticleEditUpdateNewTalk', array( &$this, $recipient ) ) ) {
+                                       if ( User::isIP( $shortTitle ) ) {
+                                               // An anonymous user
+                                               $recipient->setNewtalk( true, $revision );
+                                       } elseif ( $recipient->isLoggedIn() ) {
+                                               $recipient->setNewtalk( true, $revision );
+                                       } else {
+                                               wfDebug( __METHOD__ . ": don't need to notify a nonexistent user\n" );
+                                       }
                                }
                        }
                }
@@ -2139,12 +2141,14 @@ class WikiPage implements Page, IDBAccessObject {
                if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
                        // XXX: could skip pseudo-messages like js/css here, based on content model.
                        $msgtext = $content ? $content->getWikitextForTransclusion() : null;
-                       if ( $msgtext === false || $msgtext === null ) $msgtext = '';
+                       if ( $msgtext === false || $msgtext === null ) {
+                               $msgtext = '';
+                       }
 
                        MessageCache::singleton()->replace( $shortTitle, $msgtext );
                }
 
-               if( $options['created'] ) {
+               if ( $options['created'] ) {
                        self::onArticleCreate( $this->mTitle );
                } else {
                        self::onArticleEdit( $this->mTitle );
@@ -2808,7 +2812,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 +2853,8 @@ class WikiPage implements Page, IDBAccessObject {
                $resultDetails = array(
                        'summary' => $summary,
                        'current' => $current,
-                       'target'  => $target,
-                       'newid'   => $revId
+                       'target' => $target,
+                       'newid' => $revId
                );
 
                return array();
@@ -3019,69 +3023,76 @@ class WikiPage implements Page, IDBAccessObject {
         * @param array $added   The names of categories that were added
         * @param array $deleted The names of categories that were deleted
         */
-       public function updateCategoryCounts( $added, $deleted ) {
-               $ns = $this->mTitle->getNamespace();
+       public function updateCategoryCounts( array $added, array $deleted ) {
+               $that = $this;
+               $method = __METHOD__;
                $dbw = wfGetDB( DB_MASTER );
 
-               // First make sure the rows exist.  If one of the "deleted" ones didn't
-               // exist, we might legitimately not create it, but it's simpler to just
-               // create it and then give it a negative value, since the value is bogus
-               // anyway.
-               //
-               // Sometimes I wish we had INSERT ... ON DUPLICATE KEY UPDATE.
-               $insertCats = array_merge( $added, $deleted );
-               if ( !$insertCats ) {
-                       // Okay, nothing to do
-                       return;
-               }
+               // Do this at the end of the commit to reduce lock wait timeouts
+               $dbw->onTransactionPreCommitOrIdle(
+                       function() use ( $dbw, $that, $method, $added, $deleted ) {
+                               $ns = $that->getTitle()->getNamespace();
 
-               $insertRows = array();
+                               // First make sure the rows exist.  If one of the "deleted" ones didn't
+                               // exist, we might legitimately not create it, but it's simpler to just
+                               // create it and then give it a negative value, since the value is bogus
+                               // anyway.
+                               //
+                               // Sometimes I wish we had INSERT ... ON DUPLICATE KEY UPDATE.
+                               $insertCats = array_merge( $added, $deleted );
+                               if ( !$insertCats ) {
+                                       // Okay, nothing to do
+                                       return;
+                               }
 
-               foreach ( $insertCats as $cat ) {
-                       $insertRows[] = array(
-                               'cat_id' => $dbw->nextSequenceValue( 'category_cat_id_seq' ),
-                               'cat_title' => $cat
-                       );
-               }
-               $dbw->insert( 'category', $insertRows, __METHOD__, 'IGNORE' );
+                               $insertRows = array();
+                               foreach ( $insertCats as $cat ) {
+                                       $insertRows[] = array(
+                                               'cat_id' => $dbw->nextSequenceValue( 'category_cat_id_seq' ),
+                                               'cat_title' => $cat
+                                       );
+                               }
+                               $dbw->insert( 'category', $insertRows, $method, 'IGNORE' );
 
-               $addFields = array( 'cat_pages = cat_pages + 1' );
-               $removeFields = array( 'cat_pages = cat_pages - 1' );
+                               $addFields = array( 'cat_pages = cat_pages + 1' );
+                               $removeFields = array( 'cat_pages = cat_pages - 1' );
 
-               if ( $ns == NS_CATEGORY ) {
-                       $addFields[] = 'cat_subcats = cat_subcats + 1';
-                       $removeFields[] = 'cat_subcats = cat_subcats - 1';
-               } elseif ( $ns == NS_FILE ) {
-                       $addFields[] = 'cat_files = cat_files + 1';
-                       $removeFields[] = 'cat_files = cat_files - 1';
-               }
+                               if ( $ns == NS_CATEGORY ) {
+                                       $addFields[] = 'cat_subcats = cat_subcats + 1';
+                                       $removeFields[] = 'cat_subcats = cat_subcats - 1';
+                               } elseif ( $ns == NS_FILE ) {
+                                       $addFields[] = 'cat_files = cat_files + 1';
+                                       $removeFields[] = 'cat_files = cat_files - 1';
+                               }
 
-               if ( $added ) {
-                       $dbw->update(
-                               'category',
-                               $addFields,
-                               array( 'cat_title' => $added ),
-                               __METHOD__
-                       );
-               }
+                               if ( $added ) {
+                                       $dbw->update(
+                                               'category',
+                                               $addFields,
+                                               array( 'cat_title' => $added ),
+                                               $method
+                                       );
+                               }
 
-               if ( $deleted ) {
-                       $dbw->update(
-                               'category',
-                               $removeFields,
-                               array( 'cat_title' => $deleted ),
-                               __METHOD__
-                       );
-               }
+                               if ( $deleted ) {
+                                       $dbw->update(
+                                               'category',
+                                               $removeFields,
+                                               array( 'cat_title' => $deleted ),
+                                               $method
+                                       );
+                               }
 
-               foreach( $added as $catName ) {
-                       $cat = Category::newFromName( $catName );
-                       wfRunHooks( 'CategoryAfterPageAdded', array( $cat, $this ) );
-               }
-               foreach( $deleted as $catName ) {
-                       $cat = Category::newFromName( $catName );
-                       wfRunHooks( 'CategoryAfterPageRemoved', array( $cat, $this ) );
-               }
+                               foreach ( $added as $catName ) {
+                                       $cat = Category::newFromName( $catName );
+                                       wfRunHooks( 'CategoryAfterPageAdded', array( $cat, $that ) );
+                               }
+                               foreach ( $deleted as $catName ) {
+                                       $cat = Category::newFromName( $catName );
+                                       wfRunHooks( 'CategoryAfterPageRemoved', array( $cat, $that ) );
+                               }
+                       }
+               );
        }
 
        /**
index 29c240e..c62cbdf 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;
@@ -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 ) {
+               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;
                }
 
@@ -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'];
                }
 
@@ -468,10 +473,10 @@ class Xml {
         */
        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 );
@@ -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 );
@@ -736,7 +747,7 @@ class Xml {
                $form = '';
                $form .= "<table><tbody>";
 
-               foreach( $fields as $labelmsg => $input ) {
+               foreach ( $fields as $labelmsg => $input ) {
                        $id = "mw-$labelmsg";
                        $form .= Xml::openElement( 'tr', array( 'id' => $id ) );
                        $form .= Xml::tags( 'td', array( 'class' => 'mw-label' ), wfMessage( $labelmsg )->parse() );
@@ -744,7 +755,7 @@ class Xml {
                        $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' );
@@ -769,7 +780,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 +792,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 +816,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 ) ) {
@@ -902,7 +912,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 5e4f118..25dde7d 100644 (file)
@@ -78,13 +78,13 @@ class XmlTypeCheck {
                                do {
                                        $chunk = fread( $file, 32768 );
                                        $ret = xml_parse( $parser, $chunk, feof( $file ) );
-                                       if( $ret == 0 ) {
+                                       if ( $ret == 0 ) {
                                                // XML isn't well-formed!
                                                fclose( $file );
                                                xml_parser_free( $parser );
                                                return;
                                        }
-                               } while( !feof( $file ) );
+                               } while ( !feof( $file ) );
 
                                fclose( $file );
                        }
@@ -103,7 +103,7 @@ class XmlTypeCheck {
        private function rootElementOpen( $parser, $name, $attribs ) {
                $this->rootElement = $name;
 
-               if( is_callable( $this->filterCallback ) ) {
+               if ( is_callable( $this->filterCallback ) ) {
                        xml_set_element_handler( $parser, array( $this, 'elementOpen' ), false );
                        $this->elementOpen( $parser, $name, $attribs );
                } else {
@@ -118,7 +118,7 @@ class XmlTypeCheck {
         * @param $attribs
         */
        private function elementOpen( $parser, $name, $attribs ) {
-               if( call_user_func( $this->filterCallback, $name, $attribs ) ) {
+               if ( call_user_func( $this->filterCallback, $name, $attribs ) ) {
                        // Filter hit!
                        $this->filterMatch = true;
                }
index fd03ec4..c5955ae 100644 (file)
@@ -81,14 +81,14 @@ class ZhClient {
                $result = fgets( $this->mFP, 1024 );
 
                list( $status, $len ) = explode( ' ', $result );
-               if( $status == 'ERROR' ) {
+               if ( $status == 'ERROR' ) {
                        // $len is actually the error code...
                        print "zhdaemon error $len<br />\n";
                        return false;
                }
                $bytesread = 0;
                $data = '';
-               while( !feof( $this->mFP ) && $bytesread < $len ) {
+               while ( !feof( $this->mFP ) && $bytesread < $len ) {
                        $str = fread( $this->mFP, $len - $bytesread );
                        $bytesread += strlen( $str );
                        $data .= $str;
@@ -131,7 +131,7 @@ class ZhClient {
                $info = explode( ';', $infoline );
                $ret = array();
                $i = 0;
-               foreach( $info as $variant ) {
+               foreach ( $info as $variant ) {
                        list( $code, $len ) = explode( ' ', $variant );
                        $ret[strtolower( $code )] = substr( $data, $i, $len );
                        $i += $len;
index 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 7296126..911fd58 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>";
@@ -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 );
+                       $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..a8905d8 100644 (file)
@@ -602,7 +602,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..3fa20b7 100644 (file)
@@ -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();
                                }
index ae5f76c..de9e1d6 100644 (file)
@@ -87,7 +87,7 @@ class WatchAction extends FormAction {
                return parent::checkCanExecute( $user );
        }
 
-       public static function doWatch( Title $title, User $user  ) {
+       public static function doWatch( Title $title, User $user ) {
                $page = WikiPage::factory( $title );
 
                if ( wfRunHooks( 'WatchArticle', array( &$user, &$page ) ) ) {
@@ -97,7 +97,7 @@ class WatchAction extends FormAction {
                return true;
        }
 
-       public static function doUnwatch( Title $title, User $user  ) {
+       public static function doUnwatch( Title $title, User $user ) {
                $page = WikiPage::factory( $title );
 
                if ( wfRunHooks( 'UnwatchArticle', array( &$user, &$page ) ) ) {
index f386a8a..c500370 100644 (file)
@@ -311,8 +311,7 @@ abstract class ApiBase extends ContextSource {
                                        );
                                }
                                $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 {
@@ -967,9 +966,9 @@ abstract class ApiBase extends ContextSource {
                                                }
                                                break;
                                        case 'integer': // Force everything using intval() and optionally validate limits
-                                               $min = isset ( $paramSettings[self::PARAM_MIN] ) ? $paramSettings[self::PARAM_MIN] : null;
-                                               $max = isset ( $paramSettings[self::PARAM_MAX] ) ? $paramSettings[self::PARAM_MAX] : null;
-                                               $enforceLimits = isset ( $paramSettings[self::PARAM_RANGE_ENFORCE] )
+                                               $min = isset( $paramSettings[self::PARAM_MIN] ) ? $paramSettings[self::PARAM_MIN] : null;
+                                               $max = isset( $paramSettings[self::PARAM_MAX] ) ? $paramSettings[self::PARAM_MAX] : null;
+                                               $enforceLimits = isset( $paramSettings[self::PARAM_RANGE_ENFORCE] )
                                                                ? $paramSettings[self::PARAM_RANGE_ENFORCE] : false;
 
                                                if ( is_array( $value ) ) {
@@ -1397,7 +1396,7 @@ abstract class ApiBase extends ContextSource {
        public function dieUsageMsg( $error ) {
                # most of the time we send a 1 element, so we might as well send it as
                # a string and make this an array here.
-               if( is_string( $error ) ) {
+               if ( is_string( $error ) ) {
                        $error = array( $error );
                }
                $parsed = $this->parseMsg( $error );
@@ -1412,10 +1411,10 @@ abstract class ApiBase extends ContextSource {
         */
        public function dieUsageMsgOrDebug( $error ) {
                global $wgDebugAPI;
-               if( $wgDebugAPI !== true ) {
+               if ( $wgDebugAPI !== true ) {
                        $this->dieUsageMsg( $error );
                } else {
-                       if( is_string( $error ) ) {
+                       if ( is_string( $error ) ) {
                                $error = array( $error );
                        }
                        $parsed = $this->parseMsg( $error );
@@ -1448,7 +1447,7 @@ abstract class ApiBase extends ContextSource {
 
                // Check whether the error array was nested
                // array( array( <code>, <params> ), array( <another_code>, <params> ) )
-               if( is_array( $key ) ) {
+               if ( is_array( $key ) ) {
                        $error = $key;
                        $key = array_shift( $error );
                }
@@ -1560,6 +1559,10 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * Returns a list of all possible errors returned by the module
+        *
+        * Don't call this function directly: use getFinalPossibleErrors() to allow
+        * hooks to modify parameters as needed.
+        *
         * @return array in the format of array( key, param1, param2, ... ) or array( 'code' => ..., 'info' => ... )
         */
        public function getPossibleErrors() {
@@ -1602,6 +1605,19 @@ abstract class ApiBase extends ContextSource {
                return $ret;
        }
 
+       /**
+        * Get final list of possible errors, after hooks have had a chance to
+        * tweak it as needed.
+        *
+        * @return array
+        * @since 1.22
+        */
+       public function getFinalPossibleErrors() {
+               $possibleErrors = $this->getPossibleErrors();
+               wfRunHooks( 'APIGetPossibleErrors', array( $this, &$possibleErrors ) );
+               return $possibleErrors;
+       }
+
        /**
         * Parses a list of errors into a standardised format
         * @param array $errors List of errors. Items can be in the for array( key, param1, param2, ... ) or array( 'code' => ..., 'info' => ... )
index 90432b9..ab0a7e9 100644 (file)
@@ -104,7 +104,7 @@ class ApiBlock extends ApiBase {
                $res['userID'] = $target instanceof User ? $target->getId() : 0;
 
                $block = Block::newFromTarget( $target );
-               if( $block instanceof Block ) {
+               if ( $block instanceof Block ) {
                        $res['expiry'] = $block->mExpiry == $this->getDB()->getInfinity()
                                ? 'infinite'
                                : wfTimestamp( TS_ISO_8601, $block->mExpiry );
index 79ffcb0..1e35c34 100644 (file)
@@ -81,17 +81,17 @@ class ApiComparePages extends ApiBase {
         * @return int
         */
        private function revisionOrTitleOrId( $revision, $titleText, $titleId ) {
-               if( $revision ) {
+               if ( $revision ) {
                        return $revision;
-               } elseif( $titleText ) {
+               } elseif ( $titleText ) {
                        $title = Title::newFromText( $titleText );
-                       if( !$title || $title->isExternal() ) {
+                       if ( !$title || $title->isExternal() ) {
                                $this->dieUsageMsg( array( 'invalidtitle', $titleText ) );
                        }
                        return $title->getLatestRevID();
                } elseif ( $titleId ) {
                        $title = Title::newFromID( $titleId );
-                       if( !$title ) {
+                       if ( !$title ) {
                                $this->dieUsageMsg( array( 'nosuchpageid', $titleId ) );
                        }
                        return $title->getLatestRevID();
index 278ea29..59ff324 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,18 +120,18 @@ class ApiCreateAccount extends ApiBase {
 
                $apiResult = $this->getResult();
 
-               if( $status->hasMessage( 'sessionfailure' ) || $status->hasMessage( 'nocookiesfornew' ) ) {
+               if ( $status->hasMessage( 'sessionfailure' ) || $status->hasMessage( 'nocookiesfornew' ) ) {
                        // Token was incorrect, so add it to result, but don't throw an exception
                        // since not having the correct token is part of the normal
                        // flow of events.
                        $result['token'] = LoginForm::getCreateaccountToken();
                        $result['result'] = 'needtoken';
-               } elseif( !$status->isOK() ) {
+               } elseif ( !$status->isOK() ) {
                        // There was an error. Die now.
                        // Cannot use dieUsageMsg() directly because extensions
                        // might return custom error messages.
                        $errors = $status->getErrorsArray();
-                       if( $errors[0] instanceof Message ) {
+                       if ( $errors[0] instanceof Message ) {
                                $code = 'aborted';
                                $desc = $errors[0];
                        } else {
@@ -139,14 +139,14 @@ class ApiCreateAccount extends ApiBase {
                                $desc = wfMessage( $code, $errors[0] );
                        }
                        $this->dieUsage( $desc, $code );
-               } elseif( !$status->isGood() ) {
+               } elseif ( !$status->isGood() ) {
                        // Status is not good, but OK. This means warnings.
                        $result['result'] = 'warning';
 
                        // Add any warnings to the result
                        $warnings = $status->getErrorsByType( 'warning' );
-                       if( $warnings ) {
-                               foreach( $warnings as &$warning ) {
+                       if ( $warnings ) {
+                               foreach ( $warnings as &$warning ) {
                                        $apiResult->setIndexedTagName( $warning['params'], 'param' );
                                }
                                $apiResult->setIndexedTagName( $warnings, 'warning' );
@@ -259,7 +259,7 @@ class ApiCreateAccount extends ApiBase {
 
                $errors = parent::getPossibleErrors();
                // All local errors are from LoginForm, which means they're actually message keys.
-               foreach( $localErrors as $error ) {
+               foreach ( $localErrors as $error ) {
                        $errors[] = array( 'code' => $error, 'info' => wfMessage( $error )->parse() );
                }
 
index ab60008..e7e5e1d 100644 (file)
@@ -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 42fb652..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();
 
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 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..56af76f 100644 (file)
@@ -66,7 +66,7 @@ class ApiImport extends ApiBase {
                }
                if ( isset( $params['rootpage'] ) ) {
                        $statusRootPage = $importer->setTargetRootPage( $params['rootpage'] );
-                       if( !$statusRootPage->isGood() ) {
+                       if ( !$statusRootPage->isGood() ) {
                                $this->dieUsageMsg( $statusRootPage->getErrorsArray() );
                        }
                }
index 76f9b42..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 );
                }
        }
@@ -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..3caf81f 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(
index 27f8cef..3e1a753 100644 (file)
@@ -149,7 +149,7 @@ class ApiParamInfo extends ApiBase {
                                $item = array();
                                if ( is_numeric( $k ) ) {
                                        $retval['examples'] .= $v;
-                                       $result->setContent( $item, $v );
+                                       ApiResult::setContent( $item, $v );
                                } else {
                                        if ( !is_array( $v ) ) {
                                                $item['description'] = $v;
@@ -157,7 +157,7 @@ class ApiParamInfo extends ApiBase {
                                                $item['description'] = implode( $v, "\n" );
                                        }
                                        $retval['examples'] .= $item['description'] . ' ' . $k;
-                                       $result->setContent( $item, $k );
+                                       ApiResult::setContent( $item, $k );
                                }
                                $retval['allexamples'][] = $item;
                        }
@@ -300,7 +300,7 @@ class ApiParamInfo extends ApiBase {
                }
 
                // Errors
-               $retval['errors'] = $this->parseErrors( $obj->getPossibleErrors() );
+               $retval['errors'] = $this->parseErrors( $obj->getFinalPossibleErrors() );
                $result->setIndexedTagName( $retval['errors'], 'error' );
 
                return $retval;
index 09b7a88..bde1d99 100644 (file)
@@ -194,10 +194,10 @@ class ApiParse extends ApiBase {
                                // Build a result and bail out
                                $result_array = array();
                                $result_array['text'] = array();
-                               $result->setContent( $result_array['text'], $this->pstContent->serialize( $format ) );
+                               ApiResult::setContent( $result_array['text'], $this->pstContent->serialize( $format ) );
                                if ( isset( $prop['wikitext'] ) ) {
                                        $result_array['wikitext'] = array();
-                                       $result->setContent( $result_array['wikitext'], $this->content->serialize( $format ) );
+                                       ApiResult::setContent( $result_array['wikitext'], $this->content->serialize( $format ) );
                                }
                                $result->addValue( null, $this->getModuleName(), $result_array );
                                return;
@@ -225,21 +225,35 @@ class ApiParse extends ApiBase {
 
                if ( isset( $prop['text'] ) ) {
                        $result_array['text'] = array();
-                       $result->setContent( $result_array['text'], $p_result->getText() );
+                       ApiResult::setContent( $result_array['text'], $p_result->getText() );
                }
 
                if ( !is_null( $params['summary'] ) ) {
                        $result_array['parsedsummary'] = array();
-                       $result->setContent( $result_array['parsedsummary'], Linker::formatComment( $params['summary'], $titleObj ) );
+                       ApiResult::setContent( $result_array['parsedsummary'], Linker::formatComment( $params['summary'], $titleObj ) );
+               }
+
+               if ( isset( $prop['langlinks'] ) || isset( $prop['languageshtml'] ) ) {
+                       $langlinks = $p_result->getLanguageLinks();
+
+                       if ( $params['effectivelanglinks'] ) {
+                               // Link flags are ignored for now, but may in the future be
+                               // included in the result.
+                               $linkFlags = array();
+                               wfRunHooks( 'LanguageLinks', array( $titleObj, &$langlinks, &$linkFlags ) );
+                       }
+               } else {
+                       $langlinks = false;
                }
 
                if ( isset( $prop['langlinks'] ) ) {
-                       $result_array['langlinks'] = $this->formatLangLinks( $p_result->getLanguageLinks() );
+                       $result_array['langlinks'] = $this->formatLangLinks( $langlinks );
                }
                if ( isset( $prop['languageshtml'] ) ) {
-                       $languagesHtml = $this->languagesHtml( $p_result->getLanguageLinks() );
+                       $languagesHtml = $this->languagesHtml( $langlinks );
+
                        $result_array['languageshtml'] = array();
-                       $result->setContent( $result_array['languageshtml'], $languagesHtml );
+                       ApiResult::setContent( $result_array['languageshtml'], $languagesHtml );
                }
                if ( isset( $prop['categories'] ) ) {
                        $result_array['categories'] = $this->formatCategoryLinks( $p_result->getCategories() );
@@ -247,7 +261,7 @@ class ApiParse extends ApiBase {
                if ( isset( $prop['categorieshtml'] ) ) {
                        $categoriesHtml = $this->categoriesHtml( $p_result->getCategories() );
                        $result_array['categorieshtml'] = array();
-                       $result->setContent( $result_array['categorieshtml'], $categoriesHtml );
+                       ApiResult::setContent( $result_array['categorieshtml'], $categoriesHtml );
                }
                if ( isset( $prop['links'] ) ) {
                        $result_array['links'] = $this->formatLinks( $p_result->getLinks() );
@@ -288,7 +302,7 @@ class ApiParse extends ApiBase {
 
                        if ( isset( $prop['headhtml'] ) ) {
                                $result_array['headhtml'] = array();
-                               $result->setContent( $result_array['headhtml'], $context->getOutput()->headElement( $context->getSkin() ) );
+                               ApiResult::setContent( $result_array['headhtml'], $context->getOutput()->headElement( $context->getSkin() ) );
                        }
                }
 
@@ -298,10 +312,10 @@ class ApiParse extends ApiBase {
 
                if ( isset( $prop['wikitext'] ) ) {
                        $result_array['wikitext'] = array();
-                       $result->setContent( $result_array['wikitext'], $this->content->serialize( $format ) );
+                       ApiResult::setContent( $result_array['wikitext'], $this->content->serialize( $format ) );
                        if ( !is_null( $this->pstContent ) ) {
                                $result_array['psttext'] = array();
-                               $result->setContent( $result_array['psttext'], $this->pstContent->serialize( $format ) );
+                               ApiResult::setContent( $result_array['psttext'], $this->pstContent->serialize( $format ) );
                        }
                }
                if ( isset( $prop['properties'] ) ) {
@@ -321,7 +335,7 @@ class ApiParse extends ApiBase {
                                $xml = $dom->__toString();
                        }
                        $result_array['parsetree'] = array();
-                       $result->setContent( $result_array['parsetree'], $xml );
+                       ApiResult::setContent( $result_array['parsetree'], $xml );
                }
 
                $result_mapping = array(
@@ -400,7 +414,7 @@ class ApiParse extends ApiBase {
                        if ( $title ) {
                                $entry['url'] = wfExpandUrl( $title->getFullURL(), PROTO_CURRENT );
                        }
-                       $this->getResult()->setContent( $entry, $bits[1] );
+                       ApiResult::setContent( $entry, $bits[1] );
                        $result[] = $entry;
                }
                return $result;
@@ -411,7 +425,7 @@ class ApiParse extends ApiBase {
                foreach ( $links as $link => $sortkey ) {
                        $entry = array();
                        $entry['sortkey'] = $sortkey;
-                       $this->getResult()->setContent( $entry, $link );
+                       ApiResult::setContent( $entry, $link );
                        $result[] = $entry;
                }
                return $result;
@@ -465,7 +479,7 @@ class ApiParse extends ApiBase {
                        foreach ( $nslinks as $title => $id ) {
                                $entry = array();
                                $entry['ns'] = $ns;
-                               $this->getResult()->setContent( $entry, Title::makeTitle( $ns, $title )->getFullText() );
+                               ApiResult::setContent( $entry, Title::makeTitle( $ns, $title )->getFullText() );
                                if ( $id != 0 ) {
                                        $entry['exists'] = '';
                                }
@@ -487,7 +501,7 @@ class ApiParse extends ApiBase {
                                        $entry['url'] = wfExpandUrl( $title->getFullURL(), PROTO_CURRENT );
                                }
 
-                               $this->getResult()->setContent( $entry, $title->getFullText() );
+                               ApiResult::setContent( $entry, $title->getFullText() );
                                $result[] = $entry;
                        }
                }
@@ -499,7 +513,7 @@ class ApiParse extends ApiBase {
                foreach ( $headItems as $tag => $content ) {
                        $entry = array();
                        $entry['tag'] = $tag;
-                       $this->getResult()->setContent( $entry, $content );
+                       ApiResult::setContent( $entry, $content );
                        $result[] = $entry;
                }
                return $result;
@@ -510,7 +524,7 @@ class ApiParse extends ApiBase {
                foreach ( $properties as $name => $value ) {
                        $entry = array();
                        $entry['name'] = $name;
-                       $this->getResult()->setContent( $entry, $value );
+                       ApiResult::setContent( $entry, $value );
                        $result[] = $entry;
                }
                return $result;
@@ -521,7 +535,7 @@ class ApiParse extends ApiBase {
                foreach ( $css as $file => $link ) {
                        $entry = array();
                        $entry['file'] = $file;
-                       $this->getResult()->setContent( $entry, $link );
+                       ApiResult::setContent( $entry, $link );
                        $result[] = $entry;
                }
                return $result;
@@ -575,6 +589,7 @@ class ApiParse extends ApiBase {
                        ),
                        'pst' => false,
                        'onlypst' => false,
+                       'effectivelanglinks' => false,
                        'uselang' => null,
                        'section' => null,
                        'disablepp' => false,
@@ -618,6 +633,10 @@ class ApiParse extends ApiBase {
                                ' wikitext       - Gives the original wikitext that was parsed',
                                ' properties     - Gives various properties defined in the parsed wikitext',
                        ),
+                       'effectivelanglinks' => array(
+                               'Includes language links supplied by extensions',
+                               '(for use with prop=langlinks|languageshtml)',
+                       ),
                        'pst' => array(
                                'Do a pre-save transform on the input before parsing it',
                                'Ignored if page, pageid or oldid is used'
index 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..3bee4d3 100644 (file)
@@ -722,7 +722,7 @@ class ApiQuery extends ApiBase {
        public function getPossibleErrors() {
                return array_merge(
                        parent::getPossibleErrors(),
-                       $this->getPageSet()->getPossibleErrors()
+                       $this->getPageSet()->getFinalPossibleErrors()
                );
        }
 
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 566c208..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' );
                        }
 
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..881269f 100644 (file)
@@ -94,8 +94,9 @@ class ApiQueryBlocks extends ApiQueryBase {
                        list( $ip, $range ) = IP::parseCIDR( $params['ip'] );
                        if ( $ip && $range ) {
                                // We got a CIDR range
-                               if ( $range < 16 )
+                               if ( $range < 16 ) {
                                        $this->dieUsage( 'CIDR ranges broader than /16 are not accepted', 'cidrtoobroad' );
+                               }
                                $lower = wfBaseConvert( $ip, 10, 16, 8, false );
                                $upper = wfBaseConvert( $ip + pow( 2, 32 - $range ) - 1, 10, 16, 8, false );
                        } else {
@@ -120,10 +121,10 @@ class ApiQueryBlocks extends ApiQueryBase {
                        $show = array_flip( $params['show'] );
 
                        /* Check for conflicting parameters. */
-                       if ( ( isset ( $show['account'] ) && isset ( $show['!account'] ) )
-                                       || ( isset ( $show['ip'] ) && isset ( $show['!ip'] ) )
-                                       || ( isset ( $show['range'] ) && isset ( $show['!range'] ) )
-                                       || ( isset ( $show['temp'] ) && isset ( $show['!temp'] ) )
+                       if ( ( isset( $show['account'] ) && isset( $show['!account'] ) )
+                                       || ( isset( $show['ip'] ) && isset( $show['!ip'] ) )
+                                       || ( isset( $show['range'] ) && isset( $show['!range'] ) )
+                                       || ( isset( $show['temp'] ) && isset( $show['!temp'] ) )
                        ) {
                                $this->dieUsageMsg( 'show' );
                        }
index 124908b..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 ) {
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..124d273 100644 (file)
@@ -123,7 +123,7 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
                                if ( $fld_url ) {
                                        $to = $row->el_to;
                                        // expand protocol-relative urls
-                                       if( $params['expandurl'] ) {
+                                       if ( $params['expandurl'] ) {
                                                $to = wfExpandUrl( $to, PROTO_CANONICAL );
                                        }
                                        $vals['url'] = $to;
index 761b49e..56ee268 100644 (file)
@@ -88,7 +88,7 @@ class ApiQueryExternalLinks extends ApiQueryBase {
                        $entry = array();
                        $to = $row->el_to;
                        // expand protocol-relative urls
-                       if( $params['expandurl'] ) {
+                       if ( $params['expandurl'] ) {
                                $to = wfExpandUrl( $to, PROTO_CANONICAL );
                        }
                        ApiResult::setContent( $entry, $to );
index 0869cb9..5ed9d38 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,12 @@ class ApiQueryImageInfo extends ApiQueryBase {
         * @return Array of parameters for transform.
         */
        protected function mergeThumbParams( $image, $thumbParams, $otherParams ) {
+
+               if ( !isset( $thumbParams['width'] ) && isset( $thumbParams['height'] ) ) {
+                       // Populate the width with the image's width, so only the height restriction applies
+                       $thumbParams['width'] = $image->getWidth();
+               }
+
                if ( !$otherParams ) {
                        return $thumbParams;
                }
@@ -257,8 +262,8 @@ class ApiQueryImageInfo extends ApiQueryBase {
 
                if ( isset( $paramList['width'] ) ) {
                        if ( intval( $paramList['width'] ) != intval( $thumbParams['width'] ) ) {
-                               $this->dieUsage( "{$p}urlparam had width of {$paramList['width']} but "
-                                       . "{$p}urlwidth was {$thumbParams['width']}", "urlparam_urlwidth_mismatch" );
+                               $this->setWarning( "Ignoring width value set in {$p}urlparam ({$paramList['width']}) "
+                                       . "in favor of width value derived from {$p}urlwidth/{$p}urlheight ({$thumbParams['width']})" );
                        }
                }
 
@@ -571,7 +576,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 +723,6 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        array( 'code' => "{$p}urlwidth", 'info' => "{$p}urlheight cannot be used without {$p}urlwidth" ),
                        array( 'code' => 'urlparam', 'info' => "Invalid value for {$p}urlparam" ),
                        array( 'code' => 'urlparam_no_width', 'info' => "{$p}urlparam requires {$p}urlwidth" ),
-                       array( 'code' => 'urlparam_urlwidth_mismatch', 'info' => "The width set in {$p}urlparm doesn't " .
-                               "match the one in {$p}urlwidth" ),
                ) );
        }
 
index 37cd915..6dbda5f 100644 (file)
@@ -60,7 +60,7 @@ class ApiQueryInfo extends ApiQueryBase {
 
                $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' );
@@ -476,7 +476,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();
index 7a4880a..ce03e58 100644 (file)
@@ -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.',
                );
        }
 
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..eaa2b47 100644 (file)
@@ -49,12 +49,12 @@ class ApiQueryLogEvents extends ApiQueryBase {
                $this->fld_ids = isset( $prop['ids'] );
                $this->fld_title = isset( $prop['title'] );
                $this->fld_type = isset( $prop['type'] );
-               $this->fld_action = isset ( $prop['action'] );
+               $this->fld_action = isset( $prop['action'] );
                $this->fld_user = isset( $prop['user'] );
                $this->fld_userid = isset( $prop['userid'] );
                $this->fld_timestamp = isset( $prop['timestamp'] );
                $this->fld_comment = isset( $prop['comment'] );
-               $this->fld_parsedcomment = isset ( $prop['parsedcomment'] );
+               $this->fld_parsedcomment = isset( $prop['parsedcomment'] );
                $this->fld_details = isset( $prop['details'] );
                $this->fld_tags = isset( $prop['tags'] );
 
@@ -241,7 +241,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                                break;
                        case 'rights':
                                $vals2 = array();
-                               if( $legacy ) {
+                               if ( $legacy ) {
                                        list( $vals2['old'], $vals2['new'] ) = $params;
                                } else {
                                        $vals2['new'] = implode( ', ', $params['5::newgroups'] );
index b03bdfb..9d0fd0a 100644 (file)
@@ -52,7 +52,7 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
                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];
                        }
                }
index 8aceab2..7cb445d 100644 (file)
@@ -499,7 +499,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        }
                        return $retval;
                }
-               switch( $type ) {
+               switch ( $type ) {
                        case 'edit':
                                return RC_EDIT;
                        case 'new':
index 317b7ba..1d86c97 100644 (file)
@@ -146,17 +146,17 @@ class ApiQueryRevisions extends ApiQueryBase {
                $prop = array_flip( $params['prop'] );
 
                // Optional fields
-               $this->fld_ids = isset ( $prop['ids'] );
+               $this->fld_ids = isset( $prop['ids'] );
                // $this->addFieldsIf('rev_text_id', $this->fld_ids); // should this be exposed?
-               $this->fld_flags = isset ( $prop['flags'] );
-               $this->fld_timestamp = isset ( $prop['timestamp'] );
-               $this->fld_comment = isset ( $prop['comment'] );
-               $this->fld_parsedcomment = isset ( $prop['parsedcomment'] );
-               $this->fld_size = isset ( $prop['size'] );
-               $this->fld_sha1 = isset ( $prop['sha1'] );
-               $this->fld_contentmodel = isset ( $prop['contentmodel'] );
+               $this->fld_flags = isset( $prop['flags'] );
+               $this->fld_timestamp = isset( $prop['timestamp'] );
+               $this->fld_comment = isset( $prop['comment'] );
+               $this->fld_parsedcomment = isset( $prop['parsedcomment'] );
+               $this->fld_size = isset( $prop['size'] );
+               $this->fld_sha1 = isset( $prop['sha1'] );
+               $this->fld_contentmodel = isset( $prop['contentmodel'] );
                $this->fld_userid = isset( $prop['userid'] );
-               $this->fld_user = isset ( $prop['user'] );
+               $this->fld_user = isset( $prop['user'] );
                $this->token = $params['token'];
 
                if ( !empty( $params['contentformat'] ) ) {
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..37b22f1 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 );
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..0a0aaee 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;
                                }
                        }
index 491d20f..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'] );
@@ -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,
@@ -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 cae9673..53affbd 100644 (file)
@@ -270,7 +270,7 @@ class ApiSetNotificationTimestamp extends ApiBase {
                $ps = $this->getPageSet();
                return array_merge(
                        parent::getPossibleErrors(),
-                       $ps->getPossibleErrors(),
+                       $ps->getFinalPossibleErrors(),
                        $this->getRequireMaxOneParameterErrorMessages(
                                array( 'timestamp', 'torevid', 'newerthanrevid' ) ),
                        $this->getRequireOnlyOneParameterErrorMessages(
index 9d30729..5563087 100644 (file)
@@ -56,7 +56,7 @@ class ApiUpload extends ApiBase {
                $this->mParams['chunk'] = $request->getFileName( 'chunk' );
 
                // Copy the session key to the file key, for backward compatibility.
-               if( !$this->mParams['filekey'] && $this->mParams['sessionkey'] ) {
+               if ( !$this->mParams['filekey'] && $this->mParams['sessionkey'] ) {
                        $this->mParams['filekey'] = $this->mParams['sessionkey'];
                }
 
@@ -82,7 +82,7 @@ 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() ) {
@@ -354,7 +354,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 +456,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' );
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 74feffb..7310f61 100644 (file)
@@ -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 {
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..8233481 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() ) {
index 72a2e8e..f47107c 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 );
                }
        }
index 0e41e26..31982e0 100644 (file)
@@ -156,8 +156,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 +172,7 @@ class LinkCache {
         */
        public function addLink( $title ) {
                $nt = Title::newFromDBkey( $title );
-               if( $nt ) {
+               if ( $nt ) {
                        return $this->addLinkObj( $nt );
                } else {
                        return 0;
@@ -215,7 +220,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..8069836 100644 (file)
@@ -525,7 +525,7 @@ class LocalisationCache {
                }
                try {
                        $compiledRules = CLDRPluralRuleEvaluator::compile( $rules );
-               } catch( CLDRPluralRuleError $e ) {
+               } catch ( CLDRPluralRuleError $e ) {
                        wfDebugLog( 'l10n', $e->getMessage() . "\n" );
                        return array();
                }
index 6cc2a7e..49db857 100644 (file)
@@ -205,7 +205,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" );
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..63d4141 100644 (file)
@@ -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 7a29154..65fe58f 100644 (file)
@@ -302,6 +302,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 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 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 6aefc98..fd99caf 100644 (file)
@@ -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..3072bfd 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
@@ -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 array of Closure */
        protected $mTrxIdleCallbacks = array();
+       /** @var array of Closure */
+       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
@@ -964,6 +965,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 +1147,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 ) ) {
@@ -1436,7 +1438,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 +1461,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 ) ) {
@@ -1526,7 +1528,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 +1569,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 +1618,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 +1635,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 +1740,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 +1839,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 );
@@ -2283,9 +2285,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 +2456,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 +2468,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 ";
@@ -2557,7 +2559,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 +2625,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' );
                }
@@ -2665,7 +2667,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 +2859,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 +2876,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 +2966,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 Closure $callback
         * @since 1.20
+        */
+       final public function onTransactionIdle( Closure $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
+        * @since 1.22
         */
-       final public function onTransactionIdle( Closure $callback ) {
+       final public function onTransactionPreCommitOrIdle( Closure $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 +3030,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 +3064,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 +3085,7 @@ abstract class DatabaseBase implements DatabaseType {
                                }
                        }
 
+                       $this->runOnTransactionPreCommitCallbacks();
                        $this->doCommit( $fname );
                        $this->runOnTransactionIdleCallbacks();
                }
@@ -3073,21 +3119,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 +3160,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 +3198,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 +3211,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 +3435,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 +3674,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 +3752,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 82b0e5a..293557f 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 );
 
@@ -686,7 +688,7 @@ 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'" );
@@ -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..d8a3723 100644 (file)
@@ -42,7 +42,7 @@ class DatabaseMysql extends DatabaseBase {
         * @return resource
         */
        protected function doQuery( $sql ) {
-               if( $this->bufferResults() ) {
+               if ( $this->bufferResults() ) {
                        $ret = mysql_query( $sql, $this->mConn );
                } else {
                        $ret = mysql_unbuffered_query( $sql, $this->mConn );
@@ -153,7 +153,7 @@ class DatabaseMysql extends DatabaseBase {
 
                // Tell the server we're communicating with it in UTF-8.
                // This may engage various charset conversions.
-               if( $wgDBmysql5 ) {
+               if ( $wgDBmysql5 ) {
                        $this->query( 'SET NAMES utf8', __METHOD__ );
                } else {
                        $this->query( 'SET NAMES binary', __METHOD__ );
@@ -210,7 +210,7 @@ class DatabaseMysql extends DatabaseBase {
                // Only check for CR_SERVER_LOST and CR_UNKNOWN_ERROR, as
                // these are the only errors mysql_fetch_object can cause.
                // See http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
-               if( $errno == 2000 || $errno == 2013 ) {
+               if ( $errno == 2000 || $errno == 2013 ) {
                        throw new DBUnexpectedError( $this, 'Error in fetchObject(): ' . htmlspecialchars( $this->lastError() ) );
                }
                return $row;
@@ -234,7 +234,7 @@ class DatabaseMysql extends DatabaseBase {
                // Only check for CR_SERVER_LOST and CR_UNKNOWN_ERROR, as
                // these are the only errors mysql_fetch_object can cause.
                // See http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
-               if( $errno == 2000 || $errno == 2013 ) {
+               if ( $errno == 2000 || $errno == 2013 ) {
                        throw new DBUnexpectedError( $this, 'Error in fetchRow(): ' . htmlspecialchars( $this->lastError() ) );
                }
                return $row;
@@ -328,7 +328,7 @@ class DatabaseMysql extends DatabaseBase {
                } else {
                        $error = mysql_error();
                }
-               if( $error ) {
+               if ( $error ) {
                        $error .= ' (' . $this->mServer . ')';
                }
                return $error;
@@ -348,7 +348,7 @@ class DatabaseMysql extends DatabaseBase {
         * @param $fname string
         * @return ResultWrapper
         */
-       function replace( $table, $uniqueIndexes, $rows, $fname = 'DatabaseMysql::replace' ) {
+       function replace( $table, $uniqueIndexes, $rows, $fname = __METHOD__ ) {
                return $this->nativeReplace( $table, $rows, $fname );
        }
 
@@ -364,7 +364,7 @@ class DatabaseMysql extends DatabaseBase {
         * @param $options string|array
         * @return int
         */
-       public function estimateRowCount( $table, $vars = '*', $conds = '', $fname = 'DatabaseMysql::estimateRowCount', $options = array() ) {
+       public function estimateRowCount( $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = array() ) {
                $options['EXPLAIN'] = true;
                $res = $this->select( $table, $vars, $conds, $fname, $options );
                if ( $res === false ) {
@@ -393,9 +393,9 @@ class DatabaseMysql extends DatabaseBase {
                        return false;
                }
                $n = mysql_num_fields( $res->result );
-               for( $i = 0; $i < $n; $i++ ) {
+               for ( $i = 0; $i < $n; $i++ ) {
                        $meta = mysql_fetch_field( $res->result, $i );
-                       if( $field == $meta->name ) {
+                       if ( $field == $meta->name ) {
                                return new MySQLField( $meta );
                        }
                }
@@ -411,7 +411,7 @@ class DatabaseMysql extends DatabaseBase {
         * @param $fname string
         * @return bool|array|null False or null on failure
         */
-       function indexInfo( $table, $index, $fname = 'DatabaseMysql::indexInfo' ) {
+       function indexInfo( $table, $index, $fname = __METHOD__ ) {
                # SHOW INDEX works in MySQL 3.23.58, but SHOW INDEXES does not.
                # SHOW INDEX should work for 3.x and up:
                # http://dev.mysql.com/doc/mysql/en/SHOW_INDEX.html
@@ -452,7 +452,7 @@ class DatabaseMysql extends DatabaseBase {
        function strencode( $s ) {
                $sQuoted = mysql_real_escape_string( $s, $this->mConn );
 
-               if( $sQuoted === false ) {
+               if ( $sQuoted === false ) {
                        $this->ping();
                        $sQuoted = mysql_real_escape_string( $s, $this->mConn );
                }
@@ -537,11 +537,11 @@ class DatabaseMysql extends DatabaseBase {
        function getLagFromProcesslist() {
                wfDeprecated( __METHOD__, '1.19' );
                $res = $this->query( 'SHOW PROCESSLIST', __METHOD__ );
-               if( !$res ) {
+               if ( !$res ) {
                        return false;
                }
                # Find slave SQL thread
-               foreach( $res as $row ) {
+               foreach ( $res as $row ) {
                        /* This should work for most situations - when default db
                         * for thread is not specified, it had no events executed,
                         * and therefore it doesn't know yet how lagged it is.
@@ -577,12 +577,12 @@ class DatabaseMysql extends DatabaseBase {
         * @return bool|string
         */
        function masterPosWait( DBMasterPos $pos, $timeout ) {
-               $fname = 'DatabaseBase::masterPosWait';
+               $fname = __METHOD__;
                wfProfileIn( $fname );
 
                # Commit any open transactions
                if ( $this->mTrxLevel ) {
-                       $this->commit( __METHOD__ );
+                       $this->commit( $fname );
                }
 
                if ( !is_null( $this->mFakeSlaveLag ) ) {
@@ -721,7 +721,7 @@ class DatabaseMysql extends DatabaseBase {
                $result = $this->query( "SELECT GET_LOCK($lockName, $timeout) AS lockstatus", $method );
                $row = $this->fetchObject( $result );
 
-               if( $row->lockstatus == 1 ) {
+               if ( $row->lockstatus == 1 ) {
                        return true;
                } else {
                        wfDebug( __METHOD__ . " failed to acquire lock\n" );
@@ -752,13 +752,13 @@ class DatabaseMysql extends DatabaseBase {
        public function lockTables( $read, $write, $method, $lowPriority = true ) {
                $items = array();
 
-               foreach( $write as $table ) {
+               foreach ( $write as $table ) {
                        $tbl = $this->tableName( $table ) .
                                        ( $lowPriority ? ' LOW_PRIORITY' : '' ) .
                                        ' WRITE';
                        $items[] = $tbl;
                }
-               foreach( $read as $table ) {
+               foreach ( $read as $table ) {
                        $items[] = $this->tableName( $table ) . ' READ';
                }
                $sql = "LOCK TABLES " . implode( ',', $items );
@@ -815,7 +815,7 @@ class DatabaseMysql extends DatabaseBase {
         * @throws DBUnexpectedError
         * @return bool|ResultWrapper
         */
-       function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname = 'DatabaseBase::deleteJoin' ) {
+       function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname = __METHOD__ ) {
                if ( !$conds ) {
                        throw new DBUnexpectedError( $this, 'DatabaseBase::deleteJoin() called with empty $conds' );
                }
@@ -885,7 +885,7 @@ class DatabaseMysql extends DatabaseBase {
         * @param $temporary bool
         * @param $fname string
         */
-       function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = 'DatabaseMysql::duplicateTableStructure' ) {
+       function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = __METHOD__ ) {
                $tmp = $temporary ? 'TEMPORARY ' : '';
                $newName = $this->addIdentifierQuotes( $newName );
                $oldName = $this->addIdentifierQuotes( $oldName );
@@ -900,16 +900,16 @@ class DatabaseMysql extends DatabaseBase {
         * @param string $fname calling function name
         * @return array
         */
-       function listTables( $prefix = null, $fname = 'DatabaseMysql::listTables' ) {
-               $result = $this->query( "SHOW TABLES", $fname);
+       function listTables( $prefix = null, $fname = __METHOD__ ) {
+               $result = $this->query( "SHOW TABLES", $fname );
 
                $endArray = array();
 
-               foreach( $result as $table ) {
+               foreach ( $result as $table ) {
                        $vars = get_object_vars( $table );
                        $table = array_pop( $vars );
 
-                       if( !$prefix || strpos( $table, $prefix ) === 0 ) {
+                       if ( !$prefix || strpos( $table, $prefix ) === 0 ) {
                                $endArray[] = $table;
                        }
                }
@@ -922,8 +922,8 @@ class DatabaseMysql extends DatabaseBase {
         * @param $fName string
         * @return bool|ResultWrapper
         */
-       public function dropTable( $tableName, $fName = 'DatabaseMysql::dropTable' ) {
-               if( !$this->tableExists( $tableName, $fName ) ) {
+       public function dropTable( $tableName, $fName = __METHOD__ ) {
+               if ( !$this->tableExists( $tableName, $fName ) ) {
                        return false;
                }
                return $this->query( "DROP TABLE IF EXISTS " . $this->tableName( $tableName ), $fName );
index a57b24b..c197d91 100644 (file)
@@ -324,7 +324,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 +456,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 +624,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 +677,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 +691,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 +756,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 +776,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 +792,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;
                }
 
@@ -856,7 +857,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 +907,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"];
@@ -931,7 +932,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 +961,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 +977,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 +987,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 +1139,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 +1188,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 +1211,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 bb35dc3..b5ac5cb 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;
@@ -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,7 +705,7 @@ __INDEXATTR__;
                return $a;
        }
 
-       function indexUnique( $table, $index, $fname = 'DatabasePostgres::indexUnique' ) {
+       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':
@@ -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,11 +1024,11 @@ __INDEXATTR__;
         * @return string
         */
        function pg_array_parse( $text, &$output, $limit = false, $offset = 1 ) {
-               if( false === $limit ) {
+               if ( false === $limit ) {
                        $limit = strlen( $text ) - 1;
                        $output = array();
                }
-               if( '{}' == $text ) {
+               if ( '{}' == $text ) {
                        return $output;
                }
                do {
index 0789e1b..53a4dcf 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 );
                        }
                }
@@ -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] ) ) {
@@ -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 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..f702047 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 ) {
@@ -665,7 +665,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 +682,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 +833,7 @@ class LoadBalancer {
         */
        function closeAll() {
                foreach ( $this->mConns as $conns2 ) {
-                       foreach  ( $conns2 as $conns3 ) {
+                       foreach ( $conns2 as $conns3 ) {
                                foreach ( $conns3 as $conn ) {
                                        $conn->close();
                                }
index ad7b3b2..4b9ecce 100644 (file)
@@ -135,8 +135,9 @@ class LoadMonitor_MySQL implements LoadMonitor {
                $requestRate = 10;
 
                global $wgMemc;
-               if ( empty( $wgMemc ) )
+               if ( empty( $wgMemc ) ) {
                        $wgMemc = wfGetMainCache();
+               }
 
                $masterName = $this->parent->getServerName( 0 );
                $memcKey = wfMemcKey( 'lag_times', $masterName );
index 582b3ac..d75a126 100644 (file)
@@ -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..4435fc6 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(
index a69862d..8ee2b82 100644 (file)
@@ -365,8 +365,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
@@ -428,11 +429,11 @@ class DifferenceEngine extends ContextSource {
                                        $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_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
+                                                       'rc_patrolled' => 0
                                                ),
                                                __METHOD__
                                        );
@@ -513,9 +514,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 +545,7 @@ class DifferenceEngine extends ContextSource {
                                                # Show categories etc.
                                                $out->addParserOutputNoText( $parserOutput );
                                        }
-                               } else if ( $parserOutput ) {
+                               } elseif ( $parserOutput ) {
                                        $out->addParserOutput( $parserOutput );
                                }
                        }
@@ -861,7 +862,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();
        }
 
index 46a863f..be9c066 100644 (file)
@@ -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 92fee83..11a5ac9 100644 (file)
@@ -577,7 +577,7 @@ class FSFileBackend extends FileBackendStore {
                if ( $stat ) {
                        return array(
                                'mtime' => wfTimestamp( TS_MW, $stat['mtime'] ),
-                               'size'  => $stat['size']
+                               'size' => $stat['size']
                        );
                } elseif ( !$hadError ) {
                        return false; // file does not exist
@@ -810,8 +810,9 @@ class FSFileBackend extends FileBackendStore {
         * @param $errno integer
         * @param $errstr string
         * @return bool
+        * @access private
         */
-       private function handleWarning( $errno, $errstr ) {
+       public function handleWarning( $errno, $errstr ) {
                wfDebugLog( 'FSFileBackend', $errstr ); // more detailed error logging
                $this->hadWarningErrors[count( $this->hadWarningErrors ) - 1] = true;
                return true; // suppress from PHP handler
@@ -862,7 +863,7 @@ abstract class FSFileBackendList implements Iterator {
         */
        public function __construct( $dir, array $params ) {
                $path = realpath( $dir ); // normalize
-               if( $path === false ) {
+               if ( $path === false ) {
                        $path = $dir;
                }
                $this->suffixStart = strlen( $path ) + 1; // size of "path/to/dir/"
@@ -963,7 +964,7 @@ abstract class FSFileBackendList implements Iterator {
         */
        protected function getRelPath( $dir ) {
                $path = realpath( $dir );
-               if( $path === false ) {
+               if ( $path === false ) {
                        $path = $dir;
                }
                return strtr( substr( $path, $this->suffixStart ), '\\', '/' );
index d505d6f..57fd4d7 100644 (file)
@@ -803,7 +803,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;
        }
index d790a99..672e437 100644 (file)
@@ -95,17 +95,17 @@ class FileBackendGroup {
                                : 0644;
                        // Get the FS backend configuration
                        $autoBackends[] = array(
-                               'name'           => $backendName,
-                               'class'          => 'FSFileBackend',
-                               'lockManager'    => 'fsLockManager',
+                               'name' => $backendName,
+                               'class' => 'FSFileBackend',
+                               'lockManager' => 'fsLockManager',
                                'containerPaths' => array(
-                                       "{$repoName}-public"  => "{$directory}",
-                                       "{$repoName}-thumb"   => $thumbDir,
-                                       "{$repoName}-transcoded"   => $transcodedDir,
+                                       "{$repoName}-public" => "{$directory}",
+                                       "{$repoName}-thumb" => $thumbDir,
+                                       "{$repoName}-transcoded" => $transcodedDir,
                                        "{$repoName}-deleted" => $deletedDir,
-                                       "{$repoName}-temp"    => "{$directory}/temp"
+                                       "{$repoName}-temp" => "{$directory}/temp"
                                ),
-                               'fileMode'       => $fileMode,
+                               'fileMode' => $fileMode,
                        );
                }
 
@@ -135,8 +135,8 @@ class FileBackendGroup {
 
                        unset( $config['class'] ); // backend won't need this
                        $this->backends[$name] = array(
-                               'class'    => $class,
-                               'config'   => $config,
+                               'class' => $class,
+                               'config' => $config,
                                'instance' => null
                        );
                }
index 5a91f9e..ea379bc 100644 (file)
@@ -1058,13 +1058,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
@@ -1417,7 +1417,13 @@ abstract class FileBackendStore extends FileBackend {
 
        /**
         * Like resolveStoragePath() except null values are returned if
-        * the container is sharded and the shard could not be determined.
+        * the container is sharded and the shard could not be determined
+        * or if the path ends with '/'. The later case is illegal for FS
+        * backends and can confuse listings for object store backends.
+        *
+        * This function is used when resolving paths that must be valid
+        * locations for files. Directory and listing functions should
+        * generally just use resolveStoragePath() instead.
         *
         * @see FileBackendStore::resolveStoragePath()
         *
@@ -1426,7 +1432,7 @@ abstract class FileBackendStore extends FileBackend {
         */
        final protected function resolveStoragePathReal( $storagePath ) {
                list( $container, $relPath, $cShard ) = $this->resolveStoragePath( $storagePath );
-               if ( $cShard !== null ) {
+               if ( $cShard !== null && substr( $relPath, -1 ) !== '/' ) {
                        return array( $container, $relPath );
                }
                return array( null, null );
@@ -1575,9 +1581,10 @@ 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 ) {
+       final protected function setContainerCache( $container, array $val ) {
                $this->memCache->add( $this->containerCacheKey( $container ), $val, 14 * 86400 );
        }
 
@@ -1586,6 +1593,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 ) ) {
@@ -1666,14 +1674,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 +1694,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 );
@@ -1798,21 +1810,15 @@ abstract class FileBackendStoreOpHandle {
  *
  * @ingroup FileBackend
  */
-abstract class FileBackendStoreShardListIterator implements Iterator {
+abstract class FileBackendStoreShardListIterator extends FilterIterator {
        /** @var FileBackendStore */
        protected $backend;
        /** @var Array */
        protected $params;
-       /** @var Array */
-       protected $shardSuffixes;
+
        protected $container; // string; full container name
        protected $directory; // string; resolved relative path
 
-       /** @var Traversable */
-       protected $iter;
-       protected $curShard = 0; // integer
-       protected $pos = 0; // integer
-
        /** @var Array */
        protected $multiShardPaths = array(); // (rel path => 1)
 
@@ -1829,142 +1835,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 +1892,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..80afcf2 100644 (file)
@@ -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]
                                );
                        }
index 00c0ff8..f0b289e 100644 (file)
@@ -807,8 +807,8 @@ class SwiftFileBackend extends FileBackendStore {
                        $stat = array(
                                // Convert dates like "Tue, 03 Jan 2012 22:01:04 GMT" to TS_MW
                                'mtime' => wfTimestamp( TS_MW, $srcObj->last_modified ),
-                               'size'  => (int)$srcObj->content_length,
-                               'sha1'  => $srcObj->getMetadataValue( 'Sha1base36' )
+                               'size' => (int)$srcObj->content_length,
+                               'sha1' => $srcObj->getMetadataValue( 'Sha1base36' )
                        );
                } catch ( NoSuchContainerException $e ) {
                } catch ( NoSuchObjectException $e ) {
@@ -1239,8 +1239,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 )
                                        );
                                }
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 9b7a7ff..9c778c7 100644 (file)
@@ -151,7 +151,7 @@ abstract class LockManager {
         *
         * @param array $paths List of storage paths
         * @param $type integer LockManager::LOCK_* constant
-        * @return string
+        * @return Status
         */
        abstract protected function doLock( array $paths, $type );
 
@@ -160,7 +160,7 @@ abstract class LockManager {
         *
         * @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
                        );
                }
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 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 0e30017..aa41135 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 )
@@ -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
                        );
                }
@@ -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;
@@ -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
@@ -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..5cd6fc2 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++;
                        }
@@ -147,8 +147,8 @@ class ForeignAPIRepo extends FileRepo {
 
                $query = array_merge( $query,
                        array(
-                               'format'    => 'json',
-                               'action'    => 'query',
+                               'format' => 'json',
+                               'action' => 'query',
                                'redirects' => 'true'
                        ) );
                if ( $this->mApiBase ) {
@@ -157,10 +157,10 @@ class ForeignAPIRepo extends FileRepo {
                        $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 +168,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 +182,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 +198,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 +229,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'];
@@ -268,11 +269,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 +284,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 +299,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 +315,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 +323,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 d017e13..549be40 100644 (file)
@@ -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
                }
 
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..b753e18 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;
index 255da17..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' );
index edf623e..61d321e 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 );
                }
@@ -161,11 +161,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 +224,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 b481e83..325c673 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__
@@ -803,7 +803,7 @@ class LocalFile extends File {
                $oldKey = $this->repo->getSharedCacheKey( 'oldfile', $hashedName );
 
                // Must purge thumbnails for old versions too! bug 30192
-               foreach( $this->getHistory() as $oldFile ) {
+               foreach ( $this->getHistory() as $oldFile ) {
                        $oldFile->purgeThumbnails();
                }
 
@@ -845,7 +845,7 @@ class LocalFile extends File {
                // Purge the squid
                if ( $wgUseSquid ) {
                        $urls = array();
-                       foreach( $files as $file ) {
+                       foreach ( $files as $file ) {
                                $urls[] = $this->getArchiveThumbUrl( $archiveName, $file );
                        }
                        SquidUpdate::purge( $urls );
@@ -866,7 +866,7 @@ class LocalFile extends File {
                // Always purge all files from squid regardless of handler filters
                if ( $wgUseSquid ) {
                        $urls = array();
-                       foreach( $files as $file ) {
+                       foreach ( $files as $file ) {
                                $urls[] = $this->getThumbUrl( $file );
                        }
                        array_shift( $urls ); // don't purge directory
@@ -1196,20 +1196,20 @@ class LocalFile extends File {
                # doesn't deadlock. SELECT FOR UPDATE causes a deadlock for every race condition.
                $dbw->insert( 'image',
                        array(
-                               'img_name'        => $this->getName(),
-                               'img_size'        => $this->size,
-                               'img_width'       => intval( $this->width ),
-                               'img_height'      => intval( $this->height ),
-                               'img_bits'        => $this->bits,
-                               'img_media_type'  => $this->media_type,
-                               'img_major_mime'  => $this->major_mime,
-                               'img_minor_mime'  => $this->minor_mime,
-                               'img_timestamp'   => $timestamp,
+                               'img_name' => $this->getName(),
+                               'img_size' => $this->size,
+                               'img_width' => intval( $this->width ),
+                               'img_height' => intval( $this->height ),
+                               'img_bits' => $this->bits,
+                               'img_media_type' => $this->media_type,
+                               'img_major_mime' => $this->major_mime,
+                               'img_minor_mime' => $this->minor_mime,
+                               'img_timestamp' => $timestamp,
                                'img_description' => $comment,
-                               'img_user'        => $user->getId(),
-                               'img_user_text'   => $user->getName(),
-                               'img_metadata'    => $this->metadata,
-                               'img_sha1'        => $this->sha1
+                               'img_user' => $user->getId(),
+                               'img_user_text' => $user->getName(),
+                               'img_metadata' => $this->metadata,
+                               'img_sha1' => $this->sha1
                        ),
                        __METHOD__,
                        'IGNORE'
@@ -1602,9 +1602,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 +1663,11 @@ 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
+               $this->load(); // if loaded from cache, metadata will be null if it didn't fit
+               return $this->metadata !== null && strlen( $this->metadata ) <= self::CACHE_FIELD_MAX_LEN;
        }
 
        /**
@@ -2174,7 +2178,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 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..371306f 100644 (file)
@@ -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..beb6a58 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.
@@ -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.
 
@@ -647,6 +658,10 @@ Parameters:
        'config-xcache' => 'Message indicates if this program is available',
        'config-apc' => 'Message indicates if this program is available',
        'config-wincache' => 'Message indicates if this program is available',
+       'config-git' => 'Message if Git version control software is available.
+Parameter:
+* $1 is the <code>Git</code> executable file name.',
+       'config-git-bad' => 'Message if Git version control software is not found.',
        'config-imagemagick' => '$1 is ImageMagick\'s <code>convert</code> executable file name.
 
 Add dir="ltr" to the <nowiki><code></nowiki> for right-to-left languages.',
@@ -752,6 +767,7 @@ 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-ns-generic' => 'Used as label for "namespace type" radio button.
 
 See also:
@@ -966,6 +982,7 @@ See also:
 {{Identical|Help}}',
        'config-nofile' => 'Used as failure message. Parameters:
 * $1 - filename',
+       'config-extension-link' => 'Shown on last page of installation to inform about possible extensions.',
        'mainpagetext' => 'Along with {{msg-mw|mainpagedocfooter}}, the text you will see on the Main Page when your wiki is installed.',
        'mainpagedocfooter' => 'Along with {{msg-mw|mainpagetext}}, the text you will see on the Main Page when your wiki is installed.
 This might be a good place to put information about <nowiki>{{GRAMMAR:}}</nowiki>. See [[{{NAMESPACE}}:{{BASEPAGENAME}}/fi]] for an example. For languages having grammatical distinctions and not having an appropriate <nowiki>{{GRAMMAR:}}</nowiki> software available, a suggestion to check and possibly amend the messages having <nowiki>{{SITENAME}}</nowiki> may be valuable. See [[{{NAMESPACE}}:{{BASEPAGENAME}}/ksh]] for an example.',
@@ -3267,6 +3284,7 @@ $messages['crh-latn'] = array(
 
 /** Czech (česky)
  * @author Danny B.
+ * @author Jezevec
  * @author Mormegil
  * @author 아라
  */
@@ -3399,6 +3417,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.
@@ -4003,6 +4023,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.
@@ -4193,6 +4215,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 +4433,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].
 
@@ -4638,6 +4669,7 @@ $messages['eo'] = array(
  * @author Ciencia Al Poder
  * @author Crazymadlover
  * @author Danke7
+ * @author Fitoschido
  * @author Locos epraix
  * @author Od1n
  * @author Platonides
@@ -4776,6 +4808,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.
@@ -5803,6 +5836,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.
@@ -5987,6 +6022,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 +6237,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.
 
@@ -6613,6 +6657,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.
@@ -6802,6 +6848,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 +7068,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.
 
@@ -7161,6 +7216,7 @@ Miniaturaasichte vu Bilder sin megli, sobald s Uffelade vu Dateie aktiviert isch
 );
 
 /** Gujarati (ગુજરાતી)
+ * @author Ashok modhvadia
  * @author Dineshjk
  */
 $messages['gu'] = array(
@@ -7170,7 +7226,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)
@@ -10250,6 +10307,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画像ライブラリが内蔵されていることが確認されました。
@@ -11578,7 +11637,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.',
@@ -11694,7 +11753,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 +11762,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.',
@@ -11798,7 +11854,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.',
@@ -11908,7 +11963,7 @@ 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.
 
-Wells De kei Logo han, draach heh nix en.',
+Wells De kei Logo han, draach heh nix en.', # Fuzzy
        '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 +11989,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.',
@@ -12226,7 +12281,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...',
@@ -12520,17 +12575,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 +12725,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 графичка библиотека.
@@ -12855,6 +12913,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''' може да е побрз кај инсталациите наменети за само еден корисник или незаписни инсталации (само читање).
@@ -13069,6 +13132,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 Упатството за корисници] за подетални иформации како се користи вики-програмот.
 
@@ -14142,6 +14208,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.
@@ -14334,6 +14402,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.
@@ -16067,7 +16141,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 +16152,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 +16171,7 @@ $messages['ps'] = array(
 /** Portuguese (português)
  * @author Crazymadlover
  * @author Hamilton Abreu
+ * @author Luckas
  * @author Mormegil
  * @author Platonides
  * @author SandroHc
@@ -16437,7 +16511,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',
@@ -16542,7 +16616,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.
@@ -17962,7 +18036,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:',
 );
 
 /** 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' => 'ای میل کی ترتیبات',
@@ -20031,9 +20114,11 @@ $messages['zea'] = array(
 
 /** Simplified Chinese (中文(简体)‎)
  * @author Anthony Fok
+ * @author Cwek
  * @author Hydra
  * @author Hzy980512
  * @author Liangent
+ * @author Makecat
  * @author PhiLiP
  * @author Xiaomingyan
  * @author Yfdyh000
@@ -20139,6 +20224,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 +20237,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 +20378,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 +20476,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必须能够访问互联网。
index 0dca23d..e35719d 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 ) {
@@ -484,7 +486,7 @@ abstract class Installer {
                $_lsExists = file_exists( "$IP/LocalSettings.php" );
                wfRestoreWarnings();
 
-               if( !$_lsExists ) {
+               if ( !$_lsExists ) {
                        return false;
                }
                unset( $_lsExists );
@@ -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() {
@@ -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;
                        }
                }
@@ -1367,7 +1393,7 @@ abstract class Installer {
 
                require( "$IP/includes/DefaultSettings.php" );
 
-               foreach( $exts as $e ) {
+               foreach ( $exts as $e ) {
                        require_once( "$IP/extensions/$e/$e.php" );
                }
 
@@ -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..cd7e53c 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,13 +136,13 @@ 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";
                        }
@@ -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 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 2615fc6..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 ) ) {
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 30aa956..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;
                }
@@ -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 a6a8667..3e65eae 100644 (file)
@@ -146,7 +146,7 @@ class WebInstallerOutput {
                }
                wfRestoreWarnings();
 
-               if( $dir == 'rtl' ) {
+               if ( $dir == 'rtl' ) {
                        $css = CSSJanus::transform( $css, true );
                }
 
index 3f3e50a..3423a06 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';
@@ -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 */ ) .
@@ -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 );
                }
        }
@@ -1263,6 +1275,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 +1317,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 +1335,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..bb6fb04 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 );
                }
@@ -150,6 +150,7 @@ abstract class Job {
 
        /**
         * @return integer May be 0 for jobs stored outside the DB
+        * @deprecated 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
index 17a1338..6bf6f82 100644 (file)
@@ -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
@@ -580,6 +594,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
         *
index c364209..9434da0 100644 (file)
@@ -91,7 +91,7 @@ class JobQueueAggregatorMemc extends JobQueueAggregator {
                        if ( $this->cache->add( "$key:rebuild", 1, 1800 ) ) { // lock
                                $pendingDbInfo = array(
                                        'pendingDBs' => $this->findPendingWikiQueues(),
-                                       'timestamp'  => time()
+                                       'timestamp' => time()
                                );
                                for ( $attempts = 1; $attempts <= 25; ++$attempts ) {
                                        if ( $this->cache->add( "$key:lock", 1, 60 ) ) { // lock
index d1e6eb4..6f4f6d9 100644 (file)
@@ -177,70 +177,84 @@ 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;
+               }
+
+               $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;
+                       }
+               }
 
-                               $cache->set( $key, 'false', JobQueueDB::CACHE_TTL_LONG );
-                       } );
+               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." );
+                                       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;
        }
@@ -273,19 +287,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 +332,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 +349,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 +364,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 +415,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 +434,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 +444,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,7 +451,7 @@ 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." );
                }
 
@@ -516,7 +460,7 @@ class JobQueueDB extends JobQueue {
 
                // 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;
        }
@@ -570,7 +514,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 +543,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 +689,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..b517d55
--- /dev/null
@@ -0,0 +1,382 @@
+<?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 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..249ba27 100644 (file)
@@ -216,8 +216,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,7 +233,7 @@ 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'];
@@ -263,7 +264,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,7 +309,7 @@ LUA;
                                        break; // no jobs; nothing to do
                                }
 
-                               wfIncrStats( 'job-pop' );
+                               JobQueue::incrStats( 'job-pop', $this->type );
                                $item = unserialize( $blob );
                                if ( $item === false ) {
                                        wfDebugLog( 'JobQueueRedis', "Could not unserialize {$this->type} job." );
@@ -346,7 +347,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 +378,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 +399,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 +413,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 +467,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 {
@@ -493,9 +490,6 @@ LUA;
         */
        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 +509,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
@@ -547,7 +538,7 @@ LUA;
                        }
                        $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 +567,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 +633,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 +649,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 +667,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,7 +709,7 @@ 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;
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 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 1a2143e..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;
@@ -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,7 +167,7 @@ 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" );
@@ -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 d3feda2..625e8aa 100644 (file)
@@ -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..57cad87 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;
        }
 
@@ -123,14 +118,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 +136,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 +150,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 +159,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 +173,6 @@ class RefreshLinksJob2 extends Job {
                        JobQueueGroup::singleton()->push( $jobs );
                }
 
-               wfProfileOut( __METHOD__ );
                return true;
        }
 
index 1e0e54f..ef9a2d4 100644 (file)
@@ -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 fd598df..7025332 100644 (file)
@@ -76,7 +76,7 @@ class LogEventsList extends ContextSource {
                // If only one log type is used, then show a special message...
                $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() );
@@ -104,7 +104,7 @@ class LogEventsList extends ContextSource {
                $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,6 +464,7 @@ 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(
@@ -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 36ba200..9d6ab25 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 = '';
@@ -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,
@@ -520,8 +520,8 @@ class LogPage {
        public static function formatBlockFlags( $flags, $lang ) {
                $flags = explode( ',', trim( $flags ) );
 
-               if( count( $flags ) > 0 ) {
-                       for( $i = 0; $i < count( $flags ); $i++ ) {
+               if ( count( $flags ) > 0 ) {
+                       for ( $i = 0; $i < count( $flags ); $i++ ) {
                                $flags[$i] = self::formatBlockFlag( $flags[$i], $lang );
                        }
                        return wfMessage( 'parentheses' )->inLanguage( $lang )
@@ -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..963ec64 100644 (file)
@@ -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..589b1ba 100644 (file)
@@ -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 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..1ce3d5e 100644 (file)
@@ -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 a7aa82f..b9e89d9 100644 (file)
@@ -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;
index 5d31898..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
index 52d3195..d7c45d3 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.
@@ -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
@@ -168,7 +169,7 @@ class Exif {
                        '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
+                               '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 5bcb484..276af4d 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;
@@ -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..6949f94 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;
                        }
                }
index 6a46cc0..968a2cd 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 ) {
@@ -168,7 +174,9 @@ 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 );
@@ -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];
 
@@ -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 6e04b3d..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;
index d2bf1f3..8e46f2f 100644 (file)
@@ -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..5165760 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 );
                        }
@@ -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..b368906 100644 (file)
@@ -116,7 +116,9 @@ abstract class MediaHandler {
         * @param string $path the filename
         * @return String
         */
-       function getMetadata( $image, $path ) { return ''; }
+       function getMetadata( $image, $path ) {
+               return '';
+       }
 
        /**
         * Get metadata version.
@@ -166,7 +168,9 @@ abstract class MediaHandler {
         *
         * @return string
         */
-       function getMetadataType( $image ) { return false; }
+       function getMetadataType( $image ) {
+               return false;
+       }
 
        /**
         * Check if the metadata string is valid for this handler.
@@ -255,46 +259,69 @@ abstract class MediaHandler {
         * True if the handled types can be transformed
         * @return bool
         */
-       function canRender( $file ) { return true; }
+       function canRender( $file ) {
+               return true;
+       }
+
        /**
         * True if handled types cannot be displayed directly in a browser
         * but can be rendered
         * @return bool
         */
-       function mustRender( $file ) { return false; }
+       function mustRender( $file ) {
+               return false;
+       }
+
        /**
         * True if the type has multi-page capabilities
         * @return bool
         */
-       function isMultiPage( $file ) { return false; }
+       function isMultiPage( $file ) {
+               return false;
+       }
+
        /**
         * Page count for a multi-page document, false if unsupported or unknown
         * @return bool
         */
-       function pageCount( $file ) { return false; }
+       function pageCount( $file ) {
+               return false;
+       }
+
        /**
         * The material is vectorized and thus scaling is lossless
         * @return bool
         */
-       function isVectorized( $file ) { return false; }
+       function isVectorized( $file ) {
+               return false;
+       }
+
        /**
         * The material is an image, and is animated.
         * In particular, video material need not return true.
         * @note Before 1.20, this was a method of ImageHandler only
         * @return bool
         */
-       function isAnimatedImage( $file ) { return false; }
+       function isAnimatedImage( $file ) {
+               return false;
+       }
+
        /**
         * If the material is animated, we can animate the thumbnail
         * @since 1.20
         * @return bool If material is not animated, handler may return any value.
         */
-       function canAnimateThumbnail( $file ) { return true; }
+       function canAnimateThumbnail( $file ) {
+               return true;
+       }
+
        /**
         * False if the handler is disabled for all files
         * @return bool
         */
-       function isEnabled() { return true; }
+       function isEnabled() {
+               return true;
+       }
 
        /**
         * Get an associative array of page dimensions
@@ -394,9 +421,9 @@ abstract class MediaHandler {
        function visibleMetadataFields() {
                $fields = array();
                $lines = explode( "\n", wfMessage( 'metadata-fields' )->inContentLanguage()->text() );
-               foreach( $lines as $line ) {
+               foreach ( $lines as $line ) {
                        $matches = array();
-                       if( preg_match( '/^\\*\s*(.*?)\s*$/', $line, $matches ) ) {
+                       if ( preg_match( '/^\\*\s*(.*?)\s*$/', $line, $matches ) ) {
                                $fields[] = $matches[1];
                        }
                }
@@ -496,7 +523,7 @@ abstract class MediaHandler {
        public static function fitBoxWidth( $boxWidth, $boxHeight, $maxHeight ) {
                $idealWidth = $boxWidth * $maxHeight / $boxHeight;
                $roundedUp = ceil( $idealWidth );
-               if( round( $roundedUp * $boxHeight / $boxWidth ) > $maxHeight ) {
+               if ( round( $roundedUp * $boxHeight / $boxWidth ) > $maxHeight ) {
                        return floor( $idealWidth );
                } else {
                        return $roundedUp;
@@ -535,9 +562,9 @@ abstract class MediaHandler {
         * @return bool True if removed, false otherwise
         */
        function removeBadFile( $dstPath, $retval = 0 ) {
-               if( file_exists( $dstPath ) ) {
+               if ( file_exists( $dstPath ) ) {
                        $thumbstat = stat( $dstPath );
-                       if( $thumbstat['size'] == 0 || $retval != 0 ) {
+                       if ( $thumbstat['size'] == 0 || $retval != 0 ) {
                                $result = unlink( $dstPath );
 
                                if ( $result ) {
index 2616edb..1d197b1 100644 (file)
@@ -205,7 +205,7 @@ abstract class MediaTransformOutput {
                if ( $this->page && $this->page !== 1 ) {
                        $query = 'page=' . urlencode( $this->page );
                }
-               if( $params ) {
+               if ( $params ) {
                        $query .= $query ? '&' . $params : $params;
                }
                $attribs = array(
@@ -242,7 +242,7 @@ class ThumbnailImage extends MediaTransformOutput {
                # Previous parameters:
                #   $file, $url, $width, $height, $path = false, $page = false
 
-               if( is_array( $parameters ) ) {
+               if ( is_array( $parameters ) ) {
                        $defaults = array(
                                'page' => false
                        );
index b8a5b40..0afbc6f 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;
        }
@@ -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..d2e2cc9 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" );
                                }
 
index cddab51..2987588 100644 (file)
@@ -56,7 +56,7 @@ class SvgHandler extends ImageHandler {
                $metadata = $file->getMetadata();
                if ( $metadata ) {
                        $metadata = $this->unpackMetadata( $metadata );
-                       if( isset( $metadata['animated'] ) ) {
+                       if ( isset( $metadata['animated'] ) ) {
                                return $metadata['animated'];
                        }
                }
@@ -263,11 +263,11 @@ class SvgHandler extends ImageHandler {
                $metadata = array( 'version' => self::SVG_METADATA_VERSION );
                try {
                        $metadata += SVGMetadataExtractor::getMetadata( $filename );
-               } catch( MWException $e ) { // @TODO: SVG specific exceptions
+               } catch ( MWException $e ) { // @TODO: SVG specific exceptions
                        // File not found, broken, etc.
                        $metadata['error'] = array(
                                'message' => $e->getMessage(),
-                               'code'    => $e->getCode()
+                               'code' => $e->getCode()
                        );
                        wfDebug( __METHOD__ . ': ' . $e->getMessage() . "\n" );
                }
index 128bba3..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,11 +124,11 @@ 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();
                }
 
@@ -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" );
 
@@ -180,14 +187,14 @@ class SVGReader {
         */
        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();
@@ -202,11 +209,11 @@ class SVGReader {
         */
        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 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 feacc2a..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 ) );
index fbde251..58ddd6a 100644 (file)
@@ -187,7 +187,7 @@ abstract class BagOStuff {
                        }
                        usleep( $sleep ); // back off
                        $locked = $this->add( "{$key}:lock", $timeout );
-               } while( !$locked );
+               } 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 eafa836..f7247f9 100644 (file)
@@ -125,9 +125,9 @@ class ObjectCache {
        static function newAccelerator( $params ) {
                if ( function_exists( 'apc_fetch' ) ) {
                        $id = 'apc';
-               } elseif( function_exists( 'xcache_get' ) && wfIniGetBool( 'xcache.var_size' ) ) {
+               } elseif ( function_exists( 'xcache_get' ) && wfIniGetBool( 'xcache.var_size' ) ) {
                        $id = 'xcache';
-               } elseif( function_exists( 'wincache_ucache_get' ) ) {
+               } elseif ( function_exists( 'wincache_ucache_get' ) ) {
                        $id = 'wincache';
                } else {
                        throw new MWException( "CACHE_ACCEL requested but no suitable object " .
index bc76294..7cf960e 100644 (file)
@@ -94,7 +94,7 @@ class ObjectCacheSessionHandler {
         */
        static function read( $id ) {
                $data = self::getCache()->get( self::getKey( $id ) );
-               if( $data === false ) {
+               if ( $data === false ) {
                        return '';
                }
                return $data;
index f9feaf9..e1dc42e 100644 (file)
@@ -140,7 +140,13 @@ class RedisBagOStuff extends BagOStuff {
                                $conn->setex( $key, $expiry, $value );
                        }
 
-                       $result = $conn->exec();
+                       /*
+                        * multi()/exec() (transactional mode) allows multiple values to
+                        * be set/get at once and will return an array of results, in
+                        * the order they were set/get. In this case, we only set 1
+                        * value, which should (in case of success) result in true.
+                        */
+                       $result = ( $conn->exec() == array( true ) );
                } catch ( RedisException $e ) {
                        $result = false;
                        $this->handleException( $server, $conn, $e );
index 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
                }
 
index 36bfb48..493611a 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();
@@ -377,12 +381,10 @@ class CoreParserFunctions {
                $text = Sanitizer::normalizeCharReferences( Sanitizer::removeHTMLtags( $text, null, 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 +406,7 @@ class CoreParserFunctions {
        }
 
        static function formatRaw( $num, $raw ) {
-               if( self::matchAgainstMagicword( 'rawsuffix', $raw ) ) {
+               if ( self::matchAgainstMagicword( 'rawsuffix', $raw ) ) {
                        return $num;
                } else {
                        global $wgContLang;
@@ -438,7 +440,7 @@ class CoreParserFunctions {
        static function pagesinnamespace( $parser, $namespace = 0, $raw = null ) {
                return self::formatRaw( SiteStats::pagesInNs( intval( $namespace ) ), $raw );
        }
-       static function numberingroup( $parser, $name = '', $raw = null) {
+       static function numberingroup( $parser, $name = '', $raw = null ) {
                return self::formatRaw( SiteStats::numberingroup( strtolower( $name ) ), $raw );
        }
 
@@ -451,44 +453,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 +508,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 +624,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 +633,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 +671,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 +678,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 +695,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 +756,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 );
@@ -786,19 +827,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 +849,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 8103b60..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,8 +198,9 @@ 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];
@@ -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 0247d3e..957aa6a 100644 (file)
@@ -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
@@ -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__ );
 
@@ -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 {
@@ -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';
                                                }
                                        }
                                }
@@ -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
@@ -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();
@@ -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 .= '.';
@@ -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..2bd5a5d 100644 (file)
@@ -538,7 +538,7 @@ class ParserOptions {
 
                // add in language specific options, if any
                // @todo FIXME: This is just a way of retrieving the url/user preferred variant
-               if( !is_null( $title ) ) {
+               if ( !is_null( $title ) ) {
                        $confstr .= $title->getPageLanguage()->getExtraHashOptions();
                } else {
                        global $wgContLang;
@@ -557,8 +557,9 @@ class ParserOptions {
                        $confstr .= '!printable=1';
                }
 
-               if ( $this->mExtraKey != '' )
+               if ( $this->mExtraKey != '' ) {
                        $confstr .= $this->mExtraKey;
+               }
 
                // Give a chance for extensions to modify the hash, if they have
                // extra options or other effects on the parser cache.
index 3af3b7a..29b3500 100644 (file)
@@ -67,8 +67,22 @@ class ParserOutput extends CacheTime {
 
        function getText() {
                if ( $this->mEditSectionTokens ) {
+                       $text = $this->mText;
+
+                       // If there's old output with misplaced editsections links cached, mangle it to put them in
+                       // the right position. We can assume that there is no '</hN>' inside header tags, making this
+                       // possible to do with a regex.
+                       $text = preg_replace(
+                               //            [ this part is like EDITSECTION_REGEX, but with non-capturing groups                           ]
+                               //                                                                                  note the space here ------v
+                               '#(<[hH](\d)>)(<(?:mw:)?editsection page="(?:.*?)" section="(?:.*?)"(?:/>|>(?:.*?)(?:</(?:mw:)?editsection>))) ([\s\S]*?)(</[hH]\2>)#',
+                               // swap the order of content and editsection link - $2 is ignored since it's the number in hN's tag name
+                               '$1$4 $3$5',
+                               $text
+                       );
+
                        return preg_replace_callback( ParserOutput::EDITSECTION_REGEX,
-                               array( &$this, 'replaceEditSectionLinksCallback' ), $this->mText );
+                               array( &$this, 'replaceEditSectionLinksCallback' ), $text );
                }
                return preg_replace( ParserOutput::EDITSECTION_REGEX, '', $this->mText );
        }
@@ -176,10 +190,10 @@ class ParserOutput extends CacheTime {
                global $wgServer, $wgRegisterInternalExternals;
 
                $registerExternalLink = true;
-               if( !$wgRegisterInternalExternals ) {
+               if ( !$wgRegisterInternalExternals ) {
                        $registerExternalLink = !self::isLinkInternal( $wgServer, $url );
                }
-               if( $registerExternalLink ) {
+               if ( $registerExternalLink ) {
                        $this->mExternalLinks[$url] = 1;
                }
        }
@@ -201,11 +215,11 @@ class ParserOutput extends CacheTime {
                if ( $ns == NS_MEDIA ) {
                        // Normalize this pseudo-alias if it makes it down here...
                        $ns = NS_FILE;
-               } elseif( $ns == NS_SPECIAL ) {
+               } elseif ( $ns == NS_SPECIAL ) {
                        // We don't record Special: links currently
                        // It might actually be wise to, but we'd need to do some normalization.
                        return;
-               } elseif( $dbk === '' ) {
+               } elseif ( $dbk === '' ) {
                        // Don't record self links -  [[#Foo]]
                        return;
                }
@@ -258,7 +272,7 @@ class ParserOutput extends CacheTime {
         */
        function addInterwikiLink( $title ) {
                $prefix = $title->getInterwiki();
-               if( $prefix == '' ) {
+               if ( $prefix == '' ) {
                        throw new MWException( 'Non-interwiki link passed, internal parser error.' );
                }
                if ( !isset( $this->mInterwikiLinks[$prefix] ) ) {
@@ -329,7 +343,7 @@ class ParserOutput extends CacheTime {
         */
        public function getDisplayTitle() {
                $t = $this->getTitleText();
-               if( $t === '' ) {
+               if ( $t === '' ) {
                        return false;
                }
                return $t;
index f25340f..aeae234 100644 (file)
@@ -122,7 +122,7 @@ class Parser_DiffTest
 
        function setFunctionHook( $id, $callback, $flags = 0 ) {
                $this->init();
-               foreach  ( $this->parsers as $parser ) {
+               foreach ( $this->parsers as $parser ) {
                        $parser->setFunctionHook( $id, $callback, $flags );
                }
        }
index 1e90928..809e7f7 100644 (file)
@@ -148,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, '<' );
@@ -577,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 );
@@ -1214,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 465c5a6..654a66e 100644 (file)
@@ -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..e3ea40b 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 );
index e39a7b2..c77fef5 100644 (file)
@@ -48,6 +48,44 @@ function wfProfileOut( $functionname = 'missing' ) {
        }
 }
 
+/**
+ * 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
@@ -57,7 +95,9 @@ class Profiler {
                $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,10 +115,10 @@ class Profiler {
         * @return Profiler
         */
        public static function instance() {
-               if( is_null( self::$__instance ) ) {
+               if ( is_null( self::$__instance ) ) {
                        global $wgProfiler;
-                       if( is_array( $wgProfiler ) ) {
-                               if( !isset( $wgProfiler['class'] ) ) {
+                       if ( is_array( $wgProfiler ) ) {
+                               if ( !isset( $wgProfiler['class'] ) ) {
                                        wfDebug( __METHOD__ . " called without \$wgProfiler['class']"
                                                . " set, falling back to ProfilerStub for safety\n" );
                                        $class = 'ProfilerStub';
@@ -86,7 +126,7 @@ class Profiler {
                                        $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,'
@@ -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; ) {
+               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 ) {
+                       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);
                                }
                        }
 
-                       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,7 +505,7 @@ 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];
@@ -483,7 +521,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 +553,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,7 +571,7 @@ 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);
                                $memorySum = (float)$this->mMemory[$name];
@@ -585,7 +623,7 @@ class Profiler {
         * @param string $s to output
         */
        function debug( $s ) {
-               if( defined( 'MW_COMPILED' ) || function_exists( 'wfDebug' ) ) {
+               if ( defined( 'MW_COMPILED' ) || function_exists( 'wfDebug' ) ) {
                        wfDebug( $s );
                }
        }
index 1cf4fa7..2b9a322 100644 (file)
@@ -46,11 +46,11 @@ class ProfilerSimpleUDP extends ProfilerSimple {
                        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 6743619..aa018fc 100644 (file)
@@ -289,7 +289,7 @@ class ResourceLoader {
 
                // 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 +297,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 +318,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 ) {
@@ -466,7 +466,7 @@ class ResourceLoader {
                // Preload information needed to the mtime calculation below
                try {
                        $this->preloadModuleInfo( array_keys( $modules ), $context );
-               } catch( Exception $e ) {
+               } catch ( Exception $e ) {
                        // Add exception to the output as a comment
                        $errors .= $this->makeComment( $e->__toString() );
                        $this->hasErrors = true;
@@ -637,7 +637,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
                        }
                }
@@ -914,7 +914,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 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..61e6e15 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, .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 d2ce0b7..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;
@@ -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 cfd941a..a975b03 100644 (file)
@@ -59,7 +59,7 @@ class SearchEngine {
         * STUB
         *
         * @param string $term raw search term
-        * @return SearchResultSet
+        * @return SearchResultSet|Status|null
         */
        function searchText( $term ) {
                return null;
@@ -71,7 +71,7 @@ class SearchEngine {
         * STUB
         *
         * @param string $term raw search term
-        * @return SearchResultSet
+        * @return SearchResultSet|null
         */
        function searchTitle( $term ) {
                return null;
@@ -93,7 +93,7 @@ class SearchEngine {
         * @return Boolean
         */
        public function supports( $feature ) {
-               switch( $feature ) {
+               switch ( $feature ) {
                case 'list-redirects':
                        return true;
                case 'title-suffix-filter':
@@ -331,8 +331,9 @@ class SearchEngine {
                                $parsed = substr( $query, strlen( $prefix ) + 1 );
                        }
                }
-               if ( trim( $parsed ) == '' )
+               if ( trim( $parsed ) == '' ) {
                        $parsed = $query; // prefix was the whole query
+               }
 
                wfRunHooks( 'SearchEngineReplacePrefixesComplete', array( $this, $query, &$parsed ) );
 
@@ -420,8 +421,9 @@ class SearchEngine {
 
                $formatted = array_map( array( $wgContLang, 'getFormattedNsText' ), $namespaces );
                foreach ( $formatted as $key => $ns ) {
-                       if ( empty( $ns ) )
+                       if ( empty( $ns ) ) {
                                $formatted[$key] = wfMessage( 'blanknamespace' )->text();
+                       }
                }
                return $formatted;
        }
@@ -641,26 +643,30 @@ class SqlSearchResultSet extends SearchResultSet {
        }
 
        function numRows() {
-               if ( $this->mResultSet === false )
+               if ( $this->mResultSet === false ) {
                        return false;
+               }
 
                return $this->mResultSet->numRows();
        }
 
        function next() {
-               if ( $this->mResultSet === false )
+               if ( $this->mResultSet === false ) {
                        return false;
+               }
 
                $row = $this->mResultSet->fetchObject();
-               if ( $row === false )
+               if ( $row === false ) {
                        return false;
+               }
 
                return SearchResult::newFromRow( $row );
        }
 
        function free() {
-               if ( $this->mResultSet === false )
+               if ( $this->mResultSet === false ) {
                        return false;
+               }
 
                $this->mResultSet->free();
        }
@@ -750,8 +756,9 @@ class SearchResult {
                        wfRunHooks( 'SearchResultInitFromTitle', array( $title, &$id ) );
                        $this->mRevision = Revision::newFromTitle(
                                $this->mTitle, $id, Revision::READ_NORMAL );
-                       if ( $this->mTitle->getNamespace() === NS_FILE )
+                       if ( $this->mTitle->getNamespace() === NS_FILE ) {
                                $this->mImage = wfFindFile( $this->mTitle );
+                       }
                }
        }
 
@@ -761,8 +768,9 @@ class SearchResult {
         * @return Boolean
         */
        function isBrokenTitle() {
-               if ( is_null( $this->mTitle ) )
+               if ( is_null( $this->mTitle ) ) {
                        return true;
+               }
                return false;
        }
 
@@ -816,10 +824,11 @@ class SearchResult {
                // TODO: make highliter take a content object. Make ContentHandler a factory for SearchHighliter.
                list( $contextlines, $contextchars ) = SearchEngine::userHighlightPrefs( $wgUser );
                $h = new SearchHighlighter();
-               if ( $wgAdvancedSearchHighlighting )
+               if ( $wgAdvancedSearchHighlighting ) {
                        return $h->highlightText( $this->mText, $terms, $contextlines, $contextchars );
-               else
+               } else {
                        return $h->highlightSimple( $this->mText, $terms, $contextlines, $contextchars );
+               }
        }
 
        /**
@@ -863,10 +872,11 @@ class SearchResult {
         * @return String: timestamp
         */
        function getTimestamp() {
-               if ( $this->mRevision )
+               if ( $this->mRevision ) {
                        return $this->mRevision->getTimestamp();
-               elseif ( $this->mImage )
+               } elseif ( $this->mImage ) {
                        return $this->mImage->getTimestamp();
+               }
                return '';
        }
 
@@ -952,8 +962,9 @@ class SearchHighlighter {
                global $wgSearchHighlightBoundaries;
                $fname = __METHOD__;
 
-               if ( $text == '' )
+               if ( $text == '' ) {
                        return '';
+               }
 
                // spli text into text + templates/links/tables
                $spat = "/(\\{\\{)|(\\[\\[[^\\]:]+:)|(\n\\{\\|)";
@@ -984,8 +995,9 @@ class SearchHighlighter {
                                                if ( $key == 2 ) {
                                                        // see if this is an image link
                                                        $ns = substr( $val[0], 2, - 1 );
-                                                       if ( $wgContLang->getNsIndex( $ns ) != NS_FILE )
+                                                       if ( $wgContLang->getNsIndex( $ns ) != NS_FILE ) {
                                                                break;
+                                                       }
 
                                                }
                                                $epat = $endPatterns[$key];
@@ -1155,17 +1167,19 @@ class SearchHighlighter {
                $last = - 1;
                $extract = '';
                foreach ( $snippets as $index => $line ) {
-                       if ( $last == - 1 )
+                       if ( $last == - 1 ) {
                                $extract .= $line; // first line
-                       elseif ( $last + 1 == $index && $offsets[$last] + strlen( $snippets[$last] ) >= strlen( $all[$last] ) )
+                       } elseif ( $last + 1 == $index && $offsets[$last] + strlen( $snippets[$last] ) >= strlen( $all[$last] ) ) {
                                $extract .= " " . $line; // continous lines
-                       else
+                       } else {
                                $extract .= '<b> ... </b>' . $line;
+                       }
 
                        $last = $index;
                }
-               if ( $extract )
+               if ( $extract ) {
                        $extract .= '<b> ... </b>';
+               }
 
                $processed = array();
                foreach ( $terms as $term ) {
@@ -1193,8 +1207,9 @@ class SearchHighlighter {
                $split = explode( "\n", $this->mCleanWikitext ? $this->removeWiki( $text ) : $text );
                foreach ( $split as $line ) {
                        $tt = trim( $line );
-                       if ( $tt )
+                       if ( $tt ) {
                                $extracts[$count++] = $tt;
+                       }
                }
        }
 
@@ -1268,8 +1283,9 @@ class SearchHighlighter {
                        while ( $char >= 0x80 && $char < 0xc0 ) {
                                // skip trailing bytes
                                $point++;
-                               if ( $point >= strlen( $text ) )
+                               if ( $point >= strlen( $text ) ) {
                                        return strlen( $text );
+                               }
                                $char = ord( $text[$point] );
                        }
                        return $point;
@@ -1289,24 +1305,28 @@ class SearchHighlighter {
         * @protected
         */
        function process( $pattern, $extracts, &$linesleft, &$contextchars, &$out, &$offsets ) {
-               if ( $linesleft == 0 )
+               if ( $linesleft == 0 ) {
                        return; // nothing to do
+               }
                foreach ( $extracts as $index => $line ) {
-                       if ( array_key_exists( $index, $out ) )
+                       if ( array_key_exists( $index, $out ) ) {
                                continue; // this line already highlighted
+                       }
 
                        $m = array();
-                       if ( !preg_match( $pattern, $line, $m, PREG_OFFSET_CAPTURE ) )
+                       if ( !preg_match( $pattern, $line, $m, PREG_OFFSET_CAPTURE ) ) {
                                continue;
+                       }
 
                        $offset = $m[0][1];
                        $len = strlen( $m[0][0] );
-                       if ( $offset + $len < $contextchars )
+                       if ( $offset + $len < $contextchars ) {
                                $begin = 0;
-                       elseif ( $len > $contextchars )
+                       } elseif ( $len > $contextchars ) {
                                $begin = $offset;
-                       else
+                       } else {
                                $begin = $offset + intval( ( $len - $contextchars ) / 2 );
+                       }
 
                        $end = $begin + $contextchars;
 
@@ -1315,8 +1335,9 @@ class SearchHighlighter {
                        $out[$index] = $this->extract( $line, $begin, $end, $posBegin );
                        $offsets[$index] = $posBegin;
                        $linesleft--;
-                       if ( $linesleft == 0 )
+                       if ( $linesleft == 0 ) {
                                return;
+                       }
                }
        }
 
@@ -1357,16 +1378,17 @@ class SearchHighlighter {
         */
        function linkReplace( $matches ) {
                $colon = strpos( $matches[1], ':' );
-               if ( $colon === false )
+               if ( $colon === false ) {
                        return $matches[2]; // replace with caption
+               }
                global $wgContLang;
                $ns = substr( $matches[1], 0, $colon );
                $index = $wgContLang->getNsIndex( $ns );
-               if ( $index !== false && ( $index == NS_FILE || $index == NS_CATEGORY ) )
+               if ( $index !== false && ( $index == NS_FILE || $index == NS_CATEGORY ) ) {
                        return $matches[0]; // return the whole thing
-               else
+               } else {
                        return $matches[2];
-
+               }
        }
 
        /**
index 163d9dc..cbc1a7a 100644 (file)
@@ -170,8 +170,9 @@ class SearchMssql extends SearchEngine {
 
                                if ( !empty( $terms[3] ) ) {
                                        $regexp = preg_quote( $terms[3], '/' );
-                                       if ( $terms[4] )
+                                       if ( $terms[4] ) {
                                                $regexp .= "[0-9A-Za-z_]+";
+                                       }
                                } else {
                                        $regexp = preg_quote( str_replace( '"', '', $terms[2] ), '/' );
                                }
@@ -247,8 +248,9 @@ class MssqlSearchResultSet extends SearchResultSet {
 
        function next() {
                $row = $this->mResultSet->fetchObject();
-               if ( $row === false )
+               if ( $row === false ) {
                        return false;
+               }
                return new SearchResult( $row );
        }
 }
index ddfd1b3..c219b92 100644 (file)
@@ -57,12 +57,12 @@ class SearchMySQL extends SearchEngine {
 
                # @todo FIXME: This doesn't handle parenthetical expressions.
                $m = array();
-               if( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
+               if ( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
                                $filteredText, $m, PREG_SET_ORDER ) ) {
-                       foreach( $m as $bits ) {
+                       foreach ( $m as $bits ) {
                                @list( /* all */, $modifier, $term, $nonQuoted, $wildcard ) = $bits;
 
-                               if( $nonQuoted != '' ) {
+                               if ( $nonQuoted != '' ) {
                                        $term = $nonQuoted;
                                        $quote = '';
                                } else {
@@ -70,8 +70,10 @@ class SearchMySQL extends SearchEngine {
                                        $quote = '"';
                                }
 
-                               if( $searchon !== '' ) $searchon .= ' ';
-                               if( $this->strictMatching && ($modifier == '') ) {
+                               if ( $searchon !== '' ) {
+                                       $searchon .= ' ';
+                               }
+                               if ( $this->strictMatching && ( $modifier == '' ) ) {
                                        // If we leave this out, boolean op defaults to OR which is rarely helpful.
                                        $modifier = '+';
                                }
@@ -79,7 +81,7 @@ class SearchMySQL extends SearchEngine {
                                // Some languages such as Serbian store the input form in the search index,
                                // so we may need to search for matches in multiple writing system variants.
                                $convertedVariants = $wgContLang->autoConvertToAllVariants( $term );
-                               if( is_array( $convertedVariants ) ) {
+                               if ( is_array( $convertedVariants ) ) {
                                        $variants = array_unique( array_values( $convertedVariants ) );
                                } else {
                                        $variants = array( $term );
@@ -99,11 +101,12 @@ class SearchMySQL extends SearchEngine {
                                $strippedVariants = array_unique( $strippedVariants );
 
                                $searchon .= $modifier;
-                               if( count( $strippedVariants ) > 1 )
+                               if ( count( $strippedVariants ) > 1 ) {
                                        $searchon .= '(';
-                               foreach( $strippedVariants as $stripped ) {
+                               }
+                               foreach ( $strippedVariants as $stripped ) {
                                        $stripped = $this->normalizeText( $stripped );
-                                       if( $nonQuoted && strpos( $stripped, ' ' ) !== false ) {
+                                       if ( $nonQuoted && strpos( $stripped, ' ' ) !== false ) {
                                                // Hack for Chinese: we need to toss in quotes for
                                                // multiple-character phrases since normalizeForSearch()
                                                // added spaces between them to make word breaks.
@@ -111,8 +114,9 @@ class SearchMySQL extends SearchEngine {
                                        }
                                        $searchon .= "$quote$stripped$quote$wildcard ";
                                }
-                               if( count( $strippedVariants ) > 1 )
+                               if ( count( $strippedVariants ) > 1 ) {
                                        $searchon .= ')';
+                               }
 
                                // Match individual terms or quoted phrase in result highlighting...
                                // Note that variants will be introduced in a later stage for highlighting!
@@ -134,8 +138,8 @@ class SearchMySQL extends SearchEngine {
                global $wgContLang;
 
                $regex = preg_quote( $string, '/' );
-               if( $wgContLang->hasWordBreaks() ) {
-                       if( $wildcard ) {
+               if ( $wgContLang->hasWordBreaks() ) {
+                       if ( $wildcard ) {
                                // Don't cut off the final bit!
                                $regex = "\b$regex";
                        } else {
@@ -177,7 +181,9 @@ class SearchMySQL extends SearchEngine {
                global $wgCountTotalSearchHits;
 
                // This seems out of place, why is this called with empty term?
-               if ( trim( $term ) === '' ) return null;
+               if ( trim( $term ) === '' ) {
+                       return null;
+               }
 
                $filteredTerm = $this->filter( $term );
                $query = $this->getQuery( $filteredTerm, $fulltext );
@@ -187,7 +193,7 @@ class SearchMySQL extends SearchEngine {
                );
 
                $total = null;
-               if( $wgCountTotalSearchHits ) {
+               if ( $wgCountTotalSearchHits ) {
                        $query = $this->getCountQuery( $filteredTerm, $fulltext );
                        $totalResult = $this->db->select(
                                $query['tables'], $query['fields'], $query['conds'],
@@ -195,7 +201,7 @@ class SearchMySQL extends SearchEngine {
                        );
 
                        $row = $totalResult->fetchObject();
-                       if( $row ) {
+                       if ( $row ) {
                                $total = intval( $row->c );
                        }
                        $totalResult->free();
@@ -205,7 +211,7 @@ class SearchMySQL extends SearchEngine {
        }
 
        public function supports( $feature ) {
-               switch( $feature ) {
+               switch ( $feature ) {
                case 'list-redirects':
                case 'title-suffix-filter':
                        return true;
@@ -223,7 +229,7 @@ class SearchMySQL extends SearchEngine {
                foreach ( $this->features as $feature => $value ) {
                        if ( $feature === 'list-redirects' && !$value ) {
                                $query['conds']['page_is_redirect'] = 0;
-                       } elseif( $feature === 'title-suffix-filter' && $value ) {
+                       } elseif ( $feature === 'title-suffix-filter' && $value ) {
                                $query['conds'][] = 'page_title' . $this->db->buildLike( $this->db->anyString(), $value );
                        }
                }
@@ -358,7 +364,7 @@ class SearchMySQL extends SearchEngine {
 
                $dbw->update( 'searchindex',
                        array( 'si_title' => $this->normalizeText( $title ) ),
-                       array( 'si_page'  => $id ),
+                       array( 'si_page' => $id ),
                        __METHOD__,
                        array( $dbw->lowPriorityOption() ) );
        }
@@ -386,7 +392,7 @@ class SearchMySQL extends SearchEngine {
                // ignores short words... Pad them so we can pass them
                // through without reconfiguring the server...
                $minLength = $this->minSearchLength();
-               if( $minLength > 1 ) {
+               if ( $minLength > 1 ) {
                        $n = $minLength - 1;
                        $out = preg_replace(
                                "/\b(\w{1,$n})\b/",
@@ -427,7 +433,7 @@ class SearchMySQL extends SearchEngine {
         * @return int
         */
        protected function minSearchLength() {
-               if( is_null( self::$mMinSearchLength ) ) {
+               if ( is_null( self::$mMinSearchLength ) ) {
                        $sql = "SHOW GLOBAL VARIABLES LIKE 'ft\\_min\\_word\\_len'";
 
                        $dbr = wfGetDB( DB_SLAVE );
@@ -435,7 +441,7 @@ class SearchMySQL extends SearchEngine {
                        $row = $result->fetchObject();
                        $result->free();
 
-                       if( $row && $row->Variable_name == 'ft_min_word_len' ) {
+                       if ( $row && $row->Variable_name == 'ft_min_word_len' ) {
                                self::$mMinSearchLength = intval( $row->Value );
                        } else {
                                self::$mMinSearchLength = 0;
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 148a657..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 .= ' & !';
                                }
@@ -169,8 +169,8 @@ class SearchPostgres extends SearchEngine {
                }
                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];
                                }
                        }
@@ -182,11 +182,12 @@ class SearchPostgres extends SearchEngine {
                }
 
                ## 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 {
@@ -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 5b0b7f7..71fd021 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 {
@@ -324,7 +327,7 @@ class SearchSqlite extends SearchEngine {
 
                $dbw->update( 'searchindex',
                        array( 'si_title' => $title ),
-                       array( 'rowid'  => $id ),
+                       array( 'rowid' => $id ),
                        __METHOD__ );
        }
 }
index 35199d6..8c1bda2 100644 (file)
@@ -40,7 +40,7 @@ class SearchUpdate implements DeferrableUpdate {
                        $nt = $title;
                }
 
-               if( $nt ) {
+               if ( $nt ) {
                        $this->mId = $id;
                        $this->mText = $text;
 
@@ -56,7 +56,7 @@ class SearchUpdate implements DeferrableUpdate {
        function doUpdate() {
                global $wgContLang, $wgDisableSearchUpdate;
 
-               if( $wgDisableSearchUpdate || !$this->mId ) {
+               if ( $wgDisableSearchUpdate || !$this->mId ) {
                        return;
                }
 
@@ -65,7 +65,7 @@ class SearchUpdate implements DeferrableUpdate {
                $search = SearchEngine::create();
                $lc = SearchEngine::legalSearchChars() . '&#;';
 
-               if( $this->mText === false ) {
+               if ( $this->mText === false ) {
                        $search->updateTitle( $this->mId,
                                $search->normalizeText( Title::indexTitle( $this->mNamespace, $this->mTitle ) ) );
                        wfProfileOut( __METHOD__ );
diff --git a/includes/specials/SpecialActiveusers.php b/includes/specials/SpecialActiveusers.php
new file mode 100644 (file)
index 0000000..c9c82ad
--- /dev/null
@@ -0,0 +1,250 @@
+<?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 = wfGetDB( DB_SLAVE );
+               $conds = array( 'rc_user > 0' ); // Users - no anons
+               if( !$this->getUser()->isAllowed( 'hideuser' ) ) {
+                       $conds[] = 'ipb_deleted IS NULL OR ipb_deleted = 0'; // don't show hidden names
+               }
+               $conds[] = 'rc_log_type IS NULL OR rc_log_type != ' . $dbr->addQuotes( 'newusers' );
+               $conds[] = 'rc_timestamp >= ' . $dbr->addQuotes(
+                       $dbr->timestamp( wfTimestamp( TS_UNIX ) - $this->RCMaxAge*24*3600 ) );
+
+               if( $this->requestedUser != '' ) {
+                       $conds[] = 'rc_user_text >= ' . $dbr->addQuotes( $this->requestedUser );
+               }
+
+               return array(
+                       'tables' => array( 'recentchanges', 'ipblocks' ),
+                       'fields' => array(
+                               'user_name' => 'rc_user_text', // for Pager inheritance
+                               'rc_user_text', // for Pager
+                               'user_id' => 'rc_user',
+                               'recentedits' => 'COUNT(*)',
+                               'ipb_deleted' => 'MAX(ipb_deleted)'
+                       ),
+                       'options' => array(
+                               'GROUP BY' => array( 'rc_user_text', 'user_id' ),
+                               'USE INDEX' => array( 'recentchanges' => 'rc_user_text' )
+                       ),
+                       'join_conds' => array( // check for suppression blocks
+                               'ipblocks' => array( 'LEFT JOIN', array(
+                                       'rc_user=ipb_user',
+                                       'ipb_auto' => 0 # avoid duplicate blocks
+                               )),
+                       ),
+                       'conds' => $conds
+               );
+       }
+
+       function 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 );
+               if( $row->ipb_deleted ) {
+                       $item = "<span class=\"deleted\">$item</span>";
+               }
+               $count = $this->msg( 'activeusers-count' )->numParams( $row->recentedits )
+                       ->params( $userName )->numParams( $this->RCMaxAge )->escaped();
+               $blocked = !is_null( $row->ipb_deleted ) ? ' ' . $this->msg( 'listusers-blocked', $userName )->escaped() : '';
+
+               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 16652a9..35d6a0c 100644 (file)
@@ -54,6 +54,7 @@ class SpecialAllmessages extends SpecialPage {
                global $wgUseDatabaseMessages;
                if ( !$wgUseDatabaseMessages ) {
                        $out->addWikiMsg( 'allmessagesnotsupportedDB' );
+
                        return;
                } else {
                        $this->outputHeader( 'allmessagestext' );
@@ -73,7 +74,6 @@ class SpecialAllmessages extends SpecialPage {
                        $this->table->getNavigationBar() .
                        $this->table->getBody() .
                        $this->table->getNavigationBar() );
-
        }
 
        protected function getGroupName() {
@@ -211,6 +211,7 @@ class AllmessagesTablePager extends TablePager {
                        $this->getHiddenFields( array( 'title', 'prefix', 'filter', 'lang', 'limit' ) ) .
                        Xml::closeElement( 'fieldset' ) .
                        Xml::closeElement( 'form' );
+
                return $out;
        }
 
@@ -227,6 +228,7 @@ class AllmessagesTablePager extends TablePager {
                $messageNames = array_map( array( $this->lang, 'ucfirst' ), $messageNames );
 
                wfProfileOut( __METHOD__ );
+
                return $messageNames;
        }
 
@@ -317,6 +319,7 @@ class AllmessagesTablePager extends TablePager {
                                break;
                        }
                }
+
                return $result;
        }
 
@@ -365,6 +368,7 @@ class AllmessagesTablePager extends TablePager {
                                                array( 'broken' )
                                        );
                                }
+
                                return $title . ' ' . $this->msg( 'parentheses' )->rawParams( $talk )->escaped();
 
                        case 'am_default' :
@@ -388,6 +392,7 @@ class AllmessagesTablePager extends TablePager {
                        $s .= Xml::tags( 'td', $this->getCellAttrs( 'am_actual', $row->am_actual ), $formatted )
                                . "</tr>\n";
                }
+
                return $s;
        }
 
@@ -399,6 +404,7 @@ class AllmessagesTablePager extends TablePager {
                if ( !$isSecond ) {
                        $arr['id'] = Sanitizer::escapeId( 'msg_' . $this->getLanguage()->lcfirst( $row->am_title ) );
                }
+
                return $arr;
        }
 
index 1e1a56a..98ec4f6 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,6 +306,7 @@ 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 ) );
@@ -317,7 +319,7 @@ class SpecialAllpages extends IncludableSpecialPage {
                        'to' => $outpoint,
                );
 
-               if( $namespace ) {
+               if ( $namespace ) {
                        $queryParams['namespace'] = $namespace;
                }
                if ( $hideRedirects ) {
@@ -331,6 +333,7 @@ class SpecialAllpages extends IncludableSpecialPage {
                        "<a href=\"$link\">$inpointf</a></td><td>",
                        "</td><td><a href=\"$link\">$outpointf</a>"
                )->escaped();
+
                return '<tr><td class="mw-allpages-alphaindexline">' . $out . '</td></tr>';
        }
 
@@ -341,12 +344,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 +534,6 @@ class SpecialAllpages extends IncludableSpecialPage {
                                        )
                        );
                }
-
        }
 
        /**
index 5d0b79f..b083032 100644 (file)
@@ -78,6 +78,7 @@ class AncientPagesPage extends QueryPage {
                        $title,
                        htmlspecialchars( $wgContLang->convert( $title->getPrefixedText() ) )
                );
+
                return $this->getLanguage()->specialList( $link, htmlspecialchars( $d ) );
        }
 
index 2a5e504..5a2ad62 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;
@@ -954,4 +958,5 @@ class SpecialBlock extends FormSpecialPage {
 }
 
 # BC @since 1.18
-class IPBlockForm extends SpecialBlock {}
+class IPBlockForm extends SpecialBlock {
+}
index 25f9165..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' );
                }
@@ -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..0d76883 100644 (file)
@@ -95,6 +95,7 @@ class SpecialBookSources extends SpecialPage {
                                return true;
                        }
                }
+
                return false;
        }
 
@@ -116,13 +117,15 @@ class SpecialBookSources extends SpecialPage {
        private function makeForm() {
                global $wgScript;
 
-               $form = '<fieldset><legend>' . $this->msg( 'booksources-search-legend' )->escaped() . '</legend>';
-               $form .= Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) );
-               $form .= Html::hidden( 'title', $this->getTitle()->getPrefixedText() );
+               $form = Html::openElement( 'fieldset' ) . "\n";
+               $form .= Html::element( 'legend', array(), $this->msg( 'booksources-search-legend' )->text() ) . "\n";
+               $form .= Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ) . "\n";
+               $form .= Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) . "\n";
                $form .= '<p>' . Xml::inputLabel( $this->msg( 'booksources-isbn' )->text(), 'isbn', 'isbn', 20, $this->isbn );
-               $form .= '&#160;' . Xml::submitButton( $this->msg( 'booksources-go' )->text() ) . '</p>';
-               $form .= Xml::closeElement( 'form' );
-               $form .= '</fieldset>';
+               $form .= '&#160;' . Xml::submitButton( $this->msg( 'booksources-go' )->text() ) . "</p>\n";
+               $form .= Html::closeElement( 'form' ) . "\n";
+               $form .= Html::closeElement( 'fieldset' ) . "\n";
+
                return $form;
        }
 
@@ -152,6 +155,7 @@ class SpecialBookSources extends SpecialPage {
 
                                $text = $content->getNativeData();
                                $this->getOutput()->addWikiText( str_replace( 'MAGICNUMBER', $this->isbn, $text ) );
+
                                return true;
                        } else {
                                throw new MWException( "Unexpected content type for book sources: " . $content->getModel() );
@@ -162,9 +166,11 @@ class SpecialBookSources extends SpecialPage {
                $this->getOutput()->addWikiMsg( 'booksources-text' );
                $this->getOutput()->addHTML( '<ul>' );
                $items = $wgContLang->getBookstoreList();
-               foreach ( $items as $label => $url )
+               foreach ( $items as $label => $url ) {
                        $this->getOutput()->addHTML( $this->makeListItem( $label, $url ) );
+               }
                $this->getOutput()->addHTML( '</ul>' );
+
                return true;
        }
 
@@ -177,7 +183,9 @@ class SpecialBookSources extends SpecialPage {
         */
        private function makeListItem( $label, $url ) {
                $url = str_replace( '$1', $this->isbn, $url );
-               return '<li><a href="' . htmlspecialchars( $url ) . '" class="external">' . htmlspecialchars( $label ) . '</a></li>';
+
+               return Html::rawElement( 'li', array(),
+                       Html::element( 'a', array( 'href' => $url, 'class' => 'external' ), $label ) );
        }
 
        protected function getGroupName() {
index dd878cf..b2ddc22 100644 (file)
@@ -51,6 +51,7 @@ class BrokenRedirectsPage extends QueryPage {
 
        function getQueryInfo() {
                $dbr = wfGetDB( DB_SLAVE );
+
                return array(
                        'tables' => array(
                                'redirect',
@@ -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..21becd6 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;
                }
 
@@ -270,6 +274,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 +313,7 @@ class SpecialContributions extends SpecialPage {
                                        );
                                }
                        }
+
                        # Block log link
                        $tools[] = Linker::linkKnown(
                                SpecialPage::getTitleFor( 'Log', 'block' ),
@@ -347,6 +353,7 @@ class SpecialContributions extends SpecialPage {
                }
 
                wfRunHooks( 'ContributionsToolLinks', array( $id, $userpage, &$tools ) );
+
                return $tools;
        }
 
@@ -496,32 +503,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 +566,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 +651,7 @@ class ContribsPager extends ReverseChronologicalPager {
        function getDefaultQuery() {
                $query = parent::getDefaultQuery();
                $query['target'] = $this->target;
+
                return $query;
        }
 
@@ -753,6 +761,7 @@ class ContribsPager extends ReverseChronologicalPager {
                );
 
                wfRunHooks( 'ContribsPager::getQueryInfo', array( &$this, &$queryInfo ) );
+
                return $queryInfo;
        }
 
@@ -1030,6 +1039,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 51262b4..ceecd15 100644 (file)
@@ -54,32 +54,35 @@ 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';
index 7564b00..c364f70 100644 (file)
@@ -122,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 );
                        }
@@ -166,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..f297039 100644 (file)
@@ -35,7 +35,6 @@
  * @author Rob Church <robchur@gmail.com>
  */
 class SpecialEditWatchlist extends UnlistedSpecialPage {
-
        /**
         * Editing modes
         */
@@ -64,7 +63,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                $out = $this->getOutput();
 
                # Anons don't get a watchlist
-               if( $this->getUser()->isAnon() ) {
+               if ( $this->getUser()->isAnon() ) {
                        $out->setPageTitle( $this->msg( 'watchnologin' ) );
                        $llink = Linker::linkKnown(
                                SpecialPage::getTitleFor( 'Userlogin' ),
@@ -73,6 +72,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                                array( 'returnto' => $this->getTitle()->getPrefixedText() )
                        );
                        $out->addHTML( $this->msg( 'watchlistanontext' )->rawParams( $llink )->parse() );
+
                        return;
                }
 
@@ -81,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 41b1d4b..47a4d75 100644 (file)
@@ -28,7 +28,6 @@
  * @author Martin Drashkov
  */
 class FewestrevisionsPage extends QueryPage {
-
        function __construct( $name = 'Fewestrevisions' ) {
                parent::__construct( $name );
        }
@@ -44,19 +43,24 @@ 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' ) )
+                       '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' )
+                       )
                );
        }
 
@@ -73,9 +77,16 @@ class FewestrevisionsPage extends QueryPage {
                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 71f19fa..4c6593b 100644 (file)
@@ -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 68b0024..0d54bb3 100644 (file)
@@ -30,7 +30,6 @@
  * @ingroup SpecialPage
  */
 class SpecialImport extends SpecialPage {
-
        private $interwiki = false;
        private $namespace;
        private $rootpage = '';
@@ -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::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' )
                        );
                }
        }
@@ -357,9 +411,16 @@ class ImportReporter extends ContextSource {
        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..63881a7 100644 (file)
@@ -85,7 +85,7 @@ class SpecialJavaScriptTest extends SpecialPage {
         */
        private function getFrameworkListHtml() {
                $list = '<ul>';
-               foreach( self::$frameworks as $framework => $initFn ) {
+               foreach ( self::$frameworks as $framework => $initFn ) {
                        $list .= Html::rawElement(
                                'li',
                                array(),
@@ -109,7 +109,7 @@ 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 ) . '".'
index ded881c..3abfd5f 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;
                        }
@@ -111,14 +111,15 @@ class LinkSearchPage extends QueryPage {
                        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' );
+                       }
                }
        }
 
@@ -155,7 +156,7 @@ 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;
@@ -168,9 +169,10 @@ class LinkSearchPage extends QueryPage {
                // index-based-only lookup would be done
                list( $this->mMungedQuery, $clause ) = self::mungeQuery(
                                $this->mQuery, $this->mProt );
-               if( $this->mMungedQuery === false )
+               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 );
@@ -208,7 +210,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..9c2d039 100644 (file)
@@ -118,7 +118,7 @@ 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();
                        }
                }
@@ -145,7 +145,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 +157,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() ) );
@@ -166,10 +166,10 @@ 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
                );
        }
@@ -198,11 +198,13 @@ class ImageListPager extends TablePager {
                                return htmlspecialchars( $this->getLanguage()->userTimeAndDate( $value, $this->getUser() ) );
                        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 ) {
+                               if ( $filePage ) {
                                        $link = Linker::linkKnown( $filePage, htmlspecialchars( $filePage->getText() ) );
                                        $download = Xml::element( 'a',
                                                array( 'href' => wfLocalFile( $filePage )->getURL() ),
@@ -240,15 +242,15 @@ class ImageListPager extends TablePager {
                if ( !$wgMiserMode ) {
                        $inputForm['listfiles_search_for'] = Html::input( 'ilsearch', $this->mSearch, 'text',
                                array(
-                                       'size'          => '40',
+                                       'size' => '40',
                                        'maxlength' => '255',
-                                       'id'            => 'mw-ilsearch',
+                                       'id' => 'mw-ilsearch',
                        ) );
                }
                $inputForm['username'] = Html::input( 'user', $this->mUserName, 'text', array(
-                       'size'          => '40',
+                       'size' => '40',
                        'maxlength' => '255',
-                       'id'            => 'mw-listfiles-user',
+                       'id' => 'mw-listfiles-user',
                ) );
                return Html::openElement( 'form',
                                array( 'method' => 'get', 'action' => $wgScript, 'id' => 'mw-listfiles-form' ) ) .
index 7cccf88..3309682 100644 (file)
@@ -85,7 +85,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 {
@@ -149,9 +149,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 +159,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>'
@@ -170,43 +170,43 @@ class SpecialListGroupRights extends SpecialPage {
                }
                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 24888c0..4401499 100644 (file)
@@ -121,7 +121,7 @@ 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();
index d253a4d..d674b05 100644 (file)
@@ -69,7 +69,7 @@ class UsersPager extends AlphabeticPager {
                $this->requestedUser = '';
                if ( $un != '' ) {
                        $username = Title::makeTitleSafe( NS_USER, $un );
-                       if( ! is_null( $username ) ) {
+                       if ( ! is_null( $username ) ) {
                                $this->requestedUser = $username->getText();
                        }
                }
@@ -90,26 +90,26 @@ class UsersPager extends AlphabeticPager {
                $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';
                }
 
@@ -159,15 +159,16 @@ class UsersPager extends AlphabeticPager {
 
                $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>";
                }
 
@@ -179,7 +180,7 @@ class UsersPager extends AlphabeticPager {
 
                $created = '';
                # Some rows may be NULL
-               if( !$this->including && $row->creation ) {
+               if ( !$this->including && $row->creation ) {
                        $user = $this->getUser();
                        $d = $lang->userDate( $row->creation, $user );
                        $t = $lang->userTime( $row->creation, $user );
@@ -233,8 +234,9 @@ 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 .= '&#160;';
@@ -259,7 +261,7 @@ 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 );
@@ -272,10 +274,10 @@ 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 ) );
@@ -337,7 +339,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..cf690f6 100644 (file)
@@ -99,10 +99,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,7 +117,7 @@ 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 ) ) ) {
                        $opts->setValue( 'type', $par );
index 33f291b..6bccdc7 100644 (file)
@@ -75,7 +75,7 @@ class LonelyPagesPage extends PageQueryPage {
        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 1476e15..2e7f672 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,7 +89,7 @@ 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;
                }
@@ -102,7 +102,7 @@ class SpecialMergeHistory extends SpecialPage {
                $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 +110,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();
@@ -183,7 +183,7 @@ 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 =
@@ -216,7 +216,7 @@ class SpecialMergeHistory extends SpecialPage {
                        $this->msg( 'mergehistory-list' )->escaped() . "</h2>\n"
                );
 
-               if( $haveRevisions ) {
+               if ( $haveRevisions ) {
                        $out->addHTML( $revisions->getNavigationBar() );
                        $out->addHTML( '<ul>' );
                        $out->addHTML( $revisions->getBody() );
@@ -261,14 +261,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 +283,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 +298,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,7 +317,7 @@ class SpecialMergeHistory extends SpecialPage {
                        __METHOD__
                );
                # Destination page must exist with revisions
-               if( !$maxtimestamp ) {
+               if ( !$maxtimestamp ) {
                        $this->getOutput()->addWikiMsg( 'mergehistory-fail' );
                        return false;
                }
@@ -329,12 +329,12 @@ 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 +354,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 +380,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 +392,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,7 +405,7 @@ class SpecialMergeHistory extends SpecialPage {
                }
                $destTitle->invalidateCache(); // update histories
                # Check if this did anything
-               if( !$count ) {
+               if ( !$count ) {
                        $this->getOutput()->addWikiMsg( 'mergehistory-fail' );
                        return false;
                }
@@ -462,9 +462,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;
                        }
 
@@ -489,7 +489,7 @@ class MergeHistoryPager extends ReverseChronologicalPager {
                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 c35c44e..e7a86a6 100644 (file)
@@ -55,10 +55,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' );
                }
 
@@ -129,7 +129,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;
                        }
                }
@@ -212,8 +212,8 @@ 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 );
@@ -299,7 +299,7 @@ class MovePageForm extends UnlistedSpecialPage {
                        </tr>"
                );
 
-               if( $considerTalk ) {
+               if ( $considerTalk ) {
                        $out->addHTML( "
                                <tr>
                                        <td></td>
@@ -334,7 +334,7 @@ class MovePageForm extends UnlistedSpecialPage {
                        );
                }
 
-               if( $canMoveSubpage ) {
+               if ( $canMoveSubpage ) {
                        $out->addHTML( "
                                <tr>
                                        <td></td>
@@ -361,14 +361,14 @@ 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 ) .
                                "</td>
-                       </tr>");
+                       </tr>" );
                }
 
                $out->addHTML( "
@@ -502,7 +502,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,7 +524,7 @@ 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() )
@@ -535,13 +535,13 @@ class MovePageForm extends UnlistedSpecialPage {
                                        . ' 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 +552,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,8 +564,8 @@ class MovePageForm extends UnlistedSpecialPage {
 
                $extraOutput = array();
                $count = 1;
-               foreach( $extraPages as $oldSubpage ) {
-                       if( $ot->equals( $oldSubpage ) ) {
+               foreach ( $extraPages as $oldSubpage ) {
+                       if ( $ot->equals( $oldSubpage ) ) {
                                # Already did this one.
                                continue;
                        }
@@ -575,7 +575,7 @@ class MovePageForm extends UnlistedSpecialPage {
                                StringUtils::escapeRegexReplacement( $nt->getDBkey() ), # bug 21234
                                $oldSubpage->getDBkey()
                        );
-                       if( $oldSubpage->isTalkPage() ) {
+                       if ( $oldSubpage->isTalkPage() ) {
                                $newNs = $nt->getTalkPage()->getNamespace();
                        } else {
                                $newNs = $nt->getSubjectPage()->getNamespace();
@@ -583,7 +583,7 @@ class MovePageForm extends UnlistedSpecialPage {
                        # 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();
@@ -596,7 +596,7 @@ 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 );
                                        }
@@ -609,7 +609,7 @@ class MovePageForm extends UnlistedSpecialPage {
                                        $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;
                                        }
@@ -622,12 +622,12 @@ class MovePageForm extends UnlistedSpecialPage {
 
                }
 
-               if( $extraOutput !== array() ) {
+               if ( $extraOutput !== array() ) {
                        $out->addHTML( "<ul>\n<li>" . implode( "</li>\n<li>", $extraOutput ) . "</li>\n</ul>" );
                }
 
                # Deal with watches (we don't watch subpages)
-               if( $this->watch && $user->isLoggedIn() ) {
+               if ( $this->watch && $user->isLoggedIn() ) {
                        $user->addWatch( $ot );
                        $user->addWatch( $nt );
                } else {
@@ -638,7 +638,7 @@ class MovePageForm extends UnlistedSpecialPage {
                # Re-clear the file redirect cache, which may have been polluted by
                # parsing in messages above. See CR r56745.
                # @todo FIXME: Needs a more robust solution inside FileRepo.
-               if( $ot->getNamespace() == NS_FILE ) {
+               if ( $ot->getNamespace() == NS_FILE ) {
                        RepoGroup::singleton()->getLocalRepo()->invalidateImageRedirect( $ot );
                }
        }
@@ -651,8 +651,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;
@@ -669,7 +670,7 @@ class MovePageForm extends UnlistedSpecialPage {
                $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..b865f40 100644 (file)
@@ -73,9 +73,9 @@ 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,10 +88,10 @@ 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 ) {
+                       if ( $likeObj instanceof Title ) {
                                $like = $dbr->buildLike( $dbr->anyString(), strtolower( $likeObj->getDBkey() ), $dbr->anyString() );
                                $conds[] = "LOWER(img_name) $like";
                        }
@@ -164,7 +164,7 @@ class NewFilesPager extends ReverseChronologicalPager {
                        ),
                );
 
-               if( $wgMiserMode ) {
+               if ( $wgMiserMode ) {
                        unset( $fields['like'] );
                }
 
index eefc1b7..46bf81a 100644 (file)
@@ -63,17 +63,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 +115,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,12 +137,12 @@ 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();
@@ -244,8 +246,8 @@ class SpecialNewpages extends IncludableSpecialPage {
                                                        'selected' => $namespace,
                                                        'all' => 'all',
                                                ), array(
-                                                       'name'  => 'namespace',
-                                                       'id'    => 'namespace',
+                                                       'name' => 'namespace',
+                                                       'id' => 'namespace',
                                                        'class' => 'namespaceselector',
                                                )
                                        ) . '&#160;' .
@@ -331,7 +333,7 @@ class SpecialNewpages extends IncludableSpecialPage {
 
                $query = array( 'redirect' => 'no' );
 
-               if( $this->patrollable( $result ) ) {
+               if ( $this->patrollable( $result ) ) {
                        $query['rcid'] = $result->rc_id;
                }
 
@@ -369,7 +371,7 @@ class SpecialNewpages extends IncludableSpecialPage {
                }
 
                # Tags, if any.
-               if( isset( $result->ts_tags ) ) {
+               if ( isset( $result->ts_tags ) ) {
                        list( $tagDisplay, $newClasses ) = ChangeTags::formatSummaryRow( $result->ts_tags, 'newpages' );
                        $classes = array_merge( $classes, $newClasses );
                } else {
@@ -411,7 +413,7 @@ class SpecialNewpages extends IncludableSpecialPage {
                        return;
                }
 
-               if( !isset( $wgFeedClasses[$type] ) ) {
+               if ( !isset( $wgFeedClasses[$type] ) ) {
                        $this->getOutput()->addWikiMsg( 'feed-invalid' );
                        return;
                }
@@ -427,7 +429,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 ) );
                        }
@@ -443,7 +445,7 @@ class SpecialNewpages extends IncludableSpecialPage {
 
        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 +468,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() .
@@ -511,7 +513,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 +525,18 @@ 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' ) ) {
                        $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 +548,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 +558,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
                );
 
index 6b335c3..df9ed57 100644 (file)
@@ -33,6 +33,11 @@ class SpecialPasswordReset extends FormSpecialPage {
         */
        private $email;
 
+       /**
+        * @var User
+        */
+       private $firstUser;
+
        /**
         * @var Status
         */
@@ -65,7 +70,7 @@ 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',
@@ -136,7 +141,7 @@ class SpecialPasswordReset extends FormSpecialPage {
                        }
                }
 
-               if( isset( $data['Capture'] ) && !$this->getUser()->isAllowed( 'passwordreset' ) ) {
+               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' );
                }
@@ -162,7 +167,7 @@ class SpecialPasswordReset extends FormSpecialPage {
                        );
                        if ( $res ) {
                                $users = array();
-                               foreach( $res as $row ) {
+                               foreach ( $res as $row ) {
                                        $users[] = User::newFromRow( $row );
                                }
                        } else {
@@ -180,8 +185,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 {
@@ -257,14 +262,17 @@ 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 {
@@ -275,13 +283,14 @@ class SpecialPasswordReset extends FormSpecialPage {
        }
 
        public function onSuccess() {
-               if( $this->getUser()->isAllowed( 'passwordreset' ) && $this->email != null ) {
+               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() ) );
index 61ba83b..81797f2 100644 (file)
@@ -60,7 +60,7 @@ class PopularPagesPage extends QueryPage {
                global $wgContLang;
 
                $title = Title::makeTitleSafe( $result->namespace, $result->title );
-               if( !$title ) {
+               if ( !$title ) {
                        return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
                                Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
                }
index 6affa73..065c141 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;
@@ -112,8 +112,8 @@ class SpecialPrefixindex extends SpecialAllpages {
                                Html::namespaceSelector( array(
                                                'selected' => $namespace,
                                        ), array(
-                                               'name'  => 'namespace',
-                                               'id'    => 'namespace',
+                                               'name' => 'namespace',
+                                               'id' => 'namespace',
                                                'class' => 'namespaceselector',
                                ) ) .
                                Xml::checkLabel(
@@ -178,8 +178,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,32 +187,32 @@ 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' );
@@ -234,14 +234,14 @@ class SpecialPrefixindex extends SpecialAllpages {
                                        '</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;
index 979c3ee..4c5d1aa 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();
                }
 
@@ -57,7 +57,7 @@ class SpecialProtectedpages extends SpecialPage {
 
                $this->getOutput()->addHTML( $this->showOptions( $NS, $type, $level, $sizetype, $size, $indefOnly, $cascadeOnly ) );
 
-               if( $pager->getNumRows() ) {
+               if ( $pager->getNumRows() ) {
                        $this->getOutput()->addHTML(
                                $pager->getNavigationBar() .
                                '<ul>' . $pager->getBody() . '</ul>' .
@@ -78,12 +78,12 @@ 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' ),
@@ -98,7 +98,7 @@ class SpecialProtectedpages extends SpecialPage {
 
                $description_items[] = $protType;
 
-               if( $row->pr_cascade ) {
+               if ( $row->pr_cascade ) {
                        $description_items[] = $this->msg( 'protect-summary-cascade' )->text();
                }
 
@@ -106,7 +106,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 +116,12 @@ 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' ) ) {
+               if ( $this->getUser()->isAllowed( 'protect' ) ) {
                        $changeProtection = Linker::linkKnown(
                                $title,
                                $this->msg( 'protect_change' )->escaped(),
@@ -248,14 +248,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";
                }
 
@@ -278,17 +278,17 @@ class SpecialProtectedpages extends SpecialPage {
                $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 );
                }
 
@@ -348,23 +348,25 @@ class ProtectedPagesPager extends AlphabeticPager {
                $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 ) {
+               if ( $this->indefonly ) {
                        $conds[] = "pr_expiry = {$this->mDb->addQuotes( $this->mDb->getInfinity() )} 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 cf2b272..7055f2f 100644 (file)
@@ -77,12 +77,12 @@ 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' ),
@@ -99,7 +99,7 @@ class SpecialProtectedtitles extends SpecialPage {
 
                $lang = $this->getLanguage();
                $expiry = strlen( $row->pt_expiry ) ? $lang->formatExpiry( $row->pt_expiry, TS_MW ) : $infinity;
-               if( $expiry != $infinity ) {
+               if ( $expiry != $infinity ) {
                        $user = $this->getUser();
                        $description_items[] = $this->msg(
                                'protect-expiring-local',
@@ -169,19 +169,19 @@ class SpecialProtectedtitles extends SpecialPage {
                $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 );
                }
 
@@ -244,10 +244,12 @@ 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..dc4c1cd 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,7 +62,7 @@ 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 ) );
@@ -83,8 +83,8 @@ 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 );
@@ -113,11 +113,11 @@ 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;
index 6772cb5..0917069 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' ) );
@@ -73,14 +73,14 @@ 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 );
                }
 
@@ -142,7 +142,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 +154,23 @@ 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 );
@@ -206,44 +206,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,8 +260,8 @@ 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;
                        }
@@ -282,9 +282,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;
@@ -298,7 +298,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                $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 +310,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 +338,13 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                }
 
                # Namespace filtering
-               if( $opts['namespace'] !== '' ) {
+               if ( $opts['namespace'] !== '' ) {
                        $selectedNS = $dbr->addQuotes( $opts['namespace'] );
                        $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
@@ -420,7 +420,7 @@ 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() )
@@ -478,7 +478,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 
                $limit = $opts['limit'];
 
-               if( !$this->including() ) {
+               if ( !$this->including() ) {
                        // Output options box
                        $this->doHeader( $opts );
                }
@@ -491,7 +491,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                        $this->getOutput()->setFeedAppendQuery( false );
                }
 
-               if( $wgAllowCategorizedRecentChanges ) {
+               if ( $wgAllowCategorizedRecentChanges ) {
                        $this->filterByCategories( $rows, $opts );
                }
 
@@ -504,22 +504,22 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                $list = ChangesList::newFromContext( $this->getContext() );
 
                $s = $list->beginRecentChangesList();
-               foreach( $rows as $obj ) {
-                       if( $limit == 0 ) {
+               foreach ( $rows as $obj ) {
+                       if ( $limit == 0 ) {
                                break;
                        }
                        $rc = RecentChange::newFromRow( $obj );
                        $rc->counter = $counter++;
                        # Check if the page has been updated since the last visit
-                       if( $wgShowUpdatedMarker && !empty( $obj->wl_notificationtimestamp ) ) {
+                       if ( $wgShowUpdatedMarker && !empty( $obj->wl_notificationtimestamp ) ) {
                                $rc->notificationtimestamp = ( $obj->rc_timestamp >= $obj->wl_notificationtimestamp );
                        } else {
                                $rc->notificationtimestamp = false; // Default
                        }
                        # Check the number of users watching the page
                        $rc->numberofWatchingusers = 0; // Default
-                       if( $showWatcherCount && $obj->rc_namespace >= 0 ) {
-                               if( !isset( $watcherCache[$obj->rc_namespace][$obj->rc_title] ) ) {
+                       if ( $showWatcherCount && $obj->rc_namespace >= 0 ) {
+                               if ( !isset( $watcherCache[$obj->rc_namespace][$obj->rc_title] ) ) {
                                        $watcherCache[$obj->rc_namespace][$obj->rc_title] =
                                                $dbr->selectField(
                                                        'watchlist',
@@ -594,13 +594,13 @@ 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 ) ) {
+                       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 {
@@ -611,7 +611,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                $out .= Xml::closeElement( 'table' );
 
                $unconsumed = $opts->getUnconsumedValues();
-               foreach( $unconsumed as $key => $value ) {
+               foreach ( $unconsumed as $key => $value ) {
                        $out .= Html::hidden( $key, $value );
                }
 
@@ -639,7 +639,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                $extraOpts['namespace'] = $this->namespaceFilterForm( $opts );
 
                global $wgAllowCategorizedRecentChanges;
-               if( $wgAllowCategorizedRecentChanges ) {
+               if ( $wgAllowCategorizedRecentChanges ) {
                        $extraOpts['category'] = $this->categoryFilterForm( $opts );
                }
 
@@ -732,15 +732,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 +750,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 +767,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                }
 
                # Shortcut?
-               if( !count( $articles ) || !count( $cats ) ) {
+               if ( !count( $articles ) || !count( $cats ) ) {
                        return;
                }
 
@@ -778,8 +778,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];
                        }
@@ -829,13 +829,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 ),
@@ -852,7 +852,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 
                // limit links
                $cl = array();
-               foreach( $wgRCLinkLimits as $value ) {
+               foreach ( $wgRCLinkLimits as $value ) {
                        $cl[] = $this->makeOptionsLink( $lang->formatNum( $value ),
                                array( 'limit' => $value ), $nondefaults, $value == $options['limit'] );
                }
@@ -860,7 +860,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 
                // day links, reset 'from' to none
                $dl = array();
-               foreach( $wgRCLinkDays as $value ) {
+               foreach ( $wgRCLinkDays as $value ) {
                        $dl[] = $this->makeOptionsLink( $lang->formatNum( $value ),
                                array( 'days' => $value, 'from' => '' ), $nondefaults, $value == $options['days'] );
                }
@@ -869,12 +869,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'];
index bdeb770..062e09d 100644 (file)
@@ -71,7 +71,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
                }
                $outputPage = $this->getOutput();
                $title = Title::newFromURL( $target );
-               if( !$title || $title->getInterwiki() != '' ) {
+               if ( !$title || $title->getInterwiki() != '' ) {
                        $outputPage->wrapWikiMsg( "<div class=\"errorbox\">\n$1\n</div><br style=\"clear: both\" />", 'allpagesbadtitle' );
                        return false;
                }
@@ -99,7 +99,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
 
                // left join with watchlist table to highlight watched rows
                $uid = $this->getUser()->getId();
-               if( $uid ) {
+               if ( $uid ) {
                        $tables[] = 'watchlist';
                        $select[] = 'wl_user';
                        $join_conds['watchlist'] = array( 'LEFT JOIN', array(
@@ -126,7 +126,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
                        return false;
                }
 
-               if( $ns == NS_CATEGORY && !$showlinkedto ) {
+               if ( $ns == NS_CATEGORY && !$showlinkedto ) {
                        // special handling for categories
                        // XXX: should try to make this less kludgy
                        $link_tables = array( 'categorylinks' );
@@ -135,12 +135,12 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
                        // for now, always join on these tables; really should be configurable as in whatlinkshere
                        $link_tables = array( 'pagelinks', 'templatelinks' );
                        // imagelinks only contains links to pages in NS_FILE
-                       if( $ns == NS_FILE || !$showlinkedto ) {
+                       if ( $ns == NS_FILE || !$showlinkedto ) {
                                $link_tables[] = 'imagelinks';
                        }
                }
 
-               if( $id == 0 && !$showlinkedto ) {
+               if ( $id == 0 && !$showlinkedto ) {
                        return false; // nonexistent pages can't link to any pages
                }
 
@@ -149,22 +149,22 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
 
                $subsql = array(); // SELECT statements to combine with UNION
 
-               foreach( $link_tables as $link_table ) {
+               foreach ( $link_tables as $link_table ) {
                        $pfx = $prefix[$link_table];
 
                        // imagelinks and categorylinks tables have no xx_namespace field, and have xx_to instead of xx_title
-                       if( $link_table == 'imagelinks' ) {
+                       if ( $link_table == 'imagelinks' ) {
                                $link_ns = NS_FILE;
-                       } elseif( $link_table == 'categorylinks' ) {
+                       } elseif ( $link_table == 'categorylinks' ) {
                                $link_ns = NS_CATEGORY;
                        } else {
                                $link_ns = 0;
                        }
 
-                       if( $showlinkedto ) {
+                       if ( $showlinkedto ) {
                                // find changes to pages linking to this page
-                               if( $link_ns ) {
-                                       if( $ns != $link_ns ) {
+                               if ( $link_ns ) {
+                                       if ( $ns != $link_ns ) {
                                                continue;
                                        } // should never happen, but check anyway
                                        $subconds = array( "{$pfx}_to" => $dbkey );
@@ -175,7 +175,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
                        } else {
                                // find changes to pages linked from this page
                                $subconds = array( "{$pfx}_from" => $id );
-                               if( $link_table == 'imagelinks' || $link_table == 'categorylinks' ) {
+                               if ( $link_table == 'imagelinks' || $link_table == 'categorylinks' ) {
                                        $subconds["rc_namespace"] = $link_ns;
                                        $subjoin = "rc_title = {$pfx}_to";
                                } else {
@@ -183,7 +183,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
                                }
                        }
 
-                       if( $dbr->unionSupportsOrderAndLimit() ) {
+                       if ( $dbr->unionSupportsOrderAndLimit() ) {
                                $order = array( 'ORDER BY' => 'rc_timestamp DESC' );
                        } else {
                                $order = array();
@@ -198,16 +198,17 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
                                $join_conds + array( $link_table => array( 'INNER JOIN', $subjoin ) )
                        );
 
-                       if( $dbr->unionSupportsOrderAndLimit() )
+                       if ( $dbr->unionSupportsOrderAndLimit() ) {
                                $query = $dbr->limitResult( $query, $limit );
+                       }
 
                        $subsql[] = $query;
                }
 
-               if( count( $subsql ) == 0 ) {
+               if ( count( $subsql ) == 0 ) {
                        return false; // should never happen
                }
-               if( count( $subsql ) == 1 && $dbr->unionSupportsOrderAndLimit() ) {
+               if ( count( $subsql ) == 1 && $dbr->unionSupportsOrderAndLimit() ) {
                        $sql = $subsql[0];
                } else {
                        // need to resort and relimit after union
@@ -217,7 +218,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
 
                $res = $dbr->query( $sql, __METHOD__ );
 
-               if( $res->numRows() == 0 ) {
+               if ( $res->numRows() == 0 ) {
                        $this->mResultEmpty = true;
                }
 
@@ -260,13 +261,13 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
 
        function setTopText( FormOptions $opts ) {
                $target = $this->getTargetTitle();
-               if( $target ) {
+               if ( $target ) {
                        $this->getOutput()->addBacklinkSubtitle( $target );
                }
        }
 
        function setBottomText( FormOptions $opts ) {
-               if( isset( $this->mResultEmpty ) && $this->mResultEmpty ) {
+               if ( isset( $this->mResultEmpty ) && $this->mResultEmpty ) {
                        $this->getOutput()->addWikiMsg( 'recentchangeslinked-noresult' );
                }
        }
diff --git a/includes/specials/SpecialRedirect.php b/includes/specials/SpecialRedirect.php
new file mode 100644 (file)
index 0000000..210cee6
--- /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..9249f27 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' ) ) .
@@ -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,10 +605,10 @@ 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 ) {
+                       } elseif ( $val == -1 ) {
                                $newBits |= ($oldfield & $const); // use existing
                        }
                }
index 644a575..94995db 100644 (file)
@@ -137,7 +137,7 @@ class SpecialSearch extends SpecialPage {
                if ( $profile === null ) {
                        // BC with old request format
                        $profile = 'advanced';
-                       foreach( $profiles as $key => $data ) {
+                       foreach ( $profiles as $key => $data ) {
                                if ( $nslist === $data['namespaces'] && $key !== 'advanced' ) {
                                        $profile = $key;
                                }
@@ -173,7 +173,7 @@ class SpecialSearch extends SpecialPage {
                # Try to go to page as entered.
                $t = Title::newFromText( $term );
                # If the string cannot be used to create a title
-               if( is_null( $t ) ) {
+               if ( is_null( $t ) ) {
                        $this->showResults( $term );
                        return;
                }
@@ -185,19 +185,19 @@ class SpecialSearch extends SpecialPage {
                        return;
                }
 
-               if( !is_null( $t ) ) {
+               if ( !is_null( $t ) ) {
                        $this->getOutput()->redirect( $t->getFullURL() );
                        return;
                }
                # No match, generate an edit URL
                $t = Title::newFromText( $term );
-               if( !is_null( $t ) ) {
+               if ( !is_null( $t ) ) {
                        global $wgGoToEdit;
                        wfRunHooks( 'SpecialSearchNogomatch', array( &$t ) );
                        wfDebugLog( 'nogomatch', $t->getText(), false );
 
                        # If the feature is enabled, go straight to the edit page
-                       if( $wgGoToEdit ) {
+                       if ( $wgGoToEdit ) {
                                $this->getOutput()->redirect( $t->getFullURL( array( 'action' => 'edit' ) ) );
                                return;
                        }
@@ -253,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.
@@ -740,16 +745,16 @@ class SpecialSearch extends SpecialPage {
                // 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;
index 3901074..47c89d0 100644 (file)
@@ -53,7 +53,7 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
 
                $pages = SpecialPageFactory::getUsablePages( $this->getUser() );
 
-               if( !count( $pages ) ) {
+               if ( !count( $pages ) ) {
                        # Yeah, that was pointless. Thanks for coming.
                        return false;
                }
@@ -64,7 +64,7 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
                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(
@@ -77,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;
@@ -110,7 +110,7 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
                                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();
@@ -118,7 +118,7 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
                                        $includesCachedPages = true;
                                        $pageClasses[] = 'mw-specialpagecached';
                                }
-                               if( $restricted ) {
+                               if ( $restricted ) {
                                        $includesRestrictedPages = true;
                                        $pageClasses[] = 'mw-specialpagerestricted';
                                }
@@ -128,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 a362fa2..dbf2f0d 100644 (file)
@@ -53,15 +53,15 @@ 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
@@ -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,
@@ -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,7 +297,7 @@ class SpecialStatistics extends SpecialPage {
                                }
 
                                // Collect all items that belong to the same header
-                               foreach( $items as $key => $value ) {
+                               foreach ( $items as $key => $value ) {
                                        $name = $this->msg( $key )->inContentLanguage()->parse();
                                        $number = htmlspecialchars( $value );
 
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 bfcb58f..8bc9e48 100644 (file)
@@ -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 70a34e3..9050724 100644 (file)
@@ -1115,10 +1115,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() ) .
index b665c4b..ee737c6 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 {
@@ -463,7 +463,7 @@ class SpecialUpload extends SpecialPage {
                 * 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 ) {
+               foreach ( array( 'license-header', 'filedesc', 'filestatus', 'filesource' ) as $msgName ) {
                        if ( in_array( $msgName, $wgForceUIMsgAsContentMsg ) ) {
                                $msg[$msgName] = "{{int:$msgName}}";
                        } else {
@@ -505,13 +505,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 +530,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 +635,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 +681,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 +709,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 +889,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 e0ddc96..bb57e6c 100644 (file)
@@ -115,18 +115,18 @@ class LoginForm extends SpecialPage {
                $this->mReturnTo = $request->getVal( 'returnto', '' );
                $this->mReturnToQuery = $request->getVal( 'returntoquery', '' );
 
-               if( $wgEnableEmail ) {
+               if ( $wgEnableEmail ) {
                        $this->mEmail = $request->getText( 'wpEmail' );
                } else {
                        $this->mEmail = '';
                }
-               if( !in_array( 'realname', $wgHiddenPrefs ) ) {
+               if ( !in_array( 'realname', $wgHiddenPrefs ) ) {
                        $this->mRealName = $request->getText( 'wpRealName' );
                } else {
                        $this->mRealName = '';
                }
 
-               if( !$wgAuth->validDomain( $this->mDomain ) ) {
+               if ( !$wgAuth->validDomain( $this->mDomain ) ) {
                        $this->mDomain = $wgAuth->getDomain();
                }
                $wgAuth->setDomain( $this->mDomain );
@@ -135,7 +135,7 @@ class LoginForm extends SpecialPage {
                # 2. Do not return to PasswordReset after a successful password change
                #    but goto Wiki start page (Main_Page) instead ( bug 33997 )
                $returnToTitle = Title::newFromText( $this->mReturnTo );
-               if( is_object( $returnToTitle ) && (
+               if ( is_object( $returnToTitle ) && (
                        $returnToTitle->isSpecial( 'Userlogout' )
                        || $returnToTitle->isSpecial( 'PasswordReset' ) ) ) {
                        $this->mReturnTo = '';
@@ -206,8 +206,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 +231,7 @@ class LoginForm extends SpecialPage {
                }
 
                $status = $this->addNewaccountInternal();
-               if( !$status->isGood() ) {
+               if ( !$status->isGood() ) {
                        $error = $this->getOutput()->parse( $status->getWikiText() );
                        $this->mainLoginForm( $error );
                        return;
@@ -250,7 +250,7 @@ class LoginForm extends SpecialPage {
                $out = $this->getOutput();
                $out->setPageTitle( $this->msg( 'accmailtitle' ) );
 
-               if( !$result->isGood() ) {
+               if ( !$result->isGood() ) {
                        $this->mainLoginForm( $this->msg( 'mailerror', $result->getWikiText() )->text() );
                } else {
                        $out->addWikiMsg( 'accmailtext', $u->getName(), $u->getEmail() );
@@ -267,7 +267,7 @@ class LoginForm extends SpecialPage {
 
                # Create the account and abort if there's a problem doing so
                $status = $this->addNewAccountInternal();
-               if( !$status->isGood() ) {
+               if ( !$status->isGood() ) {
                        $error = $this->getOutput()->parse( $status->getWikiText() );
                        $this->mainLoginForm( $error );
                        return false;
@@ -279,7 +279,7 @@ class LoginForm extends SpecialPage {
                if ( $this->getUser()->isAnon() ) {
                        # If we showed up language selection links, and one was in use, be
                        # smart (and sensible) and save that language as the user's preference
-                       if( $wgLoginLanguageSelector && $this->mLanguage ) {
+                       if ( $wgLoginLanguageSelector && $this->mLanguage ) {
                                $u->setOption( 'language', $this->mLanguage );
                        } else {
 
@@ -296,9 +296,9 @@ class LoginForm extends SpecialPage {
                $out = $this->getOutput();
 
                # Send out an email authentication message if needed
-               if( $wgEmailAuthentication && Sanitizer::validateEmail( $u->getEmail() ) ) {
+               if ( $wgEmailAuthentication && Sanitizer::validateEmail( $u->getEmail() ) ) {
                        $status = $u->sendConfirmationMail();
-                       if( $status->isGood() ) {
+                       if ( $status->isGood() ) {
                                $out->addWikiMsg( 'confirmemail_oncreate' );
                        } else {
                                $out->addWikiText( $status->getWikiText( 'confirmemail_sendfailed' ) );
@@ -311,7 +311,7 @@ class LoginForm extends SpecialPage {
                # If not logged in, assume the new account as the current one and set
                # session cookies then show a "welcome" message or a "need cookies"
                # message as needed
-               if( $this->getUser()->isAnon() ) {
+               if ( $this->getUser()->isAnon() ) {
                        $u->setCookies();
                        $wgUser = $u;
                        // This should set it for OutputPage and the Skin
@@ -320,7 +320,7 @@ class LoginForm extends SpecialPage {
                        $this->getContext()->setUser( $u );
                        wfRunHooks( 'AddNewAccount', array( $u, false ) );
                        $u->addNewUserLogEntry( 'create' );
-                       if( $this->hasSessionCookie() ) {
+                       if ( $this->hasSessionCookie() ) {
                                $this->successfulCreation();
                        } else {
                                $this->cookieRedirectCheck( 'new' );
@@ -347,7 +347,7 @@ class LoginForm extends SpecialPage {
                        $wgMinimalPasswordLength, $wgEmailConfirmToEdit;
 
                // If the user passes an invalid domain, something is fishy
-               if( !$wgAuth->validDomain( $this->mDomain ) ) {
+               if ( !$wgAuth->validDomain( $this->mDomain ) ) {
                        return Status::newFatal( 'wrongpassword' );
                }
 
@@ -356,8 +356,8 @@ class LoginForm extends SpecialPage {
                // cation server before they create an account (otherwise, they can
                // create a local account and login as any domain user). We only need
                // to check this for domains that aren't local.
-               if( 'local' != $this->mDomain && $this->mDomain != '' ) {
-                       if(
+               if ( 'local' != $this->mDomain && $this->mDomain != '' ) {
+                       if (
                                !$wgAuth->canCreateAccounts() &&
                                (
                                        !$wgAuth->userExists( $this->mUsername ) ||
@@ -455,7 +455,7 @@ class LoginForm extends SpecialPage {
                $u->setRealName( $this->mRealName );
 
                $abortError = '';
-               if( !wfRunHooks( 'AbortNewAccount', array( $u, &$abortError ) ) ) {
+               if ( !wfRunHooks( 'AbortNewAccount', array( $u, &$abortError ) ) ) {
                        // Hook point to add extra creation throttles and blocks
                        wfDebug( "LoginForm::addNewAccountInternal: a hook blocked creation\n" );
                        return Status::newFatal( new RawMessage( $abortError ) );
@@ -478,7 +478,7 @@ class LoginForm extends SpecialPage {
                        }
                }
 
-               if( !$wgAuth->addUser( $u, $this->mPassword, $this->mEmail, $this->mRealName ) ) {
+               if ( !$wgAuth->addUser( $u, $this->mPassword, $this->mEmail, $this->mRealName ) ) {
                        return Status::newFatal( 'externaldberror' );
                }
 
@@ -576,7 +576,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 +594,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 +617,7 @@ class LoginForm extends SpecialPage {
                                // As a side-effect, we can authenticate the user's e-mail ad-
                                // dress if it's not already done, since the temporary password
                                // was sent via e-mail.
-                               if( !$u->isEmailConfirmed() ) {
+                               if ( !$u->isEmailConfirmed() ) {
                                        $u->confirmEmail();
                                        $u->saveSettings();
                                }
@@ -726,7 +726,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 +752,14 @@ class LoginForm extends SpecialPage {
                        case self::SUCCESS:
                                # We've verified now, update the real record
                                $user = $this->getUser();
-                               if( (bool)$this->mRemember != $user->getBoolOption( 'rememberpassword' ) ) {
+                               if ( (bool)$this->mRemember != $user->getBoolOption( 'rememberpassword' ) ) {
                                        $user->setOption( 'rememberpassword', $this->mRemember ? 1 : 0 );
                                        $user->saveSettings();
                                } else {
                                        $user->invalidateCache();
                                }
 
-                               if( $wgSecureLogin && !$this->mStickHTTPS ) {
+                               if ( $wgSecureLogin && !$this->mStickHTTPS ) {
                                        $user->setCookies( null, false );
                                } else {
                                        $user->setCookies();
@@ -771,7 +771,7 @@ class LoginForm extends SpecialPage {
                                $key = wfMemcKey( 'password-throttle', $request->getIP(), md5( $this->mUsername ) );
                                $wgMemc->delete( $key );
 
-                               if( $this->hasSessionCookie() || $this->mSkipCookieCheck ) {
+                               if ( $this->hasSessionCookie() || $this->mSkipCookieCheck ) {
                                        /* Replace the language object to provide user interface in
                                         * correct language immediately on this first page load.
                                         */
@@ -801,7 +801,7 @@ class LoginForm extends SpecialPage {
                                $this->mainLoginForm( $this->msg( 'wrongpassword' )->text() );
                                break;
                        case self::NOT_EXISTS:
-                               if( $this->getUser()->isAllowed( 'createaccount' ) ) {
+                               if ( $this->getUser()->isAllowed( 'createaccount' ) ) {
                                        $this->mainLoginForm( $this->msg( 'nosuchuser',
                                                wfEscapeWikiText( $this->mUsername ) )->parse() );
                                } else {
@@ -860,7 +860,7 @@ class LoginForm extends SpecialPage {
                        return Status::newFatal( 'noemail', $u->getName() );
                }
                $ip = $this->getRequest()->getIP();
-               if( !$ip ) {
+               if ( !$ip ) {
                        return Status::newFatal( 'badipaddress' );
                }
 
@@ -894,7 +894,7 @@ class LoginForm extends SpecialPage {
                $injected_html = '';
                wfRunHooks( 'UserLoginComplete', array( &$currentUser, &$injected_html ) );
 
-               if( $injected_html !== '' ) {
+               if ( $injected_html !== '' ) {
                        $this->displaySuccessfulAction( $this->msg( 'loginsuccesstitle' ),
                                'loginsuccess', $injected_html );
                } else {
@@ -973,6 +973,29 @@ class LoginForm extends SpecialPage {
                );
        }
 
+       /**
+        * Add a "return to" link or redirect to it.
+        * Extensions can use this to reuse the "return to" logic after
+        * inject steps (such as redirection) into the login process.
+        *
+        * @param $type string, one of the following:
+        *    - error: display a return to link ignoring $wgRedirectOnLogin
+        *    - success: display a return to link using $wgRedirectOnLogin if needed
+        *    - successredirect: send an HTTP redirect using $wgRedirectOnLogin if needed
+        * @param string $returnTo
+        * @param array|string $returnToQuery
+        * @param bool $stickHTTPs Keep redirect link on HTTPs
+        * @since 1.22
+        */
+       public function showReturnToPage(
+               $type, $returnTo = '', $returnToQuery = '', $stickHTTPs = false
+       ) {
+               $this->mReturnTo = $returnTo;
+               $this->mReturnToQuery = $returnToQuery;
+               $this->mStickHTTPS = $stickHTTPs;
+               $this->executeReturnTo( $type );
+       }
+
        /**
         * Add a "return to" link or redirect to it.
         *
@@ -1000,7 +1023,7 @@ class LoginForm extends SpecialPage {
                if ( $wgSecureLogin && !$this->mStickHTTPS ) {
                        $options = array( 'http' );
                        $proto = PROTO_HTTP;
-               } elseif( $wgSecureLogin ) {
+               } elseif ( $wgSecureLogin ) {
                        $options = array( 'https' );
                        $proto = PROTO_HTTPS;
                } else {
@@ -1023,10 +1046,10 @@ class LoginForm extends SpecialPage {
         * @return Boolean
         */
        private function shouldShowVForm() {
-               global $wgUseVFormUserLogin;
+               global $wgUseVFormCreateAccount, $wgUseVFormUserLogin;
 
                if ( $this->mType == 'signup' ) {
-                       return false;
+                       return $this->mRequest->getBool( 'useNew', $wgUseVFormCreateAccount );
                } else {
                        return $this->mRequest->getBool( 'useNew', $wgUseVFormUserLogin );
                }
@@ -1070,11 +1093,24 @@ class LoginForm extends SpecialPage {
                }
 
                if ( $this->mType == 'signup' ) {
-                       $template = new UsercreateTemplate();
+                       $out->addModules( 'mediawiki.special.userlogin.signup' );
+                       if ( $this->mShowVForm ) {
+                               $template = new UsercreateTemplateVForm();
+                               $out->addModuleStyles( array(
+                                       'mediawiki.ui',
+                                       'mediawiki.special.createaccount.vform'
+                               ) );
+                               // XXX hack pending RL or JS parse() support for complex content messages
+                               // https://bugzilla.wikimedia.org/show_bug.cgi?id=25349
+                               $out->addJsConfigVars( 'wgCreateacctImgcaptchaHelp',
+                                       $this->msg( 'createacct-imgcaptcha-help' )->parse() );
+                               $out->addModules( 'mediawiki.special.createaccount.vform.js' );
+                       } else {
+                               $template = new UsercreateTemplate();
+                       }
                        $q = 'action=submitlogin&type=signup';
                        $linkq = 'type=login';
                        $linkmsg = 'gotaccount';
-                       $out->addModules( 'mediawiki.special.userlogin.signup' );
                } else {
                        if ( $this->mShowVForm ) {
                                $template = new UserloginTemplateVForm();
@@ -1101,9 +1137,9 @@ 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 ) {
@@ -1131,6 +1167,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 +1206,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 +1250,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 +1331,7 @@ class LoginForm extends SpecialPage {
         */
        private function renewSessionId() {
                global $wgSecureLogin, $wgCookieSecure;
-               if( $wgSecureLogin && !$this->mStickHTTPS ) {
+               if ( $wgSecureLogin && !$this->mStickHTTPS ) {
                        $wgCookieSecure = false;
                }
 
@@ -1353,10 +1390,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 +1416,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 7501371..f23bc2d 100644 (file)
@@ -80,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' );
@@ -100,15 +100,16 @@ class UserrightsPage extends SpecialPage {
                         * edit their own groups, automatically set them as the
                         * target.
                         */
-                       if ( !count( $available['add'] ) && !count( $available['remove'] ) )
+                       if ( !count( $available['add'] ) && !count( $available['remove'] ) ) {
                                $this->mTarget = $user->getName();
+                       }
                }
 
                if ( User::getCanonicalName( $this->mTarget ) == $user->getName() ) {
                        $this->isself = true;
                }
 
-               if( !$this->userCanChangeRights( $user, true ) ) {
+               if ( !$this->userCanChangeRights( $user, true ) ) {
                        // @todo FIXME: There may be intermediate groups we can mention.
                        $msg = $user->isAnon() ? 'userrights-nologin' : 'userrights-notallowed';
                        throw new PermissionsError( null, array( array( $msg ) ) );
@@ -127,25 +128,36 @@ class UserrightsPage extends SpecialPage {
                        $this->switchForm();
                }
 
-               if( $request->wasPosted() ) {
+               if (
+                       $request->wasPosted() &&
+                       $request->getCheck( 'saveusergroups' ) &&
+                       $user->matchEditToken( $request->getVal( 'wpEditToken' ), $this->mTarget )
+               ) {
                        // save settings
-                       if( $request->getCheck( 'saveusergroups' ) ) {
-                               $reason = $request->getVal( 'user-reason' );
-                               $tok = $request->getVal( 'wpEditToken' );
-                               if( $user->matchEditToken( $tok, $this->mTarget ) ) {
-                                       $this->saveUserGroups(
-                                               $this->mTarget,
-                                               $reason
-                                       );
-
-                                       $out->redirect( $this->getSuccessURL() );
-                                       return;
-                               }
+                       $status = $this->fetchUser( $this->mTarget );
+                       if ( !$status->isOK() ) {
+                               $this->getOutput()->addWikiText( $status->getWikiText() );
+                               return;
+                       }
+
+                       $targetUser = $status->value;
+
+                       if ( $request->getVal( 'conflictcheck-originalgroups' ) !== implode( ',', $targetUser->getGroups() ) ) {
+                               $out->addWikiMsg( 'userrights-conflict' );
+                       } else {
+                               $this->saveUserGroups(
+                                       $this->mTarget,
+                                       $request->getVal( 'user-reason' ),
+                                       $targetUser
+                               );
+
+                               $out->redirect( $this->getSuccessURL() );
+                               return;
                        }
                }
 
                // show some more forms
-               if( $this->mTarget !== null ) {
+               if ( $this->mTarget !== null ) {
                        $this->editUserGroupsForm( $this->mTarget );
                }
        }
@@ -160,17 +172,10 @@ class UserrightsPage extends SpecialPage {
         *
         * @param string $username username to apply changes to.
         * @param string $reason reason for group change
+        * @param User|UserRightsProxy $user Target user object.
         * @return null
         */
-       function saveUserGroups( $username, $reason = '' ) {
-               $status = $this->fetchUser( $username );
-               if( !$status->isOK() ) {
-                       $this->getOutput()->addWikiText( $status->getWikiText() );
-                       return;
-               } else {
-                       $user = $status->value;
-               }
-
+       function saveUserGroups( $username, $reason, $user ) {
                $allgroups = $this->getAllGroups();
                $addgroup = array();
                $removegroup = array();
@@ -218,15 +223,15 @@ class UserrightsPage extends SpecialPage {
                $newGroups = $oldGroups;
 
                // remove then add groups
-               if( $remove ) {
+               if ( $remove ) {
                        $newGroups = array_diff( $newGroups, $remove );
-                       foreach( $remove as $group ) {
+                       foreach ( $remove as $group ) {
                                $user->removeGroup( $group );
                        }
                }
-               if( $add ) {
+               if ( $add ) {
                        $newGroups = array_merge( $newGroups, $add );
-                       foreach( $add as $group ) {
+                       foreach ( $add as $group ) {
                                $user->addGroup( $group );
                        }
                }
@@ -239,7 +244,7 @@ class UserrightsPage extends SpecialPage {
                wfDebug( 'newGroups: ' . print_r( $newGroups, true ) );
                wfRunHooks( 'UserRights', array( &$user, $add, $remove ) );
 
-               if( $newGroups != $oldGroups ) {
+               if ( $newGroups != $oldGroups ) {
                        $this->addLogEntry( $user, $oldGroups, $newGroups, $reason );
                }
                return array( $add, $remove );
@@ -267,7 +272,7 @@ class UserrightsPage extends SpecialPage {
         */
        function editUserGroupsForm( $username ) {
                $status = $this->fetchUser( $username );
-               if( !$status->isOK() ) {
+               if ( !$status->isOK() ) {
                        $this->getOutput()->addWikiText( $status->getWikiText() );
                        return;
                } else {
@@ -295,57 +300,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 );
                }
 
@@ -353,7 +358,7 @@ class UserrightsPage extends SpecialPage {
        }
 
        function makeGroupNameList( $ids ) {
-               if( empty( $ids ) ) {
+               if ( empty( $ids ) ) {
                        return $this->msg( 'rightsnone' )->inContentLanguage()->text();
                } else {
                        return implode( ', ', $ids );
@@ -370,7 +375,7 @@ class UserrightsPage extends SpecialPage {
        function makeGroupNameListForLog( $ids ) {
                wfDeprecated( __METHOD__, '1.21' );
 
-               if( empty( $ids ) ) {
+               if ( empty( $ids ) ) {
                        return '';
                } else {
                        return $this->makeGroupNameList( $ids );
@@ -425,7 +430,7 @@ class UserrightsPage extends SpecialPage {
        protected function showEditUserGroupsForm( $user, $groups ) {
                $list = array();
                $membersList = array();
-               foreach( $groups as $group ) {
+               foreach ( $groups as $group ) {
                        $list[] = self::buildGroupLink( $group );
                        $membersList[] = self::buildGroupMemberLink( $group );
                }
@@ -433,7 +438,7 @@ class UserrightsPage extends SpecialPage {
                $autoList = array();
                $autoMembersList = array();
                if ( $user instanceof User ) {
-                       foreach( Autopromote::getAutopromoteGroups( $user ) as $group ) {
+                       foreach ( Autopromote::getAutopromoteGroups( $user ) as $group ) {
                                $autoList[] = self::buildGroupLink( $group );
                                $autoMembersList[] = self::buildGroupMemberLink( $group );
                        }
@@ -472,6 +477,7 @@ class UserrightsPage extends SpecialPage {
                        Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalURL(), 'name' => 'editGroup', 'id' => 'mw-userrights-form2' ) ) .
                        Html::hidden( 'user', $this->mTarget ) .
                        Html::hidden( 'wpEditToken', $this->getUser()->getEditToken( $this->mTarget ) ) .
+                       Html::hidden( 'conflictcheck-originalgroups', implode( ',', $user->getGroups() ) ) . // Conflict detection
                        Xml::openElement( 'fieldset' ) .
                        Xml::element( 'legend', array(), $this->msg( 'userrights-editusergroup', $user->getName() )->text() ) .
                        $this->msg( 'editinguser' )->params( wfEscapeWikiText( $user->getName() ) )->rawParams( $userToolLinks )->parse() .
@@ -545,7 +551,7 @@ class UserrightsPage extends SpecialPage {
                # more easily manage it.
                $columns = array( 'unchangeable' => array(), 'changeable' => array() );
 
-               foreach( $allgroups as $group ) {
+               foreach ( $allgroups as $group ) {
                        $set = in_array( $group, $usergroups );
                        # Should the checkbox be disabled?
                        $disabled = !(
@@ -562,7 +568,7 @@ class UserrightsPage extends SpecialPage {
                                'irreversible' => $irreversible
                        );
 
-                       if( $disabled ) {
+                       if ( $disabled ) {
                                $columns['unchangeable'][$group] = $checkbox;
                        } else {
                                $columns['changeable'][$group] = $checkbox;
@@ -572,17 +578,19 @@ class UserrightsPage extends SpecialPage {
                # Build the HTML table
                $ret .= Xml::openElement( 'table', array( 'class' => 'mw-userrights-groups' ) ) .
                        "<tr>\n";
-               foreach( $columns as $name => $column ) {
-                       if( $column === array() )
+               foreach ( $columns as $name => $column ) {
+                       if ( $column === array() ) {
                                continue;
+                       }
                        $ret .= Xml::element( 'th', null, $this->msg( 'userrights-' . $name . '-col', count( $column ) )->text() );
                }
                $ret .= "</tr>\n<tr>\n";
-               foreach( $columns as $column ) {
-                       if( $column === array() )
+               foreach ( $columns as $column ) {
+                       if ( $column === array() ) {
                                continue;
+                       }
                        $ret .= "\t<td style='vertical-align:top;'>\n";
-                       foreach( $column as $group => $checkbox ) {
+                       foreach ( $column as $group => $checkbox ) {
                                $attr = $checkbox['disabled'] ? array( 'disabled' => 'disabled' ) : array();
 
                                $member = User::getGroupMember( $group, $user->getName() );
index 581727d..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() .
@@ -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";
        }
 
@@ -399,7 +407,7 @@ class SpecialVersion extends SpecialPage {
                }
 
                $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 303df34..0296a63 100644 (file)
@@ -41,7 +41,7 @@ class SpecialWatchlist extends SpecialPage {
                $output = $this->getOutput();
 
                # Anons don't get a watchlist
-               if( $user->isAnon() ) {
+               if ( $user->isAnon() ) {
                        $output->setPageTitle( $this->msg( 'watchnologin' ) );
                        $output->setRobotPolicy( 'noindex,nofollow' );
                        $llink = Linker::linkKnown(
@@ -74,9 +74,9 @@ class SpecialWatchlist extends SpecialPage {
                $request = $this->getRequest();
 
                $mode = SpecialEditWatchlist::getMode( $request, $par );
-               if( $mode !== false ) {
+               if ( $mode !== false ) {
                        # TODO: localise?
-                       switch( $mode ) {
+                       switch ( $mode ) {
                                case SpecialEditWatchlist::EDIT_CLEAR:
                                        $mode = 'clear';
                                        break;
@@ -101,21 +101,21 @@ class SpecialWatchlist extends SpecialPage {
 
                // @TODO: use FormOptions!
                $defaults = array(
-               /* float */ 'days'      => floatval( $user->getOption( 'watchlistdays' ) ), /* 3.0 or 0.5, watch further below */
+               /* float */ 'days' => floatval( $user->getOption( 'watchlistdays' ) ), /* 3.0 or 0.5, watch further below */
                /* bool  */ 'hideMinor' => (int)$user->getBoolOption( 'watchlisthideminor' ),
-               /* bool  */ 'hideBots'  => (int)$user->getBoolOption( 'watchlisthidebots' ),
+               /* bool  */ 'hideBots' => (int)$user->getBoolOption( 'watchlisthidebots' ),
                /* bool  */ 'hideAnons' => (int)$user->getBoolOption( 'watchlisthideanons' ),
-               /* bool  */ 'hideLiu'   => (int)$user->getBoolOption( 'watchlisthideliu' ),
+               /* bool  */ 'hideLiu' => (int)$user->getBoolOption( 'watchlisthideliu' ),
                /* bool  */ 'hidePatrolled' => (int)$user->getBoolOption( 'watchlisthidepatrolled' ),
-               /* bool  */ 'hideOwn'   => (int)$user->getBoolOption( 'watchlisthideown' ),
-               /* bool  */ 'extended'   => (int)$user->getBoolOption( 'extendwatchlist' ),
+               /* bool  */ 'hideOwn' => (int)$user->getBoolOption( 'watchlisthideown' ),
+               /* bool  */ 'extended' => (int)$user->getBoolOption( 'extendwatchlist' ),
                /* ?     */ 'namespace' => '', //means all
-               /* ?     */ 'invert'    => false,
+               /* ?     */ 'invert' => false,
                /* bool  */ 'associated' => false,
                );
                $this->customFilters = array();
                wfRunHooks( 'SpecialWatchlistFilters', array( $this, &$this->customFilters ) );
-               foreach( $this->customFilters as $key => $params ) {
+               foreach ( $this->customFilters as $key => $params ) {
                        $defaults[$key] = $params['default'];
                }
 
@@ -130,7 +130,7 @@ class SpecialWatchlist extends SpecialPage {
                $values['hideOwn'] = (int)$request->getBool( 'hideOwn', $defaults['hideOwn'] );
                $values['hidePatrolled'] = (int)$request->getBool( 'hidePatrolled', $defaults['hidePatrolled'] );
                $values['extended'] = (int)$request->getBool( 'extended', $defaults['extended'] );
-               foreach( $this->customFilters as $key => $params ) {
+               foreach ( $this->customFilters as $key => $params ) {
                        $values[$key] = (int)$request->getBool( $key, $defaults[$key] );
                }
 
@@ -159,11 +159,11 @@ class SpecialWatchlist extends SpecialPage {
                $values['invert'] = $invert;
                $values['associated'] = $associated;
 
-               if( is_null( $values['days'] ) || !is_numeric( $values['days'] ) ) {
+               if ( is_null( $values['days'] ) || !is_numeric( $values['days'] ) ) {
                        $big = 1000; /* The magical big */
-                       if( $nitems > $big ) {
+                       if ( $nitems > $big ) {
                                # Set default cutoff shorter
-                               $values['days'] = $defaults['days'] = (12.0 / 24.0); # 12 hours...
+                               $values['days'] = $defaults['days'] = ( 12.0 / 24.0 ); # 12 hours...
                        } else {
                                $values['days'] = $defaults['days']; # default cutoff for shortlisters
                        }
@@ -177,7 +177,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 +188,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 +201,19 @@ class SpecialWatchlist extends SpecialPage {
                # Up estimate of watched items by 15% to compensate for talk pages...
 
                # Toggles
-               if( $values['hideOwn'] ) {
+               if ( $values['hideOwn'] ) {
                        $conds[] = 'rc_user != ' . $user->getId();
                }
-               if( $values['hideBots'] ) {
+               if ( $values['hideBots'] ) {
                        $conds[] = 'rc_bot = 0';
                }
-               if( $values['hideMinor'] ) {
+               if ( $values['hideMinor'] ) {
                        $conds[] = 'rc_minor = 0';
                }
-               if( $values['hideLiu'] ) {
+               if ( $values['hideLiu'] ) {
                        $conds[] = 'rc_user = 0';
                }
-               if( $values['hideAnons'] ) {
+               if ( $values['hideAnons'] ) {
                        $conds[] = 'rc_user != 0';
                }
                if ( $user->useRCPatrol() && $values['hidePatrolled'] ) {
@@ -224,7 +224,7 @@ class SpecialWatchlist extends SpecialPage {
                }
 
                # Toggle watchlist content (all recent edits or just the latest)
-               if( $values['extended'] ) {
+               if ( $values['extended'] ) {
                        $limitWatchlist = $user->getIntOption( 'wllimit' );
                        $usePage = false;
                } else {
@@ -236,7 +236,7 @@ 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 );
                }
 
@@ -246,10 +246,10 @@ class SpecialWatchlist extends SpecialPage {
                # Show watchlist header
                $form .= $this->msg( 'watchlist-details' )->numParams( $nitems )->parse() . "\n";
 
-               if( $user->getOption( 'enotifwatchlistpages' ) && $wgEnotifWatchlist ) {
+               if ( $user->getOption( 'enotifwatchlistpages' ) && $wgEnotifWatchlist ) {
                        $form .= $this->msg( 'wlheader-enotif' )->parseAsBlock() . "\n";
                }
-               if( $wgShowUpdatedMarker ) {
+               if ( $wgShowUpdatedMarker ) {
                        $form .= Xml::openElement( 'form', array( 'method' => 'post',
                                                'action' => $this->getTitle()->getLocalURL(),
                                                'id' => 'mw-watchlist-resetbutton' ) ) . "\n" .
@@ -276,10 +276,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 +302,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 +312,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 +328,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 +349,8 @@ class SpecialWatchlist extends SpecialPage {
                                'all' => '',
                                'label' => $this->msg( 'namespace' )->text()
                        ), array(
-                               'name'  => 'namespace',
-                               'id'    => 'namespace',
+                               'name' => 'namespace',
+                               'id' => 'namespace',
                                'class' => 'namespaceselector',
                        )
                ) . '&#160;';
@@ -377,7 +377,7 @@ class SpecialWatchlist extends SpecialPage {
                $output->addHTML( $form );
 
                # If there's nothing to show, stop here
-               if( $numRows == 0 ) {
+               if ( $numRows == 0 ) {
                        $output->addWikiMsg( 'watchnochange' );
                        return;
                }
@@ -477,11 +477,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 c18c963..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 '';
                }
 
index dff9ada..28b5d79 100644 (file)
@@ -46,12 +46,12 @@ class UsercreateTemplate extends QuickTemplate {
        function execute() {
                if ( $this->data['message'] ) {
 ?>
-       <div class="<?php $this->text('messagetype') ?>box">
+       <div class="<?php $this->text( 'messagetype' ); ?>box">
 <?php
                        if ( $this->data['messagetype'] == 'error' ) {
-                               ?><strong><?php $this->msg( 'loginerror' ) ?></strong><br /><?php
+                               ?><strong><?php $this->msg( 'loginerror' ); ?></strong><br /><?php
                        }
-                       $this->html('message');
+                       $this->html( 'message' );
 ?>
        </div>
        <div class="visualClear"></div>
@@ -62,10 +62,10 @@ class UsercreateTemplate extends QuickTemplate {
 <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... */ ?>
+<form name="userlogin2" id="userlogin2" method="post" action="<?php $this->text( 'action' ); ?>">
+       <h2><?php $this->msg( 'createaccount' ); ?></h2>
+       <p id="userloginlink"><?php $this->html( 'link' ); ?></p>
+       <?php $this->html( 'header' ); /* pre-table point for form plugins... */ ?>
 <?php
        if ( $this->haveData( 'languages' ) ) {
                ?><div id="languagelinks"><p><?php $this->html( 'languages' ); ?></p></div><?php
@@ -73,7 +73,7 @@ class UsercreateTemplate extends QuickTemplate {
 ?>
        <table>
                <tr>
-                       <td class="mw-label"><label for='wpName2'><?php $this->msg('yourname') ?></label></td>
+                       <td class="mw-label"><label for='wpName2'><?php $this->msg( 'yourname' ); ?></label></td>
                        <td class="mw-input">
                                <?php
                        echo Html::input( 'wpName', $this->data['name'], 'text', array(
@@ -103,7 +103,7 @@ class UsercreateTemplate extends QuickTemplate {
                        </td>
                </tr>
                <tr class="mw-row-password">
-                       <td class="mw-label"><label for='wpPassword2'><?php $this->msg('yourpassword') ?></label></td>
+                       <td class="mw-label"><label for='wpPassword2'><?php $this->msg( 'yourpassword' ); ?></label></td>
                        <td class="mw-input">
 <?php
                        echo Html::input( 'wpPassword', null, 'password', array(
@@ -122,9 +122,9 @@ class UsercreateTemplate extends QuickTemplate {
                }
 ?>
                <tr id="mw-user-domain-section">
-                       <td class="mw-label"><?php $this->msg( 'yourdomainname' ) ?></td>
+                       <td class="mw-label"><?php $this->msg( 'yourdomainname' ); ?></td>
                        <td class="mw-input">
-                               <select name="wpDomain" value="<?php $this->text( 'domain' ) ?>"
+                               <select name="wpDomain" value="<?php $this->text( 'domain' ); ?>"
                                        tabindex="4">
                                        <?php echo $doms ?>
                                </select>
@@ -134,7 +134,7 @@ class UsercreateTemplate extends QuickTemplate {
                }
 ?>
                <tr class="mw-row-password">
-                       <td class="mw-label"><label for='wpRetype'><?php $this->msg('yourpasswordagain') ?></label></td>
+                       <td class="mw-label"><label for='wpRetype'><?php $this->msg( 'yourpasswordagain' ); ?></label></td>
                        <td class="mw-input">
                                <?php
                echo Html::input( 'wpRetype', null, 'password', array(
@@ -149,7 +149,7 @@ class UsercreateTemplate extends QuickTemplate {
 <?php
                if ( $this->data['useemail'] ) {
 ?>
-                               <td class="mw-label"><label for='wpEmail'><?php $this->msg('youremail') ?></label></td>
+                               <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(
@@ -160,13 +160,13 @@ class UsercreateTemplate extends QuickTemplate {
                ) ); ?>
                                        <div class="prefsectiontip">
                                                <?php  // duplicated in Preferences.php profilePreferences()
-                                                       if( $this->data['emailrequired'] ) {
-                                                               $this->msgWiki('prefs-help-email-required');
+                                                       if ( $this->data['emailrequired'] ) {
+                                                               $this->msgWiki( 'prefs-help-email-required' );
                                                        } else {
-                                                               $this->msgWiki('prefs-help-email');
+                                                               $this->msgWiki( 'prefs-help-email' );
                                                        }
-                                                       if( $this->data['emailothers'] ) {
-                                                               $this->msgWiki('prefs-help-email-others');
+                                                       if ( $this->data['emailothers'] ) {
+                                                               $this->msgWiki( 'prefs-help-email-others' );
                                                        } ?>
                                        </div>
                                </td>
@@ -177,13 +177,13 @@ class UsercreateTemplate extends QuickTemplate {
 ?>
                                </tr>
                                <tr>
-                                       <td class="mw-label"><label for='wpRealName'><?php $this->msg('yourrealname') ?></label></td>
+                                       <td class="mw-label"><label for='wpRealName'><?php $this->msg( 'yourrealname' ); ?></label></td>
                                        <td class="mw-input">
                                                <input type='text' class='loginText' name="wpRealName" id="wpRealName"
                                                        tabindex="7"
-                                                       value="<?php $this->text('realname') ?>" size='20' />
+                                                       value="<?php $this->text( 'realname' ); ?>" size='20' />
                                                <div class="prefsectiontip">
-                                                       <?php $this->msgWiki('prefs-help-realname'); ?>
+                                                       <?php $this->msgWiki( 'prefs-help-realname' ); ?>
                                                </div>
                                        </td>
 <?php
@@ -193,11 +193,11 @@ class UsercreateTemplate extends QuickTemplate {
 ?>
                                </tr>
                                <tr>
-                                       <td class="mw-label"><label for='wpReason'><?php $this->msg('createaccountreason') ?></label></td>
+                                       <td class="mw-label"><label for='wpReason'><?php $this->msg( 'createaccountreason' ); ?></label></td>
                                        <td class="mw-input">
                                                <input type='text' class='loginText' name="wpReason" id="wpReason"
                                                        tabindex="8"
-                                                       value="<?php $this->text('reason') ?>" size='20' />
+                                                       value="<?php $this->text( 'reason' ); ?>" size='20' />
                                        </td>
 <?php
                }
@@ -233,13 +233,13 @@ class UsercreateTemplate extends QuickTemplate {
                                if ( !empty( $inputItem['msg'] ) && $inputItem['type'] != 'checkbox' ) {
                                        ?><td class="mw-label"><label for="<?php
                                        echo htmlspecialchars( $inputItem['name'] ); ?>"><?php
-                                       $this->msgWiki( $inputItem['msg'] ) ?></label><?php
+                                       $this->msgWiki( $inputItem['msg'] ); ?></label><?php
                                } else {
                                        ?><td><?php
                                }
                        ?></td>
                        <td class="mw-input">
-                               <input type="<?php echo htmlspecialchars( $inputItem['type'] ) ?>" name="<?php
+                               <input type="<?php echo htmlspecialchars( $inputItem['type'] ); ?>" name="<?php
                                echo htmlspecialchars( $inputItem['name'] ); ?>"
                                        tabindex="<?php echo $tabIndex++; ?>"
                                        value="<?php
@@ -250,13 +250,14 @@ class UsercreateTemplate extends QuickTemplate {
                                }
                                        ?>" id="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
                                        <?php
-                               if ( $inputItem['type'] == 'checkbox' && !empty( $inputItem['value'] ) )
+                               if ( $inputItem['type'] == 'checkbox' && !empty( $inputItem['value'] ) ) {
                                        echo 'checked="checked"';
+                               }
                                        ?> /> <?php
                                        if ( $inputItem['type'] == 'checkbox' && !empty( $inputItem['msg'] ) ) {
                                                ?>
                                <label for="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"><?php
-                                       $this->msgHtml( $inputItem['msg'] ) ?></label><?php
+                                       $this->msgHtml( $inputItem['msg'] ); ?></label><?php
                                        }
                                if ( $inputItem['helptext'] !== false ) {
                                ?>
@@ -276,7 +277,7 @@ class UsercreateTemplate extends QuickTemplate {
                        <td class="mw-submit">
                                <input type='submit' name="wpCreateaccount" id="wpCreateaccount"
                                        tabindex="<?php echo $tabIndex++; ?>"
-                                       value="<?php $this->msg('createaccount') ?>" />
+                                       value="<?php $this->msg( 'createaccount' ); ?>" />
                        </td>
                </tr>
        </table>
diff --git a/includes/templates/UsercreateVForm.php b/includes/templates/UsercreateVForm.php
new file mode 100644 (file)
index 0000000..b8ce27e
--- /dev/null
@@ -0,0 +1,295 @@
+<?php
+/**
+ * Html form for account creation with new VForm appearance.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Templates
+ */
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+       die( -1 );
+}
+
+/**
+ * Html form for create account with new VForm appearance.
+ *
+ * @since 1.22
+ */
+class UsercreateTemplateVForm extends BaseTemplate {
+
+       /**
+        * Extensions (AntiSpoof and TitleBlacklist) call this in response to
+        * UserCreateForm hook to add checkboxes to the create account form.
+        */
+       function addInputItem( $name, $value, $type, $msg, $helptext = false ) {
+               $this->data['extraInput'][] = array(
+                       'name' => $name,
+                       'value' => $value,
+                       'type' => $type,
+                       'msg' => $msg,
+                       'helptext' => $helptext,
+               );
+       }
+
+       function execute() {
+               global $wgCookieExpiration;
+               $expirationDays = ceil( $wgCookieExpiration / ( 3600 * 24 ) );
+?>
+<div class="mw-ui-container">
+       <?php
+       if ( $this->haveData( 'languages' ) ) {
+       ?>
+               <div id="languagelinks">
+                       <p><?php $this->html( 'languages' ); ?></p>
+               </div>
+       <?php
+       }
+       ?>
+<div id="userloginForm">
+<h2 class="createaccount-join"><?php $this->msg( 'createacct-join' ); ?></h2>
+<form name="userlogin2" id="userlogin2" class="mw-ui-vform" method="post" action="<?php $this->text( 'action' ); ?>">
+       <section class="mw-form-header">
+               <?php $this->html( 'header' ); /* extensions such as ConfirmEdit add form HTML here */ ?>
+       </section>
+       <?php
+       if ( $this->data['message'] ) {
+?>
+               <div class="<?php $this->text( 'messagetype' ); ?>box">
+               <?php if ( $this->data['messagetype'] == 'error' ) { ?>
+                       <strong><?php $this->msg( 'createacct-error' ); ?></strong><br />
+               <?php } ?>
+               <?php $this->html( 'message' ); ?>
+               </div>
+       <?php } ?>
+               <div>
+                       <label for='wpName2'>
+                               <?php $this->msg( 'userlogin-yourname' ); ?>
+
+                               <span class="mw-ui-flush-right"><?php echo $this->getMsg( 'createacct-helpusername-link' )->parse(); ?></span>
+                       </label>
+                       <?php echo Html::input( 'wpName', $this->data['name'], 'text', array(
+                               'class' => 'mw-input loginText',
+                               'id' => 'wpName2',
+                               'tabindex' => '1',
+                               'size' => '20',
+                               'required',
+                               'placeholder' => $this->getMsg( 'userlogin-yourname-ph' )->text(),
+                               'autofocus'
+                       ) ); ?>
+               </div>
+               <div>
+               <?php if ( $this->data['createemail'] ) { ?>
+                       <label class="mw-ui-checkbox-label">
+                               <input name="wpCreateaccountMail" type="checkbox" value="1" id="wpCreateaccountMail" tabindex="2"
+                                       <?php if ( $this->data['createemailset'] ) {
+                                               echo 'checked="checked"';
+                                       } ?>
+                               >
+                               <?php $this->msg( 'createaccountmail' ); ?>
+                       </label>
+               <?php } ?>
+               </div>
+               <div class="mw-row-password">
+                       <label for='wpPassword2'><?php $this->msg( 'userlogin-yourpassword' ); ?></label>
+                       <?php echo Html::input( 'wpPassword', null, 'password', array(
+                               'class' => 'mw-input loginPassword',
+                               'id' => 'wpPassword2',
+                               'tabindex' => '3',
+                               'size' => '20',
+                               'required',
+                               'placeholder' => $this->getMsg( 'createacct-yourpassword-ph' )->text()
+                       ) + User::passwordChangeInputAttribs() ); ?>
+               </div>
+       <?php if ( $this->data['usedomain'] ) {
+               $doms = "";
+               foreach ( $this->data['domainnames'] as $dom ) {
+                       $doms .= "<option>" . htmlspecialchars( $dom ) . "</option>";
+               }
+       ?>
+               <div>
+                       <label><?php $this->msg( 'yourdomainname' ); ?></label>
+                       <div class="mw-input">
+                               <select name="wpDomain" value="<?php $this->text( 'domain' ); ?>"
+                                       tabindex="4">
+                                       <?php echo $doms ?>
+                               </select>
+                       </div>
+               </div>
+       <?php } ?>
+               <div class="mw-row-password">
+                       <label for='wpRetype'><?php $this->msg( 'createacct-yourpasswordagain' ); ?></label>
+                       <?php
+                       echo Html::input( 'wpRetype', null, 'password', array(
+                               'class' => 'mw-input loginPassword',
+                               'id' => 'wpRetype',
+                               'tabindex' => '5',
+                               'size' => '20',
+                               'required',
+                               'placeholder' => $this->getMsg( 'createacct-yourpasswordagain-ph' )->text()
+                               ) + User::passwordChangeInputAttribs() );
+                       ?>
+               </div>
+               <div>
+               <?php if ( $this->data['useemail'] ) { ?>
+                       <label for='wpEmail'>
+                               <?php
+                                       $this->msg( $this->data['emailrequired'] ?
+                                               'createacct-emailrequired' :
+                                               'createacct-emailoptional'
+                                       );
+                               ?>
+                       </label>
+                       <?php
+                               echo Html::input( 'wpEmail', $this->data['email'], 'email', array(
+                                       'class' => 'mw-input loginText',
+                                       'id' => 'wpEmail',
+                                       'tabindex' => '6',
+                                       'size' => '20',
+                                       'placeholder' => $this->getMsg( 'createacct-email-ph' )->text()
+                               ) + ( $this->data['emailrequired'] ? array() : array( 'required' => '' ) ) );
+                       ?>
+                       <?php
+                       // VForm eliminates the prefsectiontip div tip:
+                       // prefs-help-email-required is redundant with the placeholder text
+                       // Doesn't show the wordy prefs-help-email
+                       // Doesn't show the wordy prefs-help-email-others
+                       ?>
+               <?php } ?>
+               </div>
+               <?php if ( $this->data['userealname'] ) { ?>
+                       <div>
+                               <label for='wpRealName'><?php $this->msg( 'createacct-realname' ); ?></label>
+                               <input type='text' class='mw-input loginText' name="wpRealName" id="wpRealName"
+                                       tabindex="7"
+                                       value="<?php $this->text( 'realname' ); ?>" size='20' />
+                               <div class="prefsectiontip">
+                                       <?php $this->msgWiki( 'prefs-help-realname' ); ?>
+                               </div>
+                       </div>
+               <?php }
+               if ( $this->data['usereason'] ) { ?>
+                       <div>
+                               <label for='wpReason'><?php $this->msg( 'createacct-reason' ); ?></label>
+                               <?php echo Html::input( 'wpReason', $this->data['reason'], 'text', array(
+                                       'class' => 'mw-input loginText',
+                                       'id' => 'wpReason',
+                                       'tabindex' => '8',
+                                       'size' => '20',
+                                       'placeholder' => $this->getMsg( 'createacct-reason-ph' )->text()
+                               ) ); ?>
+                       </div>
+               <?php }
+               $tabIndex = 9;
+               if ( isset( $this->data['extraInput'] ) && is_array( $this->data['extraInput'] ) ) {
+                       foreach ( $this->data['extraInput'] as $inputItem ) { ?>
+                       <div>
+                               <?php
+                               // If it's a checkbox, output the whole thing (assume it has a msg).
+                               if ( $inputItem['type'] == 'checkbox' ) {
+                               ?>
+                                       <label class="mw-ui-checkbox-label">
+                                               <input
+                                                       name="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
+                                                       id="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
+                                                       type="checkbox" value="1"
+                                                       tabindex="<?php echo $tabIndex++; ?>"
+                                                       <?php if ( !empty( $inputItem['value'] ) ) {
+                                                               echo 'checked="checked"';
+                                                       } ?>
+                                               >
+                                               <?php $this->msg( $inputItem['msg'] ); ?>
+                                       </label>
+                               <?php
+                               } else {
+                                       // Not a checkbox.
+                                       if ( !empty( $inputItem['msg'] ) ) {
+                                               // Output the message label
+                                       ?>
+                                               <label for="<?php echo htmlspecialchars( $inputItem['name'] ); ?>">
+                                                       <?php $this->msgWiki( $inputItem['msg'] ); ?>
+                                               </label>
+                                       <?php
+                                       }
+                                       ?>
+                                       <input
+                                               type="<?php echo htmlspecialchars( $inputItem['type'] ); ?>"
+                                               class="mw-input"
+                                               name="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
+                                               tabindex="<?php echo $tabIndex++; ?>"
+                                               value="<?php echo htmlspecialchars( $inputItem['value'] ); ?>"
+                                               id="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
+                                       />
+                               <?php
+                               }
+                               if ( $inputItem['helptext'] !== false ) {
+                               ?>
+                                       <div class="prefsectiontip">
+                                               <?php $this->msgWiki( $inputItem['helptext'] ); ?>
+                                       </div>
+                               <?php
+                               }
+                               ?>
+                               </div>
+                       <?php
+                       }
+               }
+               // JS attempts to move the image CAPTCHA below this part of the form,
+               // so skip one index.
+               $tabIndex++;
+               ?>
+               <div class="mw-submit">
+                       <input type='submit' class="mw-ui-button mw-ui-big mw-ui-block mw-ui-primary" name="wpCreateaccount" id="wpCreateaccount"
+                               tabindex="<?php echo $tabIndex++; ?>"
+                               value="<?php $this->msg( 'createacct-submit' ); ?>" />
+               </div>
+       <input type="hidden" id="useNew" name="useNew" value="1" />
+<?php if ( $this->haveData( 'uselang' ) ) { ?><input type="hidden" name="uselang" value="<?php $this->text( 'uselang' ); ?>" /><?php } ?>
+<?php if ( $this->haveData( 'token' ) ) { ?><input type="hidden" name="wpCreateaccountToken" value="<?php $this->text( 'token' ); ?>" /><?php } ?>
+</form>
+</div>
+<div class="mw-createacct-benefits-container">
+       <h2><?php $this->msg( 'createacct-benefit-heading' ); ?></h2>
+       <div class="mw-createacct-benefits-list">
+               <div>
+                       <div class="mw-benefits-icon <?php $this->msg( 'createacct-benefit-icon1' ); ?>"></div>
+                       <div class="mw-number-text">
+                               <h3><?php $this->msg( 'createacct-benefit-head1' ); ?></h3>
+                               <p><?php $this->msg( 'createacct-benefit-body1' ); ?></p>
+                       </div>
+               </div>
+               <div>
+                       <div class="mw-benefits-icon <?php $this->msg( 'createacct-benefit-icon2' ); ?>"></div>
+                       <div class="mw-number-text">
+                               <h3><?php $this->msg( 'createacct-benefit-head2' ); ?></h3>
+                               <p><?php $this->msg( 'createacct-benefit-body2' ); ?></p>
+                       </div>
+               </div>
+               <div>
+                       <div class="mw-benefits-icon <?php $this->msg( 'createacct-benefit-icon3' ); ?>"></div>
+                       <div class="mw-number-text">
+                               <h3><?php $this->msg( 'createacct-benefit-head3' ); ?></h3>
+                               <p><?php $this->msg( 'createacct-benefit-body3' ); ?></p>
+                       </div>
+               </div>
+       </div>
+</div>
+</div>
+<?php
+
+       }
+}
index 0b4b8e5..8c937a7 100644 (file)
@@ -33,13 +33,13 @@ class UserloginTemplate extends QuickTemplate {
        function execute() {
                if ( $this->data['message'] ) {
 ?>
-       <div class="<?php $this->text('messagetype') ?>box">
+       <div class="<?php $this->text( 'messagetype' ); ?>box">
                <?php
                if ( $this->data['messagetype'] == 'error' ) {
-                       ?><strong><?php $this->msg( 'loginerror' ) ?></strong><br /><?php
+                       ?><strong><?php $this->msg( 'loginerror' ); ?></strong><br /><?php
                }
                ?>
-               <?php $this->html('message') ?>
+               <?php $this->html( 'message' ); ?>
        </div>
        <div class="visualClear"></div><?php
 
@@ -47,11 +47,11 @@ class UserloginTemplate extends QuickTemplate {
 ?>
 <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>
+<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
@@ -59,7 +59,7 @@ class UserloginTemplate extends QuickTemplate {
 ?>
        <table>
                <tr>
-                       <td class="mw-label"><label for='wpName1'><?php $this->msg('yourname') ?></label></td>
+                       <td class="mw-label"><label for='wpName1'><?php $this->msg( 'yourname' ); ?></label></td>
                        <td class="mw-input">
                                <?php
                        echo Html::input( 'wpName', $this->data['name'], 'text', array(
@@ -75,7 +75,7 @@ class UserloginTemplate extends QuickTemplate {
                        </td>
                </tr>
                <tr>
-                       <td class="mw-label"><label for='wpPassword1'><?php $this->msg('yourpassword') ?></label></td>
+                       <td class="mw-label"><label for='wpPassword1'><?php $this->msg( 'yourpassword' ); ?></label></td>
                        <td class="mw-input">
                                <?php
                        echo Html::input( 'wpPassword', null, 'password', array(
index 132a7c1..0e688a4 100644 (file)
  */
 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' ) ) {
+       if ( $this->haveData( 'languages' ) ) {
        ?>
                <div id="languagelinks">
-                       <p><?php $this->html('languages' ); ?></p>
+                       <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') ?>">
+<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'] ) {
+       if ( $this->data['message'] ) {
        ?>
-               <div class="<?php $this->text('messagetype') ?>box">
+               <div class="<?php $this->text( 'messagetype' ); ?>box">
                <?php
                if ( $this->data['messagetype'] == 'error' ) {
                ?>
-                       <strong><?php $this->msg( 'loginerror' )?></strong><br />
+                       <strong><?php $this->msg( 'loginerror' ) ?></strong><br />
                <?php
                }
-               $this->html('message')
+               $this->html( 'message' );
                ?>
                </div>
        <?php
@@ -103,7 +93,7 @@ class UserloginTemplateVForm extends BaseTemplate {
                <div>
                        <label for='wpPassword1'>
                        <?php
-                       $this->msg('userlogin-yourpassword');
+                       $this->msg( 'userlogin-yourpassword' );
 
                        if ( $this->data['useemail'] && $this->data['canreset'] && $this->data['resetlink'] === true ) {
                                echo Linker::link(
@@ -133,28 +123,28 @@ class UserloginTemplateVForm extends BaseTemplate {
                        ?>
                </div>
        <?php
-       if( isset( $this->data['usedomain'] ) && $this->data['usedomain'] ) {
+       if ( isset( $this->data['usedomain'] ) && $this->data['usedomain'] ) {
                $doms = "";
-               foreach( $this->data['domainnames'] as $dom ) {
+               foreach ( $this->data['domainnames'] as $dom ) {
                        $doms .= "<option>" . htmlspecialchars( $dom ) . "</option>";
                }
        ?>
                <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' ) ?>"
+                       <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' ) ) {
+       if ( $this->haveData( 'extrafields' ) ) {
                echo $this->data['extrafields'];
        } ?>
 
                <div>
 
-       <?php if( $this->data['canremember'] ) { ?>
+       <?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'] ) {
@@ -166,7 +156,7 @@ class UserloginTemplateVForm extends BaseTemplate {
        <?php } ?>
                </div>
 
-       <?php if( $this->data['cansecurelogin'] ) { ?>
+       <?php if ( $this->data['cansecurelogin'] ) { ?>
                <div>
                        <label class="mw-ui-checkbox-label">
                                <input name="wpStickHTTPS" type="checkbox" value="1" id="wpStickHTTPS" tabindex="5"
@@ -188,16 +178,16 @@ class UserloginTemplateVForm extends BaseTemplate {
                        ?>
                </div>
                <div id="mw-userlogin-help">
-                       <?php echo $this->getMsg( 'userlogin-helplink' )->parse() ?>
+                       <?php echo $this->getMsg( 'userlogin-helplink' )->parse(); ?>
                </div>
-               <?php if( $this->haveData( 'createOrLoginHref' ) ) { ?>
+               <?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>
+                               <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 } ?>
+<?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>
index c98c445..774650b 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;
                }
 
@@ -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 ) {
@@ -421,12 +423,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' );
                                }
@@ -532,7 +534,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 +544,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 +581,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 +604,7 @@ abstract class UploadBase {
                }
 
                $exists = self::getExistsWarning( $localFile );
-               if( $exists !== false ) {
+               if ( $exists !== false ) {
                        $warnings['exists'] = $exists;
                }
 
@@ -612,11 +614,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,7 +656,7 @@ abstract class UploadBase {
                        $user
                );
 
-               if( $status->isGood() ) {
+               if ( $status->isGood() ) {
                        if ( $watch ) {
                                $user->addWatch( $this->getLocalFile()->getTitle() );
                        }
@@ -701,7 +703,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 +715,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 +763,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 +783,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,7 +896,7 @@ 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" );
@@ -904,13 +906,14 @@ abstract class UploadBase {
                                        "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 +943,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 +953,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 +982,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 +1017,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 +1037,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 +1062,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 +1139,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 +1219,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 +1349,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 +1376,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 +1404,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 +1416,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 +1435,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 +1459,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 +1475,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 +1511,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 == '' ) {
index 7e07516..37db688 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" );
@@ -112,7 +112,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,7 +127,7 @@ 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" );
@@ -190,7 +190,7 @@ class UploadFromChunks extends UploadFromFile {
                                // Update local chunk index for the current chunk
                                $this->mChunkIndex++;
                                $status = $this->outputChunk( $chunkPath );
-                               if( $status->isGood() ) {
+                               if ( $status->isGood() ) {
                                        // Update local offset:
                                        $this->mOffset = $preAppendOffset + $chunkSize;
                                        // Update chunk table status db
@@ -257,7 +257,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,7 +307,7 @@ class UploadFromChunks extends UploadFromFile {
        }
 
        private function getChunkFileKey( $index = null ) {
-               if( $index === null ) {
+               if ( $index === null ) {
                        $index = $this->getChunkIndex();
                }
                return $this->mFileKey . '.' . $index;
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..9276b53 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" );
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 a90fecf..1ee4627 100644 (file)
@@ -338,7 +338,7 @@ class UploadStash {
                        __METHOD__
                );
 
-               if( !$row ) {
+               if ( !$row ) {
                        throw new UploadStashNoSuchKeyException( "No such key ($key), cannot remove" );
                }
 
@@ -454,7 +454,7 @@ class UploadStash {
        protected function fetchFileMetadata( $key, $readFromDB = DB_SLAVE ) {
                // populate $fileMetadata[$key]
                $dbr = null;
-               if( $readFromDB === DB_MASTER ) {
+               if ( $readFromDB === DB_MASTER ) {
                        // sometimes reading from the master is necessary, if there's replication lag.
                        $dbr = $this->repo->getMasterDb();
                } else {
index 416b1cf..2fd4bb7 100644 (file)
@@ -275,7 +275,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 +326,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];
        }
 
        /**
@@ -482,6 +488,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() {
@@ -1075,6 +1084,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 +1100,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 +1140,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':
@@ -1811,13 +1832,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 +1921,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 +1977,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 +1988,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 +2226,79 @@ class Language {
                return $this->internalUserTimeAndDate( 'both', $ts, $user, $options );
        }
 
+       /**
+        * Convert an MWTimestamp into a pretty human-readable timestamp using
+        * the given user preferences and relative base time.
+        *
+        * DO NOT USE THIS FUNCTION DIRECTLY. Instead, call MWTimestamp::getHumanTimestamp
+        * on your timestamp object, which will then call this function. Calling
+        * this function directly will cause hooks to be skipped over.
+        *
+        * @see MWTimestamp::getHumanTimestamp
+        * @param MWTimestamp $ts Timestamp to prettify
+        * @param MWTimestamp $relativeTo Base timestamp
+        * @param User $user User preferences to use
+        * @return string Human timestamp
+        * @since 1.21
+        */
+       public function getHumanTimestamp( MWTimestamp $ts, MWTimestamp $relativeTo, User $user ) {
+               $diff = $ts->diff( $relativeTo );
+               $diffDay = (bool)( (int)$ts->timestamp->format( 'w' ) - (int)$relativeTo->timestamp->format( 'w' ) );
+               $days = $diff->days ?: (int)$diffDay;
+               if ( $diff->invert || $days > 5 && $ts->timestamp->format( 'Y' ) !== $relativeTo->timestamp->format( 'Y' ) ) {
+                       // Timestamps are in different years: use full timestamp
+                       // Also do full timestamp for future dates
+                       /**
+                        * @FIXME Add better handling of future timestamps.
+                        */
+                       $format = $this->getDateFormatString( 'both', $user->getDatePreference() ?: 'default' );
+                       $ts = $this->sprintfDate( $format, $ts->getTimestamp( TS_MW ) );
+               } elseif ( $days > 5 ) {
+                       // Timestamps are in same year,  but more than 5 days ago: show day and month only.
+                       $format = $this->getDateFormatString( 'pretty', $user->getDatePreference() ?: 'default' );
+                       $ts = $this->sprintfDate( $format, $ts->getTimestamp( TS_MW ) );
+               } elseif ( $days > 1 ) {
+                       // Timestamp within the past week: show the day of the week and time
+                       $format = $this->getDateFormatString( 'time', $user->getDatePreference() ?: 'default' );
+                       $weekday = self::$mWeekdayMsgs[$ts->timestamp->format( 'w' )];
+                       $ts = wfMessage( "$weekday-at" )
+                               ->inLanguage( $this )
+                               ->params( $this->sprintfDate( $format, $ts->getTimestamp( TS_MW ) ) )
+                               ->text();
+               } elseif ( $days == 1 ) {
+                       // Timestamp was yesterday: say 'yesterday' and the time.
+                       $format = $this->getDateFormatString( 'time', $user->getDatePreference() ?: 'default' );
+                       $ts = wfMessage( 'yesterday-at' )
+                               ->inLanguage( $this )
+                               ->params( $this->sprintfDate( $format, $ts->getTimestamp( TS_MW ) ) )
+                               ->text();
+               } elseif ( $diff->h > 1 || $diff->h == 1 && $diff->i > 30 ) {
+                       // Timestamp was today, but more than 90 minutes ago: say 'today' and the time.
+                       $format = $this->getDateFormatString( 'time', $user->getDatePreference() ?: 'default' );
+                       $ts = wfMessage( 'today-at' )
+                               ->inLanguage( $this )
+                               ->params( $this->sprintfDate( $format, $ts->getTimestamp( TS_MW ) ) )
+                               ->text();
+
+               // From here on in, the timestamp was soon enough ago so that we can simply say
+               // XX units ago, e.g., "2 hours ago" or "5 minutes ago"
+               } elseif ( $diff->h == 1 ) {
+                       // Less than 90 minutes, but more than an hour ago.
+                       $ts = wfMessage( 'hours-ago' )->inLanguage( $this )->numParams( 1 )->text();
+               } elseif ( $diff->i >= 1 ) {
+                       // A few minutes ago.
+                       $ts = wfMessage( 'minutes-ago' )->inLanguage( $this )->numParams( $diff->i )->text();
+               } elseif ( $diff->s >= 30 ) {
+                       // Less than a minute, but more than 30 sec ago.
+                       $ts = wfMessage( 'seconds-ago' )->inLanguage( $this )->numParams( $diff->s )->text();
+               } else {
+                       // Less than 30 seconds ago.
+                       $ts = wfMessage( 'just-now' )->text();
+               }
+
+               return $ts;
+       }
+
        /**
         * @param $key string
         * @return array|null
@@ -2781,7 +2882,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 +2901,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;
        }
 
@@ -3030,20 +3135,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]:"";
+                       $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 +3325,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 +3411,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 +3546,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();
        }
@@ -4048,15 +4155,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
index e36c085..3770b9b 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;
                }
@@ -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;
        }
 
@@ -1259,14 +1259,14 @@ class ConverterRule {
                $choice = preg_split( $varsep_pattern, $rules );
 
                foreach ( $choice as $c ) {
-                       $v  = explode( ':', $c, 2 );
+                       $v = explode( ':', $c, 2 );
                        if ( count( $v ) != 2 ) {
                                // syntax error, skip
                                continue;
                        }
                        $to = trim( $v[1] );
-                       $v  = trim( $v[0] );
-                       $u  = explode( '=>', $v, 2 );
+                       $v = trim( $v[0] );
+                       $u = explode( '=>', $v, 2 );
                        // if $to is empty, strtr() could return a wrong result
                        if ( count( $u ) == 1 && $to && in_array( $v, $variants ) ) {
                                $bidtable[$v] = $to;
@@ -1357,6 +1357,37 @@ class ConverterRule {
                }
        }
 
+       /**
+        * Similar to getRuleConvertedStr(), but this prefers to use original
+        * page title if $variant === $this->mConverter->mMainLanguageCode
+        * and may return false in this case (so this title conversion rule
+        * will be ignored and the original title is shown).
+        *
+        * @since 1.21
+        * @param $variant The variant code to display page title in
+        * @return String|false The converted title or false if just page name
+        */
+       function getRuleConvertedTitle( $variant ) {
+               if ( $variant === $this->mConverter->mMainLanguageCode ) {
+                       // If a string targeting exactly this variant is set,
+                       // use it. Otherwise, just return false, so the real
+                       // page name can be shown (and because variant === main,
+                       // there'll be no further automatic conversion).
+                       $disp = $this->getTextInBidtable( $variant );
+                       if ( $disp ) {
+                               return $disp;
+                       }
+                       if ( array_key_exists( $variant, $this->mUnidtable ) ) {
+                               $disp = array_values( $this->mUnidtable[$variant] );
+                               $disp = $disp[0];
+                       }
+                       // Assigned above or still false.
+                       return $disp;
+               } else {
+                       return $this->getRuleConvertedStr( $variant );
+               }
+       }
+
        /**
         * Generate conversion table for all text.
         * @private
@@ -1439,7 +1470,7 @@ class ConverterRule {
                                   // then we check its fallback variants.
                                $variantFallbacks =
                                        $this->mConverter->getVariantFallbacks( $variant );
-                               if( is_array( $variantFallbacks ) ) {
+                               if ( is_array( $variantFallbacks ) ) {
                                        foreach ( $variantFallbacks as $variantFallback ) {
                                                // if current variant's fallback exist in flags
                                                if ( isset( $this->mVariantFlags[$variantFallback] ) ) {
@@ -1509,7 +1540,7 @@ class ConverterRule {
                                        $this->mRuleDisplay = $this->getRuleConvertedStr( $variant );
                                        break;
                                case 'T':
-                                       $this->mRuleTitle = $this->getRuleConvertedStr( $variant );
+                                       $this->mRuleTitle = $this->getRuleConvertedTitle( $variant );
                                        $this->mRuleDisplay = '';
                                        break;
                                default:
index 89eff30..61fed2c 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
        '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 6cddddb..39bdfb5 100644 (file)
@@ -79,13 +79,13 @@ class LanguageEo extends Language {
         */
        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"
+                       '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 );
        }
@@ -96,20 +96,20 @@ class LanguageEo extends Language {
         */
        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"
+                       '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..d941d67 100644 (file)
@@ -50,7 +50,7 @@ class GanConverter extends LanguageConverter {
                                                                        $flags,
                                                                        $manualLevel );
                $names = array(
-                       'gan'      => '原文',
+                       'gan' => '原文',
                        'gan-hans' => '简体',
                        'gan-hant' => '繁體',
                );
@@ -62,7 +62,7 @@ class GanConverter extends LanguageConverter {
                $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..4c2d21e 100644 (file)
@@ -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..c0bdc3f 100644 (file)
@@ -68,18 +68,18 @@ class KkConverter extends LanguageConverter {
                $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 9398899..09c5727 100644 (file)
@@ -141,7 +141,7 @@ class LanguageKsh extends Language {
                                switch ( $gender ) {
                                        case 'm':
                                                $lord = 'dä';
-                                               break ;
+                                               break;
                                        case 'f':
                                                $lord = 'di';
                                                break;
@@ -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..e4290ce 100644 (file)
@@ -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..ff0181e 100644 (file)
@@ -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..7c5c683 100644 (file)
@@ -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..8c82837 100644 (file)
@@ -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 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..d9154f7 100644 (file)
@@ -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 5fe4e8f..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..31731e7 100644 (file)
@@ -50,15 +50,15 @@ 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 );
        }
@@ -68,13 +68,13 @@ class ZhConverter extends LanguageConverter {
                $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..3d8be91 100644 (file)
@@ -186,11 +186,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Peuleumah jumeulah ureueng kalon',
 'tog-oldsig' => 'Tanda jaroe jinoe:',
 'tog-fancysig' => 'Peujeuet tanda jaroe sibagoe naseukah wiki (hana hubong keudroe)',
-'tog-externaleditor' => 'Nguy editor eksternal nyang ka na (keu nyang utoih khong, peureulee neuato kusuih bak kompute droeneuh.
-
-[//www.mediawiki.org/wiki/Manual:External_editors Haba leubeh leungkap.])',
-'tog-externaldiff' => 'Nguy diff eksternal nyang ka na (keu nyang utoih mantong, peureulee neuato kusuih bak kompute droeneuh
-[//www.mediawiki.org/wiki/Manual:External_editors More information.])',
 'tog-showjumplinks' => 'Peuudep hubong keu ngon bantu "langsong u"',
 'tog-uselivepreview' => 'Nguy peuleumah hase langsong (JavaScript) (baci)',
 'tog-forceeditsummary' => 'Peuingat lon meunyo plok neuringkaih neuandam mantong soh',
@@ -241,8 +236,8 @@ $messages = array(
 'august' => 'Buleuën Lapan',
 'september' => 'Buleuën Sikureuëng',
 'october' => 'Buleuën Siplôh',
-'november' => 'Buleuën Siblah',
-'december' => 'Buleuën Duwa Blah',
+'november' => 'Buleuën Siblaih',
+'december' => 'Buleuën Duwa Blaih',
 'january-gen' => 'Buleuën Sa',
 'february-gen' => 'Buleuën Duwa',
 'march-gen' => 'Buleuën Lhèë',
@@ -253,26 +248,26 @@ $messages = array(
 'august-gen' => 'Buleuën Lapan',
 'september-gen' => 'Buleuën Sikureuëng',
 'october-gen' => 'Buleuën Siplôh',
-'november-gen' => 'Buleuën Siblah',
-'december-gen' => 'Buleuën Duwa Blah',
+'november-gen' => 'Buleuën Siblaih',
+'december-gen' => 'Buleuën Duwa Blaih',
 'jan' => 'Sa',
 'feb' => 'Duwa',
 'mar' => 'Lhèë',
 'apr' => 'Peuët',
-'may' => 'Lim',
+'may' => 'Limong',
 'jun' => 'Nam',
-'jul' => 'Tuj',
-'aug' => 'Lap',
-'sep' => 'Sik',
-'oct' => 'Sip',
-'nov' => 'Sib',
-'dec' => 'Dub',
+'jul' => 'Tujôh',
+'aug' => 'Lapan',
+'sep' => 'Sikureuëng',
+'oct' => 'Siplôh',
+'nov' => 'Siblaih',
+'dec' => 'Duwa Blaih',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kawan|Kawan}}',
 'category_header' => 'Teunuléh lam kawan "$1"',
 'subcategories' => 'Aneuk kawan',
-'category-media-header' => 'Alat lam kawan "$1"',
+'category-media-header' => 'Peukakaih lam kawan "$1"',
 'category-empty' => "''Kawan nyoë jinoë hat hana teunuléh atawa media.''",
 'hidden-categories' => '{{PLURAL:$1|Kawan teusom|Kawan teusom}}',
 'hidden-category-category' => 'Kawan teusom',
@@ -287,7 +282,7 @@ $messages = array(
 'noindex-category' => 'On nyang hana geuindex',
 'broken-file-category' => 'On ngon gamba reuloh',
 
-'about' => 'Bhah',
+'about' => 'Bhaih',
 'article' => 'Teunuléh',
 'newwindow' => '(peuhah bak tingkap barô)',
 'cancel' => 'Peubateuë',
@@ -322,7 +317,7 @@ $messages = array(
 'vector-view-history' => 'Atra u likôt',
 'vector-view-view' => 'Beuët',
 'vector-view-viewsource' => 'Eu nè',
-'actions' => 'Buet',
+'actions' => 'Buët',
 'namespaces' => 'Ruweuëng nan',
 'variants' => 'Ragam',
 
@@ -338,7 +333,7 @@ $messages = array(
 'history' => 'Atra u likot',
 'history_short' => 'Atra u likôt',
 'updatedmarker' => 'geuubah yoh seunaweue keuneulheueh lon phon kon',
-'printableversion' => 'Seunalén citak',
+'printableversion' => 'Seunalén rakam',
 'permalink' => 'Neuhubông teutap',
 'print' => 'Rakam',
 'view' => 'Beuet',
@@ -359,7 +354,7 @@ $messages = array(
 'talkpage' => 'Peugah haba bhah ôn nyoë',
 'talkpagelinktext' => 'Marit',
 'specialpage' => 'Ôn kusuih',
-'personaltools' => 'Alat droë',
+'personaltools' => 'Peukakaih droë',
 'postcomment' => 'Beunagi baro',
 'articlepage' => 'Eu ôn asoë',
 'talk' => 'Peugah haba',
@@ -420,7 +415,7 @@ $1",
 
 'ok' => 'Ka göt',
 'retrievedfrom' => 'Geurumpok nibak "$1"',
-'youhavenewmessages' => 'Droëneuh   na $1 ($2).',
+'youhavenewmessages' => 'Droëneuh na $1 ($2).',
 'newmessageslink' => 'peusan barô',
 'newmessagesdifflink' => 'neuubah keuneulheuëh',
 'youhavenewmessagesfromusers' => "Droeneuh na $1 nibak {{PLURAL:$3|ureueng nguy la'en|$3 ureueng nguy}} ($2).",
@@ -459,7 +454,7 @@ $1",
 'nstab-media' => 'Ôn media',
 'nstab-special' => 'Kusuih',
 'nstab-project' => 'Buët ôn',
-'nstab-image' => 'Beureukah',
+'nstab-image' => 'Beureukaih',
 'nstab-mediawiki' => 'Peusan',
 'nstab-template' => 'Seunaleuëk',
 'nstab-help' => 'Beunantu',
@@ -578,21 +573,21 @@ Meunyo ureueng la\'en nyang peugot neulakee nyoe, atawa meunyo droeneuh ka neuin
 'retypenew' => 'Pasoë teuma lageuëm barô:',
 
 # Edit page toolbar
-'bold_sample' => 'Citak teubay naseukah nyoë',
+'bold_sample' => 'Rakam teubay naseukah nyoë',
 'bold_tip' => 'Citak teubay',
-'italic_sample' => 'Citak singèt naseukah nyoë',
-'italic_tip' => 'Citak singèt',
+'italic_sample' => 'Rakam singèt naseukah nyoë',
+'italic_tip' => 'Rakam singèt',
 'link_sample' => 'Nan hubông',
 'link_tip' => 'Hubông dalam',
-'extlink_sample' => 'http://www.example.com nan hubông',
+'extlink_sample' => 'http://www.example.com nan neuhubông',
 'extlink_tip' => 'Hubông luwa (bèk tuwoë bôh http:// bak away)',
 'headline_sample' => 'Naseukah nan',
 'headline_tip' => 'Aneuk beunagi tingkat 1',
 'nowiki_sample' => 'Bèk format naseukah nyoë',
 'nowiki_tip' => 'Bèk seutot beuntuk wiki',
-'image_tip' => 'Pasoë beureukah',
+'image_tip' => 'Pasoë beureukaih',
 'media_tip' => 'Hubông beureukah alat',
-'sig_tip' => 'Tanda jaroë Droëneuh  ngön tanda watèë',
+'sig_tip' => 'Tanda jaroë Droëneuh ngön tanda watèë',
 'hr_tip' => 'Garéh data',
 
 # Edit pages
@@ -648,9 +643,9 @@ Nyoë pat nakeuh log seunampôh nibak ôn nyoë:",
 Log seunampôh ngon log peuninah ôn nyoë geupeuseudiya di yup nyoe keu keuneubah.',
 
 # Parser/template warnings
-'post-expand-template-inclusion-warning' => "'''Ingat:''' Seunipat seunaleuek nyang neunguy rayek that.
-Ladom seunaleuek hana geupeuroh",
-'post-expand-template-inclusion-category' => 'On ngon seunipat seunaleuek nyang leubeh bataih',
+'post-expand-template-inclusion-warning' => "'''Ingat:''' Seunipat seunaleuëk nyang neunguy rayek that.
+Ladôm seunaleuëk hana geupeurôh",
+'post-expand-template-inclusion-category' => 'Ôn ngön seunipat seunaleuëk nyang leubèh bataih',
 'post-expand-template-argument-warning' => "'''Ingat:''' On nyoe na paleng h'an saboh alasan seunaleuek nyang na sunipat ekspansi nyang raya that.
 Alasan-alasan nyan hana geupeureumeuen.",
 'post-expand-template-argument-category' => 'On ngon alasan seunaleuek nyang hana geupeureumeuen',
@@ -658,7 +653,7 @@ Alasan-alasan nyan hana geupeureumeuen.",
 # History pages
 'viewpagelogs' => 'Eu log ôn nyoë',
 'currentrev' => 'Geunantoë jinoë',
-'currentrev-asof' => 'Geunantoë paléng barô bak $1',
+'currentrev-asof' => 'Geunantoë barô bak $1',
 'revisionasof' => 'Gantoë tiëp $1',
 'revision-info' => 'Geunantoë tiëp $1; $2',
 'previousrevision' => '←Geunantoë sigohlomjih',
@@ -679,8 +674,8 @@ Alasan-alasan nyan hana geupeureumeuen.",
 
 # Revision deletion
 'rev-delundel' => 'peuleumah/peusom',
-'revdel-restore' => 'Ubah leumah',
-'revdel-restore-deleted' => 'geunantoe nyang ka geusampoh',
+'revdel-restore' => 'Ubah neuleumah',
+'revdel-restore-deleted' => 'geunantoe nyang ka geusampôh',
 'revdel-restore-visible' => 'geunantoe nyang leumah',
 
 # Merge log
@@ -704,14 +699,14 @@ Alasan-alasan nyan hana geupeureumeuen.",
 'prevn' => '{{PLURAL:$1|$1}} sigohlomjih',
 'nextn' => '{{PLURAL:$1|$1}} lheuëh nyan',
 'prevn-title' => '$1 {{PLURAL:$1|hasé|hasé}} sigohlomjih',
-'nextn-title' => '$1 {{PLURAL:$1|hase|hase}} lheueh nyan',
-'shown-title' => 'Peuleumah $1 {{PLURAL:$1|hasé|hasé}} tiëp halaman',
+'nextn-title' => '$1 {{PLURAL:$1|hasé}} lheuëh nyan',
+'shown-title' => 'Peuleumah $1 {{PLURAL:$1|hasé}} tiëp ôn',
 'viewprevnext' => 'Eu ($1 {{int:pipe-separator}} $2)($3)',
 'searchmenu-exists' => "'''Na on ngon nan \"[[:\$1]]\" bak wiki nyoe.'''",
-'searchmenu-new' => "'''Peugot on \"[[:\$1]]\" bak wiki nyoe!'''",
+'searchmenu-new' => "'''Peugöt ôn \"[[:\$1]]\" bak wiki nyoë!'''",
 'searchhelp-url' => 'Help:Asoë',
-'searchprofile-articles' => 'On asoe',
-'searchprofile-project' => 'On Beunantu ngon Buet',
+'searchprofile-articles' => 'Ôn asoë',
+'searchprofile-project' => 'Ôn Beunantu ngön Buët',
 'searchprofile-images' => 'Multimedia',
 'searchprofile-everything' => 'Ban dum',
 'searchprofile-advanced' => 'Tingkat lanjut',
@@ -719,11 +714,11 @@ Alasan-alasan nyan hana geupeureumeuen.",
 'searchprofile-project-tooltip' => 'Mita bak $1',
 'searchprofile-images-tooltip' => 'Mita beureukaih',
 'searchprofile-everything-tooltip' => 'Mita ban dum ôn asoë (rôh ôn marit)',
-'searchprofile-advanced-tooltip' => 'Mita bak ruweueng nan meupat-pat',
+'searchprofile-advanced-tooltip' => 'Mita bak ruweuëng nan meupat-pat',
 'search-result-size' => '$1 ({{PLURAL:$2|1 narit|$2 narit}})',
 'search-result-category-size' => '{{PLURAL:$1|1 anggeeta|$1 anggeeta}} ({{PLURAL:$2|1 aneuk kawan|$2 aneuk kawan}}, {{PLURAL:$3|1 beureukaih|$3 beureukaih}})',
 'search-redirect' => '(peuninah $1)',
-'search-section' => '(bagian $1)',
+'search-section' => '(beunagi $1)',
 'search-suggest' => 'Kadang meukeusud Droëneuh nakeuh: $1',
 'search-interwiki-caption' => 'Buët la’én',
 'search-interwiki-default' => 'Hasé $1:',
@@ -749,7 +744,7 @@ Alasan-alasan nyan hana geupeureumeuen.",
 'yourrealname' => 'Nan aseuli:',
 'prefs-help-realname' => '* Nan aseuli hana meucéh neupasoë.
 Meunyo neupasoë, euntreuk nan Droëneuh nyan geupeuleumah mangat jitupeuë soë nyang tuléh.',
-'prefs-help-email' => 'Alamat surat-e hana meuceh na, tapi geupeureulee keu peugot ulang lageuem, meunyo droeneuh tuwoe lageuem.',
+'prefs-help-email' => 'Alamat surat-e hana meuceh na, tapi geupeureulee keu seumeugot ulang lageuem, meunyo droeneuh tuwoe lageuem.',
 'prefs-help-email-others' => "Droeneuh jeuet cit neupileh neupubiyeue ureueng la'en geupeu'et surat keu droeneuh rot surat-e rot seunambat bak on ureueng nguy atawa on marit.
 Surat-e droeneuh h'an geupeugah keu ureueng nyan.",
 
@@ -774,12 +769,12 @@ Surat-e droeneuh h'an geupeugah keu ureueng nyan.",
 'recentchanges-summary' => "Di yup nyoë nakeuh neuubah barô nyang na bak Wikipèdia nyoë.
 Ceunatat: (bida) = neuubah, (riwayat) = riwayat teumuléh, '''B''' = ôn barô, '''u''' = neuandam ubeut, '''b''' = neuandam bot, (± ''bit'') = jumeulah asoë meutamah/meukureuëng, → = neuandam beunagi, ← = mohtasa otomatis.
 ----",
-'recentchanges-feed-description' => 'Peutumèë neu’ubah paléng barô lam wiki bak eumpeuën nyoë.',
+'recentchanges-feed-description' => 'Peuteumèë neu’ubah barô lam wiki bak umpeuën nyoë.',
 'recentchanges-label-newpage' => 'Neuandam nyoe jipeugot on baro',
 'recentchanges-label-minor' => 'Nyoe neuandam ubeut',
 'recentchanges-label-bot' => 'Neuandam nyoe geupubuet le bot',
 'recentchanges-label-unpatrolled' => 'Neuandam nyoe goh lom geukalon',
-'rcnote' => "Di yup nyoë nakeuh {{PLURAL:$1|nakeuh '''1''' neu’ubah paléng barô |nakeuh '''$1''' neu’ubah paléng barô}} lam {{PLURAL:$2|'''1''' uroë|'''$2''' uroë}} nyoë, trôk ‘an $5, $4.",
+'rcnote' => "Di yup nyoë nakeuh {{PLURAL:$1|nakeuh '''1''' neu’ubah barô |nakeuh '''$1''' neu’ubah barô}} lam {{PLURAL:$2|'''1''' uroë|'''$2''' uroë}} nyoë, trôk ‘an $5, $4.",
 'rcnotefrom' => 'Di yup nyoë nakeuh neu’ubah yôh <strong>$2</strong> (geupeuleumah trôh ‘an <strong>$1</strong> neu’ubah).',
 'rclistfrom' => 'Peuleumah neuubah paléng barô yôh $1 kön',
 'rcshowhideminor' => '$1 andam bacut',
@@ -824,19 +819,19 @@ Ceunatat: (bida) = neuubah, (riwayat) = riwayat teumuléh, '''B''' = ôn barô,
 'listfiles' => 'Dapeuta beureukah',
 
 # File description page
-'file-anchor-link' => 'Beureukah',
-'filehist' => 'Riwayat beureukah',
-'filehist-help' => 'Teugon bak tanggay/watèë keu eu beureukah nyoë ‘oh watèë nyan.',
+'file-anchor-link' => 'Beureukaih',
+'filehist' => 'Riwayat beureukaih',
+'filehist-help' => 'Teugon bak uroë buleuën/watèë keu eu beureukaih nyoë ‘oh watèë nyan.',
 'filehist-revert' => 'peuriwang',
 'filehist-current' => 'jinoë hat',
-'filehist-datetime' => 'Tanggay/Watèë',
+'filehist-datetime' => 'Uroë buleuën/Watèë',
 'filehist-thumb' => 'Beuntuk ubeut',
 'filehist-thumbtext' => 'Beuntuk ubeut keu seunalén tiëp $1',
 'filehist-user' => 'Ureuëng nguy',
 'filehist-dimensions' => 'Dimènsi',
 'filehist-filesize' => 'Rayek beureukah',
 'filehist-comment' => 'Tapeusé',
-'imagelinks' => 'Meuneunguy beureukaih',
+'imagelinks' => 'Neunguy beureukaih',
 'linkstoimage' => 'Ôn di yup nyoë na {{PLURAL:$1|hubông|$1 hubông}} u beureukah nyoë:',
 'nolinkstoimage' => 'Hana ôn nyang na hubông u beureukah nyoë.',
 'sharedupload' => 'Beureukah nyoë dari $1 ngön kadang geunguy lé buët-buët la’én.',
@@ -939,7 +934,7 @@ Teuneurang bak [$2 on teuneurangjih] geupeuleumah di yup nyoe.",
 # Special:ListGroupRights
 'listgrouprights-members' => '(dapeuta anggèëta)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Surat-e ureuëng nguy',
 
 # Watchlist
@@ -1012,15 +1007,15 @@ Droëneuh jeuët neugantoë tingkat lindông keu ôn nyoë, tapi nyan hana peung
 'blanknamespace' => '(Keuë)',
 
 # Contributions
-'contributions' => 'Peuneugöt {{GENDER:$1|ureuëng nguy}}',
-'contributions-title' => 'Peuneugöt ureuëng nguy keu $1',
-'mycontris' => 'Peuneugöt',
+'contributions' => 'Beuneuri {{GENDER:$1|ureuëng nguy}}',
+'contributions-title' => 'Beuneuri ureuëng nguy keu $1',
+'mycontris' => 'Beuneuri',
 'contribsub2' => 'Keu $1 ($2)',
 'uctop' => '(ateuëh)',
 'month' => 'Yôh buleuën (ngön yôh goh lom nyan)',
 'year' => 'Yôh thôn (ngön yôh goh lom nyan)',
 
-'sp-contributions-newbies' => 'Keu ureuëng-ureuëng nyang ban nguy mantöng',
+'sp-contributions-newbies' => 'Keu ureuëng ban dapeuta mantöng',
 'sp-contributions-newbies-sub' => 'Keu ureuëng nguy barô',
 'sp-contributions-blocklog' => 'Log peutheun',
 'sp-contributions-uploads' => 'peunasoe',
@@ -1033,12 +1028,12 @@ Droëneuh jeuët neugantoë tingkat lindông keu ôn nyoë, tapi nyan hana peung
 
 # What links here
 'whatlinkshere' => 'Neuhubông balék',
-'whatlinkshere-title' => 'Ôn nyang na hubông u $1',
+'whatlinkshere-title' => 'Ôn nyang na neuhubông u $1',
 'whatlinkshere-page' => 'Ôn:',
 'linkshere' => "Ôn-ôn nyoë meuhubông u '''[[:$1]]''':",
 'nolinkshere' => "Hana ôn nyang teuhubông u '''[[:$1]]'''.",
 'isredirect' => 'ôn peupinah',
-'istemplate' => 'deungön seunaleuëk',
+'istemplate' => 'ngön seunaleuëk',
 'isimage' => 'hubông beureukaih',
 'whatlinkshere-prev' => '$1 {{PLURAL:$1|sigohlomjih|sigohlomjih}}',
 'whatlinkshere-next' => '$1 {{PLURAL:$1|lheuëh nyan|lheuëh nyan}}',
@@ -1057,7 +1052,7 @@ Droëneuh jeuët neugantoë tingkat lindông keu ôn nyoë, tapi nyan hana peung
 'blocklink' => 'theun',
 'unblocklink' => 'peugadöh theun',
 'change-blocklink' => 'ubah theun',
-'contribslink' => 'peuneugöt',
+'contribslink' => 'beuneuri',
 'blocklogpage' => 'Log peutheun',
 'blocklogentry' => 'theun [[$1]] ngön watèë maté tanggay $2 $3',
 'unblocklogentry' => 'peugadöh theun "$1"',
@@ -1106,13 +1101,13 @@ Lam masalah nyoë, meunyo neuhawa, Droëneuh jeuët neupeupinah atawa neupeugab
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Ôn ureuëng nguy Droëneuh',
-'tooltip-pt-mytalk' => 'Ôn peugah haba Droëneuh',
+'tooltip-pt-mytalk' => 'Ôn marit Droëneuh',
 'tooltip-pt-preferences' => 'Atô',
 'tooltip-pt-watchlist' => 'Dapeuta ôn nyang lôn kalön',
-'tooltip-pt-mycontris' => 'Dapeuta peuneugöt Droëneuh',
+'tooltip-pt-mycontris' => 'Dapeuta beuneuri Droëneuh',
 'tooltip-pt-login' => 'Droëneuh geupadan keu tamong log, bah pih nyan hana geupeuwajéb.',
 'tooltip-pt-logout' => 'Teubiët',
-'tooltip-ca-talk' => 'Peugah haba ôn asoë',
+'tooltip-ca-talk' => 'Marit ôn asoë',
 'tooltip-ca-edit' => 'Droëneuh jeuët neuandam ôn nyoë. Neunguy tumbôy eu dilèë yôh goh neukeubah.',
 'tooltip-ca-addsection' => 'Puphôn beunagi barô',
 'tooltip-ca-viewsource' => 'Ôn nyoë geupeulindông.
@@ -1135,22 +1130,21 @@ Droëneuh cit jeuët neu’eu nèjih.',
 'tooltip-n-randompage' => 'Peuleumah beurangkari ôn',
 'tooltip-n-help' => 'Bak mita bantu.',
 'tooltip-t-whatlinkshere' => 'Dapeuta ban dum ôn wiki nyang na neuhubông u ôn nyoë',
-'tooltip-t-recentchangeslinked' => 'Neuubah barô ôn-ôn nyang na hubông u ôn nyoë',
+'tooltip-t-recentchangeslinked' => 'Neuubah barô ôn-ôn nyang na neuhubông u ôn nyoë',
 'tooltip-feed-rss' => 'Umpeuën RSS keu ôn nyoë',
 'tooltip-feed-atom' => 'Umpeuën Atom keu ôn nyoë',
 'tooltip-t-contributions' => 'Eu dapeuta nyang ka geutuléh lé ureuëng nguy nyoë',
-'tooltip-t-emailuser' => 'Kirém surat-e u ureuëng nguy nyoë',
+'tooltip-t-emailuser' => "Peu'ét surat-e u ureuëng nguy nyoë",
 'tooltip-t-upload' => 'Peutamong beureukaih',
 'tooltip-t-specialpages' => 'Dapeuta ban dum ôn kusuih',
-'tooltip-t-print' => 'Seunalén citak ôn nyoë',
-'tooltip-t-permalink' => '
-Hubông teutap keu revisi ôn nyoë',
+'tooltip-t-print' => 'Seunalén rakam ôn nyoë',
+'tooltip-t-permalink' => 'Neuhubông teutap keu geunantoë ôn nyoë',
 'tooltip-ca-nstab-main' => 'Eu ôn asoë',
 'tooltip-ca-nstab-user' => 'Eu ôn ureuëng nguy',
 'tooltip-ca-nstab-special' => 'Nyoë nakeuh ôn kusuih nyang h’an jeuët geu’andam.',
 'tooltip-ca-nstab-project' => 'Eu ôn buët',
-'tooltip-ca-nstab-image' => 'Eu ôn beureukah',
-'tooltip-ca-nstab-template' => 'Eu templat',
+'tooltip-ca-nstab-image' => 'Eu ôn beureukaih',
+'tooltip-ca-nstab-template' => 'Eu seunaleuëk',
 'tooltip-ca-nstab-help' => 'Eu ôn beunantu',
 'tooltip-ca-nstab-category' => 'Eu ôn kawan',
 'tooltip-minoredit' => 'Bôh tanda keu nyoë sibagoë andam bacut',
@@ -1161,14 +1155,14 @@ Hubông teutap keu revisi ôn nyoë',
 'tooltip-watch' => 'Peutamah ôn nyoë u dapeuta keunalön Droëneuh',
 'tooltip-rollback' => 'Peuriwang neu’andam-neu’andam bak ôn nyoë u nyang tuléh keuneulheuëh lam sigo teugön',
 'tooltip-undo' => 'Peuriwang geunantoë nyoë ngön peuhah plôk neu’andam ngön cara eu dilèë. Choë jeuët geupeutamah bak plôk ehtisa.',
-'tooltip-summary' => 'Pasoe ehtisa paneuk',
+'tooltip-summary' => 'Pasoë éhtisa paneuk',
 
 # Browsing diffs
 'previousdiff' => '← Bida away',
 'nextdiff' => 'Geunantoë lheuëh nyan →',
 
 # Media information
-'file-info-size' => '$1 × $2 piksel, rayek beureukah: $3, MIME jeunèh: $4',
+'file-info-size' => '$1 × $2 piksel, rayek beureukaih: $3, MIME jeunèh: $4',
 'file-nohires' => 'Hana resolusi nyang leubèh manyang.',
 'svg-long-desc' => 'Beureukah SVG, nominal $1 x $2 piksel, rayek beureukah: $3',
 'show-big-image' => 'Resolusi peunoh',
@@ -1180,8 +1174,8 @@ Hubông teutap keu revisi ôn nyoë',
 # Bad image list
 'bad_image_list' => 'Beuntukjih lagèë di miyub nyoë:
 
-Cit buté dapeuta (baréh nyang geupeuphôn ngon tanda *) nyang geukira. Hubông phôn bak saboh baréh beukeu hubông u beureukah nyang brôk.
-Hubông-hubông lheuëh nyan bak baréh nyang saban geukira sibagoë keucuali, nakeu teunuléh nyang jeuët peuleumah beureukah nyan.',
+Cit buté dapeuta (baréh nyang geupeuphôn ngon tanda *) nyang geukira. Hubông phôn bak saboh baréh beukeuh hubông u beureukaih nyang brôk.
+Hubông-hubông lheuëh nyan bak baréh nyang saban geukira sibagoë keucuali, nakeuh teunuléh nyang jeuët peuleumah beureukaih nyan.',
 
 # Metadata
 'metadata' => 'Metadata',
index dd485ef..580e52f 100644 (file)
@@ -46,8 +46,6 @@ $messages = array(
 'tog-shownumberswatching' => 'اعرض عدد المستخدمين المراقبين',
 'tog-oldsig' => 'التوقيع الحالي:',
 'tog-fancysig' => 'عامل التوقيع كنص ويكي (بدون وصلة أوتوماتيكية)',
-'tog-externaleditor' => 'استخدم محررا خارجيا بشكل افتراضي (للخبراء فقط، يحتاج إعدادات خاصة على حاسوبك) ([//www.mediawiki.org/wiki/Manual:External_editors مزيد من المعلومات.])',
-'tog-externaldiff' => 'استخدم فرقا خارجيا بشكل افتراضي (للخبراء فقط، يحتاج إعدادات خاصة على حاسوبك) ([//www.mediawiki.org/wiki/Manual:External_editors للمزيد من المعلومات.])',
 'tog-showjumplinks' => 'مكن وصلات "اذهب إلى" المساعدة',
 'tog-uselivepreview' => 'استخدم الاستعراض السريع (جافاسكريبت) (تجريبي)',
 'tog-forceeditsummary' => 'نبهني عند إدخال ملخص تعديل فارغ',
index 8f01de7..9ce43d7 100644 (file)
@@ -254,7 +254,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:',
@@ -423,7 +423,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:',
@@ -604,7 +604,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,45 +614,79 @@ 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',
+'createacct-helpusername-url' => '{{ns:Project}}:Beleid_gebruikersname',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(help my kies)]]',
 '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' => 'Meld via beveiligde bediener aan',
 '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?',
+'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-captcha-help-url' => '{{ns:Project}}:Gebruiker_aanvra',
+'createacct-imgcaptcha-help' => "Kan nie die beeld sien nie? [[{{MediaWiki:createacct-captcha-help-url}}|Vra dan 'n gebruiker aan]]",
+'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' => 'wysigings',
+'createacct-benefit-body2' => 'bladsye',
+'createacct-benefit-body3' => 'onlangse 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.',
@@ -672,13 +706,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 +732,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 +758,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,12 +768,14 @@ 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-legend' => 'Kry nuwe wagwoord',
 'passwordreset-disabled' => 'Die herskik van U wagwoord is gedeaktiveer op hierdie wiki.',
+'passwordreset-emaildisabled' => 'E-posfunksies is afgeskakel op hierdie wiki.',
 'passwordreset-pretext' => '{{PLURAL:$1| | Voer een van die onderstaande velde in}}',
 'passwordreset-username' => 'Gebruiker:',
 'passwordreset-domain' => 'Domein:',
@@ -763,7 +801,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,7 +851,7 @@ 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.'''
@@ -850,8 +888,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 +899,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 +939,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 +993,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.'''
@@ -1205,7 +1246,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.",
@@ -1248,7 +1289,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 +1306,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 +1407,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 +1448,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 +1596,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 +1638,7 @@ Bladsye op [[Special:Watchlist|u dophoulys]] word in '''vetdruk''' uitgewys.",
 'reuploaddesc' => 'Keer terug na die laaivorm.',
 'upload-tryagain' => 'Stuur gewysigde lêerbeskrywing',
 'uploadnologin' => 'Nie ingeteken nie',
-'uploadnologintext' => 'Teken eers in [[Special:UserLogin|logged in]]
-om lêers te laai.',
+'uploadnologintext' => 'U moet [[Special:UserLogin|aanmeld]] alvorens u lêers kan laai.',
 'upload_directory_missing' => 'Die oplaaigids ($1) bestaan nie en kon nie deur die webbediener geskep word nie.',
 'upload_directory_read_only' => 'Die webbediener kan nie na die oplaai gids ($1) skryf nie.',
 'uploaderror' => 'Laaifout',
@@ -2083,12 +2126,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 +2179,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 +2195,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 +2225,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',
@@ -2502,7 +2554,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',
@@ -2649,6 +2701,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 +2951,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 +3164,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 +3195,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
@@ -3560,7 +3627,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 +3806,16 @@ 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.",
+'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 +3906,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 f40de91..1e4a9f4 100644 (file)
@@ -77,8 +77,6 @@ $messages = array(
 'tog-shownumberswatching' => 'የሚከታተሉ ተጠቃሚዎችን ቁጥር አሳይ',
 'tog-oldsig' => 'የቀድሞው ፊርማ ቅደመ እይታ',
 'tog-fancysig' => 'ጥሬ ፊርማ (ያለራስገዝ ማያያዣ)',
-'tog-externaleditor' => 'በቀዳሚነት ውጪያዊ አራሚን ተጠቀም',
-'tog-externaldiff' => 'በቀዳሚነት የውጭ ልዩነት-ማሳያን ተጠቀም',
 'tog-showjumplinks' => 'የ"ዝለል" አቅላይ መያያዣዎችን አስችል',
 'tog-uselivepreview' => 'ቀጥታ ቅድመ-ዕይታን ይጠቀሙ (JavaScript) (የሙከራ)',
 'tog-forceeditsummary' => 'ማጠቃለያው ባዶ ከሆነ ማስታወሻ ይስጠኝ',
@@ -846,13 +844,6 @@ $1ን ወይም ማንም ሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
 'search-external' => 'አፍአዊ ፍለጋ',
 'searchdisabled' => '{{SITENAME}} ፍለጋ አሁን እንዳይሠራ ተደርጓል። ለጊዜው ግን በGoogle ላይ መፈልግ ይችላሉ። የ{{SITENAME}} ይዞታ ማውጫ በዚያ እንዳልታደሰ ማቻሉ ያስታውሱ።',
 
-# Quickbar
-'qbsettings-none' => ' ምንም',
-'qbsettings-fixedleft' => 'በግራ የተለጠፈ',
-'qbsettings-fixedright' => 'በቀኝ የተለጠፈ',
-'qbsettings-floatingleft' => 'በግራ ተንሳፋፊ',
-'qbsettings-floatingright' => 'በቀኝ ተንሳፋፊ',
-
 # Preferences page
 'preferences' => 'ምርጫዎች፤',
 'mypreferences' => 'ምርጫዎች፤',
@@ -1474,14 +1465,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'listusers-noresult' => 'ማንም ተጠቃሚ አልተገኘም።',
 'listusers-blocked' => '(ታግዷል)',
 
-# Special:ActiveUsers
-'activeusers' => 'ተግባራዊ አባላት ዝርዝር',
-'activeusers-intro' => 'እነዚህ አባላት ባለፈው $1 ቀን ውስጥ ማናቸውንም አይነት ተግባር ፈጸሙ።',
-'activeusers-count' => '$1 {{PLURAL:$1|ለውጥ|ለውጦች}} ባለፈው $3 ቀን ውስጥ',
-'activeusers-hidebots' => 'ሎሌዎች ይደበቁ',
-'activeusers-hidesysops' => 'መጋቢዎች ይደበቁ',
-'activeusers-noresult' => 'ማንም ተጠቃሚ አልተገኘም።',
-
 # Special:ListGroupRights
 'listgrouprights' => 'የተጠቃሚ ስብስባ መብቶች',
 'listgrouprights-group' => 'ስብስባ',
index 03fc479..d458c1d 100644 (file)
@@ -161,8 +161,6 @@ $messages = array(
 'tog-shownumberswatching' => "Amostrar o numero d'usuarios que cosiran un articlo",
 'tog-oldsig' => 'Sinyadura actual',
 'tog-fancysig' => 'Tratar as sinyaduras como wikitexto (sin de vinclo automatico)',
-'tog-externaleditor' => "Fer servir l'editor externo por defecto (nomás ta espiertos, cal que faiga achustes especials en o suyo ordenador.  [//www.mediawiki.org/wiki/Manual:External_editors Mas información.])",
-'tog-externaldiff' => 'Fer servir o visualizador de diferencias externo por defecto (nomás ta expertos, cal que faiga achustes especials en o suyo ordenador.  [//www.mediawiki.org/wiki/Manual:External_editors Mas información.])',
 'tog-showjumplinks' => 'Activar vinclos d\'accesibilidat "blincar enta"',
 'tog-uselivepreview' => 'Activar previsualización automatica (cal JavaScript) (Esperimental)',
 'tog-forceeditsummary' => 'Avisar-me quan o campo de resumen siga buedo.',
@@ -177,6 +175,7 @@ $messages = array(
 'tog-showhiddencats' => 'Amostrar categorías amagatas',
 'tog-noconvertlink' => 'Desactivar a conversión de titol de vinclo',
 'tog-norollbackdiff' => 'No amostrar as diferencias dimpués de revertir',
+'tog-useeditwarning' => "Alvertir-me quan salga d'una pachina d'edición sin alzar os cambios",
 
 'underline-always' => 'Siempre',
 'underline-never' => 'Nunca',
@@ -840,6 +839,7 @@ Pareix que la hesen borrau.",
 'edit-no-change' => "S'ha ignorato a suya edición, pos no s'ha feito garra cambeo ta o texto.",
 'edit-already-exists' => "No s'ha puesto creyar una pachina nueva.
 Ya existe.",
+'editwarning-warning' => "Si sale d'ista pachina perderá totz os cambios que haiga feito. Si tiene una cuenta d'usuario, puet eliminar ista alvertencia en a sección «Caixa d'edición» d'as suyas preferencies.",
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Pare cuenta: Ista pachina tiene masiadas cridas ta funcions de preproceso (parser functions) costosas.
@@ -1101,15 +1101,6 @@ Asegure-se que iste cambio no trencará a continidat de l'historial d'a pachina.
 'search-external' => 'Busca externa',
 'searchdisabled' => 'A busca en {{SITENAME}} ye temporalment desactivata. Entremistanto, puede mirar en {{SITENAME}} fendo servir buscadors externos, pero pare cuenta que os suyos endices de {{SITENAME}} puede no estar esviellatos.',
 
-# Quickbar
-'qbsettings' => 'Preferencias de "Quickbar"',
-'qbsettings-none' => 'Garra',
-'qbsettings-fixedleft' => 'Fixa a la zurda',
-'qbsettings-fixedright' => 'Fixa a la dreita',
-'qbsettings-floatingleft' => 'Flotant a la zurda',
-'qbsettings-floatingright' => 'Flotant a la dreita',
-'qbsettings-directionality' => "Fixato, pendendo en a direccionalidat d'o suyo script y o suyo luengache",
-
 # Preferences page
 'preferences' => 'Preferencias',
 'mypreferences' => 'Preferencias',
@@ -1646,7 +1637,6 @@ Por seguridat, s'ha desactivau img_auth.php.",
 'http-read-error' => 'Error de lectura HTTP.',
 'http-timed-out' => 'A requesta HTTP ha circumducito.',
 'http-curl-error' => 'Error en recuperar a URL: $1',
-'http-host-unreachable' => "No s'ha puesto acceder t'a URL.",
 'http-bad-status' => 'Ha habiu un problema en a requesta HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1948,15 +1938,6 @@ Protocolos suportados: <code>$1</code> (no los adhiba en a suya busca).',
 'listusers-noresult' => "No s'ha trobato ixe usuario.",
 'listusers-blocked' => '({{GENDER:$1|bloqueyato|bloqueyata}})',
 
-# Special:ActiveUsers
-'activeusers' => "Lista d'usuarios activos",
-'activeusers-intro' => "Ista ye una lista d'usuarios que han teniu bella actividat en os zaguers $1 {{PLURAL:$1|diya|diyas}}.",
-'activeusers-count' => '$1 {{PLURAL:$1|edición|edicions}} en os zaguers {{PLURAL:$3|diya|$3 diyas}}',
-'activeusers-from' => "Amostrar nombres d'usuario que prencipien por:",
-'activeusers-hidebots' => 'Amagar robots',
-'activeusers-hidesysops' => 'Amagar administradors',
-'activeusers-noresult' => "No s'han trobato usuarios.",
-
 # Special:ListGroupRights
 'listgrouprights' => "Dreitos d'a colla d'usuarios",
 'listgrouprights-summary' => "Contino trobará a lista de collas d'usuario definitas en iste wiki, con os suyos dreitos d'acceso asociatos. Tamién puet trobar aquí [[{{MediaWiki:Listgrouprights-helppage}}|información adicional]] sobre os dreitos individuals.",
@@ -2718,13 +2699,8 @@ 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 */',
@@ -2737,13 +2713,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 +2754,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',
 
index 87e3aaa..0639d4d 100644 (file)
@@ -30,391 +30,397 @@ $namespaceNames = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'Hlenċa undermearcian:',
-'tog-justify' => 'Macian cwidfloccas riht',
-'tog-hideminor' => 'Lytla ādihtas hȳdan in nīƿum hƿeorfum',
-'tog-hidepatrolled' => 'Ƿeardede ādihtas hȳdan in nīƿe hƿearfas',
-'tog-newpageshidepatrolled' => 'Ƿeardede sīdan hȳdan in nīƿe hƿearfas',
-'tog-extendwatchlist' => 'Ƿæccȝetale sprædan to scēaƿenne ealle hƿearfas, ne efne þā nīƿoste',
-'tog-usenewrc' => 'Benota forðod ȝetæl nīƿra hƿeorfunȝa (þis þearf JavaScript)',
-'tog-numberheadings' => 'Selffremmende-rīm hēafodingas',
-'tog-showtoolbar' => 'Þone tōlstæf scēaƿian (þearf JavaScript)',
-'tog-editondblclick' => 'Sīdan ādihtan bȳ tƿicnæppende (þearf JavaScript)',
-'tog-editsection' => 'Dǣla ādihtende þafian bȳ [ādihtan] hlenċum',
-'tog-editsectiononrightclick' => 'Þafa dǣla ādihtune þurh sƿenȝas þǣre sƿīðran healfe on dǣla titulum (þis þearf JavaScript)',
-'tog-showtoc' => 'Innoðes tæfle sēon (for sīdum þe mā þonne 3 hēafodingas habbaþ)',
-'tog-rememberpassword' => 'Mīne inmeldunge ȝemyndan on þissum spearcatelle (oþ $1 {{PLURAL:$1|dæȝ|dagas}})',
-'tog-watchcreations' => 'Sīdan þe iċ scieppe ēacian tō mīnre ƿæccȝetale',
-'tog-watchdefault' => 'Sīdan þe iċ ādihte ēacian tō mīnre ƿæccȝetale',
-'tog-watchmoves' => 'Sīdan þe iċ hƿeorfe ēacian tō mīnre ƿæccȝetale',
-'tog-watchdeletion' => 'Sīdan þe iċ forlēose ēacian tō mīnre ƿæccȝetale',
-'tog-minordefault' => 'Ealle ādihtende mearcian tōlas ȝeƿunelīċe',
-'tog-previewontop' => 'Forescēaƿe sēon fore ādihtbox',
-'tog-previewonfirst' => 'Forescēaƿe sēon on formestum ādihte',
-'tog-nocache' => 'Ne þafa trameta settunȝe',
-'tog-enotifwatchlistpages' => 'Send mē spearccræftiȝ ǣrend þǣr tramet on mīnum ƿæccȝetæle ƿierþ andƿended',
-'tog-enotifusertalkpages' => 'Send mē spearccræftiȝ ǣrend þǣr mīn brūcendtramet is andƿended',
-'tog-enotifminoredits' => 'Send mē spearccræftiȝ ǣrend þǣr trametas sind efne lytellīce andƿended',
-'tog-enotifrevealaddr' => 'Ēoƿa mīn spearccræftiȝra ǣrenda stōƿnaman on sprearccræftiȝum ȝecȳðendum ǣrendum',
-'tog-shownumberswatching' => 'Hū mæniȝ ƿæccende brūcendas sēon',
-'tog-oldsig' => 'Foresihþ þæs selftācnes þe is nū ȝenotod:',
-'tog-fancysig' => 'Dō mid þissum selftācne sƿā mid Ƿikitext (lēas ǣr ȝedōnes hlencan)',
-'tog-externaleditor' => 'Nota ūtƿeardne ādihttōl tō ȝeƿunelicre ȝesetednesse (synderlīce tō sƿīðe cræftiȝum mannum - þearf ānlica ȝesetednessa on þīnum spearctelle)',
-'tog-externaldiff' => 'Nota ūtƿearde scādunȝe tō ȝeƿunelicre ȝesetednesse (synderlīce tō sƿīðe cræftiȝum mannum - þearf ānlica ȝesetednesse on þīnum spearctelle)',
-'tog-showjumplinks' => 'Lǣt "ȝā tō" ȝefēre hlencan',
-'tog-uselivepreview' => 'Nota andefene foresihþe (þearf JavaScript) (tō costnunȝe)',
-'tog-forceeditsummary' => 'Scyhte mē þǣr ic inƿrīte nāne ādihtsceortnesse',
-'tog-watchlisthideown' => 'Mīna ādihtunga hȳdan ƿiþ þā ƿæccȝetale',
-'tog-watchlisthidebots' => 'Searuþrala ādihtas hȳdan ƿiþ þā ƿæccȝetale',
-'tog-watchlisthideminor' => 'Lȳtl ādihtas hȳdan ƿiþ þā ƿæccȝetale',
-'tog-watchlisthideliu' => 'Ādihtas bȳ inmeldedum brūcendum hȳdan ƿiþ þā ƿæccȝetale',
-'tog-watchlisthideanons' => 'Hȳd ādihtas fram uncūðum brūcendum ƿiþ þæt ƿæccȝetæl',
-'tog-watchlisthidepatrolled' => 'Hȳd ƿeardode ādihtas ƿiþ þæt ƿæccȝetæl',
-'tog-ccmeonemails' => 'Send mē ȝelīcnessa þāra spearcræftiȝena ǣrenda þe ic ōðrum brūcendum sende',
-'tog-diffonly' => 'Ne ēoƿa sīdan innunȝe under scādunȝum',
-'tog-showhiddencats' => 'Ēoƿa ȝehȳdede floccas',
+'tog-underline' => 'Mearc under hlencan:',
+'tog-justify' => 'Macian cwidfloccas rihte',
+'tog-hideminor' => 'Hȳdan lytela adihtunga in nīwra wendinga getæle',
+'tog-hidepatrolled' => 'Hȳdan weardoda adihtunga in nīwra andwendinga getæle',
+'tog-newpageshidepatrolled' => 'Hȳdan weardode trametas in nīwra andwendinga getæle',
+'tog-extendwatchlist' => 'Sprǣdan wæccgetæl tō īwenne ealla andwendinga, nā synderlīce þā nīwostan',
+'tog-usenewrc' => 'Settan andwendunge on hēapas æfter tramete on nīwra andwendunga getæle and wæccgetæle (þearf JavaScript)',
+'tog-numberheadings' => 'Settan rīm on fōrecwidas selflīce',
+'tog-showtoolbar' => 'Īwan þā adihtunge tōlmearce (þearf JavaScript)',
+'tog-editondblclick' => 'Adihtan trametas mid twifealdum mȳs swenge (þearf JavaScript)',
+'tog-editsection' => 'Þafian dǣla adihtunge mid [ādihtan] hlencum',
+'tog-editsectiononrightclick' => 'Þafian dǣla adihtunge þurh swīðran healfe mȳs swengas on dǣla titulum (þearf JavaScript)',
+'tog-showtoc' => 'Īwan innunge tabulan (for trametum þe mā þonne 3 fōrecwidas habbaþ)',
+'tog-rememberpassword' => 'Gemynan mīne inmeldunge on þissum spearctellende (oþ $1 {{PLURAL:$1|dæg|dagas}} lengest)',
+'tog-watchcreations' => 'Ēacnian mīn wæccgetæl mid trametum þā ic scieppe and ymelum þā ic hlade on nett.',
+'tog-watchdefault' => 'Ēacnian mīn wæccgetæl mid trametum and ymelum þā ic adihte.',
+'tog-watchmoves' => 'Ēacnian mīn wæccgetæl mid trametum and ymelum þā ic wege.',
+'tog-watchdeletion' => 'Ēacnian mīn wæccgetæl mid trametum and ymelum þā ic forlēose.',
+'tog-minordefault' => 'Mearcian ealla adihtunga lytela tō gewunan',
+'tog-previewontop' => 'Īwan fōrebysene ofer adihtunge mearce',
+'tog-previewonfirst' => 'Īwan fōrebysene on forman adihtunge',
+'tog-nocache' => 'Nā þafian þæt webbsēcend sette trametas on horde',
+'tog-enotifwatchlistpages' => 'Sendan mē spearcǣrend þǣr tramet oþþe ymele on mīnum wæccgetæle sīe andwended.',
+'tog-enotifusertalkpages' => 'Sendan mē spearcǣrend þǣr mīnes brūcendtrametes mōtung sī awended',
+'tog-enotifminoredits' => 'Sendan mē spearcǣrend þǣr trametas oþþe ymelan sīen efne lyt andwended.',
+'tog-enotifrevealaddr' => 'Īwan mīnne spearcǣrenda naman on gecȳðendum spearcǣrendum',
+'tog-shownumberswatching' => 'Īwan þæt rīm wæccendra brūcenda',
+'tog-oldsig' => 'Genge selfmearc:',
+'tog-fancysig' => 'Dōn selfmearce tō wikitexte (lēas ǣr gedōnes hlencan)',
+'tog-showjumplinks' => 'Þafian "gān tō" gefērra hlencena',
+'tog-uselivepreview' => 'Notian rihte īwde fōrebysene (þearf JavaScript) (on costnunge)',
+'tog-forceeditsummary' => 'Cȳðan mē þǣr ic ne wrīte ādihtunge sceortnesse',
+'tog-watchlisthideown' => 'Hȳdan mīna adihtunga wiþ þæt wæccgetæl',
+'tog-watchlisthidebots' => 'Hȳdan searuþrǣla adihtunga wiþ þæt wæccgetæl',
+'tog-watchlisthideminor' => 'Hȳdan lytela adihtunga wiþ þæt wæccgetæl',
+'tog-watchlisthideliu' => 'Hȳdan adihtungas fram inmeldedum brūcendum wiþ þæt wæccgetæl',
+'tog-watchlisthideanons' => 'Hȳdan adihtunga fram uncūðum brūcendum wiþ þæt wæccgetæl',
+'tog-watchlisthidepatrolled' => 'Hȳdan weardoda adihtunga wiþ þæt wæccgetæl',
+'tog-ccmeonemails' => 'Sendan mē gelīcnessa þāra spearcǣrenda þe ic ōðrum brūcendum sende',
+'tog-diffonly' => 'Nā īwan trametes innunge under scādungum',
+'tog-showhiddencats' => 'Īwan gehȳdede floccas',
 'tog-noconvertlink' => 'Ne lǣt hlencena titula āwendunge',
-'tog-norollbackdiff' => 'Forlǣt scādunȝe æfter edƿeorc is ȝedōn',
+'tog-norollbackdiff' => 'Forlǣtan scādunge siþþan edweorc sīe gedōn',
+'tog-useeditwarning' => 'Cȳðan mē þǣr ic afare fram adihtunge tramete þe gīet hæbbe unhordoda andwendunga.',
 
 'underline-always' => 'Ǣfre',
 'underline-never' => 'Nǣfre',
-'underline-default' => 'Ƿebbsēcendes ȝeƿunelic ȝesetedness',
+'underline-default' => 'Scinnes oþþe webbsēcendes gewuna',
 
 # Font style option in Special:Preferences
-'editfont-style' => 'Stæfcynd for þǣre ƿrītunȝe on þǣm ādihtearce:',
-'editfont-default' => 'Ƿebbsēcendes ȝeƿunelic ȝesetedness',
-'editfont-monospace' => 'Ānbrǣded stæfcynd',
-'editfont-sansserif' => 'Tæȝellēas stæfcynd',
-'editfont-serif' => 'Tæȝelbǣr stæfcynd',
+'editfont-style' => 'Stæfcynd for þǣre wrītunge on þǣre adihtunge mearce:',
+'editfont-default' => 'Webbsēcendes geƿunelicu gesetedness',
+'editfont-monospace' => 'Ānes gemetes gebrǣded stæfcynd',
+'editfont-sansserif' => 'Tægellēas stæfcynd',
+'editfont-serif' => 'Tægelbǣre stæfcynd',
 
 # Dates
-'sunday' => 'Sunnandæȝ',
-'monday' => 'Mōnandæȝ',
-'tuesday' => 'Tīƿesdæȝ',
-'wednesday' => 'Ƿēdnesdæȝ',
-'thursday' => 'Þunresdæȝ',
-'friday' => 'Frīȝedæȝ',
-'saturday' => 'Sæterndæȝ',
+'sunday' => 'Sunnandæg',
+'monday' => 'Mōnandæg',
+'tuesday' => 'Tīwesdæg',
+'wednesday' => 'Wēdnesdæg',
+'thursday' => 'Þunresdæg',
+'friday' => 'Frigedæg',
+'saturday' => 'Sæterndæg',
 'sun' => 'Sun',
 'mon' => 'Mōn',
-'tue' => 'Tīƿ',
-'wed' => 'Ƿēd',
+'tue' => 'Tīw',
+'wed' => 'Wēd',
 'thu' => 'Þun',
-'fri' => 'Frī',
+'fri' => 'Fri',
 'sat' => 'Sæt',
-'january' => 'Æfterra Ȝēola',
+'january' => 'Æfterra Gēola',
 'february' => 'Solmōnaþ',
 'march' => 'Hrēþmōnaþ',
-'april' => 'Ēostremōnaþ',
+'april' => 'Ēastermōnaþ',
 'may_long' => 'Þrimilcemōnaþ',
 'june' => 'Sēarmōnaþ',
 'july' => 'Mǣdmōnaþ',
-'august' => 'Ƿēodmōnaþ',
-'september' => 'Hāliȝmōnaþ',
-'october' => 'Ƿinterfylleþ',
+'august' => 'Wēodmōnaþ',
+'september' => 'Hāligmōnaþ',
+'october' => 'Winterfylleþ',
 'november' => 'Blōtmōnaþ',
-'december' => 'Ǣrra Ȝēola',
-'january-gen' => 'Æfterran Ȝēolan',
+'december' => 'Ǣrra Gēola',
+'january-gen' => 'Æfterran Gēolan',
 'february-gen' => 'Solmōnþes',
 'march-gen' => 'Hrēþmōnþes',
-'april-gen' => 'Ēostremōnþes',
+'april-gen' => 'Ēastermōnþes',
 'may-gen' => 'Þrimilcemōnþes',
 'june-gen' => 'Sēarmōnþes',
 'july-gen' => 'Mǣdmōnþes',
-'august-gen' => 'Ƿēodmōnþes',
-'september-gen' => 'Hāliȝmōnþes',
-'october-gen' => 'Ƿinterfylleðes',
+'august-gen' => 'Wēodmōnþes',
+'september-gen' => 'Hāligmōnþes',
+'october-gen' => 'Winterfylleðes',
 'november-gen' => 'Blōtmōnþes',
-'december-gen' => 'Ǣrran Ȝēolan',
+'december-gen' => 'Ǣrran Gēolan',
 'jan' => 'Ǣr Ȝē',
 'feb' => 'Sol',
 'mar' => 'Hrē',
-'apr' => 'Ēos',
+'apr' => 'Ēas',
 'may' => 'Þri',
-'jun' => 'Sēr',
+'jun' => 'Sēar',
 'jul' => 'Mǣd',
-'aug' => 'Ƿēo',
+'aug' => 'Wēo',
 'sep' => 'Hāl',
-'oct' => 'Ƿinfyl',
+'oct' => 'Winterf',
 'nov' => 'Blō',
-'dec' => 'Æf Ȝē',
+'dec' => 'Æf Gē',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Flocc|Floccas}}',
 'category_header' => 'Trametas in flocce "$1"',
 'subcategories' => 'Underfloccas',
 'category-media-header' => 'Missenmiddel in flocce "$1"',
-'category-empty' => "''Þes flocc hæfþ nū nǣnȝu ȝeƿritu oþþe missenmiddel.''",
-'hidden-categories' => '{{PLURAL:$1|Ȝehȳded flocc|$1 Ȝehȳdede floccas}}',
-'hidden-category-category' => 'Ȝehȳdede floccas',
-'category-subcat-count' => '{{PLURAL:$2|Þes flocc hæfþ efne þone folȝiendan underflocc.|Þes flocc hæfþ {{PLURAL:$1|þone folȝiendan underflocc|$1 þā folȝiendan underfloccas}}, þāra fullena $2.}}',
+'category-empty' => "''Þes flocc hæfþ nū nǣngu geƿritu oþþe missenmiddel.''",
+'hidden-categories' => '{{PLURAL:$1|Gehȳded flocc|$1 Gehȳdede floccas}}',
+'hidden-category-category' => 'Gehȳdede floccas',
+'category-subcat-count' => '{{PLURAL:$2|Þes flocc hæfþ synderlīce þone folgiendan underflocc.|Þes flocc hæfþ {{PLURAL:$1|þone folgiendan underflocc|þā folgiendan $1 underflocca}} - þæt fulle rīm is $2.}}',
 'category-subcat-count-limited' => 'Þes flocc hæfþ {{PLURAL:$1|þisne underflocc|$1 þās underfloccas}}.',
-'category-article-count' => '{{PLURAL:$2|Þes flocc hæfþ efne þā folȝiendan āne sīdan.|{{PLURAL:$1|Sēo folȝiende sīde is|$1 Þā folȝiendan sīdan sind}} in þissum flocce, þāra fullena $2.}}',
-'category-article-count-limited' => '{{PLURAL:$1|Se folȝienda tramet is|$1 Þā folȝiendan trametas sind}} on þissum flocce hēr.',
-'category-file-count' => ' {{PLURAL:$2|Þes flocc hæfþ efne þæt folȝiende ȝeƿithord.|{{PLURAL:$1|Þæt folȝiende ȝeƿithord is|$1 Þā folȝiendan ȝeƿithord sind}} in þissum flocce, þāra fullena $2.}}',
-'category-file-count-limited' => '{{PLURAL:$1|Þis ȝeƿithord is|$1 Þās ȝeƿithord sind}} in þissum flocce hēr.',
+'category-article-count' => '{{PLURAL:$2|Þes flocc hæfþ synderlīce þone folgiendan ānne tramet.|{{PLURAL:$1|Se folgienda tramet is|Þā folgiendan $1 trametaa sind}} in þissum flocce - þæt fulle rīm is $2.}}',
+'category-article-count-limited' => '{{PLURAL:$1|Se folgienda tramet is|$1 Þā folgiendan trametas sind}} on þissum flocce hēr.',
+'category-file-count' => '{{PLURAL:$2|Þes flocc hæfþ synderlīce þā folgiendan ymelan.|{{PLURAL:$1|Sēo folgiende ymele is|Þā folgiendan $1 ymelena sind}} in þissum flocce - þæt fulle rīm is $2.}}',
+'category-file-count-limited' => '{{PLURAL:$1|Þēos ymele is|$1 Þās ymelan sind}} in þissum flocce hēr.',
 'listingcontinuesabbrev' => 'mā',
-'index-category' => 'Ȝebēacniende trametas',
-'noindex-category' => 'Unȝebēacniende trametas',
-
-'about' => 'Ymbe',
-'article' => 'Innunȝsīde',
-'newwindow' => '(openaþ in nīƿum ēaȝþyrelum)',
-'cancel' => 'Undō',
+'index-category' => 'Getǣcnede trametas',
+'noindex-category' => 'Ungetǣcnede trametas',
+'broken-file-category' => 'Trametas þā habbaþ gebrocene hlencan mid ymelum',
+
+'about' => 'Gecȳþness',
+'article' => 'Innunge tramet',
+'newwindow' => '(openaþ in nīwum ēagþyrele)',
+'cancel' => 'Undōn',
 'moredotdotdot' => 'Mā...',
-'mypage' => 'Mīn sīde',
-'mytalk' => 'Mīnu ȝespreċ',
-'anontalk' => 'Þisses IP stōƿnaman talu',
+'morenotlisted' => 'Mā þe nis on getæle...',
+'mypage' => 'Mīn tramet',
+'mytalk' => 'Mīn mōtung',
+'anontalk' => 'Þisses IP naman mōtung',
 'navigation' => 'Þurhfōr',
 'and' => '&#32;and',
 
 # Cologne Blue skin
-'qbfind' => 'Find',
-'qbbrowse' => 'Onbirȝe',
-'qbedit' => 'Ādihte',
-'qbpageoptions' => 'Þēos sīde',
-'qbmyoptions' => 'Mīna sīdan',
-'qbspecialpages' => 'Syndriȝa sīdan',
-'faq' => 'Oftost ascoda ascunȝa',
+'qbfind' => 'Findan',
+'qbbrowse' => 'Þurhsēcan',
+'qbedit' => 'Adihtan',
+'qbpageoptions' => 'Þes tramet',
+'qbmyoptions' => 'Mīne trametas',
+'qbspecialpages' => 'Syndrige trametas',
+'faq' => 'Oftost ascoda ascunga',
 'faqpage' => 'Project:FAQ',
 
 # Vector skin
-'vector-action-addsection' => 'Mearcunge ēacian',
-'vector-action-delete' => 'Forlēos',
-'vector-action-move' => 'Ƿeȝ',
-'vector-action-protect' => 'Beorȝa',
-'vector-action-undelete' => 'Sciepe tramet eft',
-'vector-action-unprotect' => 'Unbeorȝa',
-'vector-simplesearch-preference' => 'Lǣt forðoda sēcunge tōtyhtinga (synderlīce for Vector scinne)',
-'vector-view-create' => 'Sciepe',
-'vector-view-edit' => 'Ādihte',
+'vector-action-addsection' => 'Ēacnian mid mearcunge',
+'vector-action-delete' => 'Forlēosan',
+'vector-action-move' => 'Wegan',
+'vector-action-protect' => 'Beorgan',
+'vector-action-undelete' => 'Scieppan tramet eft',
+'vector-action-unprotect' => 'Andwendan beorgunge',
+'vector-simplesearch-preference' => 'Ānfealdlīc sēcunge mearc (synderlīce on Vector scinne)',
+'vector-view-create' => 'Scieppan',
+'vector-view-edit' => 'Adihtan',
 'vector-view-history' => 'Stǣr',
-'vector-view-view' => 'Rǣd',
-'vector-view-viewsource' => 'Sēo fruman',
+'vector-view-view' => 'Rǣdan',
+'vector-view-viewsource' => 'Sēon fruman',
 'actions' => 'Fremmunga',
 'namespaces' => 'Namstedas',
-'variants' => 'Missenlicnessa',
+'variants' => 'Missenlīcnessa',
 
-'errorpagetitle' => 'Ƿōh',
-'returnto' => 'Ȝā eft tō $1',
+'errorpagetitle' => 'Wōh',
+'returnto' => 'Gān eft tō $1',
 'tagline' => 'Fram {{SITENAME}}',
 'help' => 'Help',
-'search' => 'Sēc',
-'searchbutton' => 'Sēc',
-'go' => 'Gā',
+'search' => 'Sēcan',
+'searchbutton' => 'Sēcan',
+'go' => 'Gān',
 'searcharticle' => 'Gān',
-'history' => 'Sīdan stǣr',
+'history' => 'Trametes stǣr',
 'history_short' => 'Stǣr',
-'updatedmarker' => 'nīƿod æfter ic cōm hider ǣror',
-'printableversion' => 'Ūtmǣlendlicu fadunȝ',
-'permalink' => 'Fæst hlenċe',
-'print' => 'Ūtmǣl',
-'edit' => 'Ādiht',
-'create' => 'Sciepe',
-'editthispage' => 'Ādiht þās sīdan',
-'create-this-page' => 'Sciepe þās sīdan',
-'delete' => 'Forlēos',
-'deletethispage' => 'Forlēos þās sīdan',
-'undelete_short' => 'Maca {{PLURAL:$1|ānne ādiht|$1 ādihtas}} eft',
-'protect' => 'Beorȝa',
-'protect_change' => 'Hƿeorf',
-'protectthispage' => 'Beorȝa þās sīdan',
-'unprotect' => 'Unbeorgan',
-'unprotectthispage' => 'Unbeorȝa þās sīdan',
-'newpage' => 'Nīƿu sīde',
-'talkpage' => 'Sprec ymb þās sīdan',
-'talkpagelinktext' => 'ȝespreċ',
-'specialpage' => 'Syndriȝ sīde',
+'updatedmarker' => 'nīwod æfter mīnre lætestan sōcne',
+'printableversion' => 'Ūtmǣlendlicu fadung',
+'permalink' => 'Fæst hlenca',
+'print' => 'Ūtmǣlan',
+'view' => 'Sihþ',
+'edit' => 'Adihtan',
+'create' => 'Scieppan',
+'editthispage' => 'Adihtan þisne tramet',
+'create-this-page' => 'Scieppan þisne tramet',
+'delete' => 'Forlēosan',
+'deletethispage' => 'Forlēosan þisne tramet',
+'undelete_short' => 'Scieppan {{PLURAL:$1|āne adihtunge|$1 adihtunga}} eft',
+'viewdeleted_short' => 'Sēon {{PLURAL:$1|āne forlorene adihtunge|$1 forlorenra adihtunga}}',
+'protect' => 'Beorgan',
+'protect_change' => 'Wendan',
+'protectthispage' => 'Beorgan þisne tramet',
+'unprotect' => 'Andwendan beorgunge',
+'unprotectthispage' => 'Andwendan beorgune þisses trametes',
+'newpage' => 'Nīwe tramet',
+'talkpage' => 'Sprecan ymbe þisne tramet',
+'talkpagelinktext' => 'Mōtung',
+'specialpage' => 'Syndrig tramet',
 'personaltools' => 'Āgne tōlas',
-'postcomment' => 'Nīƿe dǣl',
-'articlepage' => 'Seoh innungsīdan',
-'talk' => 'Ȝespreċ',
-'views' => 'Ansīena',
-'toolbox' => 'Tōlearc',
-'userpage' => 'Seoh brūcendsīdan',
-'projectpage' => 'Seoh ƿeorcsīdan',
-'imagepage' => 'Seoh ȝeƿithordsīdan',
-'mediawikipage' => 'Ȝeƿritsīdan sēon',
-'templatepage' => 'Seoh bysensīdan',
-'viewhelppage' => 'Seoh helpsīdan',
-'categorypage' => 'Seoh floccsīdan',
-'viewtalkpage' => 'Seoh tæle',
-'otherlanguages' => 'On ōðrum sprǣċum',
+'postcomment' => 'Nīwe dǣl',
+'articlepage' => 'Sēon innunge tramet',
+'talk' => 'Mōtung',
+'views' => 'Sihþa',
+'toolbox' => 'Tōlmearc',
+'userpage' => 'Sēon brūcendes tramet',
+'projectpage' => 'Sēon weorces tramet',
+'imagepage' => 'Sēon ymelan tramet',
+'mediawikipage' => 'Sēon ǣrendgewrita tramet',
+'templatepage' => 'Sēon bysene tramet',
+'viewhelppage' => 'Sēon helpes tramet',
+'categorypage' => 'Sēon flocces tramet',
+'viewtalkpage' => 'Sēon mōtunge',
+'otherlanguages' => 'On ōðrum sprǣcum',
 'redirectedfrom' => '(Edlǣded fram $1)',
-'redirectpagesub' => 'Edlǣdsīde',
-'lastmodifiedat' => 'Man nīwanost þās sīdan hƿearf on þǣre $2 stunde þæs $1.',
+'redirectpagesub' => 'Edlǣdunge tramet',
+'lastmodifiedat' => 'Man nīwanost wende þisne tramet on þǣre $2 tīde þæ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ō:',
+'protectedpage' => 'Geborgen tramet',
+'jumpto' => 'Gān tō:',
 'jumptonavigation' => 'þurhfōr',
-'jumptosearch' => 'sēċan',
-'view-pool-error' => 'Ƿē sind sāriȝe for þǣm þe þās þeȝntōlas nū oferlīce ƿyrcaþ.
-Tō mæniȝe brūcendas ȝesēcaþ to sēonne þās sīdan.
-Ƿ̈ē biddaþ þæt þū abīde scortre tīde fore þū ȝesēce to sēonne þās sīdan eft.
+'jumptosearch' => 'sēcan',
+'view-pool-error' => 'Wālā, þā þegntōlas nū oferlīce wyrcaþ.
+Tō mænige brūcendas gesēcaþ tō sēonne þisne tramet.
+Wē biddaþ þæt þū abīde scortne tīman ǣr þū gesēce to sēonne þisne tramet eft.
 
 $1',
+'pool-errorunknown' => 'Uncūþ wōh',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite' => 'Ymbe {{SITENAME}}',
-'aboutpage' => 'Project:Ymbe',
-'copyright' => 'Man mæȝ innunȝe under $1 findan.',
-'copyrightpage' => '{{ns:project}}:Ȝelīcnessriht',
-'currentevents' => 'Ȝelimpunȝa þisses tīman',
-'currentevents-url' => 'Project:Ȝelimpunga þisses tīman',
+'aboutsite' => 'Gecȳþness ymbe {{SITENAME}}',
+'aboutpage' => 'Project:Gecȳþness',
+'copyright' => 'Man mæg innunge under $1 findan.',
+'copyrightpage' => '{{ns:project}}:Gelīcnessriht',
+'currentevents' => 'Gelimpunga þisses tīman',
+'currentevents-url' => 'Project:Gelimpunga þisses tīman',
 'disclaimers' => 'Ætsacunga',
-'disclaimerpage' => 'Project:Ætsacunga',
-'edithelp' => 'Help mid ādihtunge',
-'edithelppage' => 'Help:Ādihtung',
-'helppage' => 'Help:Inn',
-'mainpage' => 'Hēafodsīde',
-'mainpage-description' => 'Hēafodsīde',
+'disclaimerpage' => 'Project:Gemǣne ætsacung',
+'edithelp' => 'Help on adihtunge',
+'edithelppage' => 'Help:Adihtung',
+'helppage' => 'Help:Innung',
+'mainpage' => 'Hēafodtramet',
+'mainpage-description' => 'Hēafodtramet',
 'policy-url' => 'Project:Rǣd',
-'portal' => 'Ȝemǣnscipes ingang',
-'portal-url' => 'Project:Ȝemǣnscipes inȝanȝ',
+'portal' => 'Gemǣnscipes ingang',
+'portal-url' => 'Project:Gemǣnscipes ingang',
 'privacy' => 'Ānlēpnesse rǣd',
 'privacypage' => 'Project:Ānlēpnesse rǣd',
 
-'badaccess' => 'Þafunȝe ƿōh',
-'badaccess-group0' => 'Þū ne mōst dōn þā dǣde þǣre þe þū hafast abeden.',
+'badaccess' => 'Þafunge wōh',
+'badaccess-group0' => 'Þū ne mōst dōn þā dǣde þǣre þe þū hafast abede.',
 'badaccess-groups' => 'Þēos dǣd þǣre þū hafast abeden is synderlīce alȳfedlic brūcendum on {{PLURAL:$2|þissum þrēate|ānum þāra þrēata}}: $1.',
 
-'versionrequired' => '$1 fadunȝ of MediaǷiki is ȝeþorften',
-'versionrequiredtext' => 'Fadung $1 MediaǷiki is ȝeþorften tō notiennde þisne tramet.
-Sēoh þone [[Special:Version|fadunge tramet]].',
+'versionrequired' => '$1 fadung of MediaWiki is behēfe',
+'versionrequiredtext' => '$1 fadung MediaWiki is behēfe tō notienne þisne tramet.
+Seoh þone [[Special:Version|fadunge tramet]].',
 
-'ok' => 'OK',
-'retrievedfrom' => 'Fram "$1" beȝieten',
+'ok' => 'Gōd lā',
+'retrievedfrom' => 'Fram "$1" begeten',
 'youhavenewmessages' => 'Þū hæfst $1 ($2).',
-'newmessageslink' => 'nīƿu ǣrendȝeƿritu',
-'newmessagesdifflink' => 'nīƿost hƿearf',
-'youhavenewmessagesmulti' => 'Þū hæfst nīƿe ǣrende on $1',
-'editsection' => 'ādihtan',
-'editold' => 'ādihtan',
-'viewsourceold' => 'Sēon andweorc',
-'editlink' => 'ādihtan',
-'viewsourcelink' => 'Fruman sēon',
-'editsectionhint' => 'Dǣl ādihtan: $1',
-'toc' => 'Innoþ',
-'showtoc' => 'sēon',
+'newmessageslink' => 'nīwu ǣrendgewritu',
+'newmessagesdifflink' => 'nīwost andwendung',
+'youhavenewmessagesfromusers' => 'Þū hafast $1 fram {{PLURAL:$3|ōðrum brūcende|$3 brūcenda}} ($2).',
+'youhavenewmessagesmanyusers' => 'Þū hafast $1 fram manigum brūcendum ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|nīwe ǣrendgewrit|nīwra ǣrendgewrita}}',
+'youhavenewmessagesmulti' => 'Þū hæfst nīwu ǣrendu on $1',
+'editsection' => 'adihtan',
+'editold' => 'adihtan',
+'viewsourceold' => 'Sēon fruman',
+'editlink' => 'adihtan',
+'viewsourcelink' => 'Sēon fruman',
+'editsectionhint' => 'Adihtan dǣl: $1',
+'toc' => 'Innung',
+'showtoc' => 'īwan',
 'hidetoc' => 'hȳdan',
-'thisisdeleted' => '$1 sēon oþþe nīƿian?',
-'viewdeleted' => '$1 sēon?',
-'restorelink' => '{{PLURAL:$1|ān āfeorsed ādiht|$1 āfeorsed ādihtas}}',
-'feedlinks' => 'Flōd:',
-'feed-invalid' => 'Ungenge underƿrītunge inlāde ȝecynd.',
-'feed-unavailable' => 'Fruman inlāda ne sind ȝearƿa',
+'thisisdeleted' => 'Sēon oþþe nīwian $1?',
+'viewdeleted' => 'Sēon $1 lā?',
+'restorelink' => '{{PLURAL:$1|ān forloren ādihtung|$1 forlorenra adihtunga}}',
+'feedlinks' => 'Ǣrendstrēam:',
+'feed-invalid' => 'Ungenge underwrītunge ǣrendstrēames gecynd.',
+'feed-unavailable' => 'Fruman ǣrendstrēamas ne sind gearwa',
 'site-rss-feed' => '$1 RSS strēam',
 'site-atom-feed' => '$1 Atom strēam',
 'page-rss-feed' => '$1 RSS strēam',
 'page-atom-feed' => '$1 Atom strēam',
-'red-link-title' => '$1 (ne ȝiet ƿriten)',
+'red-link-title' => '$1 (tramet ne biþ)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'Sīde',
-'nstab-user' => 'Brūcendsīde',
-'nstab-media' => 'Ȝemyndsīde',
-'nstab-special' => 'Syndriȝu sīde',
-'nstab-project' => 'Ƿeorces sīde',
-'nstab-image' => 'Fīl',
-'nstab-mediawiki' => 'Ǣrendȝeƿrit',
+'nstab-main' => 'Tramet',
+'nstab-user' => 'Brūcendes tramet',
+'nstab-media' => 'Missendendebyrdnesse tramet',
+'nstab-special' => 'Syndrig tramet',
+'nstab-project' => 'Weorces tramet',
+'nstab-image' => 'Ymele',
+'nstab-mediawiki' => 'Ǣrendgewrit',
 'nstab-template' => 'Bysen',
-'nstab-help' => 'Helpsīde',
+'nstab-help' => 'Helpes tramet',
 'nstab-category' => 'Flocc',
 
 # Main script and global functions
-'nosuchaction' => 'Nǣniȝ dǣd',
-'nosuchactiontext' => 'Þæt weorc þe se nettfrumfinded wile is ungenge.
-Þū meahtlīce miswrite þone nettfrumfindend, oþþe folgode unrihtne hlencan.
-Þis mæg ēac tācnian unrihtnesse on þǣre sōftware þe is gebrocen fram {{SITENAME}}.',
-'nosuchspecialpage' => 'Nǣniȝu syndriȝu sīde',
-'nospecialpagetext' => '<strong>Þū hafast abiden ungenges ānlices trametes.</strong>
+'nosuchaction' => 'Swilc dǣd ne biþ nā',
+'nosuchactiontext' => 'Sēo þe se nettfrumfinded wile dōn nis genge.
+Þū wēninga miswrite þone nettfrumfindend, oþþe folgode unrihtne hlencan.
+Þis mæg ēac tācnian wōh on þǣre weorcwrithyrste þe is gebrocen fram {{SITENAME}}.',
+'nosuchspecialpage' => 'Swilc syndrig tramet ne biþ nā',
+'nospecialpagetext' => '<strong>Þū hafast abiden ungenges syndriges trametes.</strong>
 
-Getæl gengra ānlicra trameta cann mann findand be [[Special:SpecialPages|{{int:specialpages}}]].',
+Getæl gengra syndrigra trameta cann man findan be [[Special:SpecialPages|þǣm syndrigra trameta getæle]].',
 
 # General errors
-'error' => 'Ƿōh',
-'databaseerror' => 'Cȳþþuhordes ƿōh',
-'dberrortext' => 'Cȳþþuhordes bēnes endebyrdnesse fremmode ƿōh.
-Þis mæȝe mǣnan regolƿōh on þǣre sōftƿare.
-Sēo nīƿoste ȝesōhte sōftƿare bēn ƿæs:
-<blockquote><tt>$1</tt></blockquote>
-fram innan ƿeorce "<tt>$2</tt>".
-Cȳþþuhord edƿende ƿōh "<tt>$3: $4</tt>"',
-'laggedslavemode' => "'''Ƿarnung:''' Sīde ne mihteliċ ne hæfþ nīƿa nīƿunga.",
-'enterlockreason' => 'Wrīt race þǣre forwiernunge and apunsunge be þǣm tīman on þǣm bēo sēo forwiernung forlǣten',
-'missingarticle-rev' => '(nīƿung#: $1)',
-'internalerror' => 'Innan ƿōh',
-'internalerror_info' => 'Innan ƿōh: $1',
-'fileappenderrorread' => 'Ne meahte "$1" rǣdan on ēacunge.',
-'fileappenderror' => 'Ne meahte "$1" to "$2" ēacian.',
-'filerenameerror' => 'Ne cúðe ednemnan þrǽd "$1" tó "$2".',
-'filenotfound' => 'Ne cūðe findan þrǣd "$1".',
-'formerror' => 'Ƿōh: ne meahte cȳþþuȝeƿrit forþsendan',
+'error' => 'Wōh',
+'databaseerror' => 'Cȳþþuhordes wōh',
+'dberrortext' => 'Cȳþþuhordes bēne endebyrdnesse wōh gelamp.
+Þis mæg mǣnan wōh on þǣre weorcwrithyrste.
+Sēo nīwoste gesōhte cȳþþuhordes bēn wæs:
+<blockquote><code>$1</code></blockquote>
+fram innan wyrcunge "<code>$2</code>".
+Cȳþþuhord ageaf wōh "<code>$3: $4</code>"',
+'laggedslavemode' => "'''Warnung:''' Wēnunga næbbe se tramet nīwlīca nīwunga.",
+'enterlockreason' => 'Wrīt race þǣre forwiernunge and apinsunge þæs tīman on þǣm bēo sēo forwiernung forlǣten',
+'missingarticle-rev' => '(nīwung#: $1)',
+'internalerror' => 'Inweard wōh',
+'internalerror_info' => 'Inweard wōh: $1',
+'fileappenderrorread' => 'Ne cūðe "$1" rǣdan under ēacnunge.',
+'fileappenderror' => 'Ne cūðe "$2" mid "$1" ēacnian.',
+'filerenameerror' => 'Ne cūðe ednemnan ymelan "$1" tō "$2".',
+'filenotfound' => 'Ne cūðe findan ymelan "$1".',
+'formerror' => 'Wōh: ne cūðe cȳþþugewrit forþsendan.',
 'badarticleerror' => 'Þēos dǣd ne cann bēon gefremed on þissum tramete.',
-'badtitle' => 'Unandfenge títul',
-'viewsource' => 'Fruman sēon',
-'cascadeprotected' => 'Þis trament hafaþ geworden gebeorgod wiþ ādihtunge, for þǣm þe hē is geinnod in þissum trament {{PLURAL:$1|tramente, þe is| tramentum, þe sind}} geborgod mid þǣre "cascading" cyre gesett wyrcende: $2',
+'badtitle' => 'Nā genge titul',
+'viewsource' => 'Sēon fruman',
+'cascadeprotected' => 'Þes trament wæs geborgen wiþ adihtunge, for þǣm þe hē is befangen in þissum {{PLURAL:$1|tramente, þe is| tramentum, þe sind}} geborgen settum wyrcende þǣm cyre "cascading": $2',
 
 # Login and logout pages
 'logouttext' => "'''Þū eart nū ūtmeldod.'''
 
-Þū canst ætfeolan tō brūcenne {{SITENAME}} ungecūðe, oþþe þū canst <span class='plainlinks'>[$1 inmeldian eft]</span> tō ylcan oþþe ōðrum brūcende.
-Cnāw þæt sume sīdan cunnon gelǣstende ēowod wesan swā þū wǣre gīet inmeldod, oþ þæt þū clǣnsie þīnes sēcendtōles gemynd.",
-'yourname' => 'Þīn brūcendnama',
-'yourpassword' => 'Þafungƿord:',
-'yourpasswordagain' => 'Þafungƿord edƿrītan:',
-'remembermypassword' => 'Mīne inmeldunge ȝemyndan on þissum spearcatelle (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'yourdomainname' => 'Þīn ȝeƿeald:',
+Þū canst ætfeolan þǣre nytte {{SITENAME}} tō ungecūðum, oþþe þū canst <span class='plainlinks'>[$1 inmeldian eft]</span> tō þǣm ylcan oþþe ōðrum brūcende.
+Cnāw þæt sume trametas mihten gīet wesan geīwde swā þū wǣre gīet inmeldod, oþ þæt þū clǣnsie þīnes sēcendtōles hord.",
+'yourname' => 'Þīn brūcendnama:',
+'yourpassword' => 'Þafungword:',
+'yourpasswordagain' => 'Wrītan þafungword eft:',
+'remembermypassword' => 'Gemynan mīne inmeldunge on þissum webbsēcende (oþ $1 {{PLURAL:$1|dæg|daga}} lengest)',
+'yourdomainname' => 'Þīn geweald:',
 'login' => 'Inmeldian',
-'nav-login-createaccount' => 'Nīƿne hordcleofan scieppan oþþe inmeldian',
-'userlogin' => 'Macian nīwne grīman oþþe grīman brūcan',
+'nav-login-createaccount' => 'Inmeldian / wyrcan reccinge',
+'userlogin' => 'Inmeldian / wyrcan reccinge',
 'userloginnocreate' => 'Inmeldian',
 'logout' => 'Ūtmeldian',
 'userlogout' => 'Ūtmeldian',
-'notloggedin' => 'Ne inȝemelded',
-'nologinlink' => 'Hordcleofan scieppan',
-'createaccount' => 'Hordcleofan scieppan',
+'notloggedin' => 'Nā ingemeldod',
+'nologinlink' => 'Scieppan reccinge',
+'createaccount' => 'Scieppan reccinge',
 'gotaccountlink' => 'Inmeldian',
-'createaccountmail' => 'Þurh spearcenaǣrend',
+'createaccountmail' => 'Notian sceortne tīman hlētlic þafungword and sendan hit to þǣm spearcǣrenda naman þe is niðer',
 'createaccountreason' => 'Racu:',
-'badretype' => 'Þā þafungƿord þe ƿrite þū, bēoþ unȝemæcca.',
-'userexists' => 'Hƿā hæfþ þæt brūcendnama.
-Bidde ōðer brūcendnama ċēosan.',
-'loginerror' => 'Inmeldunge ƿōh',
-'createaccounterror' => 'Ne cūðe macian reccend: $1',
-'nocookiesnew' => 'Se brūcendreccend wæs gemacod, ac þū neart inmedlod.
-{{SITENAME}} brȳcþ tācninclu tō inmeldienne brūcendas.
-Þū hafast forwierned tācninclu.
-Bidde þē, lǣt hīe tō twyrcenne, and þǣræfter inmelda þurh þīnne nīwan brūcendnaman and gelēafnessword.',
+'badretype' => 'Þā þafungword þe write þū, bēoþ ungelīc.',
+'userexists' => 'Se brūcendnama is ǣr gebrocen. Cēos lā ōðerne naman.',
+'loginerror' => 'Inmeldunge wōh',
+'createaccounterror' => 'Ne cūðe scieppan reccinge: $1',
+'nocookiesnew' => 'Sēo brūcendreccing wæs gemacod, ac þū neart inmeldod.
+{{SITENAME}} brȳcþ cȳþþu grētunga tō inmeldienne brūcendas.
+Þū hafast forwierned cȳþþu grētunga.
+Līef him lā, and siþþan inmelda þīnne nīwan brūcendnaman and þīn nīwe þafungword.',
 'loginsuccesstitle' => 'Inmeldung gesǣlde',
-'loginsuccess' => "'''Þu eart nū inmeldod tō {{SITENAME}} swā \"\$1\".'''",
-'nosuchuser' => 'Þǣr nis nān brūcere þe hæfþ þone naman "$1".
-Stafena micelnesse sind hefige and ānlica on brūcendnamum.
-Scēawa þīne wrītunge eft, oþþe brūc þā cartan þe is hērunder tō [[Special:UserLogin/signup|settene nīwne brūcendreccend]].',
-'nosuchusershort' => 'Þǣr is nān brūcend mid þǣm naman "$1".  Edscēawa on þīne wrītunge.',
-'passwordtooshort' => 'Gelēafword sculon habban læst {{PLURAL:$1|1 stafan|$1 stafan}}.',
-'mailmypassword' => 'Nīƿe þafungƿord bȳ e-mail sendan',
+'loginsuccess' => "'''Þu eart nū inmeldod tō {{SITENAME}}  \"\$1\".'''",
+'nosuchuser' => 'Þǣr nis nān brūcend þe hæfþ þone naman "$1".
+Stafena micelnessa sind hefiga and ānlica on brūcendnamum.
+Scēawa þīne wrītunge eft, oþþe [[Special:UserLogin/signup|sciepp nīwe reccinge]].',
+'nosuchusershort' => 'Þǣr nis nān brūcend mid þǣm naman "$1".  Scēawa þīne wrītunge.',
+'passwordtooshort' => 'Þafungword sculon habban læst {{PLURAL:$1|1 stafan|$1 stafena}}.',
+'mailmypassword' => 'Sendan nīwe þafungword on spearcǣrend',
 'acct_creation_throttle_hit' => 'Hwæt, þu hæfst gēo geseted {{PLURAL:$1|1 hordcleofan|$1 -}}. Þu ne canst settan ǣnige māran.',
-'accountcreated' => 'Hordcleofan ȝescapen',
-'loginlanguagelabel' => 'Sprǣċ: $1',
+'accountcreated' => 'Scōp reccinge',
+'loginlanguagelabel' => 'Sprǣc: $1',
 
 # Change password dialog
-'resetpass' => 'Þafungƿord hƿeorfan',
-'oldpassword' => 'Eald þafungƿord:',
-'newpassword' => 'Nīƿu þafungƿord:',
-'retypenew' => 'Nīƿe þafungƿord edƿrītan',
-'resetpass-submit-loggedin' => 'Þafungƿord hƿeorfan',
+'resetpass' => 'Andwendan þafungword',
+'oldpassword' => 'Eald þafungword:',
+'newpassword' => 'Nīwe þafungword:',
+'retypenew' => 'Wrīt nīwe þafungword eft:',
+'resetpass-submit-loggedin' => 'Andwendan þafungword',
 'resetpass-submit-cancel' => 'Undōn',
 
 # Edit page toolbar
 'bold_sample' => 'Þicce traht',
 'bold_tip' => 'Þicce traht',
-'italic_sample' => 'Flōƿende traht',
-'italic_tip' => 'Flōƿende traht',
-'link_sample' => 'Hlenċnama',
-'link_tip' => 'Innanƿeard hlenċe',
-'extlink_sample' => 'http://www.example.com hlenċnama',
-'extlink_tip' => 'Ūtanƿeard hlenċe (ȝemune http:// foredǣl)',
+'italic_sample' => 'Flōwende traht',
+'italic_tip' => 'Flōwende traht',
+'link_sample' => 'Hlencan nama',
+'link_tip' => 'Innanweard hlenca',
+'extlink_sample' => 'http://www.example.com hlencan nama',
+'extlink_tip' => 'Ūtanweard hlenca (beþenc þone http:// foredǣl)',
 'headline_sample' => 'Hēafodlīnan traht',
 'headline_tip' => 'Emnet 2 hēafodlīn',
 'nowiki_sample' => 'Unȝeƿorhtne traht hēr stellan',
@@ -431,15 +437,15 @@ Scēawa þīne wrītunge eft, oþþe brūc þā cartan þe is hērunder tō [[Sp
 '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',
+'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.',
@@ -451,12 +457,12 @@ Scēawa þīne wrītunge eft, oþþe brūc þā cartan þe is hērunder tō [[Sp
 '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!",
+'previewnote' => "'''Beþenc þe þis is gīet efne fōrebysen.'''
+Þīna andwendunga gīet ne sind hordoda!",
 'editing' => 'Ādihtende $1',
 'editingsection' => 'Ādihtende $1 (dǣl)',
 'editingcomment' => 'Ādihtende $1 (nīƿe dǣl)',
@@ -471,42 +477,42 @@ Gif þu hider misfōn cōme, cnoca þā þīnne webbscēaweres '''on bæc''' cn
 Þū behǣtst ēac þæt þū selfa þis ƿrite, oþþe efenlǣhtest of sumre
 folcliċum āgnunge oþþe ȝelīċum frēom horde (sēo $1 for āscungum).
 '''Ne forþsend efenlǣhtscielded ƿeorc būtan þafunge!'''",
-'templatesused' => '{{PLURAL:$1|Bysen|Bysena}} brocen on þisre sīdan:',
-'templatesusedpreview' => '{{PLURAL:$1|Bysen|Bysena}} brocen on þisre forescēaƿe:',
-'template-protected' => '(borgen)',
+'templatesused' => '{{PLURAL:$1|Þēos bysen is|Þās bysena sind}} gebrocen on þissum tramete:',
+'templatesusedpreview' => '{{PLURAL:$1|Þēos bysen is|Þās bysena sind}} gebrocen on þisre fōrebysene:',
+'template-protected' => '(geborgen)',
 'template-semiprotected' => '(sāmborgen)',
-'hiddencategories' => 'Þēos sīde is ȝesīþ {{PLURAL:$1|1 ȝehȳdedes flocces|$1 ȝehȳdeda flocca}}:',
-'nocreate-loggedin' => 'Þū ne hæfst þafunge to scieppenne nīƿa sīdan.',
-'permissionserrors' => 'Þafunga ƿōh',
-'permissionserrorstext-withaction' => 'Þū ne hæfst þafunge for $2, forþǣm þe {{PLURAL:$1|race|racum}}:',
+'hiddencategories' => 'Þes tramet is gesibb {{PLURAL:$1|1 gehȳdedum flocce|$1 gehȳdedra flocca}}:',
+'nocreate-loggedin' => 'Þū ne hæfst þafunge to scieppenne nīwe trametas.',
+'permissionserrors' => 'Þafunga wōh',
+'permissionserrorstext-withaction' => 'Þū ne hæfst þafunge tō $2, for {{PLURAL:$1|þisre race|þissum racum}}:',
 'recreate-moveddeleted-warn' => "'''Warnung: Þu edsciepst tramet þe wæs ǣr āfeorsod.'''
 
 Þu sceoldest smēagan, hwæðer hit gerādlic sīe, forþ tō gānne mid ādihtunge þisses trametes.
 Þæt āfeorsungbred þisses trametes is hēr geīeht for behēfnesse:",
 
 # History pages
-'viewpagelogs' => 'Ealdhordas sēon for þisse sīdan',
-'nohistory' => 'Nis nān ādihtungstǣr for þissum tramete.',
-'currentrev-asof' => 'Nīƿe fadung sƿā $1',
-'revisionasof' => 'Nīƿung fram',
-'previousrevision' => '← Ieldra fadung',
-'nextrevision' => 'Nīƿra fadung →',
-'currentrevisionlink' => 'Nīƿu fadung',
+'viewpagelogs' => 'Sēon þisses trametes ealdhold',
+'nohistory' => 'Nis nān ādihtungstǣr for þissum tramete.',
+'currentrev-asof' => 'Nīwost fadung on $1',
+'revisionasof' => 'Nīwung fram $1',
+'previousrevision' => '← Ieldre fadung',
+'nextrevision' => 'Nīwre fadung →',
+'currentrevisionlink' => 'Nīwost fadung',
 'cur' => 'nū',
 'next' => 'nīehst',
 'last' => 'ǣr',
-'history-fieldset-title' => 'Stǣr sēċan',
+'history-fieldset-title' => 'Sēcan stǣr',
 'histfirst' => 'Ǣrest',
-'histlast' => 'Nīƿost',
-'historyempty' => '(æmettiȝ)',
+'histlast' => 'Nīwost',
+'historyempty' => '(æmettig)',
 
 # Revision feed
-'history-feed-title' => 'Ednīƿunge stǣr',
+'history-feed-title' => 'Ednīwunge stǣr',
 'history-feed-description' => 'Ednīƿunge stǣr þisse sīdan on þǣre ƿiki',
 'history-feed-item-nocomment' => '$1 on $2',
 
 # Revision deletion
-'rev-deleted-comment' => '(cƿide fornōm)',
+'rev-deleted-comment' => '(fornōm cwide)',
 'rev-deleted-user' => '(brūcendnama fornōm)',
 'rev-delundel' => 'scēaƿian/hȳdan',
 'rev-showdeleted' => 'scēaƿan',
@@ -523,7 +529,7 @@ folcliċum āgnunge oþþe ȝelīċum frēom horde (sēo $1 for āscungum).
 'revdelete-reasonotherlist' => 'Ōðru racu',
 
 # History merging
-'mergehistory-from' => 'Frumasīde:',
+'mergehistory-from' => 'Fruman tramet:',
 'mergehistory-submit' => 'Ednīƿunga ȝeþēodian',
 'mergehistory-reason' => 'Racu:',
 
@@ -531,7 +537,7 @@ folcliċum āgnunge oþþe ȝelīċum frēom horde (sēo $1 for āscungum).
 'revertmerge' => 'Unȝeþēodan',
 
 # Diffs
-'history-title' => 'Ednīƿunge stǣr for "$1"',
+'history-title' => 'Ednīwunge stǣr for "$1"',
 'lineno' => 'Līne $1:',
 'compareselectedversions' => 'Corena fadunga metan',
 'editundo' => 'undōn',
@@ -542,66 +548,63 @@ folcliċum āgnunge oþþe ȝelīċum frēom horde (sēo $1 for āscungum).
 'searchresulttext' => 'For mā cȳþþe ymbe {{SITENAME}} sēċan, sēo [[{{MediaWiki:Helppage}}|{{int:help}}]].',
 'searchsubtitle' => "Þū sōhtest '''[[:$1]]'''",
 'searchsubtitleinvalid' => "Þū sōhtest '''$1'''",
-'notitlematches' => 'Nān sīdenama mæccan',
-'notextmatches' => 'Nāne sīdetrahtes mæccan',
+'notitlematches' => 'Nis þǣr nǣnig swilc tramet mid þǣm naman',
+'notextmatches' => 'Nis þǣr nǣnig swilc traht on nǣngum trametum',
 'prevn' => 'ǣror {{PLURAL:$1|$1}}',
 'nextn' => 'nīehst {{PLURAL:$1|$1}}',
 'viewprevnext' => 'Sēon ($1 {{int:pipe-separator}} $2) ($3)',
-'searchmenu-new' => "'''Þā sīdan \"[[:\$1]]\" scieppan on þisre ƿiki!'''",
-'searchhelp-url' => 'Help:Inn',
-'searchprofile-articles' => 'Innoþsīdan',
-'searchprofile-project' => 'Help and Ƿeorc sīdan',
-'searchprofile-images' => 'Mæniȝȝemyndisc',
-'searchprofile-everything' => 'Ȝehƿæt',
-'searchprofile-articles-tooltip' => 'In $1 sēċan',
-'searchprofile-project-tooltip' => 'In $1 sēċan',
-'searchprofile-images-tooltip' => 'Fīlan sēċan',
-'search-result-size' => '$1 ({{PLURAL:$2|1 ƿord|$2 ƿord}})',
-'search-redirect' => '(edlǣd $1)',
+'searchmenu-new' => "'''Scieppan þone tramet \"[[:\$1]]\" on þissum wiki!'''",
+'searchhelp-url' => 'Help:Innung',
+'searchprofile-articles' => 'Innunge trametas',
+'searchprofile-project' => 'Helpes and Weorca trametas',
+'searchprofile-images' => 'Missenendebyrdness',
+'searchprofile-everything' => 'Gehwæt',
+'searchprofile-articles-tooltip' => 'Sēcan in $1',
+'searchprofile-project-tooltip' => 'Sēcan in $1',
+'searchprofile-images-tooltip' => 'Sēcan ymelan',
+'search-result-size' => '$1 ({{PLURAL:$2|1 word|$2 worda}})',
+'search-redirect' => '(edlǣded fram "$1")',
 'search-section' => '(dǣl $1)',
 'search-suggest' => 'Mǣnst þū: $1',
-'search-interwiki-caption' => 'Sƿeostorƿeorc',
+'search-interwiki-caption' => 'Sweostorweorc',
 'search-interwiki-default' => '$1 becymas:',
 'search-interwiki-more' => '(mā)',
-'searchrelated' => 'ȝesibbed',
+'searchrelated' => 'gesibb',
 'searchall' => 'eall',
 'showingresults' => 'Īewan under oþ <b>$1</b> tōhīgunga onginnenda mid #<b>$2</b>.',
 'showingresultsnum' => 'Under sind <b>$3</b> tóhígunga onginnende mid #<b>$2</b>.',
-'powersearch' => 'Sēċan',
-'powersearch-legend' => 'Forþliċ sōcn',
-'powersearch-ns' => 'In namanstedum sēċan:',
-'powersearch-redir' => 'Edlǣdas scēaƿian',
-'powersearch-field' => 'Sēċan',
-'search-external' => 'Ūtan sōcn',
-
-# Quickbar
-'qbsettings-none' => 'Nān',
+'powersearch' => 'Sēcan forþ',
+'powersearch-legend' => 'Manigfeald sēcung',
+'powersearch-ns' => 'Sēcan in namstedum:',
+'powersearch-redir' => 'Settan edlǣdunge on getæle',
+'powersearch-field' => 'Sēcan',
+'search-external' => 'Ūtanweard sōcn',
 
 # Preferences page
-'preferences' => 'Foreberunga',
-'mypreferences' => 'Mīna foreberunga',
-'prefsnologin' => 'Ne inȝemelded',
+'preferences' => 'Fōreberunga',
+'mypreferences' => 'Mīna fōreberunga',
+'prefsnologin' => 'Nā inmeldod',
 'prefs-skin' => 'Scynn',
-'skin-preview' => 'Forescēaƿian',
+'skin-preview' => 'Fōrebysen',
 'prefs-datetime' => 'Tælmearc and tīd',
-'prefs-rc' => 'Nīƿe hƿearfas',
-'prefs-watchlist' => 'Ƿæccȝetalu',
-'saveprefs' => 'Sparian',
-'rows' => 'Rǣƿa',
+'prefs-rc' => 'Nīwa andwendunga',
+'prefs-watchlist' => 'Wæccgetæl',
+'saveprefs' => 'Hordian',
+'rows' => 'Rǣwa:',
 'columns' => 'Sȳla:',
-'searchresultshead' => 'Sōcnfintan',
-'resultsperpage' => 'Tōhīgunga tō īewenne for tramete',
-'recentchangescount' => 'Hū mæniȝ ādihtas to scēaƿenne ȝeþēaƿe:',
-'savedprefs' => 'Þīna foreberunga ƿurdon ȝespared.',
-'timezonelegend' => 'Tīdstell',
-'servertime' => 'Bryttantīma is nū',
-'defaultns' => 'Sēcan in þissum namstedum be frambyge:',
+'searchresultshead' => 'Sōcn',
+'resultsperpage' => 'Tōhrīgunga tō īewenne for ǣlcum tramete:',
+'recentchangescount' => 'Hū mæniga adihtunga to īwenne gewunelīce:',
+'savedprefs' => 'Þīna fōreberunga wurdon gehordod.',
+'timezonelegend' => 'Tīdgeard',
+'servertime' => 'Þegntōles tīd is nū:',
+'defaultns' => 'Elles sēcan on þissum namstedum:',
 'default' => 'gewunelic',
-'youremail' => 'E-ǣrende *',
-'username' => 'Brūcendnama:',
+'youremail' => 'Spearcǣrenda nama:',
+'username' => '{{GENDER:$1|Brūcendnama}}:',
 'yourrealname' => 'Þīn rihtnama*',
 'yourlanguage' => 'Brūcendofermearces sprǣc',
-'yourvariant' => 'Sprǣce wendung',
+'yourvariant' => 'Sprǣce wendung:',
 'yourgender' => 'Ȝecynd:',
 'gender-male' => 'Ƿer',
 'gender-female' => 'Frēo',
@@ -625,8 +628,8 @@ folcliċum āgnunge oþþe ȝelīċum frēom horde (sēo $1 for āscungum).
 'group-all' => '(eall)',
 
 'group-user-member' => '{{GENDER:$1|brūcend}}',
-'group-bot-member' => 'searuþræl',
-'group-sysop-member' => 'beƿitend',
+'group-bot-member' => '{{GENDER:$1|searuþrǣl}}',
+'group-sysop-member' => '{{GENDER:$1|bewitend}}',
 'group-suppress-member' => 'oferȝesiht',
 
 'grouppage-sysop' => '{{ns:project}}:Beƿitendas',
@@ -638,98 +641,97 @@ folcliċum āgnunge oþþe ȝelīċum frēom horde (sēo $1 for āscungum).
 'rightslog' => 'Brūcenda riht cranic',
 
 # Associated actions - in the sentence "You do not have permission to X"
-'action-edit' => 'þās sīdan ādihtan',
+'action-edit' => 'adihtan þisne tramet',
 
 # Recent changes
-'nchanges' => '$1 {{PLURAL:$1|hƿearf|hƿeafas}}',
-'recentchanges' => 'Nīƿe hƿearfas',
-'recentchanges-legend' => 'Nīƿa hƿearfa forebearƿan',
-'recentchanges-feed-description' => 'Þā mǣst nīƿoste hƿearfan huntan to þisse ƿiki in þissum strēame',
-'recentchanges-label-newpage' => 'Þes ādiht macode nīƿa sīdan',
-'recentchanges-label-minor' => 'Þes is lȳtl ādiht',
-'recentchanges-label-bot' => 'Searuþræl fremmode þisne ādiht',
+'nchanges' => '$1 {{PLURAL:$1|andwendung|andwendunga}}',
+'recentchanges' => 'Nīwa andwendunga',
+'recentchanges-legend' => 'Nīwra andwendunga cyras',
+'recentchanges-feed-description' => 'Īwan þā nīwostan andwendunga þæs wiki mid þissum strēame',
+'recentchanges-label-newpage' => 'Þēos adihtung scōp nīwne tramet',
+'recentchanges-label-minor' => 'Þēos is lytel adihtung',
+'recentchanges-label-bot' => 'Searuþrǣl fremede þās adihtunge',
 'rcnote' => "Under {{PLURAL:$1|... '''1''' ...|sind þā æftemestan '''$1''' hweorfunga}} in {{PLURAL:$2|...|þǣm æftemestum '''$2''' dagum}}, . . $5, $4.",
-'rcnotefrom' => 'Under sind þā hweorfunga siþþan <b>$2</b> (oþ <b>$1</b> geīewed).',
-'rclistfrom' => 'Nīƿe hƿeorfan sēon beȝinnende fram $1',
-'rcshowhideminor' => '$1 lȳtl ādihtas',
-'rcshowhidebots' => '$1 searuþralas',
+'rcnotefrom' => "Niðer sind þā andwendunga æfter '''$2''' (mǣst īweþ '''$1''').",
+'rclistfrom' => 'Īwan nīwa andwendunga fram $1 and siþþan',
+'rcshowhideminor' => '$1 lytela adihtunga',
+'rcshowhidebots' => '$1 searuþrǣlas',
 'rcshowhideliu' => '$1 inmeldede brūcendas',
-'rcshowhideanons' => '$1 uncūþ brūcendas',
-'rcshowhidemine' => '$1 mīne ādihtas',
-'rclinks' => 'Læste $1 hƿearfas sēon in læstum $2 dagum<br />$3',
-'diff' => 'scēa',
-'hist' => 'Stǣr',
+'rcshowhideanons' => '$1 uncūðe brūcendas',
+'rcshowhidemine' => '$1 mīna adihtunga',
+'rclinks' => 'Īwan þā nīwostan $1 andwendunga in þissum nīehstum $2 daga<br />$3',
+'diff' => 'scēad',
+'hist' => 'stǣr',
 'hide' => 'hȳdan',
-'show' => 'Scēaƿan',
-'minoreditletter' => 'm',
+'show' => 'Īwan',
+'minoreditletter' => 'ly',
 'newpageletter' => 'N',
-'boteditletter' => 'b',
-'rc_categories_any' => 'Ǣniȝ',
+'boteditletter' => 'þr',
+'rc_categories_any' => 'Ǣnig',
 'rc-enhanced-expand' => 'Ȝehanda sēon (þearf JavaScript)',
 'rc-enhanced-hide' => 'Ȝehanda hȳdan',
 
 # Recent changes linked
-'recentchangeslinked' => 'Sibbhƿearfas',
-'recentchangeslinked-feed' => 'Sibbhƿearfas',
-'recentchangeslinked-toolbox' => 'Sibbhƿearfas',
-'recentchangeslinked-title' => 'Hƿearfas ȝesibbed to "$1"',
-'recentchangeslinked-page' => 'Sīdenama:',
+'recentchangeslinked' => 'Sibba andwendunga',
+'recentchangeslinked-feed' => 'Sibba andwendunga',
+'recentchangeslinked-toolbox' => 'Sibba andwendunga',
+'recentchangeslinked-title' => 'Andwendunga þā sind gesibba "$1"',
+'recentchangeslinked-page' => 'Trametes nama:',
 'recentchangeslinked-to' => 'Hƿearfas to sīdan sēon þe hlenċan habbaþ to þǣre ȝiefen sīdan in stede',
 
 # 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',
+'imagelinks' => 'Hlencan tō ymelan',
 '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.',
@@ -752,169 +754,166 @@ Cnæpp on sƿeorhēafde hƿeorfþ þā endebyrdnessa.',
 # 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-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' => 'Þā folgendan trametas nabbaþ hlencan tō ōðrum sprǣcfadungum.',
 
 # Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|byte|bytes}}',
-'ncategories' => '$1 {{PLURAL:$1|flocca|floccas}}',
-'nlinks' => '$1 bendas',
-'nmembers' => '$1 {{PLURAL:$1|ȝesīþ|ȝesīðas}}',
-'specialpage-empty' => 'Þēos sīde is ǣmtiȝ.',
+'nbytes' => '$1 {{PLURAL:$1|bita|bitena}}',
+'ncategories' => '$1 {{PLURAL:$1|flocca|flocca}}',
+'nlinks' => '$1 {{PLURAL:$1|hlenca|hlencena}}',
+'nmembers' => '$1 {{PLURAL:$1|gesīþ|gesīða}}',
+'specialpage-empty' => 'Nis þǣr nāht þe āh cȳðan þes tramet.',
 'lonelypages' => 'Ealdorlēase trametas',
-'unusedimages' => 'Unbrocene fīlan',
-'popularpages' => 'Dēore trametas',
+'unusedimages' => 'Īdela ymelan',
+'popularpages' => 'Folclīce trametas',
 'wantedcategories' => 'Gewilnode floccas',
 'wantedpages' => 'Gewilnode trametas',
-'mostlinked' => 'Gebundenostan trametas',
-'mostlinkedcategories' => 'Gebundenostan floccas',
-'mostlinkedtemplates' => 'Gebundenostan bysena',
-'prefixindex' => 'Ealla sīdan mid foredǣle',
+'mostlinked' => 'Trametas mid þǣm mǣstan rīme hlencena',
+'mostlinkedcategories' => 'Floccas mid þǣm mǣstan rīme hlencena',
+'mostlinkedtemplates' => 'Bysena mid þǣm mǣstan rīme hlencena',
+'prefixindex' => 'Ealle trametas mid fōredǣle',
 'shortpages' => 'Scorte trametas',
 'longpages' => 'Lange trametas',
-'listusers' => 'Brūcenda ȝetalu',
-'newpages' => 'Nīƿa sīdan',
-'newpages-username' => 'Brūcendnama:',
-'ancientpages' => 'Ieldestan Trametas',
-'move' => 'n',
-'movethispage' => 'Þās sīdan ȝeferan',
-'pager-newer-n' => '{{PLURAL:$1|nīƿra 1|nīƿra $1}}',
-'pager-older-n' => '{{PLURAL:$1|ieldra 1|ieldra $1}}',
+'listusers' => 'Brūcenda getæl',
+'newpages' => 'Nīwe trametas',
+'newpages-username' => 'Brūcendes nama:',
+'ancientpages' => 'Ieldestan trametas',
+'move' => 'Wegan',
+'movethispage' => 'Wegan þisne tramet',
+'pager-newer-n' => '{{PLURAL:$1|nīwran 1|nīwran $1}}',
+'pager-older-n' => '{{PLURAL:$1|ieldran 1|ieldran $1}}',
 
 # Book sources
 'booksources' => 'Bōcfruman',
 'booksources-search-legend' => 'Sēcan bōcfruman',
 'booksources-go' => 'Gān',
-'booksources-text' => 'Under is getalu benda tō ōðrum webstedum þe bebycgaþ nīwa and gebrocena bēc, and hæbben
-ēac mā āscunga ymbe bēc þe þu sēcst:',
+'booksources-text' => 'Niðer is getæl hlencena tō ōðrum webstedum þe cīpaþ nīwa and gebrocena bēc, and wēninga hæbben ēac mā cȳþþu ymbe bēc þe þu sēcst:',
 
 # Special:Log
-'specialloguserlabel' => 'Brūcend:',
-'speciallogtitlelabel' => 'Nama:',
+'specialloguserlabel' => 'Gelǣstende brūcend:',
+'speciallogtitlelabel' => 'Ende (trametes titul oþþe brūcendes nama):',
 'log' => 'Ealdhord',
 
 # Special:AllPages
-'allpages' => 'Ealla sīdan',
-'alphaindexline' => '$1  $2',
-'nextpage' => 'Nīehsta sīde ($1)',
-'prevpage' => 'Ǣror sīde ($1)',
-'allpagesfrom' => 'Sīdan scēaƿian beȝinnende æt:',
-'allpagesto' => 'Sīdan scēaƿian endende æt:',
-'allarticles' => 'Ealla sīdan',
-'allinnamespace' => 'Ealle trametas ($1 namanstede)',
-'allpagesprev' => 'Fore',
+'allpages' => 'Ealle trametas',
+'alphaindexline' => '$1  $2',
+'nextpage' => 'Nīehst tramet ($1)',
+'prevpage' => 'Ǣrra tramet ($1)',
+'allpagesfrom' => 'Īwan trametas fram:',
+'allpagesto' => 'Īwan trametas oþ:',
+'allarticles' => 'Ealle trametas',
+'allinnamespace' => 'Ealle trametas (namstede: $1)',
+'allpagesprev' => 'Ǣr',
 'allpagesnext' => 'Nīehst',
 'allpagessubmit' => 'Gān',
 
 # Special:Categories
 'categories' => 'Floccas',
-'categoriespagetext' => 'Þā folgendan floccas standaþ in þǣm wici.
-[[Special:UnusedCategories|Unused categories]] are not shown here.
-Also see [[Special:WantedCategories|wanted categories]].',
+'categoriespagetext' => '{{PLURAL:$1|Se folgienda flocc befēhþ|Þā folgiendan floccas befōþ}} trametas oþþe missenendebyrdmessa. [[Special:UnusedCategories|Nā gebrocene floccas]] ne sind geīwde hēr. Ēac seoh [[Special:WantedCategories|gewilnode floccas]].',
 
 # Special:DeletedContributions
 'sp-deletedcontributions-contribs' => 'forðunga',
 
 # Special:LinkSearch
-'linksearch' => 'Ūtanƿeard hlenċan',
+'linksearch' => 'Sēcung ūtanweardra hlencena',
 'linksearch-ok' => 'Sēċan',
 
 # Special:ListUsers
-'listusers-noresult' => 'Nǣnne brūcend gefundenne.',
+'listusers-noresult' => 'Nān brūcend wæs gefunden.',
 
 # Special:ActiveUsers
 'activeusers' => 'Hƿata brūcenda ȝetalu',
 
 # Special:ListGroupRights
-'listgrouprights-group' => 'Clīeƿen',
+'listgrouprights-group' => 'Hēap',
 'listgrouprights-rights' => 'Riht',
-'listgrouprights-helppage' => 'Help:Clīeƿenes riht',
-'listgrouprights-members' => '(ȝesīða ȝetalu)',
-'listgrouprights-removegroup' => '{{PLURAL:$2|Clīeƿen|Clīeƿenas}} forniman: $1',
-'listgrouprights-addgroup-all' => 'Eall clīeƿenas ēacian',
-'listgrouprights-removegroup-all' => 'Ealle clīeƿenas forniman',
-
-# E-mail user
-'emailuser' => 'To þissum brūcende ƿrītan',
-'emailfrom' => 'Fram',
+'listgrouprights-helppage' => 'Help:Hēapes riht',
+'listgrouprights-members' => '(getæl gesīða)',
+'listgrouprights-removegroup' => 'Animan {{PLURAL:$2|þisne hēap|þās hēapas}}: $1',
+'listgrouprights-addgroup-all' => 'Ēacnian mid eallum hēapum',
+'listgrouprights-removegroup-all' => 'Animan ealle hēapas',
+
+# Email user
+'emailuser' => 'Wrītan spearcǣrend þissum brūcende',
+'emailfrom' => 'Fram:',
 'emailto' => 'Tō:',
-'emailsubject' => 'Forþsetennes',
-'emailmessage' => 'Ǣrendȝeƿrit',
-'emailsend' => 'Ǣrendian',
-'emailsent' => 'Ǣrendȝeƿrit sended',
-'emailsenttext' => 'Þīn e-mail ǣrendȝeƿrit ƿearþ ȝesend.',
+'emailsubject' => 'Forþsetedness:',
+'emailmessage' => 'Ǣrendgewrit:',
+'emailsend' => 'Sendan',
+'emailsent' => 'Ǣrendgewrit wæs gesend',
+'emailsenttext' => 'Þīn ǣrendgewrit wæs gesend on spearcǣrende.',
 
 # Watchlist
-'watchlist' => 'Mīnu ƿæcceȝetalu',
-'mywatchlist' => 'Mīnu ƿæcceȝetalu',
-'removedwatchtext' => 'Sēo sīde "[[:$1]]" ƿæs fram [[Special:Watchlist|þīnre ƿæccȝetale]] fornōm.',
-'watch' => 'Ƿæccan',
-'watchthispage' => 'Þās sīdan ƿæccan',
-'unwatch' => 'Unƿæccan',
-'unwatchthispage' => 'Ƿæccende healtian',
-'watchlist-details' => '{{PLURAL:$1|$1 sīde|$1 sīdan}} on þīnre ƿæccȝetale, ne beinnende ȝespreċsīdan.',
-'watchlistcontains' => 'Þīn behealdnestalu hæfþ $1 {{PLURAL:$1|trameta|trametas}} inn.',
-'wlnote' => 'Under sind þā æftemestan $1 hweorfunga in þǣm æftemestum <b>$2</b> stundum.',
-'wlshowlast' => 'Īewan æftemestan $1 stunda $2 daga $3',
-'watchlist-options' => 'Ƿæccȝetale forebearƿan',
+'watchlist' => 'Mīn behealdunggetæl',
+'mywatchlist' => 'Mīn behealdunggetæl',
+'removedwatchtext' => 'Se tramet "[[:$1]]" wæs fram [[Special:Watchlist|þīnum behealdunggetæle]] anumen.',
+'watch' => 'Behealdan',
+'watchthispage' => 'Behealdan þisne tramet',
+'unwatch' => 'Ablinnan behealdunge',
+'unwatchthispage' => 'Ablinnan behealdunge',
+'watchlist-details' => '{{PLURAL:$1|Þǣr is $1 tramet|Þǣr sind $1 trameta}} on þīnum behealdunggetæle, nā arīmedum mōtungum.',
+'watchlistcontains' => 'Þīn behealdungtæl hæfþ $1 {{PLURAL:$1|tramet|trameta}}.',
+'wlnote' => "Niðer {{PLURAL:$1|is sēo nīwoste andwendung|sind þā nīwostan '''$1''' andwendunga}} in {{PLURAL:$2|þǣre latostan tīde|þǣm latostan '''$2''' tīda}}, fram: $3, $4.",
+'wlshowlast' => 'Īwan þā latostan $1 tīda $2 daga $3',
+'watchlist-options' => 'Behealdungtæles cyras',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching' => 'Ƿæccende...',
-'unwatching' => 'Unƿæccende...',
+'watching' => 'Behealdende...',
+'unwatching' => 'Ablinnende behealdunge...',
 
 'enotif_impersonal_salutation' => '{{SITENAME}} brūcend',
-'enotif_lastvisited' => 'Sēo $1 for eall hƿearfas siþþan þīn læst cyme.',
-'enotif_lastdiff' => 'Sēo $1 to sēonne þisne hƿearf.',
+'enotif_lastvisited' => 'Sēon $1 for eallum andwendungum fram þīnum latostan cyme.',
+'enotif_lastdiff' => 'Sēon $1 to sēonne þās andwendunge.',
 'enotif_anon_editor' => 'uncūþ brūcend $1',
 'created' => 'ȝescapen',
 'changed' => 'hƿorfen',
 
 # Delete
-'deletepage' => 'Sīdan āfeorsian',
-'excontent' => "innung ƿæs: '$1'",
-'excontentauthor' => "innung ƿæs: '$1' (and se āna forðiend ƿæs '[[Special:Contributions/$2|$2]]')",
-'exblank' => 'tramet wæs ǣmtig',
-'historywarning' => 'Warnung: Se tramet, þone þu āfeorsian teohhast, hæfþ stǣre:',
-'actioncomplete' => 'Ƿeorcdǣd fuldōn',
-'dellogpage' => 'Āfeorsunge ƿīsbōc',
-'deletionlog' => 'āfeorsunge wisbōc',
+'deletepage' => 'Forlēosan tramet',
+'excontent' => 'innung wæs: "$1"',
+'excontentauthor' => 'innung wæs: \'$1\' (and se āna forðiend wæs "[[Special:Contributions/$2|$2]")',
+'exblank' => 'tramet wæs æmettig',
+'historywarning' => "'''Warnung''': Se tramet þe þū wilt forlēosan hafaþ stǣr mid nēan $1 {{PLURAL:$1|fadunge|fadunga}}:",
+'actioncomplete' => 'Dǣd  is fulfyled',
+'dellogpage' => 'Forlēosunge ealdhord',
+'deletionlog' => 'forlēosunge ealdhord',
 'deletecomment' => 'Racu:',
-'deleteotherreason' => 'Ōðra/ēaca racu:',
+'deleteotherreason' => 'Ōðra/nīehst racu:',
 'deletereasonotherlist' => 'Ōðru racu',
 
 # Rollback
-'rollback_short' => 'Edhƿeorfan',
-'rollbacklink' => 'Edhƿeorfan',
-'rollbackfailed' => 'Edhƿeorf misfangen',
-'editcomment' => "Sēo ādihtungymbsprǣc wæs: \"''\$1''\".",
-'revertpage' => 'Ācierde ādihtunga fram [[Special:Contributions/$2|$2]] ([[User talk:$2|Gesprec]]); wendede on bæc tō ǣrran fadunge fram [[User:$1|$1]]',
+'rollback_short' => 'Settan on bæc',
+'rollbacklink' => 'settan on bæc',
+'rollbackfailed' => 'Bæcsettung tōsǣlde',
+'editcomment' => "Þǣre adihtunge se cwide wæs: \"''\$1''\".",
+'revertpage' => 'Onhwearf adihtunga fram [[Special:Contributions/$2|$2]] ([[User talk:$2|mōtung]]); wendede on bæc tō ǣrran fadunge fram [[User:$1|$1]]',
 
 # Protect
-'protectlogpage' => 'Beorges ƿīsbōc',
-'protectedarticle' => 'borgen "[[$1]]"',
-'unprotectedarticle' => 'unborgen "[[$1]]"',
-'protect-title' => 'Beorges emnet hƿeorfan for "$1"',
-'prot_1movedto2' => '[[$1]] ȝefered tō [[$2]]',
+'protectlogpage' => 'Beorges ealdhord',
+'protectedarticle' => 'bearg "[[$1]]"',
+'unprotectedarticle' => 'anōm beorgunge fram "[[$1]]"',
+'protect-title' => 'Andwendan beorges emnet for "$1"',
+'prot_1movedto2' => 'Wæg [[$1]] tō [[$2]]',
 'protectcomment' => 'Racu:',
 'protectexpiry' => 'Endaþ:',
-'protect_expiry_invalid' => 'Endende tīde is unriht.',
-'protect_expiry_old' => 'Endende tīde is in ȝēara dagum.',
+'protect_expiry_invalid' => 'Endes tīd is unriht.',
+'protect_expiry_old' => 'Endes tīd is in gēardagum.',
 'protect-text' => "Þū meaht þæt beorges emnet sēon and hƿeorfan hēr for þǣre sīdan '''$1'''.",
 'protect-default' => 'Eall brūcendas þafian',
-'protect-fallback' => '"$1" þafunge ābiddan',
-'protect-level-autoconfirmed' => 'Nīƿe and unbōcen brūcendas fortȳnan',
-'protect-level-sysop' => 'Efne for beƿitendum',
+'protect-fallback' => 'Synderlīce līefan brūcendum þā habbaþ "$1" lēafe',
+'protect-level-autoconfirmed' => 'Līefan synderlīce selflīce afæstnodum brūcendum',
+'protect-level-sysop' => 'Līefan synderlīce bewitendum',
 'protect-summary-cascade' => 'beflōƿende',
 'protect-expiring' => 'endaþ $1 (UTC)',
 'protect-cascade' => 'Sīdan beorgan beinnodon þisse sīdan (flōƿende ȝebeorg)',
@@ -946,7 +945,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 '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)',
@@ -964,10 +963,10 @@ Also see [[Special:WantedCategories|wanted categories]].',
 '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.',
+'nolinkshere' => "Nǣnge trametas habbaþ hlencan mid '''[[:$1]]'''.",
 'isredirect' => 'edlǣdungtramet',
 'istemplate' => 'bysentraht',
-'isimage' => 'biliþhlenċ',
+'isimage' => 'ymelan hlenca',
 'whatlinkshere-links' => '← hlenċan',
 'whatlinkshere-hideredirs' => '$1 edlǣdas',
 'whatlinkshere-hidetrans' => '$1 bysentraht',
@@ -993,7 +992,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'ipbotherreason' => 'Ōðeru/geīecendlicu racu:',
 'ipblocklist-submit' => 'Sēċan',
 'infiniteblock' => 'unendiende',
-'expiringblock' => 'forealdaþ $1 $2',
+'expiringblock' => 'forealdaþ on $1 on $2',
 'blocklink' => 'fortȳnan',
 'unblocklink' => 'unfortȳnan',
 'change-blocklink' => 'Fortȳne hƿeorfan',
@@ -1060,7 +1059,7 @@ Bidde cēos ōðerne naman.',
 Þū 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-unprotect' => 'Andwendan beorgune þisses trametes',
 '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',
@@ -1102,7 +1101,7 @@ Bidde cēos ōðerne naman.',
 'tooltip-undo' => '"Undōn" undēþ þisne ādiht and þæt ādihtcynd openaþ in forescēaƿemōde. Þis þafaþ race ēaciende in þǣre scortnesse.',
 
 # Attribution
-'anonymous' => 'Namcūþlēas(e) brūcend {{SITENAME}}n',
+'anonymous' => '{{PLURAL:$1|Uncūþ brūcend|Uncūðe brūcendas}} of {{SITENAME}}',
 'siteuser' => '{{SITENAME}}n brūcere $1',
 'others' => 'ōðru',
 'anonusers' => '{{SITENAME}} {{PLURAL:$2|uncūþ brūcend|uncūðe brūcendas}} $1',
@@ -1112,7 +1111,7 @@ Bidde cēos ōðerne naman.',
 'nextdiff' => 'Nīƿra ādiht',
 
 # Media information
-'imagemaxsize' => 'Settan biliðu on biliþgemearcungtrametum tō:',
+'imagemaxsize' => "Mǣst biliðes micelness:<br />''(for ymelena amearcunga trametum)''",
 'thumbsize' => 'Þumannæglmicelnes:',
 'file-info-size' => '$1 × $2 pixels, fīlmiċelu: $3, MIMEcynn: $4',
 'file-nohires' => 'Þǣr nis nǣniȝ mā miċelu.',
@@ -1120,7 +1119,7 @@ Bidde cēos ōðerne naman.',
 'show-big-image' => 'Fulmiċelu',
 
 # Special:NewFiles
-'imagelisttext' => 'Under is getalu $1 biliða gedæfted $2.',
+'imagelisttext' => "Niðer is getæl '''$1''' {{PLURAL:$1|ymelan|ymelena}}, endebyrded  on $2.",
 'noimages' => 'Nāht tō sēonne.',
 'ilsubmit' => 'Sēċan',
 'bydate' => 'be tælmearce',
@@ -1139,7 +1138,7 @@ Bidde cēos ōðerne naman.',
 'exif-artist' => 'Fruma',
 'exif-usercomment' => 'Brūcendes trahtnunga',
 'exif-exposuretime' => 'Blicestīd',
-'exif-brightnessvalue' => 'Beorhtnes',
+'exif-brightnessvalue' => 'APEX beorhtness',
 'exif-lightsource' => 'Lēohtfruma',
 'exif-whitebalance' => 'Hƿītefnetta',
 'exif-sharpness' => 'Scearpnes',
@@ -1203,7 +1202,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 +1218,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 +1255,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 cbd5c61..9c471d4 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author ;Hiba;1
  * @author Abanima
+ * @author Achraf94
  * @author AhmadSherif
  * @author Aiman titi
  * @author Alexknight12
@@ -889,9 +890,19 @@ $2',
 'welcomecreation-msg' => 'تم إنشاء حسابك.
 لا تنس تعديل [[Special:Preferences|تفضيلاتك في {{SITENAME}}]].',
 'yourname' => 'اسم المستخدم:',
+'userlogin-yourname' => 'اسم المستخدم',
+'userlogin-yourname-ph' => 'أدخل اسم المستخدم الخاص بك',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(ساعدني في الاختيار)]]',
 '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 +915,35 @@ $2',
 'logout' => 'تسجيل الخروج',
 'userlogout' => 'اخرج',
 'notloggedin' => 'غير مسجل الدخول',
+'userlogin-noaccount' => 'ليس لديك حساب؟',
+'userlogin-joinproject' => 'انضم إلى {{SITENAME}}',
 'nologin' => "ليس لديك حساب؟ '''$1'''.",
 'nologinlink' => 'أنشئ حسابا',
 'createaccount' => 'أنشئ حسابا',
 'gotaccount' => "لديك حساب؟ '''$1'''.",
 'gotaccountlink' => 'تسجيل الدخول',
 'userlogin-resetlink' => 'نسيت تفاصيل الدخول؟',
+'helplogin-url' => 'Help:تسجيل الدخول',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|المساعدة في تسجيل الدخول]]',
+'createacct-join' => 'قم بإدخال المعلومات الخاصة بك أدناه.',
+'createacct-emailrequired' => 'عنوان البريد الإلكتروني',
+'createacct-emailoptional' => 'البريد الإلكتروني (اختياري)',
+'createacct-email-ph' => 'أدخل عنوان بريدك الإلكتروني',
 'createaccountmail' => 'استخدم كلمة سر عشوائية مؤقتة وارسلها إلى عنوان البريد الإلكتروني المحدد أدناه',
+'createacct-realname' => 'الاسم الحقيقي (اختياري)',
 'createaccountreason' => 'السبب:',
+'createacct-reason' => 'السبب',
+'createacct-reason-ph' => 'لماذا تقوم بإنشاء حساب آخر',
+'createacct-captcha' => 'تحقق أمني',
+'createacct-captcha-help-url' => '{{ns:Project}}: طلب حساب',
+'createacct-benefit-body1' => 'التعديلات',
+'createacct-benefit-body2' => 'الصفحات',
+'createacct-benefit-body3' => 'المساهمين في الآونة الأخيرة',
 'badretype' => 'كلمات السر التي أدخلتها لا تتطابق.',
 'userexists' => 'اسم المستخدم الذي تم إدخاله مستعمل بالفعل.
 الرجاء اختيار اسم مختلف.',
 'loginerror' => 'خطأ في الدخول',
+'createacct-error' => 'خطأ في إنشاء حساب',
 'createaccounterror' => 'تعذر إنشاء حساب المستخدم: $1',
 'nocookiesnew' => 'تم إنشاء حساب المستخدم، ولكنك لست مسجل الدخول بعد.
 يستخدم {{SITENAME}} كوكيز لتسجيل الدخول.
@@ -1012,9 +1040,10 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'إعادة ضبط كلمة السر',
-'passwordreset-text' => 'Ø£Ù\83Ù\85Ù\84 Ù\87ذا Ø§Ù\84Ù\86Ù\85Ù\88ذج Ù\84تتÙ\84Ù\82Ù\89 Ø¨Ø±Ù\8aدا Ø¥Ù\84Ù\83ترÙ\88Ù\86Ù\8aا Ù\8aØ°Ù\83ر Ø¨ØªÙ\81اصÙ\8aÙ\84 Ø­Ø³Ø§بك.',
+'passwordreset-text' => 'Ø£Ù\83Ù\85Ù\84 Ù\87ذا Ø§Ù\84Ù\86Ù\85Ù\88ذج Ù\84إعادة Ø¶Ø¨Ø· Ù\83Ù\84Ù\85Ø© Ø§Ù\84سر Ø§Ù\84خاصة بك.',
 'passwordreset-legend' => 'إعادة تعيين كلمة السر',
 'passwordreset-disabled' => 'عُطّلت إعادة تعيين كلمة السر على هذه الويكي.',
+'passwordreset-emaildisabled' => 'تم تعطيل ميزات البريد الإلكتروني على هذه الويكي.',
 'passwordreset-pretext' => '{{PLURAL:$1||أدخل أحد أجزاء البيانات أدناه}}',
 'passwordreset-username' => 'اسم المستخدم:',
 'passwordreset-domain' => 'النطاق:',
@@ -1022,25 +1051,23 @@ $2',
 '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' => 'ولّد بريد إلكتروني لإعادة ضبط كلمة السر وهو معروض بالأسفل لكن فشل إرساله للمستخدم: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'تغيير عنوان البريد الإلكتروني',
@@ -1557,6 +1584,7 @@ $1",
 'searchdisabled' => 'البحث في {{SITENAME}} معطل.
 يمكنك البحث من خلال جوجل في الوقت الحالي.
 لاحظ أن فهارسه لمحتوى {{SITENAME}} ربما تكون غير محدثة.',
+'search-error' => 'حدث خطأ ما أثناء البحث: $1',
 
 # Preferences page
 'preferences' => 'تفضيلات',
@@ -2449,6 +2477,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' => 'التالي قائمة بمجموعات المستخدمين المعرفة في هذا الويكي، بصلاحياتهم المصاحبة.
@@ -4198,13 +4235,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' => 'ابحث عن الملفات المكررة بناء على قيم الهاش.',
@@ -4294,21 +4324,23 @@ $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' => 'حذف{{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-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' => 'غيّر $1 بسرية إمكانية رؤية أحداث سجل $3',
 'logentry-suppress-revision-legacy' => 'غيّر $1 بسرية إمكانية رؤية مراجعات صفحة $3',
 'revdelete-content-hid' => 'محتوى مخفي',
index f4f242e..d815925 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
@@ -212,8 +212,6 @@ $messages = array(
 'tog-shownumberswatching' => 'লক্ষ্য কৰি থকা সদস্য সমূহৰ সংখ্যা দেখুৱাওক',
 'tog-oldsig' => 'বৰ্তমানৰ স্বাক্ষৰ:',
 'tog-fancysig' => 'স্বাক্ষৰ ৱিকিটেক্সট হিচাপে ব্যৱহাৰ কৰক (স্বয়ংক্ৰিয় সংযোগ অবিহনে)',
-'tog-externaleditor' => 'ডিফ’ল্ট ভাবে বাহ্যিক সম্পাদন-সঁজুলি ব্যৱহাৰ কৰক (দক্ষ জনৰ বাবেহে, আপোনাৰ কম্পিউটাৰত বিশেষ ব্যৱস্থা থাকিব লাগিব । [//www.mediawiki.org/wiki/Manual:External_editors সবিশেষ ।])',
-'tog-externaldiff' => 'ডিফ’ল্ট ভাবে বাহ্যিক তফাৎ (diff) ব্যৱহাৰ কৰক (দক্ষ জনৰ বাবেহে, আপোনাৰ কম্পিউটাৰত বিশেষ ব্যৱস্থা থাকিব লাগিব । [//www.mediawiki.org/wiki/Manual:External_editors সবিশেষ ।])',
 'tog-showjumplinks' => '"জঁপিয়াই যাওক" সংযোগ সক্ৰিয় কৰক',
 'tog-uselivepreview' => 'সম্পাদনাৰ লগে লগে খচৰা দেখুৱাওক (জাভাস্ক্ৰিপ্টৰ প্ৰয়োজন) (পৰীক্ষামূলক)',
 'tog-forceeditsummary' => 'সম্পাদনাৰ সাৰাংশ নিদিলে মোক জনাব',
@@ -227,6 +225,7 @@ $messages = array(
 'tog-diffonly' => 'পার্থক্যৰ তলত পৃষ্ঠাৰ বিষয়বস্তু নেদেখুৱাব',
 'tog-showhiddencats' => 'নিহিত শ্ৰেণী সমূহ দেখুৱাওক',
 'tog-norollbackdiff' => 'পূৰ্বৱত কৰা পাছত পাৰ্থক্য নেদেখুৱাব',
+'tog-useeditwarning' => 'সালসলনি সংৰক্ষণ নকৰাকৈ সম্পাদনা পৃষ্ঠা ত্যাগৰ সময়ত মোক সাৱধান কৰক',
 
 'underline-always' => 'সদায়',
 'underline-never' => 'কেতিয়াও নহয়',
@@ -596,9 +595,20 @@ $2',
 আপোনাৰ সদস্যভুক্তি হৈ গ’ল ।
 [[Special:Preferences|{{SITENAME}}ৰ পছন্দসমূহ]]ত আপোনাৰ পছন্দমতে ব্যক্তিগতকৰণ কৰি ল’বলৈ নাপাহৰে যেন ।',
 'yourname' => 'সদস্যনাম:',
+'userlogin-yourname' => 'সদস্যনাম',
+'userlogin-yourname-ph' => 'আপোনাৰ সদস্যনাম লিখক',
+'createacct-helpusername-url' => '{{ns:Project}}:সদস্যনাম_নীতি',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(মোক বাছনি কৰাত সহায় কৰক)]]',
 '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 +621,39 @@ $2',
 'logout' => 'প্ৰস্থান',
 'userlogout' => 'প্ৰস্থান',
 'notloggedin' => 'প্ৰৱেশ কৰা নাই',
+'userlogin-noaccount' => 'কোনো একাউণ্ট নাই?',
+'userlogin-joinproject' => '{{SITENAME}}ত যোগদান কৰক',
 'nologin' => "ৱিকিপিডিয়াত আপোনাৰ একাউণ্ট নাই নেকি? তেনে '''$1'''।",
 'nologinlink' => 'নতুন একাউণ্ট খোলক',
 'createaccount' => 'সভ্যভুক্ত হবলৈ',
 'gotaccount' => "আপুনি সদস্য হয়নে? '''$1'''",
 'gotaccountlink' => 'প্ৰৱেশ',
 'userlogin-resetlink' => 'আপোনাৰ প্ৰৱেশ তথ্য পাহৰিছে?',
+'helplogin-url' => 'সহায়:প্ৰৱেশ/লগ্‌-ইন',
+'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-captcha-help-url' => '{{ns:Project}}:এটা একাউণ্টৰ বাবে অনুৰোধ কৰক',
+'createacct-imgcaptcha-help' => 'ছবিখন দেখা পোৱা নাই? [[{{MediaWiki:createacct-captcha-help-url}}|এটা একাউণ্টৰ বাবে অনুৰোধ কৰক]]',
+'createacct-imgcaptcha-ph' => 'ওপৰত দেখা পোৱা পাঠ্য লিখক',
+'createacct-submit' => 'আপোনাৰ একাউণ্ট সৃষ্টি কৰক',
+'createacct-benefit-heading' => 'আপোনাৰ দৰে মানুহেই {{SITENAME}} তৈয়াৰ কৰিছে',
+'createacct-benefit-body1' => 'সম্পাদনাসমূহ',
+'createacct-benefit-body2' => 'পৃষ্ঠাসমূহ',
+'createacct-benefit-body3' => 'শেহতীয়া অৱদানকাৰীসকল',
 'badretype' => 'আপুনি দিয়া গুপ্ত শব্দ দুটা মিলা নাই।',
 'userexists' => 'আপুনি দিয়া সদস্যনাম আগৰে পৰাই ব্যৱহাৰ হৈ আছে।
 অনুগ্ৰহ কৰি বেলেগ সদস্যনাম এটা নিৰ্বাচন কৰক।',
 'loginerror' => 'প্ৰৱেশ সমস্যা',
+'createacct-error' => 'একাউণ্ট সৃষ্টিত ত্ৰুটি',
 'createaccounterror' => "একাউন্ট সৃষ্টি কৰা নহ'ল: $1",
 'nocookiesnew' => 'আপোনাৰ সদস্যভুক্তি হৈ গৈছে, কিন্তু আপুনি প্ৰৱেশ কৰা নাই।
 {{SITENAME}}ত প্ৰৱেশ কৰিবলৈ কুকি সক্ৰিয় থাকিব লাগিব।
@@ -712,12 +743,14 @@ $2',
 'resetpass-wrong-oldpass' => 'অস্থায়ী বা সাম্প্ৰতিক গুপ্তশব্দ গ্ৰহণযোগ্য নহয় ।
 হয়টো আপুনি ইতিমধ্যেই সফলভাবে আপুনাৰ গুপ্তশব্দ সলনি কৰিছিল বা এটা নতুন অস্থায়ী গুপ্তশব্দৰ বাবে অনুৰোধ কৰিছিল ।',
 'resetpass-temp-password' => 'অস্থায়ী গুপ্তশব্দ:',
+'resetpass-abort-generic' => 'এটা এক্সটেন্‌ছনৰদ্বাৰা গুপ্তশব্দ সলনি কাৰ্য বাতিল কৰা হৈছে।',
 
 # Special:PasswordReset
 'passwordreset' => 'গুপ্তশব্দ ন-কৈ বহাওক',
 'passwordreset-text' => ' আপোনাৰ গুপ্তশব্দ ন-কৈ বহুৱাবলৈ তলৰ প্ৰপত্ৰ সম্পূৰ্ণ কৰক।',
 'passwordreset-legend' => 'গুপ্তশব্দ ন-কৈ বহাওক',
 'passwordreset-disabled' => 'এই ৱিকিত গুপ্তশব্দ নবীকৰণ নিষ্ক্ৰিয় কৰা হৈছে ।',
+'passwordreset-emaildisabled' => 'এই ৱিকিত ই-মেইল বৈশিষ্টসমূহ নিষ্ক্ৰিয় কৰা হৈছে।',
 'passwordreset-pretext' => '{{PLURAL:$1||তলত উল্লেখ কৰা তথ্যৰ কোনো অংশ ভৰাওক}}',
 'passwordreset-username' => 'সদস্যনাম',
 'passwordreset-domain' => 'ডমেইন :',
@@ -739,7 +772,7 @@ $2
 অস্থায়ী গুপ্তশব্দ: $2',
 'passwordreset-emailsent' => 'এখন গুপ্তশব্দ উদ্ধাৰ ই-মেইল পঠিওৱা হৈছে।',
 'passwordreset-emailsent-capture' => 'এখন গুপ্তশব্দ উদ্ধাৰ ইমেইল পঠিওৱা হৈছে, এইখন তলত দেখা পাব।',
-'passwordreset-emailerror-capture' => "এখন গুপ্তশব্দ উদ্ধাৰ ইমেইল সৃষ্টি কৰা হ'ল কিন্তু সদস্যজনলৈ পঠিয়াব পৰা নগ'ল, এইখন তলত দেখুওৱা হৈছে: $1",
+'passwordreset-emailerror-capture' => "এখন গুপ্তশব্দ উদ্ধাৰ ইমেইল সৃষ্টি কৰা হ'ল, কিন্তু {{GENDER:$2|সদস্যজনলৈ}} পঠিয়াব পৰা নগ'ল। সেইখন তলত দেখুওৱা হৈছে: $1",
 
 # Special:ChangeEmail
 'changeemail' => 'ই-মেইল ঠিকনা সলনি কৰক',
@@ -966,6 +999,7 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 'content-failed-to-parse' => '$1 মডেলৰ বাবে $2ৰ তথ্য নিকা কৰিব পৰা নগ’ল: $3',
 'invalid-content-data' => 'অবৈধ সমল তথ্য',
 'content-not-allowed-here' => '[[$2]] পৃষ্ঠাত "$1" সমল অনুমোদিত নহয়',
+'editwarning-warning' => 'এই পৃষ্ঠাটো এৰিলে আপুনি কৰা পৰিবৰ্তনসমূহ হেৰাব পাৰে। যদি আপুনি প্ৰৱেশ কৰা অৱস্থাত আছে, আপুনি এই সতৰ্কবাৰ্তাক আপোনাৰ পছন্দসমূহৰ "সম্পাদনা" অংশত অসামৰ্থবান কৰিব পাৰিব।',
 
 # Content models
 'content-model-wikitext' => 'ৱিকিপাঠ্য',
@@ -1255,15 +1289,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' => 'পছন্দসমূহ',
@@ -1407,6 +1433,7 @@ $1",
 'userrights-notallowed' => 'সদস্যৰ অধিকাৰ যোগ কৰিবলৈ বা আঁতৰ কৰিবলৈ আপোনাৰ একাউণ্টৰ অনুমতি নাই ।',
 'userrights-changeable-col' => 'আপুনি সলনি কৰিব পৰা গোটসমূহ',
 'userrights-unchangeable-col' => 'আপুনি সলনি কৰিব নোৱাৰা গোটসমূহ',
+'userrights-conflict' => 'সদস্য অধিকাৰ দ্বন্দ্ব! অনুগ্ৰহ কৰি আপোনাৰ সালসলনি আকৌ এবাৰ প্ৰয়োগ কৰক।',
 
 # Groups
 'group' => 'গোট:',
@@ -1816,7 +1843,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 +2002,10 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 তাৰ সলনি সেইবোৰত উপযুক্ত পৃষ্ঠাৰ লগত সংযোগ থাকিব পাৰে।
 [[MediaWiki:Disambiguationspage]]ৰ পৰা সংযোগ থকা কোনো সাঁচ ব্যৱহাৰ কৰিলে এখন পৃষ্ঠাক দ্ব্যৰ্থতা দূৰীকৰণ পৃষ্ঠা হিছাপে গণ্য কৰা হয়।",
 
+'pageswithprop' => 'পৃষ্ঠা উপাদান সম্বলিত পৃষ্ঠাসমূহ',
+'pageswithprop-legend' => 'পৃষ্ঠা উপাদান সম্বলিত পৃষ্ঠাসমূহ',
+'pageswithprop-text' => 'বিশেষ পৃষ্ঠা উপাদান ব্যৱহাৰ কৰা পৃষ্ঠাসমূহ ইয়াত তালিকাভুক্ত কৰা হৈছে।',
+'pageswithprop-prop' => 'উপাদান নাম:',
 'pageswithprop-submit' => 'যাওক',
 
 'doubleredirects' => 'দ্বি-পুনঃনিৰ্দেশিত',
@@ -2144,7 +2174,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 # Special:ActiveUsers
 'activeusers' => 'সক্ৰিয় ব্যবহাৰকাৰীৰ তালিকা',
 'activeusers-intro' => 'যোৱা  {{PLURAL:$1|দিন|দিন}}ৰ ভিতৰত অৱদান আগবঢ়োৱা ব্যৱহাৰকাৰীৰ তালিকা',
-'activeusers-count' => 'যà§\8bৱা {{PLURAL:$3|দিনত|$3 à¦¦à¦¿à¦¨à¦¤}} à¦¸à§°à§\8dবমà§\81ঠ {{PLURAL:$1|à¦\95ামৰ|à¦\95ামৰ}} à¦¸à¦\82à¦\96à§\8dযা $1',
+'activeusers-count' => 'যà§\8bৱা {{PLURAL:$3|দিনত|$3 à¦¦à¦¿à¦¨à¦¤}} à¦\95ৰা $1{{PLURAL:$1|à¦\9fা à¦\95াম|à¦\9fা à¦\95াম}} à¦¸à¦\82à¦\96à§\8dযা',
 'activeusers-from' => 'ইয়াৰে আৰম্ভ হোৱা ব্যৱহাৰকাৰী সকল দেখুৱাওক:',
 'activeusers-hidebots' => 'বট নেদেখুৱাব',
 'activeusers-hidesysops' => 'প্ৰশাসক নেদেখুৱাব',
@@ -2874,6 +2904,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 +3038,7 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'pageinfo-robot-noindex' => 'ইনডেক্সৰ অনুপযোগী',
 'pageinfo-views' => 'দৰ্শনৰ সংখ্যা',
 'pageinfo-watchers' => 'পৃষ্ঠা নিৰীক্ষকৰ সংখ্যা',
+'pageinfo-few-watchers' => '$1 {{PLURAL:$1|তকৈ কম নিৰীক্ষক}}',
 'pageinfo-redirects-name' => 'পৃষ্ঠালৈ থকা পুনৰ্নিৰ্দেশ',
 'pageinfo-subpages-name' => 'এই পৃষ্ঠাৰ উপপৃষ্ঠাসমূহ',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|পুনৰ্নিৰ্দেশ|পুনৰ্নিৰ্দেশসমূহ}}; $3 {{PLURAL:$3|অপুনৰ্নিৰ্দেশ নাই|অপুনৰ্নিৰ্দেশসমূহ}})',
@@ -3029,6 +3061,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 +3141,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:
 
@@ -3735,13 +3787,6 @@ $5
 'version-entrypoints-header-entrypoint' => 'প্ৰৱেশ পইণ্ট',
 'version-entrypoints-header-url' => 'ইউআৰএল',
 
-# Special:FilePath
-'filepath' => 'নথিৰ পথ',
-'filepath-page' => 'নথি:',
-'filepath-submit' => 'যাওক',
-'filepath-summary' => 'এই বিশেষ পৃষ্ঠায় এটা নথিপত্ৰৰ বাবে সম্পূৰ্ণ পথ ঘুৰাই পঠায়।
-ছবিসমূহক সম্পূৰ্ণ বিভেদনত দেখুৱা হয়, অন্য নথিপত্ৰ ধৰণসমূহ সিহতৰ সংলঘ্ন প্ৰগ্ৰামৰ সৈতে প্ৰত্যক্ষভাৱে আৰম্ভ হয়।',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'প্ৰতিলিপি পৃষ্ঠাসমূহ অনুসন্ধান কৰক',
 'fileduplicatesearch-summary' => 'হেছ্‌ মানসমূহৰ উপৰত নিৰ্ভৰ কৰি প্ৰতিলিপিত নথিপত্ৰসমূহৰ বাবে সন্ধান কৰক।',
@@ -3832,14 +3877,17 @@ $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 দৃশ্যমানতা পৰিৱৰ্তন কৰা হ’ল',
@@ -3864,9 +3912,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 +3973,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 +3994,7 @@ $5
 'duration-centuries' => '$1 {{PLURAL:$1|শতাব্দী|শতাব্দী}}',
 'duration-millennia' => '$1 {{PLURAL:$1|সহস্ৰাব্দ|সহস্ৰাব্দ}}',
 
+# Image rotation
+'rotate-comment' => 'ছবিখন ঘড়ীৰ কাটাৰ দিশত $1 {{PLURAL:$1|ডিগ্ৰী}} ঘূৰোৱা হৈছে।',
+
 );
index 216c52f..729156a 100644 (file)
@@ -60,7 +60,7 @@ $specialPageAliases = array(
 $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 +77,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 +110,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',
@@ -199,14 +199,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',
@@ -267,7 +267,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',
@@ -281,11 +281,11 @@ $messages = array(
 'jumpto' => 'Saltar a:',
 'jumptonavigation' => 'navegación',
 'jumptosearch' => 'guetar',
-'view-pool-error' => 'Sentímoslo, los sirvidores tán sobrecargaos nestos momentos.
-Hai demasiaos usuarios faciendo por ver esta páxina.
-Por favor espera un cachín enantes de volver intentar acceder a esta páxina.
+'view-pool-error' => "Sentímoslo, los sirvidores tán sobrecargaos nestos momentos.
+Hai demasiaos usuarios intentando ver esta páxina.
+Por favor espera un ratu enantes d'intentar otra vuelta entrar a esta páxina.
 
-$1',
+$1",
 'pool-timeout' => 'Tiempu escosáu esperando pal bloquéu',
 'pool-queuefull' => 'La cola de trabayu ta enllena',
 'pool-errorunknown' => 'Fallu desconocíu',
@@ -293,7 +293,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' => '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 $1.',
 'copyrightpage' => "{{ns:project}}:Drechos d'autor",
 'currentevents' => 'Actualidá',
 'currentevents-url' => 'Project:Actualidá',
@@ -312,7 +312,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 +342,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 +383,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 +401,7 @@ Esto débese davezu a siguir una \"dif\" caducada o un enllaz d'historial a una
 Si esti nun ye'l casu, seique tengas atopao un bug nel software.
 Por favor informa d'esto a un [[Special:ListUsers/sysop|alministrador]], anotando la URL.",
 'missingarticle-rev' => '(núm. revisión: $1)',
-'missingarticle-diff' => '(dif: $1, $2)',
+'missingarticle-diff' => '(Diff: $1, $2)',
 'readonly_lag' => 'La base de datos candóse automáticamente mentes los sirvidores de la base de datos esclava se sincronicen cola maestra',
 'internalerror' => 'Fallu internu',
 'internalerror_info' => 'Fallu internu: $1',
@@ -412,7 +412,7 @@ Por favor informa d'esto a un [[Special:ListUsers/sysop|alministrador]], anotand
 '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',
+'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.',
@@ -432,7 +432,7 @@ Estos datos nun van refrescase nestos momentos.",
 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.',
@@ -475,9 +475,20 @@ Ten en cuenta que dalgunes páxines puen siguir apaeciendo como si tovía tuvier
 'welcomecreation-msg' => "Creóse la to cuenta.
 Nun t'escaezas d'escoyer 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",
+'createacct-helpusername-url' => '{{ns:Project}}:Política_de_nomes',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(ayudame a escoyer)]]',
 '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}})",
+'userlogin-remembermypassword' => 'Recordame',
+'userlogin-signwithsecure' => 'Aniciar sesión con un sirvidor seguru',
 'securelogin-stick-https' => "Siguir coneutáu al HTTPS dempués d'identificase",
 'yourdomainname' => 'El to dominiu:',
 'password-change-forbidden' => 'Nun se pueden camudar les contraseñes nesta wiki.',
@@ -490,18 +501,37 @@ Nun t'escaezas d'escoyer les tos [[Special:Preferences|preferencies de {{SITENAM
 'logout' => 'Dexar de tar identificáu',
 'userlogout' => 'Colar',
 'notloggedin' => 'Non identificáu',
+'userlogin-noaccount' => '¿Nun tien una cuenta?',
+'userlogin-joinproject' => 'Xunise a {{SITENAME}}',
 'nologin' => '¿Nun tienes una cuenta? $1.',
 'nologinlink' => 'Crear una cuenta',
 'createaccount' => 'Crear una cuenta',
 'gotaccount' => '¿Ya tienes una cuenta? $1.',
 'gotaccountlink' => 'Identificase',
 'userlogin-resetlink' => "¿Escaecisti los datos d'identificación?",
+'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:',
+'createacct-reason' => 'Motivu',
+'createacct-captcha' => 'Comprobación de seguridá',
+'createacct-captcha-help-url' => '{{ns:Project}}:Solicitar una cuenta',
+'createacct-imgcaptcha-help' => '¿Nun pue ver la imaxe? [[{{MediaWiki:createacct-captcha-help-url}}|Solicite una cuenta]]',
+'createacct-imgcaptcha-ph' => "Escriba'l testu qu'apaez arriba",
+'createacct-benefit-heading' => '{{SITENAME}} failu xente como vusté.',
+'createacct-benefit-body1' => 'ediciones',
+'createacct-benefit-body2' => 'Páxines',
+'createacct-benefit-body3' => 'collaboradores esti mes',
 'badretype' => "Les claves 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",
+'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.
 {{SITENAME}} usa «cookies» pa identificar a los usuarios.
@@ -632,7 +662,7 @@ Tendría d'aniciar sesión y escoyer una contraseña nueva agora. Si esta solici
 Clave provisional: $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',
@@ -2031,6 +2061,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.
@@ -3007,11 +3046,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:
 
@@ -3639,13 +3692,6 @@ 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:FileDuplicateSearch
 'fileduplicatesearch' => 'Buscar archivos duplicaos',
 'fileduplicatesearch-summary' => 'Busca archivos duplicaos basándose nos sos valores fragmentarios.',
index f6b0ea9..ddf5a23 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' => 'دَییشیکلیک قیساسی بوش قالاندا منی بیلدیر',
index 03952be..a8a0f72 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' => 'Бер ҡасан да',
@@ -563,9 +562,13 @@ $2',
 'welcomecreation-msg' => 'Иҫәп яҙыуығыҙ яһалды.
 Шәхси [[Special:Preferences|{{SITENAME}} көйләүҙәрен]] үҙегеҙгә уңайлы итеп үҙгәртергә онотмағыҙ.',
 'yourname' => 'Ҡатнашыусы исеме',
+'userlogin-yourname' => 'Ҡулланыусы исеме',
 'yourpassword' => 'Һеҙҙең пароль',
+'userlogin-yourpassword' => 'Пароль',
+'userlogin-yourpassword-ph' => 'Яңы паролде яҙығыҙ',
 'yourpasswordagain' => 'Паролде ҡабаттан яҙыу',
 'remembermypassword' => 'Был компьютерҙа паролемде иҫләргә ($1 {{PLURAL:$1|көндән|көндән}} күп түгел)',
+'userlogin-remembermypassword' => 'Хәтерҙә ҡалдырырға',
 'securelogin-stick-https' => 'Танылғандан һуң HTTPS менән бәйләнеште ҡалдырырға',
 'yourdomainname' => 'Һеҙҙең домен',
 'password-change-forbidden' => 'Был викила паролегеҙҙе үҙгәртә алмайһығыҙ.',
@@ -912,6 +915,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' => 'викияҙма',
@@ -1196,15 +1201,6 @@ $1",
 Хәҙергә эҙләүҙе Google менән үтәй алаһығыҙ.
 Тик унда {{SITENAME}} өсөн индекслауҙың иҫке булыуы мөмкинлеген онотмағыҙ.',
 
-# Quickbar
-'qbsettings' => 'Тиҙ күсеү',
-'qbsettings-none' => 'Һис бере',
-'qbsettings-fixedleft' => 'Һулда нығытылған',
-'qbsettings-fixedright' => 'Уңда нығытылған',
-'qbsettings-floatingleft' => 'Һулда күсеүсе',
-'qbsettings-floatingright' => 'Уңда күсеүсе',
-'qbsettings-directionality' => 'Беркетелгән, телегеҙҙең яҙыу йүнәлешенә бәйле',
-
 # Preferences page
 'preferences' => 'Көйләүҙәр',
 'mypreferences' => 'Көйләүҙәр',
@@ -1753,7 +1749,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>
@@ -2076,6 +2071,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' => 'Түбәндә был вики-проектта билдәләнгән ҡатнашыусы төркөмдәре килтерелгән һәм уларҙың хоҡуҡтары күрһәтелгән.
@@ -2951,11 +2955,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' => 'Векторлы',
 
@@ -3658,13 +3658,6 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
 'version-entrypoints-header-entrypoint' => 'Инеш урыны',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Файлға юл',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Күсеү',
-'filepath-summary' => 'Был махсус бит файлдың тулы юлын ҡайтара.
-Рәсемдәр тулы асыҡлыҡта күрһәтелә, башҡа файлдар билдәләнгән программалары аша турана-тура асыла.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Бер иш файлдарҙы эҙләү',
 'fileduplicatesearch-summary' => 'Бер иш файлдарҙы хэш-кодтары буйынса эҙләү.',
index 35d80f0..3babb36 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',
@@ -514,9 +511,20 @@ 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',
+'createacct-helpusername-url' => '{{ns:Project}}:Paragamit_na_Kalakawan',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(tabangi akong makapili)]]',
 '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' => 'Giromdoma ako',
+'userlogin-signwithsecure' => 'Maglaog sa seguradong serbidor',
 '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 +537,37 @@ 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',
+'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-captcha' => 'Rikisang panseguridad',
+'createacct-captcha-help-url' => '{{ns:Project}}:Maghagad nin panindog',
+'createacct-imgcaptcha-help' => 'Dae nahihiling an imahe? [[{{MediaWiki:createacct-captcha-help-url}}|Maghagad nin panindog]]',
+'createacct-imgcaptcha-ph' => 'Pakikaag an tekstong nahihiling mo sa ibabaw',
+'createacct-benefit-heading' => '{{SITENAME}} pinaghimo kan mga tawong siring mo.',
+'createacct-benefit-body1' => 'mga pagliliwat',
+'createacct-benefit-body2' => 'mga pahina',
+'createacct-benefit-body3' => 'pinakahurihang 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 +608,8 @@ Tabi maglaog giraray matapos mong maresibe ini.',
 'blocked-mailpassword' => 'An saimong IP address pinagkubkob na magliwat, asin kaya dae tinutugutan na gumamit kan pambawi nin sekretong panlaog na punksyon tanganing makalikay sa abuso.',
 'eauthentsent' => 'Sarong e-koreong pankumpirmasyon an ipinadara sa nominadong e-koreong address.
 Bago an ibang e-koreo ipinadara sa panindog, ika igwang pagsunudong na mga instruksyon na yaon sa e-koreo, tanganing kumpirmaron na an panindog tunay talagang saimo.',
-'throttled-mailpassword' => 'Sarong pagiromdom kan sekretong panlaog an ipinadara na, sa laog nin {{PLURAL:$1|hour|$1 hours}}.
-Tangarig malikayan an abuso, saro sanang pagiromdom kan sekretong panlaog an ipinapadara sa lambang {{PLURAL:$1|hour|$1 hours}}.',
+'throttled-mailpassword' => 'Sarong e-surat sa pagliliwat kan sekretong panlaog an ipinadara na, sa laog nin {{PLURAL:$1|hour|$1 hours}}.
+Tangarig malikayan an abuso, saro sanang e-surat sa pagliliwat kan sekretong panlaog an ipinapadara sa lambang {{PLURAL:$1|hour|$1 hours}}.',
 'mailerror' => 'Salâ an pagpadará kan koreo: $1',
 'acct_creation_throttle_hit' => 'Mga bisita kaining wiki na ginagamit an saimong IP address nagmukna nin {{PLURAL:$1|1 panindog|$1 mga panindog}} sa nakaaging aldaw, na iyo ngani an maximum na pinagtutugot sa laog kan peryodong panahon.
 Bilang resulta, an mga bisita na naggagamit kaining IP address dae nguna makakamukna nin mga panindog.',
@@ -628,12 +655,14 @@ 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' => 'Kumpletoha ining porma tangarig liwatong an saimong sekretong panlaog.',
 'passwordreset-legend' => 'Pakibago kan sekretong panlaog',
 'passwordreset-disabled' => 'An pagbago kan sekretong panlaog pinagpundo sa wiking ini.',
+'passwordreset-emaildisabled' => 'E-surat na mga estima pinag-uruntok sa wiking ini.',
 'passwordreset-pretext' => '{{PLURAL:$1||Pakilaog kan saro sa mga pedaso nin datos sa ibaba}}',
 'passwordreset-username' => 'Paragamit-ngaran:',
 'passwordreset-domain' => 'Kasakupan:',
@@ -641,12 +670,12 @@ Matriumpo mo nang nailaog an sekretong panlaog o nakua an bàgong temporaryong s
 '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 +686,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 +863,8 @@ Pigpropromesa mo man samuyà na ika an kagsurat kaini, o kinopya mo ini sa domin
 Pigpapangakò mo man samuyà na ika an nagsurat kaini, o pigkopya mo ini sa dominiong panpubliko o sarong parehong libreng rekurso (hilingon an $1 para sa mga detalye). '''DAI TABÌ MAGSUMITIR NIN MGA GIBONG IPINAPANGALAD NA KOPYAHON NIN MAYONG PERMISO!'''",
 'longpageerror' => "'''Ay Sala: An teksto na saimong pinagsumite {{PLURAL:$1|sarong kilobyte|$1 kilobytes}} an laba, mas halaba kesa maksimum na {{PLURAL:$2|sarong kilobyte|$2 kilobytes}}.'''
 Ini dae tabi maitatagama.",
-'readonlywarning' => "'''Patanid tabi: An datos-sarayan nakakandado para sa maintenance, kay ika dae makakapagtagama kan saimong mga pinagriliwat sa ngunyan.'''
-Ika mapuwedeng maikopya an teksto pasiring sa sarong sagunson kan teksto asin para itagama ini sa huri.
+'readonlywarning' => "'''Patanid tabi: An datos-sarayan nakakandado para sa maintenance, kaya ika dae makakapagtagama kan saimong mga pinagriliwat sa ngunyan.'''
+Ika mapuwedeng makakopya asin idukot an saimong teksto pasiring sa sarong sagunson kan teksto asin itagama ini sa bandang huri.
 
 An administrador na iyo an nagkandado kaini naghayag kaining kapaliwanagan: $1",
 'protectedpagewarning' => "'''Patanid tabi: Ining pahina pinagprotektaran tanganing an mga paragamit sana na igwang pribilihiyo bilang administrador an makakapagliwat kaini.'''
@@ -879,6 +908,7 @@ Igwa na kaini.',
 'content-failed-to-parse' => 'Nagpalya sa paglunhay an $2 na laman para sa $1 na modelo: $3',
 'invalid-content-data' => 'Imbalidong datos nin laman',
 'content-not-allowed-here' => '"$1" na laman dae pinagtutugutan sa pahina [[$2]]',
+'editwarning-warning' => 'Sa pagbaya kaining pahina magkakausa saimo na mawara an anuman na mga kaliwatan na saimong ginibo. Kun ika maglaog, mapuwede mong untukon ining patanid sa "Pagliliwat" na seksyon kan saimong mga kamuyahan.',
 
 # Content models
 'content-model-wikitext' => 'wiki-teksto',
@@ -1144,7 +1174,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 +1194,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 +1339,7 @@ An saimong e-surat na adres dae ipagbuyagyag kunsoarin na an ibang paragamit mak
 'userrights-notallowed' => 'An saimong panindog mayo tabi nin permiso na magdagdag o maghale nin karapatan kan mga paragamit.',
 'userrights-changeable-col' => 'Mga grupo na mapuwede mong baguhon',
 'userrights-unchangeable-col' => 'Mga grupo na dae mo mapuwedeng baguhon',
+'userrights-conflict' => 'Kumplikto sa katanosan nin paragamit! Pakigibo giraray kan saimong mga kaliwatan.',
 
 # Groups
 'group' => 'Grupo:',
@@ -1719,7 +1742,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 +1896,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 +2068,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 +2133,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.',
@@ -2540,6 +2568,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 +2596,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.",
@@ -2897,6 +2927,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 +2957,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 +3034,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:
 
@@ -3631,12 +3674,16 @@ 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.',
+'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 +3710,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 +3774,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 +3802,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 +3870,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 +3891,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..760bfa1 100644 (file)
@@ -119,8 +119,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Паказваць колькасць назіральнікаў',
 'tog-oldsig' => 'Існуючы подпіс:',
 'tog-fancysig' => 'Апрацоўваць подпіс як вікі-тэкст (без аўтаматычнай спасылкі)',
-'tog-externaleditor' => "Карыстацца вонкавай праграмай для праўкі (edit); рэкамендуецца толькі для спецыялістаў, бо патрабуе адмысловых настаўленняў на камп'ютары; [//www.mediawiki.org/wiki/Manual:External_editors гл. падрабязна.]",
-'tog-externaldiff' => "Карыстацца вонкавай праграмай для параўнання (diff); рэкамендуецца толькі для спецыялістаў, бо патрабуе адмысловых настаўленняў на камп'ютары; [//www.mediawiki.org/wiki/Manual:External_editors гл. падрабязна.]",
 'tog-showjumplinks' => 'Дазволіць дапаможныя спасылкі "jump to"',
 'tog-uselivepreview' => 'Жывы перадпаказ (Яваскрыпт, эксперыментальн.)',
 'tog-forceeditsummary' => 'Папярэджваць пра пустое поле тлумачэння праўкі',
@@ -134,6 +132,7 @@ $messages = array(
 'tog-diffonly' => 'Не паказваць рэшты старонкі пад розніцай',
 'tog-showhiddencats' => 'Паказаць схаваныя катэгорыі',
 'tog-norollbackdiff' => 'Не паказваць розніцу ў выніку адкату',
+'tog-useeditwarning' => 'Папярэдзіць мяне, калі я пакідаю старонку з незахаванымі праўкамі',
 
 'underline-always' => 'Заўсёды',
 'underline-never' => 'Ніколі',
@@ -815,6 +814,8 @@ $2
 'edit-no-change' => 'Вашая праўка была праігнараваная, таму што не мяняўся тэкст.',
 'edit-already-exists' => 'Не ўдалося стварыць новую старонку.
 Такая ўжо існуе.',
+'editwarning-warning' => 'Выхад з гэтай старонкі прывядзе да страты правак, якія вы зрабілі. 
+Калі Вы зарэгістраваныя ў сістэме, Вы можаце адключыць гэта папярэджанне ў закладцы "Праца" Вашых настаўленняў.',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "Увага: На старонцы занадта шмат працаёмістых зваротаў да парсера.
@@ -1075,15 +1076,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' => 'Настáўленні',
@@ -1600,7 +1592,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>
@@ -1901,15 +1892,6 @@ $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' => 'Гэты пералік вызначаных у гэтай вікі груп удзельнікаў, разам з прыпісанымі ім дазволамі.
@@ -2717,13 +2699,8 @@ $1',
 'pageinfo-authors' => 'Колькасць розных аўтараў',
 
 # Skin names
-'skinname-standard' => 'Класіка',
-'skinname-nostalgia' => 'Настальгія',
 'skinname-cologneblue' => 'Сіні Кёльн',
 'skinname-monobook' => 'Манабук',
-'skinname-myskin' => 'Майскін',
-'skinname-chick' => 'Чык',
-'skinname-simple' => 'Проста',
 'skinname-modern' => 'Сучаснасць',
 
 # Patrolling
index cd930b1..eafbba9 100644 (file)
@@ -673,9 +673,20 @@ $2',
 'welcomecreation-msg' => 'Ваш рахунак быў створаны.
 Не забудзьцеся зьмяніць Вашыя [[Special:Preferences|налады ў {{GRAMMAR:месны|{{SITENAME}}}}]].',
 'yourname' => 'Імя ўдзельніка:',
+'userlogin-yourname' => 'Імя ўдзельніка',
+'userlogin-yourname-ph' => 'Увядзіце вашае імя ўдзельніка',
+'createacct-helpusername-url' => '{{ns:Project}}:Правілы_імёнаў_удзельнікаў',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(дапамажыце выбраць)]]',
 '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 +699,39 @@ $2',
 'logout' => 'Выйсьці',
 'userlogout' => 'Выйсьці',
 'notloggedin' => 'Вы не ўвайшлі ў сыстэму',
+'userlogin-noaccount' => 'Ня маеце рахунку?',
+'userlogin-joinproject' => 'Далучайцеся да {{GRAMMAR:родны|{{SITENAME}}}}',
 'nologin' => 'Ня маеце рахунку? $1.',
 'nologinlink' => 'Стварыце рахунак',
 'createaccount' => 'Стварэньне рахунку',
 'gotaccount' => 'Ужо маеце рахунак? $1.',
 'gotaccountlink' => 'Увайдзіце',
 'userlogin-resetlink' => 'Забыліся на зьвесткі для ўваходу?',
+'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-captcha-help-url' => '{{ns:Project}}:Запыты рахункаў',
+'createacct-imgcaptcha-help' => 'Ня бачыце рысунак? [[{{MediaWiki:createacct-captcha-help-url}}|Запытайце рахунак]]',
+'createacct-imgcaptcha-ph' => 'Увядзіце тэкст, што бачыце вышэй',
+'createacct-submit' => 'Стварыць рахунак',
+'createacct-benefit-heading' => '{{SITENAME}} створаная людзьмі, такімі як вы.',
+'createacct-benefit-body1' => 'правак',
+'createacct-benefit-body2' => 'старонак',
+'createacct-benefit-body3' => 'удзельнікаў за апошні час',
 'badretype' => 'Уведзеныя Вамі паролі не супадаюць.',
 'userexists' => 'Уведзенае Вамі імя ўдзельніка ўжо выкарыстоўваецца кімсьці іншым. 
 Калі ласка, выберыце іншае імя.',
 'loginerror' => 'Памылка ўваходу',
+'createacct-error' => 'Памылка стварэньня рахунку',
 'createaccounterror' => 'Немагчыма стварыць рахунак: $1',
 'nocookiesnew' => 'Рахунак быў створаны, але ў сыстэму Вы не ўвайшлі.
 {{SITENAME}} выкарыстоўвае cookie для ўваходу ў сыстэму.
@@ -785,6 +817,7 @@ $2',
 'resetpass-wrong-oldpass' => 'Няслушны часовы альбо цяперашні пароль.
 Магчыма Вы ўжо пасьпяхова зьмянілі Ваш пароль альбо запыталі новы часовы пароль.',
 'resetpass-temp-password' => 'Часовы пароль:',
+'resetpass-abort-generic' => 'Зьмяненьне паролю было скасаванае пашырэньнем.',
 
 # Special:PasswordReset
 'passwordreset' => 'Ачыстка паролю',
@@ -819,7 +852,7 @@ $2
 Часовы пароль: $2',
 'passwordreset-emailsent' => 'Ліст пра скіданьне паролю быў дасланы.',
 'passwordreset-emailsent-capture' => 'Ліст пра скіданьне паролю быў дасланы, што паказана ніжэй.',
-'passwordreset-emailerror-capture' => 'Ліст пра скіданьне паролю быў створаны і паказаны ніжэй, але не ўдалося адправіць яго карыстальніку: $1',
+'passwordreset-emailerror-capture' => 'Ліст пра скіданьне паролю быў створаны і паказаны ніжэй, але не ўдалося адправіць яго {{GENDER:$2|ўдзельніку|ўдзельніцы}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Зьмяніць адрас электроннай пошты',
@@ -2188,6 +2221,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}}}}, разам зь іх правамі.
@@ -3149,11 +3191,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' => 'Фармат наступны:
 
@@ -3786,12 +3842,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' => 'Гэтая спэцыяльная старонка вяртае поўны шлях да файла.
-Выявы паказаныя ў поўным выглядзе, астатнія тыпы файлаў адкрываюцца прыпісанымі да іх праграмамі.',
+'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 +3944,7 @@ MediaWiki распаўсюджваецца з надзеяй, што будзе
 'htmlform-selectorother-other' => 'Іншае',
 'htmlform-no' => 'Не',
 'htmlform-yes' => 'Так',
+'htmlform-chosen-placeholder' => 'Выберыце варыянт',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 з падтрымкай поўнатэкстнага пошуку',
index 594eafe..77b7f08 100644 (file)
@@ -15,6 +15,7 @@
  * @author Kaganer
  * @author Spiritia
  * @author Stanqo
+ * @author Termininja
  * @author Turin
  * @author Urhixidur
  * @author Vladimir Penov
@@ -266,10 +267,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 +280,7 @@ $messages = array(
 'tog-diffonly' => 'Без показване на съдържанието на страницата при преглед на разлики',
 'tog-showhiddencats' => 'Показване на скритите категории',
 'tog-norollbackdiff' => 'Пропускане на разликовата връзка след извършване на отмяна на редакции',
+'tog-useeditwarning' => 'Предупреждаване при опит за напускане на страница, отворена в режим на редактиране, без да са запазени промените',
 
 'underline-always' => 'Винаги',
 'underline-never' => 'Никога',
@@ -644,8 +642,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' => 'Домейн:',
@@ -667,8 +672,11 @@ $2',
 'gotaccount' => "Имате ли вече сметка? '''$1'''.",
 'gotaccountlink' => 'Влизане',
 'userlogin-resetlink' => 'Забравени данни за влизане в системата?',
+'createacct-emailrequired' => 'Електронна поща',
 'createaccountmail' => 'Използване на временна парола, която се изпраща по електронната поща, посочена по-долу',
 'createaccountreason' => 'Причина:',
+'createacct-reason' => 'Причина',
+'createacct-imgcaptcha-ph' => 'Въведете текста, който виждате по-горе',
 'badretype' => 'Въведените пароли не съвпадат.',
 'userexists' => 'Въведеното потребителско име вече се използва.
 Изберете друго име.',
@@ -997,6 +1005,8 @@ $2
 'invalid-content-data' => 'Невалидни данни за съдържание',
 'content-not-allowed-here' => '
 На страницата [[$2]] не е позволено използването на $1',
+'editwarning-warning' => 'Ако излезете от тази страница, може да загубите всички незапазени промени, които сте направили. 
+Ако сте влезли в системата, можете да изключите това предупреждение през меню "Редактиране" във вашите лични настройки.',
 
 # Content models
 'content-model-wikitext' => 'уикитекст',
@@ -2072,6 +2082,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}}|тук]].',
@@ -3543,13 +3562,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 aa27579..37395df 100644 (file)
@@ -484,9 +484,15 @@ $2',
 'welcomecreation-msg' => 'আপনার অ্যাকাউন্ট তৈরী হয়েছে।
 আপনার [[Special:Preferences|{{SITENAME}} পছন্দসমূহ]]  পরিবর্তন করে নিতে ভুলবেন না।',
 'yourname' => 'ব্যবহারকারী নাম:',
+'userlogin-yourname' => 'ব্যবহারকারী নাম',
+'userlogin-yourname-ph' => 'আপনার ব্যবহাকারী নাম প্রবেশ করান',
 'yourpassword' => 'শব্দচাবি:',
+'userlogin-yourpassword' => 'শব্দচাবি (Password)',
+'userlogin-yourpassword-ph' => 'আপনার শব্দচাবি (পাসওয়ার্ড) লিখুন',
 'yourpasswordagain' => 'শব্দচাবিটি (password) আবার লিখুন',
 'remembermypassword' => 'একাধিক সেশনের জন্য শব্দচাবি মনে রাখা হোক (সর্বোচ্চ $1 {{PLURAL:$1|দিনের|দিনের}} জন্য)',
+'userlogin-remembermypassword' => 'আমাকে মনে রাখো',
+'userlogin-signwithsecure' => 'নিরাপদ সার্ভারের মাধ্যমে লগইন করুন',
 'securelogin-stick-https' => 'লগইনের পর এইচটিটিপিএস-এর সাথে সংযোগকৃত থাকুন',
 'yourdomainname' => 'আপনার ডোমেইন',
 'password-change-forbidden' => 'আপনি এই উইকিতে পাসওয়ার্ড পরিবর্তন করতে পারবেন না।',
@@ -499,12 +505,16 @@ $2',
 'logout' => 'প্রস্থান করুন',
 'userlogout' => 'প্রস্থান',
 'notloggedin' => 'আপনি সংযুক্ত নন',
+'userlogin-noaccount' => 'কোনও অ্যাকাউন্ট নেই?',
+'userlogin-joinproject' => '{{SITENAME}}-এ অংশগ্রহন করুন',
 'nologin' => "আপনার কি উইকিপিডিয়াতে অ্যাকাউন্ট নেই? তাহলে '''$1'''।",
 'nologinlink' => 'অ্যাকাউন্ট তৈরি করুন',
 'createaccount' => 'নতুন অ্যাকাউন্ট খুলুন',
 'gotaccount' => "আপনার কি ইতিমধ্যে একটি অ্যাকাউন্ট তৈরি করা আছে? '''$1''' করুন।",
 'gotaccountlink' => 'প্রবেশ',
 'userlogin-resetlink' => 'আপনার লগইনের বিস্তারিত তথ্যাদি ভুলে গেছেন?',
+'helplogin-url' => 'Help:প্রবেশ',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|লগইন সংক্রান্ত সাহায্য]]',
 'createaccountmail' => 'একটি র‌্যান্ডম পাসওয়ার্ড নির্বাচন করুন এবং নিচের নির্ধারিত ইমেইল ঠিকানায় পাঠিয়ে দিন',
 'createaccountreason' => 'কারণ:',
 'badretype' => "আপনার প্রবেশ করানো শব্দচাবি'টি মিলছেনা।",
@@ -595,6 +605,7 @@ $2',
 'passwordreset-text' => 'আপনার শব্দচাবি বদলের জন্য নিচের ফর্মটি পূরণ করুন।',
 'passwordreset-legend' => 'শব্দচাবি রিসেট',
 'passwordreset-disabled' => 'এই উইকিতে শব্দচাবি রিসেটের সুবিধা নিষ্ক্রিয় রয়েছে।',
+'passwordreset-emaildisabled' => 'এই উইকিতে ইমেইল অপশনটি বন্ধ করা হয়েছে।',
 'passwordreset-pretext' => '{{PLURAL:$1||নিচে উল্লেখিত ডেটাগুলোর কোনো একটি প্রবেশ করান}}',
 'passwordreset-username' => 'ব্যবহারকারী নাম:',
 'passwordreset-domain' => 'ডোমেইন:',
@@ -625,7 +636,7 @@ $2
 অস্থায়ী শব্দচাবি: $2',
 'passwordreset-emailsent' => 'শব্দচাবি বদলের একটি ই-মেইল পাঠানো হয়েছে।',
 'passwordreset-emailsent-capture' => 'স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল করা হয়েছে, যা নিচে দেখানো হচ্ছে।',
-'passwordreset-emailerror-capture' => 'স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল তৈরী করা হয়েছিল, যা নিচে দেখানো হচ্ছে, তবে $1 ব্যবহারকারীকে এটি পাঠানো যায়নি!',
+'passwordreset-emailerror-capture' => 'স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল তৈরী করা হয়েছিল, যা নিচে দেখানো হচ্ছে, তবে $1 {{GENDER:$2|ব্যবহারকারীকে}} এটি পাঠানো যায়নি!',
 
 # Special:ChangeEmail
 'changeemail' => 'ই-মেইল ঠিকানা পরিবর্তন',
@@ -1118,6 +1129,7 @@ $1",
 'powersearch-togglenone' => 'কিছু নয়',
 'search-external' => 'বহিঃস্থ অনুসন্ধান',
 'searchdisabled' => '{{SITENAME}} অনুসন্ধান এখন নিষ্ক্রিয় আছে। আপনি গুগলের মাধ্যমে অনুসন্ধান চালাতে পারেন। লক্ষ্য করুন যে {{SITENAME}}-এর বিষয়বস্তুর উপর গুগলের ইন্ডেক্সগুলি হালনাগাদ না-ও করা থাকতে পারে।',
+'search-error' => 'অনুসন্ধানের সময় একটি ত্রুটি হয়েছে: $1',
 
 # Preferences page
 'preferences' => 'আমার পছন্দ',
@@ -1980,6 +1992,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|দিনে|$3 দিনে}} সর্বমোট {{PLURAL:$1|কর্মকাণ্ডের}} সংখ্যা $1',
+'activeusers-from' => 'ব্যবহারকারী দেখাও যাদের নাম এই অক্ষর দিয়ে শুরু:',
+'activeusers-hidebots' => 'বট লুকাও',
+'activeusers-hidesysops' => 'প্রশাসক লুকাও',
+'activeusers-noresult' => 'কোনো ব্যবহারকারী পাওয়া যায়নি।',
+
 # Special:ListGroupRights
 'listgrouprights' => 'দলগত ব্যবহারকারী অধিকার',
 'listgrouprights-summary' => 'এই উইকির ব্যবহারকারীদের একটি গ্রুপগুলোর তালিকা দেখানো হচ্ছে, সাথে গ্রুপের কার্যপরিধিও উল্লেখ করা হয়েছে।
@@ -2506,6 +2527,17 @@ $1',
 
 '''সতর্কীকরণ!'''
 কোন জনপ্রিয় পাতার ক্ষেত্রে এই পরিবর্তনটি খুবই আকস্মিক হতে পারে; অগ্রসর হবার আগে এই কাজটির ফলাফল কী হতে পারে, সে ব্যাপারে অনুগ্রহ করে নিশ্চিত হোন।",
+'movepagetext-noredirectfixer' => "নিচের ফর্মটি ব্যবহার করে একটি পাতার শিরোনাম পরিবর্তন করা যাবে, এবং সেই সাথে নতুন শিরোনামে এর সমগ্র ইতিহাস স্থানান্তর করা যাবে।
+পুরনো শিরোনামটি নতুন শিরোনামটির প্রতি একটি পুনর্নির্দেশনা ধারণ করবে।
+[[Special:DoubleRedirects|দ্বি-পুনর্নির্দেশনা]] বা [[Special:BrokenRedirects|অচল পুনর্নির্দেশনাগুলি]] পরীক্ষা করে দেখতে ভুলবেন না।
+সংযোগগুলি যাতে তাদের লক্ষ্যে পৌঁছায়, তা নিশ্চিত করার দায়িত্ব আপনার।
+
+লক্ষ্য করুন যে যদি নতুন শিরোনামে ইতিমধ্যেই একটি পাতা থেকে থাকে, তবে উৎস পাতাটি সেই শিরোনামে স্থানান্তর করা হবে '''না''', যদি না নতুন শিরোনামের পাতাটি খালি থাকে বা একটি পুননির্দেশনা হয় এবং এর কোন অতীত সম্পাদনা ইতিহাস না থাকে। 
+অর্থাৎ আপনি ভুল করে নাম পরিবর্তন করলে সহজেই পুরনো নামে ফেরত যেতে পারবেন, কিন্তু ইতিমধ্যে বিদ্যমান কোন পাতার উপরে লিখতে পারবেন না।
+
+'''সতর্কীকরণ!'''
+কোন জনপ্রিয় পাতার ক্ষেত্রে এই পরিবর্তনটি খুবই আকস্মিক হতে পারে;
+অগ্রসর হবার আগে এই কাজটির ফলাফল কী হতে পারে, সে ব্যাপারে অনুগ্রহ করে নিশ্চিত হোন।",
 'movepagetalktext' => "পাতাটির সাথে সাথে সংশ্লিষ্ট আলোচনা পাতাটিও স্বয়ংক্রিয়ভাবে সরানো হবে '''যদি না:'''
 *খালি নয় এমন একটি আলাপ পাতা নতুন শিরোনামটির অধীনে ইতিমধ্যেই বিদ্যমান থাকে, অথবা
 *আপনি নিচের বাক্সটি থেকে টিক সরিয়ে নিতে পারেন।
@@ -3480,13 +3512,6 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'version-entrypoints-header-entrypoint' => 'শুরু',
 'version-entrypoints-header-url' => 'ইউআরএল',
 
-# Special:FilePath
-'filepath' => 'ফাইলের পাথ',
-'filepath-page' => 'ফাইল:',
-'filepath-submit' => 'চলো',
-'filepath-summary' => 'এই বিশেষ পাতায় ফাইলের পূর্ণাঙ্গ পাথ দেখা যাবে।
-চিত্রগুলো পূর্ণ রেজ্যুলেশনে প্রদর্শিত হবে, অন্যান্য ধরনের ফাইলগুলো তার নির্ধারিত প্রোগ্রামের মাধ্যমে ওপেন হবে।',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ডুপ্লিকেট ফাইলের জন্য অনুসন্ধান',
 'fileduplicatesearch-summary' => 'হ্যাশ ভ্যালুর ওর ভিত্তি করে একই ছবিগুলো খুঁজুন।',
@@ -3574,6 +3599,8 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'htmlform-submit' => 'জমা দাও',
 'htmlform-reset' => 'পরিবর্তন বাতিল',
 'htmlform-selectorother-other' => 'অন্য',
+'htmlform-no' => 'না',
+'htmlform-yes' => 'হ্যাঁ',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 সহ পূর্ণ টেক্সট সার্চ সমর্থন',
@@ -3664,7 +3691,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 df3b608..2b2fbd0 100644 (file)
@@ -589,9 +589,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 +610,16 @@ Na zisoñjit ket resisaat ho [[Special:Preferences|penndibaboù evit {{SITENAME}
 'logout' => 'Digevreañ',
 'userlogout' => 'Digevreañ',
 'notloggedin' => 'Digevreet',
+'userlogin-noaccount' => "Kont ebet ganeoc'h c'hoazh ?",
+'userlogin-joinproject' => 'Kemer perzh e {{SITENAME}}',
 'nologin' => "N'hoc'h eus kont ebet ? '''$1'''.",
 'nologinlink' => 'Krouiñ ur gont',
 'createaccount' => 'Krouiñ ur gont nevez',
 'gotaccount' => "Ur gont zo ganeoc'h dija ? '''$1'''.",
 'gotaccountlink' => 'Kevreañ',
 'userlogin-resetlink' => "Ha disoñjet eo bet ho titouroù kevreañ ganeoc'h ?",
+'helplogin-url' => 'Skoazell : Kevreañ',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Skoazell evit kevreañ]]',
 'createaccountmail' => 'Dre bostel',
 'createaccountreason' => 'Abeg :',
 'badretype' => 'Ne glot ket ar gerioù-tremen an eil gant egile.',
@@ -651,8 +661,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.",
@@ -2099,6 +2109,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.
@@ -2449,8 +2468,8 @@ Dindan emañ merket enmont diwezhañ marilh ar stankadennoù, d'ho kelaouiñ :",
 'isredirect' => 'pajenn adkas',
 'istemplate' => 'enframmet',
 'isimage' => 'Liamm war-zu ar restr',
-'whatlinkshere-prev' => '{{PLURAL:$1|kent|kent $1}}',
-'whatlinkshere-next' => "{{PLURAL:$1|war-lerc'h|war-lerc'h $1}}",
+'whatlinkshere-prev' => '{{PLURAL:$1|kent|$1 kent}}',
+'whatlinkshere-next' => "{{PLURAL:$1|war-lerc'h|$1 war-lerc'h}}",
 'whatlinkshere-links' => '← liammoù',
 'whatlinkshere-hideredirs' => '$1 adkas',
 'whatlinkshere-hidetrans' => '$1 treuzkluzadur',
@@ -3693,13 +3712,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 +3801,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 6f4fda0..0df5336 100644 (file)
@@ -17,6 +17,7 @@
  * @author Gemmaa
  * @author Grondin
  * @author Iradigalesc
+ * @author Jmarchn
  * @author Jordi Roqué
  * @author Juanpabl
  * @author Kaganer
@@ -329,7 +330,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',
@@ -609,10 +610,17 @@ 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' => "Nom d'usuari",
+'userlogin-yourname-ph' => "Introduïu el vostre nom d'usuari",
+'createacct-helpusername-url' => "{{ns:Project}}:Nom d'usuari",
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(ajuda per escollir-ne un)]]',
 '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',
@@ -636,12 +644,29 @@ 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?",
+'helplogin-url' => 'Help:Registrar-se',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajuda per registrar-se]]',
+'createacct-join' => 'Introduïu les dades a continuació.',
+'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 electrònic especificat a continuació",
+'createacct-realname' => 'Nom real (opcional)',
 'createaccountreason' => 'Motiu:',
+'createacct-reason' => 'Motiu',
+'createacct-captcha' => 'Control de seguretat',
+'createacct-captcha-help-url' => '{{ns:Project}}:Sol·licitar un compte',
+'createacct-imgcaptcha-help' => 'No podeu veure la imatge? [[{{MediaWiki:createacct-captcha-help-url}}|Sol·liciteu un compte]]',
+'createacct-imgcaptcha-ph' => 'Introduïu el text que apareix a dalt',
+'createacct-benefit-heading' => '{{SITENAME}} és feta per gent com tu.',
+'createacct-benefit-body1' => 'edicions',
+'createacct-benefit-body2' => 'pàgines',
+'createacct-benefit-body3' => 'col·laboradors aquest mes',
 '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.',
@@ -729,6 +754,7 @@ Deveu haver canviat la vostra contrasenya o demanat una nova contrasenya tempora
 '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-emaildisabled' => 'Les opcions de correu electrònic no estan habilitades en aquest wiki.',
 'passwordreset-pretext' => '{{PLURAL:$1||Introduïu un dels elements de dades següents}}',
 'passwordreset-username' => "Nom d'usuari:",
 'passwordreset-domain' => 'Domini',
@@ -752,7 +778,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 +866,7 @@ El número d'identificació de la vostra adreça IP és $3, i l'ID del bloqueig
 Potser ha estat moguda o eliminada mentre estàveu veient la pàgina.',
 'loginreqtitle' => 'Cal que inicieu una sessió',
 'loginreqlink' => 'inicia una sessió',
-'loginreqpagetext' => 'Heu de ser $1 per a visualitzar altres pàgines.',
+'loginreqpagetext' => "Cal que seguiu l'enllaç «$1» per a visualitzar altres pàgines.",
 'accmailtitle' => "S'ha enviat una contrasenya.",
 'accmailtext' => "S'ha enviat una contrasenya aleatòria a $2 per a l'{{GENDER:$1|usuari|usuària}} [[User talk:$1|$1]].
 
@@ -1249,6 +1275,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 +1548,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}}',
@@ -1794,7 +1821,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 +2131,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|modificació|modificacions}} 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 +2160,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',
@@ -2457,7 +2491,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 +2632,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 +2662,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.
@@ -3066,11 +3101,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:
 
@@ -3695,13 +3737,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.",
@@ -3805,7 +3840,7 @@ Les imatges es mostren en plena resolució; altres tipus de fitxer s'inicien dir
 '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-delete' => '$1 {{GENDER:$2|ha suprimit}} la pàgina $3',
 'logentry-suppress-event' => "$1 secretament ha canviat la visibilitat {{PLURAL:$5|d'un esdeveniment al registre|de $5 esdeveniments al registre}} de $3: $4",
 'logentry-suppress-revision' => "$1 secretament ha canviat la visibilitat {{PLURAL:$5|d'una revisió|de $5 revisions}} a la pàgina $3: $4",
 'logentry-suppress-event-legacy' => "$1 secretament ha canviat la visibilitat d'esdeveniments al registre de $3",
index 452ada1..be367af 100644 (file)
@@ -12,6 +12,7 @@
  * @author Girdi
  * @author Mega programmer
  * @author Sasan700
+ * @author Умар
  */
 
 $fallback = 'ru';
@@ -217,7 +218,7 @@ $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)',
@@ -238,8 +239,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Гайта декъашхойн терахь, агlо латийна болу шай тергаме могlам юкъа',
 'tog-oldsig' => 'Хьалххьажар долучу куьгтаlорна:',
 'tog-fancysig' => 'Шен вики-къастаман куьгтаlдар (ша шех хьажориг йоцуш)',
-'tog-externaleditor' => 'Лелайан арахьара рéдаккхар (гlулкхдириг леррина нисйина хила йеза, [//www.mediawiki.org/wiki/Manual:External_editors кхин дlа.])',
-'tog-externaldiff' => 'Лелабан арахьара диллагlарам башхо тарйо гlирс (гlулкхдириг леррина нисйина хила йеза, [//www.mediawiki.org/wiki/Manual:External_editors кхин дlа.])',
 'tog-showjumplinks' => 'Латайе гlодарна хьажоригаш «дехьа вала оцу»',
 'tog-uselivepreview' => 'Лелайа чехка хьалха хьажа (JavaScript, муха ю хьажарна)',
 'tog-forceeditsummary' => 'Дага даийта, нагахь нисйарх лаьцна чохь язъйина язахь',
@@ -281,60 +280,60 @@ $messages = array(
 'thu' => 'Еа',
 'fri' => 'Пle',
 'sat' => 'Шот',
-'january' => 'нажи бутт',
-'february' => 'мархи бутт',
-'march' => 'биÑ\8dкаÑ\80г Ð±Ñ\83Ñ\82т',
-'april' => 'тушоли бутт',
-'may_long' => 'сели бутт',
-'june' => 'мангал Ð±Ñ\83Ñ\82Ñ\82',
-'july' => 'мÑ\8fÑ\82Ñ\81ел Ð±Ñ\83Ñ\82Ñ\82',
-'august' => 'эгиш бутт',
-'september' => 'Ñ\82ав Ð±Ñ\83Ñ\82Ñ\82',
-'october' => 'аÑ\80даÑ\80 Ð±Ñ\83Ñ\82Ñ\82',
-'november' => 'эрх бутт',
-'december' => 'огой Ð±Ñ\83Ñ\82Ñ\82',
-'january-gen' => 'нажи бутт',
-'february-gen' => 'мархи бутт',
-'march-gen' => 'биÑ\8dкаÑ\80г Ð±Ñ\83Ñ\82т',
-'april-gen' => 'тушоли бутт',
-'may-gen' => 'сели бутт',
-'june-gen' => 'мангал Ð±Ñ\83Ñ\82Ñ\82',
-'july-gen' => 'мÑ\8fÑ\82Ñ\81ел Ð±Ñ\83Ñ\82Ñ\82',
-'august-gen' => 'эгиш бутт',
-'september-gen' => 'Ñ\82ав Ð±Ñ\83Ñ\82Ñ\82',
-'october-gen' => 'аÑ\80даÑ\80 Ð±Ñ\83Ñ\82Ñ\82',
-'november-gen' => 'эрх бутт',
-'december-gen' => 'огой Ð±Ñ\83Ñ\82Ñ\82',
-'jan' => 'нажи бутт',
-'feb' => 'мархи бутт',
-'mar' => 'биÑ\8dкаÑ\80г Ð±Ñ\83Ñ\82т',
-'apr' => 'тушоли бутт',
-'may' => 'сели бутт',
-'jun' => 'мангал Ð±Ñ\83Ñ\82Ñ\82',
-'jul' => 'мÑ\8fÑ\82Ñ\81ел Ð±Ñ\83Ñ\82Ñ\82',
-'aug' => 'эгиш бутт',
-'sep' => 'Ñ\82ав Ð±Ñ\83Ñ\82Ñ\82',
-'oct' => 'аÑ\80даÑ\80 Ð±Ñ\83Ñ\82Ñ\82',
-'nov' => 'эрх бутт',
-'dec' => 'огой Ð±Ñ\83Ñ\82Ñ\82',
+'january' => 'январь',
+'february' => 'февраль',
+'march' => 'маÑ\80т',
+'april' => 'апрель',
+'may_long' => 'май',
+'june' => 'иÑ\8eнÑ\8c',
+'july' => 'иÑ\8eлÑ\8c',
+'august' => 'август',
+'september' => 'Ñ\81енÑ\82Ñ\8fбÑ\80Ñ\8c',
+'october' => 'окÑ\82Ñ\8fбÑ\80Ñ\8c',
+'november' => 'ноябрь',
+'december' => 'декабÑ\80Ñ\8c',
+'january-gen' => 'январь',
+'february-gen' => 'февраль',
+'march-gen' => 'маÑ\80т',
+'april-gen' => 'апрель',
+'may-gen' => 'май',
+'june-gen' => 'иÑ\8eнÑ\8c',
+'july-gen' => 'иÑ\8eлÑ\8c',
+'august-gen' => 'август',
+'september-gen' => 'Ñ\81енÑ\82Ñ\8fбÑ\80Ñ\8c',
+'october-gen' => 'окÑ\82Ñ\8fбÑ\80Ñ\8c',
+'november-gen' => 'ноябрь',
+'december-gen' => 'декабÑ\80Ñ\8c',
+'jan' => 'январь',
+'feb' => 'февраль',
+'mar' => 'маÑ\80т',
+'apr' => 'апрель',
+'may' => 'май',
+'jun' => 'иÑ\8eнÑ\8c',
+'jul' => 'иÑ\8eлÑ\8c',
+'aug' => 'август',
+'sep' => 'Ñ\81енÑ\82Ñ\8fбÑ\80Ñ\8c',
+'oct' => 'окÑ\82Ñ\8fбÑ\80Ñ\8c',
+'nov' => 'ноябрь',
+'dec' => 'декабÑ\80Ñ\8c',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|Кадегар|Кадегарш}}',
-'category_header' => 'Агlонаш оц кадегаршчохь «$1»',
-'subcategories' => 'Бухаркадегарш',
-'category-media-header' => 'Хlумнаш оцу кадегар чохь «$1»',
-'category-empty' => "''Хlара кадегар хlинца йаьсса ю.''",
-'hidden-categories' => '{{PLURAL:$1|Къайлаха кадегар|Къайлаха йолу кадегарш}}',
-'hidden-category-category' => 'Къайлаха йолу кадегарш',
-'category-subcat-count' => '{{PLURAL:$2|Хlокх кадегар чохь ю хlокхуьна бухар кадегар.|{{PLURAL:$1|Гойташ $1 бухар кадегар|Гойту $1 бухар кадегар|Гойту $1 бухар кадегар}} оцу $2.}}',
-'category-subcat-count-limited' => 'Хlокх кадегар чохь {{PLURAL:$1|$1 бухар кадегар|$1 бухар кадегарша|$1 бухар кадегарш}}.',
-'category-article-count' => '{{PLURAL:$2|Хlокх кадегар чохь яц цхьа агlо бе.|{{PLURAL:$1|Гойташ $1 агlо|Гойту $1 агlонаш|Гойту $1 агlонаш}} хlокх кадегарца кху $2.}}',
-'category-article-count-limited' => 'Хlокх кадегар чохь {{PLURAL:$1|$1 агlо|$1 агlонаш|$1 агlонаш}}.',
-'category-file-count' => '{{PLURAL:$2|Хlокх кадегар чохь цхьа хlум бе яц.|{{PLURAL:$1|Гойта $1 хlум|Гойту $1 хlума|Гойту $1 хlумнаш}} хlокх кадегарца кху $2.}}',
-'category-file-count-limited' => 'Хlокх кадегар чохь {{PLURAL:$1|$1 хlум|$1 хlума|$1 хlумнаш}}.',
+'pagecategories' => '{{PLURAL:$1|Категори|Категореш}}',
+'category_header' => 'Агlонаш оц категоречохь «$1»',
+'subcategories' => 'Бухаркатегореш',
+'category-media-header' => 'ХӀумнаш оцу категори чохь «$1»',
+'category-empty' => "''ХӀара категори хӀинца йаьсса ю.''",
+'hidden-categories' => '{{PLURAL:$1|Къайлаха категори|Къайлаха йолу категореш}}',
+'hidden-category-category' => 'Къайлаха йолу категореш',
+'category-subcat-count' => '{{PLURAL:$2|ХӀокх категори чохь ю хӀокхуьна бухар категори.|{{PLURAL:$1|Гойташ $1 бухар категори|Гойту $1 бухар категори|Гойту $1 бухар категори}} оцу $2.}}',
+'category-subcat-count-limited' => 'Хlокх категори чохь {{PLURAL:$1|$1 бухар категори|$1 бухар категореша|$1 бухар категореш}}.',
+'category-article-count' => '{{PLURAL:$2|ХӀокх категори чохь яц цхьа агӀо бе.|{{PLURAL:$1|Гойташ $1 агlо|Гойту $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 хlума|Гойту $1 хlумнаш}} хlокх категорешца кху $2.}}',
+'category-file-count-limited' => 'ХӀокх категори чохь {{PLURAL:$1|$1 файл|$1 хӀума|$1 файлаш}}.',
 'listingcontinuesabbrev' => '(кхин дlа)',
 'index-category' => 'Меттигтерахьйо агlонаш',
-'noindex-category' => 'Дlахьушйоцу агlонаш',
+'noindex-category' => 'ДӀахьушйоцу агӀонаш',
 
 'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
 
@@ -342,10 +341,10 @@ $messages = array(
 'article' => 'Яззам',
 'newwindow' => '(керлачу корехь)',
 'cancel' => 'Цаоьшу',
-'moredotdotdot' => 'Кхин дlа…',
-'mypage' => 'Долахь йолу агlо',
-'mytalk' => 'Сан дийцаре агlо',
-'anontalk' => 'Дийцаре хlара IP-долуметтиг',
+'moredotdotdot' => 'Кхин дӀа…',
+'mypage' => 'Долахь йолу агӀо',
+'mytalk' => 'Сан дийцаре агӀо',
+'anontalk' => 'Дийцаре хӀара IP-долуметтиг',
 'navigation' => 'Шавигар',
 'and' => '&#32;а',
 
@@ -369,7 +368,7 @@ $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' => 'Дийраш',
@@ -384,10 +383,10 @@ $messages = array(
 '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' => 'Хьажа',
@@ -504,13 +503,14 @@ $1',
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Яззам',
 'nstab-user' => 'Декъашхо',
+'nstab-media' => 'Медиа агӀо',
 'nstab-special' => 'Белха агlо',
 'nstab-project' => 'Кхолламех',
-'nstab-image' => 'Ð¥lÑ\83м',
+'nstab-image' => 'Файл',
 'nstab-mediawiki' => 'Хаам',
-'nstab-template' => 'Куцкеп',
+'nstab-template' => 'Кеп',
 'nstab-help' => 'Нисвохаам',
-'nstab-category' => 'Кадегар',
+'nstab-category' => 'Категори',
 
 # Main script and global functions
 'nosuchaction' => 'Ишта дийриг дац',
@@ -533,15 +533,25 @@ $1',
 'badtitle' => 'Цамегаш йолу цlе',
 'badtitletext' => 'Дехарца йолу агlонан цlе нийса яц, йаьсса ю, хила мега нийса ца хlоттийна меттаюкъар йа юкъарвики цlе. Хила мега, цlарца цамагош йолу саберг.',
 'viewsource' => 'Хьажар',
-'protectedpagetext' => 'Хlара агlо дlакъойлина йу рé цадаккхийта.',
+'protectedpagetext' => 'ХӀара агӀо дӀакъойлина йу рé цадаккхийта.',
 'viewsourcetext' => 'Хьоьга далундерг хьажар а дезахь хlокху агlон чура йоза хьаэцар:',
-'protectedinterface' => 'Хlара схьгайтарна гlирса хаамаш латтош йолу агlо йу. Гlуо лелачаьрга гал ца яккхийта, оцун хийцам ба магийна дац.',
+'protectedinterface' => 'ХӀара схьгайтарна гӀирса хаамаш латтош йолу агӀо йу. ГӀуо лелачаьрга гал ца яккхийта, оцун хийцам ба магийна дац.',
+'exception-nologin' => 'Ахьа хӀой вовзийтина вац',
 
 # Login and logout pages
+'welcomeuser' => 'Марша ДогӀийла, $1!',
 'yourname' => 'Декъашхон цlе:',
+'userlogin-yourname' => 'Декъашхон цӀе',
+'userlogin-yourname-ph' => 'Язъе декъашхон цӀе',
 'yourpassword' => 'Ишар:',
+'userlogin-yourpassword' => 'Ишар',
+'userlogin-yourpassword-ph' => 'Язъе ишар',
+'createacct-yourpassword-ph' => 'Язъе ишар',
 'yourpasswordagain' => 'Юха язъйе ишар:',
+'createacct-yourpasswordagain' => 'Бакъе ишар',
+'createacct-yourpasswordagain-ph' => 'Кхин цкъа язъе ишар',
 'remembermypassword' => 'Даглаца сан дlавазвалар хlокху гlулкхдечу гlирса тlяхь (цхьан $1 {{PLURAL:$1|ден|динахь|динахь}})',
+'userlogin-remembermypassword' => 'Дагахь латт ве со',
 'yourdomainname' => 'Хьан машан меттиг:',
 'login' => 'Вовзийта хьой гlирсан',
 'nav-login-createaccount' => 'Вовзийта хьой / дlавазло',
@@ -594,7 +604,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,7 +619,7 @@ $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' => 'Декъашхо сацийна',
 'accmailtitle' => 'Ишар дlаяхьийтина.',
@@ -635,9 +645,10 @@ $1',
 'updated' => '(Карла йаькхина)',
 'note' => "'''Билгалдаккхар:'''",
 'previewnote' => "'''Хlара хьалх хьажар ду, йоза хlинца язданза ду!'''",
-'editing' => 'Редаккхар: $1',
-'editingsection' => 'Редаккхар $1 (даакъа)',
-'editingcomment' => 'Редаккхар $1 (керла даакъа)',
+'editing' => 'Тадар: $1',
+'creating' => 'АгӀо кхоллар «$1»',
+'editingsection' => 'Тадар $1 (даакъа)',
+'editingcomment' => 'Тадар $1 (керла даакъа)',
 'editconflict' => 'Редаккхарна дойнаш: $1',
 'yourtext' => 'Хьан йоза',
 'yourdiff' => 'Башхаллаш',
@@ -653,8 +664,8 @@ $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онца:',
+'templatesused' => '{{PLURAL:$1|Кеп, лелийна|Кепаш, лелош ду}} хlокху агlон башхонца:',
+'templatesusedpreview' => '{{PLURAL:$1|Кеп, лелошдолу|Кепаш, лелошдолу}} оцу хьалх хьожучу агlонца:',
 'template-protected' => '(гlароллийца)',
 'template-semiprotected' => '(дуьззина доцуш гlаролла)',
 'hiddencategories' => 'Хlара агlо чуйогlуш ю оцу $1 {{PLURAL:$1|къайлаха кадегарчу|къайлаха кадегаршчу|къайлаха кадегаршчу}}:',
@@ -671,7 +682,7 @@ $1',
 
 # Parser/template warnings
 'parser-template-loop-warning' => 'Карийна куцкепаш юкъахь хилла шад: [[$1]]',
-'parser-template-recursion-depth-warning' => 'Дозанал хьалаваьлла кlоргенца йух йуха дина куцкеп ($1)',
+'parser-template-recursion-depth-warning' => 'Дозанал хьалаваьлла кlоргенца йух йуха дина кеп ($1)',
 
 # "Undo" feature
 'undo-success' => 'Нисйинарг а тlе цалаца мега. Дехар до, хьажа цхьатерра йуй башхо, тешна хила, баккъалла иза хийцам буйте хьуна безарг, тlакха тlе таlайе «дlайазйе агlо», хийцам хlотта ба.',
@@ -690,8 +701,8 @@ $1',
 'page_last' => 'тlаьххьара',
 'histlegend' => "Кхетор: (хlинцлера.) — йолучу башхон къастам; (хьалх.) — хьалхлерачу башхон къастам; '''ж''' — жимо бозалца болу хийцам.",
 'history-fieldset-title' => 'Хьажа исцlарерачу',
-'histfirst' => 'къена',
-'histlast' => 'Ñ\85Ñ\8cалÑ\85о',
+'histfirst' => 'ширниш',
+'histlast' => 'Ñ\85Ñ\8cалÑ\85аÑ\80ниÑ\88',
 'historyempty' => '(йаьсса)',
 
 # Revision feed
@@ -715,7 +726,7 @@ $1',
 'revertmerge' => 'Йекъа',
 
 # Diffs
-'history-title' => '$1 â\80\94 Ñ\85ийÑ\86аман Ð¸Ñ\81Ñ\82оÑ\80е',
+'history-title' => '$1 â\80\94 Ñ\85ийÑ\86аман Ð¸Ñ\81Ñ\82оÑ\80и',
 'lineno' => 'Могlа $1:',
 'compareselectedversions' => 'Хаьржиначуьна башхо муха ю хьажа',
 'showhideselectedversions' => 'Гайта/къайлайаха хаьржина башхонаш',
@@ -784,7 +795,7 @@ $1',
 'prefs-resetpass' => 'Хийца ишар',
 'prefs-rendering' => 'Арахьара хатl',
 'saveprefs' => 'lалашдан',
-'prefs-editing' => 'РедаккÑ\85ар',
+'prefs-editing' => 'Тадар',
 'searchresultshead' => 'Лаха',
 'timezonelegend' => 'Сахьатан аса:',
 'prefs-searchoptions' => 'Лахарна гlирс нисба',
@@ -839,6 +850,7 @@ $1',
 'nchanges' => '$1 {{PLURAL:$1|хийцам|хийцамаш|хийцамаш}}',
 'recentchanges' => 'Керла нисдарш',
 'recentchanges-legend' => 'Гlирс нисбарна керла нисдарш',
+'recentchanges-summary' => 'Лахахьа гайтина хронологин къепехь тӀаьхьара бина хийцамаш Википедин агӀонашкахь',
 'recentchanges-feed-description' => 'Тергам бе тlаьхьара вики хийцаман хlокху ларца.',
 'recentchanges-label-newpage' => 'Оцу нисдарца кхоллина керла агlо.',
 'recentchanges-label-minor' => 'Хlара нисдинарг къастийна жимо долушсан',
@@ -851,7 +863,7 @@ $1',
 'rcshowhidemine' => '$1 айхьа нисдинарш',
 'rclinks' => 'Гайта тlаьхьара $1 хийцамаш оцу $2 ден<br />$3',
 'diff' => 'тейп тайпнара',
-'hist' => 'иÑ\81Ñ\82оÑ\80е',
+'hist' => 'иÑ\81Ñ\82оÑ\80и',
 'hide' => 'Къайлаяккха',
 'show' => 'Гайта',
 'minoreditletter' => 'ж',
@@ -873,8 +885,8 @@ $1',
 'recentchangeslinked-to' => 'Кхечу агlор, гайта хийцамаш агlонашца, хlоттийначу агlонтlе хьажориг йолуш',
 
 # Upload
-'upload' => 'ЧÑ\83йаккÑ\85а Ñ\85\83м',
-'uploadbtn' => 'ЧÑ\83йаккÑ\85а Ñ\85\83м',
+'upload' => 'ЧÑ\83йаккÑ\85а Ñ\84айл',
+'uploadbtn' => 'ЧÑ\83йаккÑ\85а Ñ\84айл',
 'uploadlogpage' => 'Чуйахаран тéптар',
 'uploadlogpagetext' => 'Лахахьа гойтуш бу могlам тlаьххьара чуяхна хlумнаши. Ишта хьажа. [[Special:ImageList|хlумнаши могlам]] йа [[Special:NewImages|галеларе хlумнаши]].',
 'filename' => 'Хlуман цlе',
@@ -899,7 +911,7 @@ PICT # тайп тайпан
 
 # Special:ListFiles
 'listfiles_search_for' => 'Лаха хIуман цIарца:',
-'imgfile' => 'Ñ\85\83м',
+'imgfile' => 'Ñ\84айл',
 'listfiles' => 'Хlумнаши могlам',
 'listfiles_name' => 'Хlуман цlе',
 'listfiles_user' => 'Декъашхо',
@@ -907,9 +919,9 @@ PICT # тайп тайпан
 'listfiles_description' => 'Цуьнах лаьцна',
 
 # File description page
-'file-anchor-link' => ' Хlум',
-'filehist' => 'Ð¥lÑ\83ман Ð¸Ñ\81Ñ\82оÑ\80е',
-'filehist-help' => 'ТlеÑ\82аlаде Ñ\82еÑ\80аÑ\85Ñ\8c\85ан, Ð¼Ñ\83Ñ\85а Ñ\85илла Ñ\85Ñ\8cажаÑ\80на Ð¸ Ñ\85\83м.',
+'file-anchor-link' => 'Файл',
+'filehist' => 'Файлан Ð¸Ñ\81Ñ\82оÑ\80и',
+'filehist-help' => 'ТlеÑ\82аlаде Ñ\82еÑ\80аÑ\85Ñ\8c\85ан, Ð¼Ñ\83Ñ\85а Ñ\85илла Ñ\85Ñ\8cажаÑ\80на Ð¸ Ñ\84айл.',
 'filehist-deleteall' => 'дlадайá массо',
 'filehist-deleteone' => 'дlадайá',
 'filehist-current' => 'карара',
@@ -929,7 +941,7 @@ PICT # тайп тайпан
 'filerevert-submit' => 'Юхаяккха',
 
 # File deletion
-'filedelete-legend' => 'Ð\94lайайá Ð¸ Ñ\85\83м',
+'filedelete-legend' => 'Ð\94lайайá Ð¸ Ñ\84айл',
 'filedelete-submit' => 'Дlадайá',
 'filedelete-otherreason' => 'Кхин бахьан:',
 'filedelete-reason-otherlist' => 'Кхин бахьан',
@@ -981,15 +993,15 @@ 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|Ñ\85\83м|Ñ\85\83ма|Ñ\85\83мнаш}}',
+'nbytes' => '$1 {{PLURAL:$1|байт|байташ|байт}}',
+'ncategories' => '$1 {{PLURAL:$1|категори|категореш|категореш}}',
+'nmembers' => '$1 {{PLURAL:$1|Ñ\84айл|Ñ\84айлана|Ñ\84айлаш}}',
 'specialpage-empty' => 'Дехаро хlумма ца елла.',
 'lonelypages' => 'Байлахь йисина агIонаш',
-'uncategorizedpages' => 'Кадегар йоцу агIонаш',
-'uncategorizedcategories' => 'Кадегар йоцу кадегарш',
-'uncategorizedimages' => 'Кадегар йоцу хIумнаш',
-'uncategorizedtemplates' => 'Кадегар йоцу куцкепаш',
+'uncategorizedpages' => 'Категори йоцу агIонаш',
+'uncategorizedcategories' => 'Категори йоцу категореш',
+'uncategorizedimages' => 'Категори йоцу хIумнаш',
+'uncategorizedtemplates' => 'Категори йоцу кепаш',
 'unusedcategories' => 'Йаьсса кадегарш',
 'wantedcategories' => 'Оьшуш йолу кадегарш',
 'wantedpages' => 'Оьшуш йолу агIонаш',
@@ -1008,14 +1020,16 @@ PICT # тайп тайпан
 'protectedpages' => 'ГIаролла дина агIонаш',
 'protectedtitles' => 'Ца магийна йолу цIераш',
 'listusers' => 'Декъашхой могlам',
+'listusers-editsonly' => 'Цхаъ мукъане а хийцам бина декъашхой гайта',
+'listusers-creationsort' => 'Кхолларан хене хьаьжна нисъяр',
 '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уш ялахь яцахь а иза хила мега жигара лелош.',
 'pager-newer-n' => '{{PLURAL:$1|алсамо керла|алсамо керланаш|алсамо керлачарех}} $1',
-'pager-older-n' => '{{PLURAL:$1|алсамо къена|алсамо къенанаш|алсамо къеначарех}} $1',
+'pager-older-n' => '{{PLURAL:$1|алсамо шира|алсамо ширниш|алсамо ширачарех}} $1',
 
 # Book sources
 'booksources' => 'Жайнан хьосташ',
@@ -1061,6 +1075,7 @@ PICT # тайп тайпан
 
 # Special:ActiveUsers
 'activeusers' => 'Жигар декъашхой могlам',
+'activeusers-from' => 'ТӀера волавелла декъашхой гайта',
 
 # Special:ListGroupRights
 'listgrouprights' => 'Декъашхойн тобанаши бакъонаш',
@@ -1068,7 +1083,7 @@ PICT # тайп тайпан
 'listgrouprights-helppage' => 'Help:Тобан бакъонаш',
 'listgrouprights-members' => '(тобан могlам)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Декъашхочун хааман кехат',
 'defemailsubject' => 'Хаам {{grammar:genitive|{{SITENAME}}}} чура бу',
 'emailmessage' => 'Хаам:',
@@ -1101,7 +1116,7 @@ PICT # тайп тайпан
 'exbeforeblank' => 'чуьраниг дlацlанйале хьалха: «$1»',
 'exblank' => 'агlо йаьсса йара',
 'delete-legend' => 'Дlадайáр',
-'confirmdeletetext' => 'Ð¥Ñ\8cан Ð´ÐµÑ\85аÑ\80 Ð´Ñ\83 Ñ\85lаÑ\80а Ð°Ð³lо Ñ\88е Ð±Ñ\83Ñ\85Ñ\86и Ð´lабайа Ð°Ñ\8cлла (йа Ñ\81Ñ\83Ñ\80Ñ\82) Ð° Ð¼Ð°Ñ\81Ñ\81о Ñ\86Ñ\83Ñ\8cнан Ð¸Ñ\81Ñ\82оÑ\80е оцу бух чура. Дехар до, бакъде, билгала хьайна иза лаахь, кхеташ хира ву хьо тlаьхьа хир долу чун, иза деш ду ахьа бакъонца догlуш, вахьа дехкина долучу дакъанца [[{{MediaWiki:Policy-url}}]].',
+'confirmdeletetext' => 'Ð¥Ñ\8cан Ð´ÐµÑ\85аÑ\80 Ð´Ñ\83 Ñ\85lаÑ\80а Ð°Ð³lо Ñ\88е Ð±Ñ\83Ñ\85Ñ\86и Ð´lабайа Ð°Ñ\8cлла (йа Ñ\81Ñ\83Ñ\80Ñ\82) Ð° Ð¼Ð°Ñ\81Ñ\81о Ñ\86Ñ\83Ñ\8cнан Ð¸Ñ\81Ñ\82оÑ\80и оцу бух чура. Дехар до, бакъде, билгала хьайна иза лаахь, кхеташ хира ву хьо тlаьхьа хир долу чун, иза деш ду ахьа бакъонца догlуш, вахьа дехкина долучу дакъанца [[{{MediaWiki:Policy-url}}]].',
 'actioncomplete' => 'Дешдерг кхочушди',
 'deletedtext' => '«$1» дlаяккхина йара.
 Хьажа. $2 хьажарна оцу тlаьхьара дlадайаран могlаме.',
@@ -1119,6 +1134,7 @@ PICT # тайп тайпан
 'protectlogpage' => 'Гlаролли тептар',
 'protectedarticle' => 'гlаролла дина агlо «[[$1]]»',
 'modifiedarticleprotection' => 'агlонан гlаролли локхалла хийцина «[[$1]]»',
+'movedarticleprotection' => 'гӀаролла дехьадаккха тӀера «[[$2]]» цуна тӀе «[[$1]]»',
 'prot_1movedto2' => '«[[$1]]» цlе хийцина оцу «[[$2]]»',
 'protectcomment' => 'Бахьан:',
 'protectexpiry' => 'Чекхйолу:',
@@ -1157,6 +1173,7 @@ PICT # тайп тайпан
 # Namespace form on various pages
 'namespace' => 'Цlерийн ана:',
 'invert' => 'Хаьржинарг хилийта',
+'namespace_association' => 'Йихкина меттиг',
 'blanknamespace' => '(Коьрта)',
 
 # Contributions
@@ -1222,7 +1239,7 @@ PICT # тайп тайпан
 Нагахь ахьа иза цадинехь, дехар до, хьажа йуйла [[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АХЬЕДАР!'''
@@ -1259,7 +1276,7 @@ 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' => 'Латадé куцкепаш',
@@ -1329,7 +1346,7 @@ PICT # тайп тайпан
 '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о',
@@ -1364,9 +1381,6 @@ PICT # тайп тайпан
 # Spam protection
 'spamprotectiontitle' => 'Совбиларна литтар',
 
-# Skin names
-'skinname-standard' => 'Лела ма ярра',
-
 # Browsing diffs
 'previousdiff' => '← Хьалхдоьда нисдинарг',
 'nextdiff' => 'Тlяхьа догlа нисдинарг →',
@@ -1468,11 +1482,6 @@ PICT # тайп тайпан
 # Special:Version
 'version' => 'Варси MediaWiki',
 
-# Special:FilePath
-'filepath' => 'ХIуман тIе болу некъ',
-'filepath-page' => 'Хlум:',
-'filepath-submit' => 'Дехьавала',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Лаха цхьатера йолу хIумнаш',
 'fileduplicatesearch-submit' => 'Лаха',
@@ -1514,4 +1523,7 @@ PICT # тайп тайпан
 'dberr-usegoogle' => 'Цlачун хьо хьажа лаха гlонца Google.',
 'dberr-outofdate' => 'Хьуна хаалахь, цуьна йолу меттиг хила мега тишйелла черахь.',
 
+# New logging system
+'logentry-move-move' => '$1 {{GENDER:$2|цӀе хийцина|цӀе хийцина}} $3 оцу $4',
+
 );
index 7833a2c..befb913 100644 (file)
@@ -905,8 +905,8 @@ $2
 لەوە دەچی سڕدرابێتەوه.‌',
 'edit-conflict' => 'کێشەی دەستکاری.',
 'edit-no-change' => 'دەستکاریەکەت بەرچاو نەخرا، لەبەر ئەوەی هیچ گۆڕانکارییەکت لەسەر دەقەکە نەکردووە.',
-'edit-already-exists' => 'توانای درووست‌کردنی لاپەڕەی نوێ نیە.<br />
-ئÛ\95Ù\88Û\95 Ù\84Û\95Ù¾Û\8eØ´â\80\8cدا Ù\87Û\95بÙ\88Ù\88.',
+'edit-already-exists' => 'تواناییی دروستکردنی پەڕەی نوێ نییە.
+ئÛ\95Ù\85Û\95 Ù¾Û\95Ú\95Û\95Û\8cÛ\95 Ù¾Û\8eشتر Ù\87Û\95بÙ\88Ù\88Û\95.',
 'defaultmessagetext' => 'دەقی پەیامی هەمیشەیی',
 'invalid-content-data' => 'دراوەی ناوەرۆکی نادروست',
 'editwarning-warning' => 'بەجێ‌هێشتنی ئەم لاپەڕەیە دەبێتە هۆی لە‌دەست چوونی هەموو ئەو گۆڕانکاریانەی کردووتە.',
@@ -1789,12 +1789,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' => 'ئەم پەڕە لیستی ئەو پەڕانەیە کە ڕەوانەکراون بۆ پەڕەیەکی ڕەوانەکراوی دیکە.
 هەر ڕیزێک، بەستەرەکانی ڕەوانەکردنەوەی یەکەم و دووەم و ھەروەھا ئامانجی ڕەوانەکراوی دووەمی تێدایە کە حاڵەتی ئاساییدا مەبەستی «ڕاستی»ی ڕەوانەکراوی یەکەمیش دەبێ بۆ ئەوێ بێت.
@@ -3287,7 +3293,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 +3335,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 0cf4a7a..c0fdfcf 100644 (file)
@@ -17,6 +17,7 @@
  * @author Kaganer
  * @author Kuvaly
  * @author Li-sung
+ * @author Littledogboy
  * @author Martin Kozák
  * @author Matěj Grabovský
  * @author Mercy
@@ -505,7 +506,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',
@@ -772,9 +773,20 @@ 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',
+'createacct-helpusername-url' => '{{ns:Project}}:Uživatelské_jméno',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(pomozte mi s výběrem)]]',
+'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' => 'Přihlášení na zabezpečený server',
 '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,18 +799,39 @@ Nezapomeňte si upravit své [[Special:Preferences|nastavení {{grammar:2sg|{{SI
 'logout' => 'Odhlásit se',
 'userlogout' => 'Odhlášení',
 'notloggedin' => 'Nejste přihlášen(a)',
+'userlogin-noaccount' => 'Nemáte účet?',
+'userlogin-joinproject' => 'Přidejte se k {{grammar:3sg|{{SITENAME}}}}',
 'nologin' => "Dosud nemáte účet? '''$1'''.",
 'nologinlink' => 'Zaregistrujte se',
 'createaccount' => 'Vytvořit účet',
 'gotaccount' => "Už jste registrováni? '''$1'''.",
 'gotaccountlink' => 'Přihlaste se',
 'userlogin-resetlink' => 'Zapomněli jste přihlašovací údaje?',
+'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-captcha-help-url' => '{{ns:Project}}:Žádost o účet',
+'createacct-imgcaptcha-help' => 'Nevidíte obrázek? [[{{MediaWiki:createacct-captcha-help-url}}|Požádejte o účet]]',
+'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:{{NUMBEROFEDITS:R}}|editace|editace|editací}}',
+'createacct-benefit-body2' => '{{PLURAL:{{NUMBEROFARTICLES:R}}|stránka|stránky|stránek}}',
+'createacct-benefit-body3' => '{{PLURAL:{{NUMBEROFACTIVEUSERS:R}}|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.',
@@ -882,12 +915,14 @@ 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-legend' => 'Znovu nastavit heslo',
 'passwordreset-disabled' => 'Znovunastavení hesla je na této wiki zakázáno.',
+'passwordreset-emaildisabled' => 'E-mailové funkce byly na této wiki vypnuty.',
 'passwordreset-pretext' => '{{PLURAL:$1||Zadejte jeden z údajů níže}}',
 'passwordreset-username' => 'Uživatelské jméno:',
 'passwordreset-domain' => 'Doména:',
@@ -916,7 +951,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',
@@ -1332,7 +1367,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)',
@@ -1488,7 +1523,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 +1532,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 +1544,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 +1587,7 @@ Tuto operaci nelze vrátit zpět.',
 'userrights-notallowed' => 'Váš účet nemá oprávnění měnit uživatelská práva.',
 'userrights-changeable-col' => 'Skupiny, které můžete měnit',
 'userrights-unchangeable-col' => 'Skupiny, které nemůžete měnit',
+'userrights-conflict' => 'Konflikt uživatelských práv! Proveďte požadované změny ještě jednou.',
 
 # Groups
 'group' => 'Skupina:',
@@ -2143,7 +2180,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 +2317,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 +2375,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',
 
@@ -3237,11 +3283,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í}}',
+'weeks' => '{{PLURAL:$1|$1 týden|$1 týdny|$1 týdnů}}',
 'months' => '{{PLURAL:$1|$1 měsícem|$1 měsíci}}',
 'years' => '{{PLURAL:$1|$1 rokem|$1 roky}}',
 '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:
 
@@ -3919,12 +3979,16 @@ 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.',
+'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 +4080,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 58a4f9d..97d9381 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',
@@ -529,9 +527,18 @@ 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:',
+'userlogin-yourname' => 'Enw Defnyddiwr',
+'userlogin-yourname-ph' => 'Rhowch eich enw defnyddiwr',
 'yourpassword' => 'Eich cyfrinair:',
+'userlogin-yourpassword' => 'Cyfrinair',
+'userlogin-yourpassword-ph' => 'Teipiwch eich cyfrinair',
+'createacct-yourpassword-ph' => 'Rhowch gyfrinair',
 'yourpasswordagain' => 'Ail-deipiwch y cyfrinair:',
+'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|diwrnod|diwrnod}})",
+'userlogin-remembermypassword' => 'Cofio fi',
+'userlogin-signwithsecure' => 'Mewngofnodi drwy weinydd diogel',
 'securelogin-stick-https' => "Cadw'r cyswllt â HTTPS ar ôl mewngofnodi",
 'yourdomainname' => 'Eich parth',
 'password-change-forbidden' => 'Ni allwch newid cyfrineiriau ar y wici hwn.',
@@ -544,18 +551,39 @@ 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?',
+'helplogin-url' => 'Help:Mewngofnodi',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Cymorth i fewngofnodi]]',
+'createacct-join' => 'Rhowch eich gwybodaeth 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-captcha-help-url' => '{{ns:Project}}:Ymholi am gyfri',
+'createacct-imgcaptcha-help' => 'Methu gweld y ddelwedd? [[{{MediaWiki:createacct-captcha-help-url}}|Holwch am gyfrif]]',
+'createacct-imgcaptcha-ph' => 'Nodwch y testun a welwch uchod',
+'createacct-submit' => 'Crëwch gyfrif',
+'createacct-benefit-heading' => 'Mae {{SITENAME}} yn cael ei greu gan bobl fel chi.',
+'createacct-benefit-body1' => 'golygiadau',
+'createacct-benefit-body2' => 'tudalennau',
+'createacct-benefit-body3' => 'cyfrannwyr diweddar',
 '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.',
@@ -634,12 +662,14 @@ 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-legend' => 'Ailosod y cyfrinair',
 'passwordreset-disabled' => 'Analluogwyd ailosod cyfrineiriau ar y wici hwn.',
+'passwordreset-emaildisabled' => 'Analluogwyd offer e-bost 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-username' => 'Eich enw defnyddiwr:',
 'passwordreset-domain' => 'Parth:',
@@ -663,7 +693,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',
@@ -1160,6 +1190,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 +1334,7 @@ Mae'r wybodaeth hon ar gael i'r cyhoedd.",
 'userrights-notallowed' => 'Nid oes gan eich cyfrif y caniatâd priodol i ychwanegu neu dynnu hawliau defnyddwyr.',
 'userrights-changeable-col' => 'Grwpiau y gallwch eu newid',
 'userrights-unchangeable-col' => 'Grwpiau na allwch eu newid',
+'userrights-conflict' => 'Gwrthdaro gyda hawliau defnyddiwr! Gwnewch eich newidiadau eto.',
 
 # Groups
 'group' => 'Grŵp:',
@@ -2028,6 +2060,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]].",
@@ -2985,11 +3026,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|awr}} yn ôl',
+'minutes-ago' => '$1 {{PLURAL:$1|munud|munud}} yn ôl',
+'seconds-ago' => '$1 {{PLURAL:$1|eiliad|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:
 
@@ -3597,12 +3652,8 @@ 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.",
+'redirect' => 'Ailgyfeiriwyd gan ffeil, defnyddiwr neu adolygiad ID',
+'redirect-legend' => 'Ailgyfeiriad i ffeil newu dudalen',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Chwilio am ffeiliau dyblyg',
@@ -3693,6 +3744,8 @@ 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...',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 gyda chymorth chwilio yr holl destun',
index 3094234..87800bf 100644 (file)
@@ -220,8 +220,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Vis antal brugere, der overvåger',
 'tog-oldsig' => 'Nuværende signatur:',
 'tog-fancysig' => 'Behandl signatur som wikitekst uden automatisk henvisning',
-'tog-externaleditor' => 'Brug ekstern editor automatisk (kun for rutinerede brugere, da det kræver særlige indstillinger på din computer. [//www.mediawiki.org/wiki/Manual:External_editors Flere oplysninger.])',
-'tog-externaldiff' => 'Brug ekstern forskelsvisning automatisk (kun for rutinerede brugere, da det kræver særlige indstillinger på din computer. [//www.mediawiki.org/wiki/Manual:External_editors Flere oplysninger.])',
 'tog-showjumplinks' => 'Vis tilgængeligheds-henvisninger',
 'tog-uselivepreview' => 'Brug automatisk forhåndsvisning (kræver JavaScript og er på forsøgsstadiet)',
 'tog-forceeditsummary' => 'Advar mig hvis jeg ikke udfylder beskrivelsesfeltet',
@@ -236,6 +234,7 @@ $messages = array(
 'tog-showhiddencats' => 'Vis skjulte kategorier',
 'tog-noconvertlink' => 'Slå konvertering af sidetitler fra',
 'tog-norollbackdiff' => 'Vis ikke forskel efter tilbagerulning',
+'tog-useeditwarning' => 'Advar mig, hvis jeg forlader en redigeringsside med ændringer, der ikke er gemt.',
 
 'underline-always' => 'Altid',
 'underline-never' => 'Aldrig',
@@ -487,15 +486,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',
@@ -603,9 +602,15 @@ 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',
 'yourpasswordagain' => 'Gentag adgangskode',
 'remembermypassword' => 'Husk mit brugernavn i denne browser (højst $1 {{PLURAL:$1|dag|dage}})',
+'userlogin-remembermypassword' => 'Husk mig',
+'userlogin-signwithsecure' => 'Log på med sikker server',
 '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,12 +623,16 @@ 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?',
+'helplogin-url' => 'Help:Logge på',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hjælp til at logge på]]',
 'createaccountmail' => 'Brug en midlertidig tilfældig adgangskode og send den til e-mailadressen angivet nedenfor',
 'createaccountreason' => 'Begrundelse:',
 'badretype' => 'De indtastede adgangskoder er ikke ens.',
@@ -721,6 +730,7 @@ Du har muligvis allerede skiftet din adgangskode eller anmodet om en ny midlerti
 'passwordreset-text' => 'Udfyld denne formular for at nulstille din adgangskode.',
 'passwordreset-legend' => 'Nulstil adgangskode',
 'passwordreset-disabled' => 'Nulstilling af kodeord er slået fra på denne wiki.',
+'passwordreset-emaildisabled' => 'E-mailfunktioner er slået fra på denne wiki.',
 'passwordreset-pretext' => '{{PLURAL:$1||Indtast en af de nedenstående oplysninger}}',
 'passwordreset-username' => 'Brugernavn:',
 'passwordreset-domain' => 'Domæne:',
@@ -961,6 +971,8 @@ Den ser du til at være slettet.',
 'content-failed-to-parse' => 'Kunne ikke fortolke $2-indholdet af $1-modellen: $3',
 'invalid-content-data' => 'Ugyldig indholdsdata',
 'content-not-allowed-here' => '"$1" indhold er ikke tilladt på siden [[$2]]',
+'editwarning-warning' => 'Hvis du forlader siden nu, risikerer du at miste alle ændringer, som du har lavet.
+Denne advarsel kan slås fra under "Redigering" i dine indstillinger.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1239,6 +1251,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',
@@ -2113,6 +2126,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.
@@ -2197,7 +2219,7 @@ Fremtidige ændringer af denne side og dens tilknyttede diskussionsside vil bliv
 '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',
 
@@ -3680,13 +3702,6 @@ 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:FileDuplicateSearch
 'fileduplicatesearch' => 'Find dubletfiler',
 'fileduplicatesearch-summary' => 'Find dublerede filer baseret på deres hash-værdi.',
@@ -3732,7 +3747,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 +3790,8 @@ 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',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 med fuld-tekst søgnings support',
index c5d5507..259ee7a 100644 (file)
@@ -826,13 +826,18 @@ Vergiss nicht, deine [[Special:Preferences|{{SITENAME}}-Einstellungen]] zu ände
 'yourname' => 'Benutzername:',
 'userlogin-yourname' => 'Benutzername',
 'userlogin-yourname-ph' => 'Gib deinen Benutzernamen ein',
+'createacct-helpusername-url' => '{{ns:Project}}:Benutzernamensrichtlinie',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(Auswahlhilfe)]]',
 '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' => 'Über den sicheren Server anmelden',
 '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.',
@@ -855,12 +860,29 @@ Vergiss nicht, deine [[Special:Preferences|{{SITENAME}}-Einstellungen]] zu ände
 'userlogin-resetlink' => 'Die Anmeldedaten vergessen?',
 '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 du ein anderes Benutzerkonto erstellst',
+'createacct-captcha' => 'Sicherheitsprüfung',
+'createacct-captcha-help-url' => '{{ns:Project}}:Benutzerkontenanträge',
+'createacct-imgcaptcha-help' => 'Das Bild ist nicht sichtbar? [[{{MediaWiki:createacct-captcha-help-url}}|Beantrage ein Benutzerkonto]].',
+'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' => 'Bearbeitungen',
+'createacct-benefit-body2' => 'Seiten',
+'createacct-benefit-body3' => '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.',
@@ -944,6 +966,7 @@ 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',
@@ -978,7 +1001,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',
@@ -1439,7 +1462,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}})',
@@ -1616,6 +1639,7 @@ Dies kann nicht mehr rückgängig gemacht werden.',
 'userrights-notallowed' => 'Du verfügst nicht über die erforderlichen Berechtigungen, um Benutzerrechte vergeben oder entziehen zu können.',
 'userrights-changeable-col' => 'Gruppenzugehörigkeit, die du ändern kannst',
 'userrights-unchangeable-col' => 'Gruppenzugehörigkeit, die du nicht ändern kannst',
+'userrights-conflict' => 'Benutzerrechtekonflikt! Bitte führe deine Änderungen erneut durch.',
 
 # Groups
 'group' => 'Gruppe:',
@@ -1739,7 +1763,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',
@@ -1782,8 +1806,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
@@ -2348,6 +2372,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,7 +2458,7 @@ 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}}.',
+'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',
@@ -3311,11 +3344,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:
 
@@ -3955,11 +4002,16 @@ 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.',
+'redirect' => 'Weiterleitung von Datei, Benutzer oder Versionskennung',
+'redirect-legend' => 'Weiterleitung auf eine Datei oder Seite',
+'redirect-summary' => 'Diese Spezialseite leitet auf eine Datei (Dateiname angegeben), Seite (Versionskennung angegeben) oder Benutzerseite (numerische Benutzerkennung angegeben) weiter.',
+'redirect-submit' => 'Los',
+'redirect-lookup' => 'Suchen:',
+'redirect-value' => 'Wert:',
+'redirect-user' => 'Benutzerkennung',
+'redirect-revision' => 'Seitenversion',
+'redirect-file' => 'Dateiname',
+'redirect-not-exists' => 'Der Wert wurde nicht gefunden',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Dateiduplikatsuche',
@@ -4052,6 +4104,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',
index bd1951a..a9dc302 100644 (file)
@@ -309,12 +309,12 @@ $magicWords = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'Bınê gırey de xete bıance:',
+'tog-underline' => 'Bınê gırey de xete bance:',
 'tog-justify' => 'Paragrafan eyar ke',
 'tog-hideminor' => 'Vurnayışanê şenıkan pela vurnayışanê peyênan de bınımne',
 'tog-hidepatrolled' => 'Vurnayışanê qontrolkerdeyan pela vurnayışê peyêni de bınımne',
 'tog-newpageshidepatrolled' => 'Pelanê qontrolkerdeyan lista pelanê neweyan de bınımne',
-'tog-extendwatchlist' => 'Lista seyrkerdışi hera bıke ke vurnayışi pêro bıasê, tenya tewr peyêni nê',
+'tog-extendwatchlist' => 'Lista seyrkerdışi hera bıke ke vurnayışi pêro basê, tenya tewr peyêni nê',
 'tog-usenewrc' => 'Pele be vurnayışanê grube de vurnayışê peyêni u lista seyrkerdışi (JavaScript lazımo)',
 'tog-numberheadings' => 'Sernuşteyan be xo numre cı şane',
 'tog-showtoolbar' => 'Goceganê hacetanê vurnayışi bımocne (JavaScript lazımo)',
@@ -331,7 +331,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 +346,17 @@ $messages = array(
 'tog-watchlisthideminor' => 'Vurnayışanê qıckekan lista mına seyrkerdışi de bınımne',
 'tog-watchlisthideliu' => 'Lista seyrkerdışi ra vurnayışanê karberanê cıkewteyan bınımne',
 'tog-watchlisthideanons' => 'Lista seyrkerdışi ra vurnayışanê karberanê anoniman bınımne',
-'tog-watchlisthidepatrolled' => 'Lista seyrkerdışi ra vurnayışanê qontrol kerdeyan bınımne',
+'tog-watchlisthidepatrolled' => 'Lista seyrkerdışi ra vurnayışanê qontrolkerdeyan bınımne',
 'tog-ccmeonemails' => 'E-posteyanê ke ez karberanê binan rê rışenan, mı rê kopya inan bırışe',
 'tog-diffonly' => 'Qıyasê versiyonan de tek ferqan bımocne, pela butıne nê',
-'tog-showhiddencats' => 'Kategoriyanê dızdine bımocne',
+'tog-showhiddencats' => 'Kategoriyanê dızdiye bımocne',
 'tog-noconvertlink' => 'Greyê sernami çerx kerdışi bıqefılne',
 'tog-norollbackdiff' => 'Peyserardışi ra dıme ferqi caverde',
-'tog-useeditwarning' => '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 +381,7 @@ $messages = array(
 'fri' => 'Êne',
 'sat' => 'Şem',
 'january' => 'Çele',
-'february' => 'Şıbate',
+'february' => 'Sıbate',
 'march' => 'Adar',
 'april' => 'Nisane',
 'may_long' => 'Gulane',
@@ -393,7 +393,7 @@ $messages = array(
 'november' => 'Tışrino Peyên',
 'december' => 'Kanun',
 'january-gen' => 'Çele',
-'february-gen' => 'Şıbate',
+'february-gen' => 'Sıbate',
 'march-gen' => 'Adar',
 'april-gen' => 'Nisane',
 'may-gen' => 'Gulane',
@@ -405,7 +405,7 @@ $messages = array(
 'november-gen' => 'Tışrino Peyên',
 'december-gen' => 'Kanun',
 'jan' => 'Çel',
-'feb' => 'Şbt',
+'feb' => 'Sbt',
 'mar' => 'Adr',
 'apr' => 'Nsn',
 'may' => 'Gln',
@@ -425,7 +425,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 tenya ena kategoriya bınêne esta.|Na kategoriye de {{PLURAL:$1|ena kategoriye esta|$1 enê kategoriy estê}}, be $2 ra pêro piya.}}',
 'category-subcat-count-limited' => 'Na kategoriye de {{PLURAL:$1|ena kategoriya bınêne esta|enê $1 kategoriyê bınêni estê}}.',
 'category-article-count' => '{{PLURAL:$2|Na kategoriye de teyna ena pele esta.|Na kategoriye de $2 ra pêro pia, {{PLURAL:$1|ena pele esta|enê $1 peli estê.}}, be $2 ra pêro pia}}',
 'category-article-count-limited' => '{{PLURAL:$1|Pela cêrêne|$1 Pelê cêrêni}} na kategoriye derê.',
@@ -434,8 +434,8 @@ $messages = array(
 'category-file-count-limited' => '{{PLURAL:$1|Dosya cêrêne|$1 Dosyê cêrêni}} na kategoriye derê.',
 'listingcontinuesabbrev' => '(dewam)',
 'index-category' => 'Pelê endeksıni',
-'noindex-category' => 'Perê ke ratnena cı çinıya',
-'broken-file-category' => 'Peleye ke linkê Dosyayandê xelata muhtewa kenê',
+'noindex-category' => 'Pelê ke zerrekê cı çıniyo',
+'broken-file-category' => 'Peleye ke gıreyê dosyeyanê ğeletan muhtewa kenê',
 'categoryviewer-pagedlinks' => '($1) ($2)',
 
 'linkprefix' => "'''MediaWiki niya ro.'''",
@@ -476,7 +476,7 @@ $messages = array(
 'vector-view-view' => 'Bıwane',
 'vector-view-viewsource' => 'Çımey bıvêne',
 'actions' => 'Kerdışi',
-'namespaces' => 'Cayê namam',
+'namespaces' => 'Cayê namey',
 'variants' => 'Varyanti',
 
 'navigation-heading' => 'Menuya Navigasyoni',
@@ -731,9 +731,20 @@ 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',
+'createacct-helpusername-url' => '{{ns:Project}}:Politikaya_nameyê_karberan',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(çerezan de mı rê desteg)]]',
 '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 +757,34 @@ 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ê?',
+'helplogin-url' => 'Help:Qeydbiyayış',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Desteg be qeydbiyayış ra]]',
+'createacct-emailrequired' => 'Adresa e-postey',
+'createacct-emailoptional' => 'Adresa e-postey (mecburi niya)',
+'createacct-email-ph' => 'Adresa e-posteyê xo cıkewe',
 'createaccountmail' => 'mı rê e-mail sera parola bırışe',
+'createacct-realname' => 'Nameyo raştıkên (mecburi niyo)',
 'createaccountreason' => 'Sebeb:',
+'createacct-reason' => 'Sebeb',
+'createacct-captcha' => 'Qontrolê asayişi',
+'createacct-captcha-help-url' => '{{ns:Project}}:Yew hesab bıwaze',
+'createacct-imgcaptcha-help' => 'Asayışi nêvênena? [[{{MediaWiki:createacct-captcha-help-url}}|Yew hesab bıwaze]]',
+'createacct-benefit-body1' => 'vurnayışi',
+'createacct-benefit-body2' => 'peli',
+'createacct-benefit-body3' => 'İştıraqkerdoğê na aşme',
 '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ê.
@@ -867,9 +894,9 @@ $2
 Ena parolaya deqewe de u xorê ju parolaya newi bıweçine. Parolaya şıma emaya şıma viri se  yana  ena e-posta şıma nê weştase u şıma qayıl niye parolaya xo bıvurnese, ena mesacer peygoş bıkerê.',
 'passwordreset-emailelement' => 'Namey karberi: $1
 Parola vêrdiye: $2',
-'passwordreset-emailsent' => 'E-postay xo vira kerdışi rışiyê.',
-'passwordreset-emailsent-capture' => 'Zey cêri e-postay xo vira kerdışi rışiyê.',
-'passwordreset-emailerror-capture' => 'ey cêri e-postay xo vira kerdışi vıraziyê lakin merdum dê $1 rê nêrışiyê.',
+'passwordreset-emailsent' => 'Yew e-posteyê esterıtışê parola rışiya.',
+'passwordreset-emailsent-capture' => 'Yew e-posteyê esterıtışê parolayo ke rışiya, no cêr mocniyayo.',
+'passwordreset-emailerror-capture' => 'Yew e-posteyê esterıtışê parolayo ke rışiya, no cêr mocniyayo, ema {{GENDER:$2|karber}}i rê rıştış de mıwefeq nêbi: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'E-posta adresa xo bıvurnê',
@@ -1035,7 +1062,7 @@ Fına zi qayılê ke  iştıraq kewê, Şıma qayılê kê şar vaco eno nuşte
 'copyrightwarning2' => 'Ney bızane ke nuşteyê ke şıma ruşneni (şaweni) keyepelê {{SITENAME}} herkes eşkeno nê nuşteyanê şıma ser kay bıkero. Eke şıma qayil niye kes bıvurno, nuşetyanê xo meerze ita. <br />
 Wexta ke şıma nuşte zi erzeni ita; şıma gani taahhud bıde koti ra ardo (qey teferruati referans: $1).',
 'longpageerror' => "'''Xırab: Dergeya nuşte dê şıma nezdi {{PLURAL:$1|kilobayto|$1 kilobayto}}, feqet {{PLURAL:$2|kilobayt|$2 kilobayt}} ra vêşiyo. Qeyd biyayişê cı nêbeno'''",
-'readonlywarning' => "'''DİQET: Semedê mıqayti, database kılit biyo. No sebeb ra vurnayişê şıma qayd nêbeno. Nuşteyanê şıma yewna serkar eşkeno wedaro u pey ra şıma eşkeni reyna ita de qayd bıker'''
+'readonlywarning' => "'''Diqet: Semedê mıqayti, database kılit biyo. No sebeb ra vurnayişê şıma qayd nêbeno. Nuşteyanê şıma yewna serkar eşkeno wedaro u pey ra şıma eşkeni reyna ita de qayd bıker'''
 
 Serkar o ke kılit kerdo; no beyanat dayo: $1",
 'protectedpagewarning' => "'''Diqet: No pel pawyeno, teyna serkari eşkeni bıvurni.'''
@@ -1195,7 +1222,7 @@ Eke şıma serkari u devam bıkeri [$1 no vurnayiş şıma eşkeni bıvini].",
 'revdelete-nologid-text' => 'Şıma vıraştışê nê fonksiyoni rê ya yew cıkewtışo waşte diyar nêkerdo, ya ki çıkewtışo diyarkerde çıniyo.',
 'revdelete-no-file' => 'Dosya diyarkerdiye çıniya.',
 'revdelete-show-file-confirm' => 'Şıma eminê ke wazenê çımraviyarnayışê esterıtey na dosya "<nowiki>$1</nowiki>" $2 ra $3 de bıvênê?',
-'revdelete-show-file-submit' => 'E',
+'revdelete-show-file-submit' => 'Eya',
 'revdelete-selected' => "'''[[:$1]]: ra {{PLURAL:$2|çımraviyarnayışo weçinıte|çımraviyarnayışê weçinıtey}}'''",
 'logdelete-selected' => "'''{{PLURAL:$1|Qeydbiyayışo weçinıte|Qeydbiyayışê weçinıtey}}:'''",
 'revdelete-text' => "'''Çımraviyarnayışê esterıtey u kerdışi hewna tarixê pele u qeydan de asenê, hema parçeyê zerrekê dinan areze nêbenê.'''
@@ -1213,7 +1240,7 @@ Eke şertê ilawekerdey ke niyê ro, idarekerê bini {{SITENAME}} de nêşenê h
 'revdelete-hide-user' => 'Karber u IP ê ke vurnayiş kerdo bınım.',
 'revdelete-hide-restricted' => 'Malumatan pa serkaran u karberan ra bınım.',
 'revdelete-radio-same' => '(mevurne)',
-'revdelete-radio-set' => 'E',
+'revdelete-radio-set' => 'Eya',
 'revdelete-radio-unset' => 'Nê',
 'revdelete-suppress' => 'Hem ê binan ra hem zi serkaran ra malumatan bınım',
 'revdelete-unsuppress' => 'reizyonê ke tepiya anciye serbest ker',
@@ -1430,7 +1457,7 @@ Etıya şıma rê yew kılito raştameo ke şıma şenê bıgurenê/bıxebetnê:
 'timezoneregion-pacific' => 'Okyanuso Pasifik',
 'allowemail' => 'Karberê bini wa bışê mı rê e-posta bırışê.',
 'prefs-searchoptions' => 'Cı geyre',
-'prefs-namespaces' => 'Cayê namam',
+'prefs-namespaces' => 'Cayê namey',
 'defaultns' => 'Eke heni, enê cayanê namey de cı geyre (sae ke):',
 'default' => 'qısur',
 'prefs-files' => 'Dosyey',
@@ -1443,7 +1470,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 +2100,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 +2118,12 @@ gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 'brokenredirects-edit' => 'bıvurne',
 'brokenredirects-delete' => 'bestere',
 
-'withoutinterwiki' => 'Peleyê ke zıwanan de bina re gırey cı çınyo',
+'withoutinterwiki' => 'Pelê ke zıwananê binan rê gıreyê cı çıniyo',
 'withoutinterwiki-summary' => 'Enê pelî ke versiyonê ziwanî binî ra link nidano.',
 'withoutinterwiki-legend' => 'Verole',
 'withoutinterwiki-submit' => 'Bımocne',
 
-'fewestrevisions' => 'Peleyê ke cı sero tewr tayn timaryayış vıraziyayo',
+'fewestrevisions' => 'Pelê be senık çımraviyarnayışi',
 
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|bayt|bayti}}',
@@ -2113,17 +2141,17 @@ gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 'uncategorizedpages' => 'Pelayanê ke kategorî nibiye',
 'uncategorizedcategories' => 'Kategoriyê ke bê kategorîyê',
 'uncategorizedimages' => 'Dosyayê ke bê kategoriyê',
-'uncategorizedtemplates' => 'Şablonê ke bê kategoriyê',
+'uncategorizedtemplates' => 'Şablonê ke bêkategoriyê',
 'unusedcategories' => 'Kategoriyê ke nê xebtênê',
 'unusedimages' => 'Dosyeyê ke nê xebtênê',
 'popularpages' => 'Pelî ke populer o.',
 'wantedcategories' => 'Kategoriye ke waştênê',
 'wantedpages' => 'Peleye ke waştênê',
 'wantedpages-badtitle' => 'sernuşte meqbul niyo: $1',
-'wantedfiles' => 'Dosyeye ke waştênê',
+'wantedfiles' => 'Dosyeyê cıgeyriyayey',
 'wantedfiletext-cat' => 'Dosyaya cêrên karvıstedeya lakin çınya. Mewcud dosyayan de xeriba miyan de liste bena. Xırabiya wınisin dana <del>ateber</del>. Zewbi zi, şırê pela da dosyeyê ke çınyaya [[:$1]].',
 'wantedfiletext-nocat' => 'Dosyeyê cêrêni estê lekin karnêvıstê. Dosyeyê xeribi liste benê. bo babeta dano <del>ateber</del>',
-'wantedtemplates' => 'Şablonê ke waştênê',
+'wantedtemplates' => 'Şablonê ke waziyenê',
 'mostlinked' => 'Pelî ke tewr zafî lînk bîy.',
 'mostlinkedcategories' => 'Kategorî ke tewr zafî lînk bîy.',
 'mostlinkedtemplates' => 'Şablonê ke tewr zafî pela re gıre bîye.',
@@ -2135,14 +2163,14 @@ gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 'prefixindex-namespace' => 'Peleyê Veroleyıni ($1 cay nami)',
 'shortpages' => 'Pelê kılmeki',
 'longpages' => 'Peleyê dergeki',
-'deadendpages' => 'pelê ke pelê binan re gırey nêeşto',
+'deadendpages' => 'Pelê nêgıredayey',
 'deadendpagestext' => 'Ena pelan ke {{SITENAME}} de zerrî ey de link çini yo.',
-'protectedpages' => 'Pelayê ke biyê star',
+'protectedpages' => 'Pelê pawıtiyey',
 'protectedpages-indef' => 'têna pawıteyê bêmuddeti',
 'protectedpages-cascade' => 'Kilit biyaye ke teyna cascadiye',
 'protectedpagestext' => 'pelê cêrınî pawiyenê',
 'protectedpagesempty' => 'pê ney parametreyan pelê pawiteyi çinî',
-'protectedtitles' => 'Sernameyê ke starênê',
+'protectedtitles' => 'Sernameyê pawıtiyey',
 'protectedtitlestext' => 'sernameyê cêrıni pawıte yî',
 'protectedtitlesempty' => 'pê ney parametreyan sernuşteyê pawite çinê',
 'listusers' => 'Listeyê Karberan',
@@ -2226,7 +2254,7 @@ 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 />
@@ -2240,6 +2268,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' => 'Karberi {{PLURAL:$3|roce peyni de|$3 roca peyni de}} $1 {{PLURAL:$1|vurnayış|vurnayışi}} 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 +2337,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.',
@@ -2343,7 +2380,7 @@ Ena deme ra, ma qe vurnayışan ser ena pele tı haberdar keni. Hem zi çı dem
 'enotif_subject_moved' => '{{SITENAME}} de pera $1 {{gender:$2|$2}} berde',
 '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.',
@@ -2469,9 +2506,9 @@ Hesıbyayê sazê pela da '''$1''' enêyê:",
 'protect-cascadeon' => 'Ena pele nıka kılit biya. Çınki ena pele zerre listeyê {{PLURAL:$1|pele, ki|peleyan, which li}} bınê "cascading protection"iyo.
 Tı eşkeno seviyeye kılit kerdışi bıvurno, feqat tı nıeşken "cascading protection"i bıvurno.',
 'protect-default' => 'Destur bıde karberan pêrune',
-'protect-fallback' => 'Desturê "$1" lazımo',
+'protect-fallback' => 'Tenya karberanê be izna "$1" rê destur bıde',
 'protect-level-autoconfirmed' => 'Karberanê neweyan u qeyd-nêbiyaoğan kılit ke',
-'protect-level-sysop' => 'Tenya idarekeri',
+'protect-level-sysop' => 'Tenya idarekeran rê destur bıde',
 'protect-summary-cascade' => 'çırrayış',
 'protect-expiring' => 'qediyeno $1 (UTC)',
 'protect-expiring-local' => '$1 do bı qedyo',
@@ -2503,9 +2540,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,7 +2870,7 @@ 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_confirm' => 'Eya, na pele bestere',
 'delete_and_move_reason' => '"[[$1]]" qey vurnayişê nameyi esteriya',
 '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î',
@@ -3093,7 +3130,7 @@ Tı eşkeno yew sebeb bınus.',
 'pageinfo-robot-noindex' => 'İndeksnêbiyayen',
 'pageinfo-views' => 'Amarina mocnayışan',
 'pageinfo-watchers' => 'Amariya pela serykeran',
-'pageinfo-few-watchers' => '$1 ra tay {{PLURAL:$1|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 +3151,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 +3239,33 @@ Gurênayışê nae de, beno ke sistemê şıma zerar bıvêno.",
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
 'video-dims' => '$1, $2 × $3',
-'seconds-abbrev' => '$1s',
-'minutes-abbrev' => '$1m',
+'seconds-abbrev' => '$1 san',
+'minutes-abbrev' => '$1 deq',
 'hours-abbrev' => '$1h',
 'days-abbrev' => '$1d',
-'seconds' => 'verdê {{PLURAL:$1|$1 saniya|$1 saniya}}',
-'minutes' => 'verdê {{PLURAL:$1|$1 daka|$1 daka}}',
-'hours' => 'Verdê {{PLURAL:$1|$1 seata|$1 seata}}',
-'days' => 'Verdê {{PLURAL:$1|$1 rocan|$1 rocan}}',
-'months' => '{{PLURAL:$1|aşme|$1 aşmi}}',
-'years' => '{{PLURAL:$1|$1 serre|$1 serri}}',
-'ago' => 'Verdê $1',
+'seconds' => '{{PLURAL:$1|$1 saniya|$1 saniyeyan}}',
+'minutes' => '{{PLURAL:$1|$1 deqa|$1 deqan}}',
+'hours' => '{{PLURAL:$1|$1 saete|$1 saetan}}',
+'days' => '{{PLURAL:$1|$1 roce|$1 rocan}}',
+'weeks' => '{{PLURAL:$1|$1 hefte|$1 hefteyan}}',
+'months' => '{{PLURAL:$1|aşme|$1 aşman}}',
+'years' => '{{PLURAL:$1|$1 serre|$1 serran}}',
+'ago' => 'Verê $1',
 'just-now' => 'Hema newke',
 
+# Human-readable timestamps
+'hours-ago' => 'Verê $1 {{PLURAL:$1|saete|saetan}}',
+'minutes-ago' => 'Verê $1 {{PLURAL:$1|deqa|deqan}}',
+'seconds-ago' => 'Verê $1 {{PLURAL:$1|saniya|saniyeyan}}',
+'monday-at' => 'Dışeme $1 de',
+'tuesday-at' => 'Sêşeme $1 de',
+'wednesday-at' => 'Çarşeme $1 de',
+'thursday-at' => 'Pancşeme $1 de',
+'friday-at' => 'Êne $1 de',
+'saturday-at' => 'Şeme $1 de',
+'sunday-at' => 'Kırê $1 de',
+'yesterday-at' => 'Vızêri $1 de',
+
 # Bad image list
 'bad_image_list' => 'Şeklo umumi wınayo:
 
@@ -3224,8 +3275,6 @@ Na rêze de her gırêyo bin zey istisna vêniyeno, yanê pelê ke dosya beno ke
 
 /*
 Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
 'variantname-zh-hans' => 'hans',
@@ -4030,13 +4079,6 @@ 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:FileDuplicateSearch
 'fileduplicatesearch' => 'Dosyayanê zey pêyan cı geyrê',
 'fileduplicatesearch-summary' => 'Dosyanê çıftan bınê têmiyankewteyan de bıgeyre.',
@@ -4054,14 +4096,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 +4170,44 @@ 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',
 
 # 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 pela $3 {{GENDER:$2|esterıte}}',
+'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-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|berde}} $4',
-'logentry-move-move-noredirect' => "$1'i pelay $3 raçarnayış neker dı u {{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 +4262,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..0474db0 100644 (file)
@@ -188,8 +188,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 +201,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',
@@ -902,6 +901,7 @@ Eksistěrujo južo.',
 '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',
index 436c90a..5cd073a 100644 (file)
@@ -44,8 +44,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Pokitono ginumu do momomoguno minongintong',
 'tog-oldsig' => 'Sain poinsandad:',
 'tog-fancysig' => 'Pokitono sain sobaagi do tikwiki (ingaa oporian toput )',
-'tog-externaleditor' => 'Pomoguno pongigidit poinlabus sobaagi do pongoiso (montok di angasampin nopo, mongoguno do nuludan pointantu id kompiutonu. [//www.mediawiki.org/wiki/Manual:External_editors Lobi pomoilaan.])',
-'tog-externaldiff' => 'Pomoguno pongigidit poinlabus sobaagi do pongoiso (montok di angasampin nopo, mongoguno do nuludan pointantu id kompiutonu. [//www.mediawiki.org/wiki/Manual:External_editors Lobi pomoilaan.])',
 'tog-showjumplinks' => 'Pasagao "tumopik hilo" noputan awayaan',
 'tog-uselivepreview' => 'Momoguno pongingintong poimpasi (momoguno JawaSikrip) (pogumbalan)',
 'tog-forceeditsummary' => 'Posoroho oku no nung awu nosuangan kutak koinibaan niditan',
@@ -993,14 +991,6 @@ Umbalai momogonop it ihumonnu miampai do ''all:'' mooi do oihum ot oinsanan suan
 Milo ko mogihum maya Googol do daamot.
 Imurai no do indik suang diti {{SITENAME}} nopo nga nokolipas.',
 
-# Quickbar
-'qbsettings' => 'Barposikap',
-'qbsettings-none' => 'Ingaa',
-'qbsettings-fixedleft' => 'Pogolibango',
-'qbsettings-fixedright' => 'Pawanano',
-'qbsettings-floatingleft' => 'Posoibaho gibang',
-'qbsettings-floatingright' => 'Posoibaho wanan',
-
 # Preferences page
 'preferences' => 'Pipilion',
 'mypreferences' => 'Pipilion',
index a425530..9868071 100644 (file)
@@ -384,8 +384,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Εμφάνιση του αριθμού των συνδεδεμένων χρηστών',
 'tog-oldsig' => 'Υπάρχουσα υπογραφή:',
 'tog-fancysig' => 'Μεταχείριση υπογραφής ως κώδικα wiki (χωρίς αυτόματο σύνδεσμο)',
-'tog-externaleditor' => 'Χρήση εξωτερικού επεξεργαστή από προεπιλογή (για προχωρημένους μόνο, χρειάζεται ειδικές ρυθμίσεις του υπολογιστή σας. [//www.mediawiki.org/wiki/Manual:External_editors Περισσότερες πληροφορίες.])',
-'tog-externaldiff' => 'Χρήση εξωτερικού diff από προεπιλογή (για προχωρημένους μόνο, χρειάζεται ειδικές ρυθμίσεις του υπολογιστή σας. [//www.mediawiki.org/wiki/Manual:External_editors Περισσότερες πληροφορίες.])',
 'tog-showjumplinks' => 'Ενεργοποίησε τους συνδέσμους προσβασιμότητας του τύπου "μετάβαση σε"',
 'tog-uselivepreview' => 'Χρήση ζωντανής προεπισκόπησης (απαιτεί JavaScript) (πειραματικό)',
 'tog-forceeditsummary' => 'Να ειδοποιούμαι κατά την εισαγωγή κενής σύνοψης επεξεργασίας',
@@ -400,6 +398,7 @@ $messages = array(
 'tog-showhiddencats' => 'Εμφάνιση κρυμμένων κατηγοριών',
 'tog-noconvertlink' => 'Απενεργοποίησε την μετατροπή τίτλου συνδέσμου',
 'tog-norollbackdiff' => 'Παράλειψη διαφοράς μετά την εκτέλεση επαναφοράς',
+'tog-useeditwarning' => 'Προειδοποίηση όταν εγκαταλείπω μία σελίδα επεξεργασίας χωρίς να έχω πρώτα αποθηκεύσει τις αλλαγές',
 
 'underline-always' => 'Πάντα',
 'underline-never' => 'Ποτέ',
@@ -767,9 +766,20 @@ $2',
 'welcomecreation-msg' => 'Ο λογαριασμός σας έχει δημιουργηθεί.
 Μην ξεχάσετε να αλλάξετε τις [[Special:Preferences|{{SITENAME}} προτιμήσεις]] σας.',
 'yourname' => 'Όνομα χρήστη:',
+'userlogin-yourname' => 'Όνομα χρήστη',
+'userlogin-yourname-ph' => 'Εισάγετε το όνομα χρήστη σας',
+'createacct-helpusername-url' => '{{ns:Project}}:Πολιτική_Ονομασίας_Χρηστών',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(βοήθηστε με να επιλέξω)]]',
 '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 +792,28 @@ $2',
 'logout' => 'Έξοδος',
 'userlogout' => 'Έξοδος',
 'notloggedin' => 'Δεν έχετε συνδεθεί.',
+'userlogin-noaccount' => 'Δεν έχετε λογαριασμό;',
+'userlogin-joinproject' => 'Συνδεθείτε σε {{SITENAME}}',
 'nologin' => "Δεν έχετε λογαριασμό; '''$1'''.",
 'nologinlink' => 'Δημιουργήστε έναν λογαριασμό',
 'createaccount' => 'Δημιουργία νέου λογαριασμού',
 'gotaccount' => "Έχετε ήδη έναν λογαριασμό; '''$1'''.",
 'gotaccountlink' => 'Είσοδος',
 'userlogin-resetlink' => 'Ξεχάσατε τα στοιχεία σύνδεσής σας;',
+'helplogin-url' => 'Βοήθεια:Σύνδεση',
+'createacct-emailrequired' => 'Διεύθυνση ηλεκτρονικού ταχυδρομείου',
 'createaccountmail' => 'Χρήση τυχαίου προσωρινού κωδικού πρόσβασης και αποστολή του στη διεύθυνση ηλεκτρονικού ταχυδρομείου που καθορίζεται παρακάτω',
 'createaccountreason' => 'Αιτία:',
+'createacct-reason' => 'Λόγος',
+'createacct-captcha-help-url' => '{{ns:Project}}:Αίτημα για λογαριασμό',
+'createacct-imgcaptcha-ph' => 'Εισαγωγή του κειμένου που βλέπετε παραπάνω',
+'createacct-benefit-body1' => 'επεξεργασίες',
+'createacct-benefit-body2' => 'σελίδες',
 'badretype' => 'Οι κωδικοί που έχετε δηλώσει δεν συμφωνούν μεταξύ τους.',
 'userexists' => 'Το όνομα χρήστη που εισαγάγατε βρίσκεται ήδη σε χρήση.
 Παρακαλούμε, διαλέξτε ένα διαφορετικό.',
 'loginerror' => 'Σφάλμα σύνδεσης',
+'createacct-error' => 'Σφάλμα δημιουργίας λογαριασμού',
 'createaccounterror' => 'Δεν ήταν δυνατή η δημιουργία λογαριασμού: $1',
 'nocookiesnew' => 'Ο λογαριασμός χρήστη έχει δημιουργηθεί, αλλά δεν έχετε ακόμα συνδεθεί. Το {{SITENAME}} χρησιμοποιεί cookies κατά τη σύνδεση των χρηστών. Τα cookies είναι απενεργοποιημένα στον υπολογιστή σας. Παρακαλούμε ενεργοποιήστε τα και στη συνέχεια συνδεθείτε χρησιμοποιώντας το νέο όνομα χρήστη σας και τον κωδικό σας.',
 'nocookieslogin' => 'Το {{SITENAME}} χρησιμοποιεί cookies κατά τη σύνδεση των χρηστών. Τα cookies είναι απενεργοποιημένα στον υπολογιστή σας. Παρακαλούμε ενεργοποιήστε τα και ξαναδοκιμάστε!',
@@ -879,6 +899,7 @@ $2',
 'passwordreset-text' => 'Συμπληρώστε αυτή τη φόρμα για να επαναφέρετε τον κωδικό σας.',
 'passwordreset-legend' => 'Επαναφορά κωδικού πρόσβασης',
 'passwordreset-disabled' => 'Η επαναφορά κωδικού πρόσβασης έχει απενεργοποιηθεί σε αυτό το wiki',
+'passwordreset-emaildisabled' => "Τα χαρακτηριστικά ηλεκτρονικού ταχυδρομείου έχουν απενεργοποιηθεί σ' αυτό το wiki.",
 'passwordreset-pretext' => '{{PLURAL:$1||Εισάγεται ένα από τα στοιχεία δεδομένων που βλέπετε παρακάτω}}',
 'passwordreset-username' => 'Όνομα χρήστη:',
 'passwordreset-domain' => 'Domain:',
@@ -902,7 +923,7 @@ $2
 Προσωρινός κωδικός πρόσβασης:$2',
 'passwordreset-emailsent' => 'Έχει αποσταλεί email επαναφοράς κωδικού.',
 'passwordreset-emailsent-capture' => 'Έχει αποσταλεί email επαναφοράς κωδικού, το οποίο φαίνεται πιο κάτω.',
-'passwordreset-emailerror-capture' => 'Ένα email επαναφοράς κωδικού έχει δημιουργηθεί, το οποίο φαίνεται πιο κάτω, αλλά απέτυχε η αποστολή του στο χρήστη: $1',
+'passwordreset-emailerror-capture' => 'Ένα email επαναφοράς κωδικού έχει δημιουργηθεί, το οποίο φαίνεται πιο κάτω, αλλά απέτυχε η αποστολή του στο  {{GENDER:$2|χρήστη}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Αλλαγή της διεύθυνσης ηλεκτρονικού ταχυδρομείου',
@@ -1109,8 +1130,11 @@ $2
 'edit-already-exists' => 'Δεν ήταν εφικτό να δημιουργηθεί η νέα σελίδα.
 Υπάρχει ήδη.',
 'defaultmessagetext' => 'Προεπιλεγμένο κείμενο μηνύματος',
+'content-failed-to-parse' => 'Απέτυχε η ανάλυση  περιεχομένου του $2 για το μοντέλο $1:$3',
 'invalid-content-data' => 'Μη έγκυρα δεδομένα περιεχομένου',
 'content-not-allowed-here' => 'Το περιεχόμενο «$1» δεν επιτρέπεται στη σελίδα [[$2]]',
+'editwarning-warning' => 'Αφήνοντας αυτή τη σελίδα μπορεί να σας κάνει να χάσετε κάποιες αλλαγές που έχετε κάνει.
+Αν έχετε συνδεθεί, μπορείτε να απενεργοποιήσετε αυτή την προειδοποίηση στο τμήμα "{{int:prefs-editing}}" των προτιμήσεών σας.',
 
 # Content models
 'content-model-wikitext' => 'βικικείμενο',
@@ -1132,6 +1156,10 @@ $2
 'parser-template-loop-warning' => 'Εντοπίστηκε πρότυπο σε βρόχο: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Το όριο του μάκρους της αναδρομής του πρότυπου έχει ξεπεραστεί ($1)',
 'language-converter-depth-warning' => 'Το όριο βάθους του μετατροπέα γλώσσας έχει ξεπεραστεί ($1)',
+'node-count-exceeded-category' => 'Σελίδες υπέρβασης του αριθμού κόμβων',
+'node-count-exceeded-warning' => 'Η σελίδα έχει υπερβεί τον αριθμό κόμβων',
+'expansion-depth-exceeded-category' => 'Σελίδες υπέρβασης της επέκτασης σε βάθος',
+'expansion-depth-exceeded-warning' => 'Η σελίδα υπερέβη το βάθος επέκτασης',
 'converter-manual-rule-error' => 'Εντοπίστηκε σφάλμα σε μη αυτόματο κανόνα μετατροπής γλώσσας',
 
 # "Undo" feature
@@ -1385,15 +1413,7 @@ $1",
 'powersearch-togglenone' => 'Καμία',
 'search-external' => 'Εξωτερική αναζήτηση',
 'searchdisabled' => 'Η αναζήτηση για τον ιστότοπο "{{SITENAME}}" είναι απενεργοποιημένη. Μπορείτε να αναζητήσετε μέσω του Google εν τω μεταξύ. Σημειώστε ότι οι κατάλογοί τους για το περιεχόμενο του ιστοτόπου "{{SITENAME}}" μπορεί να είναι απαρχαιωμένοι.',
-
-# Quickbar
-'qbsettings' => 'Γρήγορη πρόσβαση',
-'qbsettings-none' => 'Καμία',
-'qbsettings-fixedleft' => 'Σταθερά αριστερά',
-'qbsettings-fixedright' => 'Σταθερά δεξιά',
-'qbsettings-floatingleft' => 'Πλανώμενα αριστερά',
-'qbsettings-floatingright' => 'Πλανώμενα δεξιά',
-'qbsettings-directionality' => 'Διορθώθηκε, ανάλογα με τις κατευθύνσεις του σεναρίου εντολών της γλώσσας σας',
+'search-error' => 'Παρουσιάστηκε σφάλμα κατά την αναζήτηση:$1',
 
 # Preferences page
 'preferences' => 'Προτιμήσεις',
@@ -1884,10 +1904,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 +1957,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 +2111,9 @@ $1',
 Αντιθέτως θα έπρεπε να κατευθύνουν στο κατάλληλο θέμα.<br />
 Μια σελίδα αντιμετωπίζεται ως σελίδα αποσαφήνισης αν χρησιμοποιεί ένα πρότυπο το οποίο συνδέεται από το [[MediaWiki:Disambiguationspage]]",
 
+'pageswithprop-prop' => 'Όνομα ιδιότητας:',
+'pageswithprop-submit' => 'Μετάβαση',
+
 'doubleredirects' => 'Διπλές ανακατευθύνσεις',
 'doubleredirectstext' => 'Αυτή η σελίδα συγκαταλέγει σελίδες οι οποίες ανακατευθύνουν σε άλλες σελίδες ανακατεύθυνσης. Κάθε σειρά περιέχει συνδέσμους προς την πρώτη και τη δεύτερη σελίδα ανακατεύθυνσης, όπως επίσης και την πρώτη αράδα του κειμένου στη δεύτερη σελίδα ανακατεύθυνσης η οποία και είναι, κανονικά, ο πραγματικός προορισμός της ανακατεύθυνσης -εκεί δηλαδή όπου θα έπρεπε να είχατε οδηγηθεί από την αρχή. Τα <del>διεγραμμένα</del> λήμματα έχουν επιλυθεί.',
 'double-redirect-fixed-move' => 'Η [[$1]] έχει μετακινηθεί, τώρα είναι ανακατεύθυνση στην [[$2]]',
@@ -3050,13 +3077,8 @@ $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 θα επηρεάσει το αποτέλεσμα της εκτύπωσης */',
@@ -3064,13 +3086,8 @@ $1',
 
 # 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 +3163,6 @@ $1',
 'pageinfo-category-files' => 'Αριθμός αρχείων',
 
 # Skin names
-'skinname-standard' => 'Κλασσικό',
-'skinname-nostalgia' => 'Νοσταλγία',
-'skinname-myskin' => 'ΤοSkinΜου',
-'skinname-simple' => 'Απλό',
 'skinname-modern' => 'Μοντέρνο',
 
 # Patrolling
@@ -3853,13 +3866,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' => 'Αναζήτηση για διπλά αρχεία με βάση την τιμή hash του αρχείου.',
@@ -3948,6 +3954,8 @@ $5
 'htmlform-submit' => 'Υποβολή',
 'htmlform-reset' => 'Αναστροφή αλλαγών',
 'htmlform-selectorother-other' => 'Άλλο',
+'htmlform-no' => 'Όχι',
+'htmlform-yes' => 'Ναι',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 με υποστήριξη αναζήτησης πλήρους κειμένου',
@@ -3955,7 +3963,7 @@ $5
 
 # New logging system
 'logentry-delete-delete' => '{{GENDER:$1|Ο|Η}} $1 διέγραψε τη σελίδα $3',
-'logentry-delete-restore' => 'Î\9f· $1 αποκατέστησε τη σελίδα $3',
+'logentry-delete-restore' => 'Î\9f\97 $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-event-legacy' => '{{GENDER:$2|Ο|Η}} $1 άλλαξε την ορατότητα των καταγραφόμενων συμβάντων στη σελίδα $3',
@@ -3976,12 +3984,12 @@ $5
 'logentry-move-move' => '{{GENDER:$1|Ο|Η}} $1 μετακίνησε τη σελίδα $3 στη $4',
 'logentry-move-move-noredirect' => '{{GENDER:$1|Ο|Η}} $1 μετακίνησε τη σελίδα $3 στη $4 χωρίς να αφήσει ανακατεύθυνση',
 'logentry-move-move_redir' => '{{GENDER:$1|Ο|Η}} $1 μετακίνησε τη σελίδα $3 στη $4 πάνω από την ανανακατεύθυνση',
-'logentry-move-move_redir-noredirect' => '{{GENDER:$1|Ο|Η}} $1 μετακίνησε την σελίδα $3 στην $4 πάνω από ανακατεύθυνση χωρίς να αφήσει ανακατεύθυνση',
-'logentry-patrol-patrol' => '{{GENDER:$1|Ο|Η}} $1 σήμανε την έκδοση $4 της σελίδας $3 ως ελεγμένη',
+'logentry-move-move_redir-noredirect' => '{{GENDER:$2|Ο|Η}} $1 μετακίνησε την σελίδα $3 στην $4 πάνω από μια ανακατεύθυνση χωρίς να αφήσει ανακατεύθυνση',
+'logentry-patrol-patrol' => '{{GENDER:$2|Ο|Η}} $1 επισήμανε την έκδοση $4 της σελίδας $3 ως ελεγμένη',
 'logentry-patrol-patrol-auto' => '{{GENDER:$1|Ο|Η}} $1 αυτόματα σήμανε την έκδοση $4 της σελίδας $3 ως ελεγμένη',
-'logentry-newusers-newusers' => 'Ο λογαριασμός χρήστη $1 δημιουργήθηκε',
-'logentry-newusers-create' => 'Ο λογαριασμός χρήστη $1 δημιουργήθηκε',
-'logentry-newusers-create2' => 'Ο λογαριασμός χρήστη $3 δημιουργήθηκε από {{GENDER:$1|τον|την}} $1',
+'logentry-newusers-newusers' => 'Ο λογαριασμός χρήστη $1 {{GENDER:$2|δημιουργήθηκε}}',
+'logentry-newusers-create' => 'Ο λογαριασμός χρήστη $1 {{GENDER:$2|δημιουργήθηκε}}',
+'logentry-newusers-create2' => 'Ο λογαριασμός χρήστη $3 δημιουργήθηκε από {{GENDER:$2|τον|την}} $1',
 'logentry-newusers-byemail' => 'Ο λογαριασμός χρήστη $3 δημιουργήθηκε από τον $1  και ο κωδικός πρόσβασης εστάλη μέσω ηλεκτρονικού ταχυδρομείου',
 'logentry-newusers-autocreate' => 'Ο λογαριασμός $1 δημιουργήθηκε αυτόματα',
 'logentry-rights-rights' => '{{GENDER:$1|Ο|Η}} $1 άλλαξε την ιδιότητα μέλους ομάδας για {{GENDER:$3|τον|την}} $3 από $4 σε $5',
index a38a39a..e6f7338 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' ),
@@ -372,6 +378,7 @@ $magicWords = array(
  * hook.
  */
 $specialPageAliases = array(
+       'Activeusers'               => array( 'ActiveUsers' ),
        'Allmessages'               => array( 'AllMessages' ),
        'Allpages'                  => array( 'AllPages' ),
        'Ancientpages'              => array( 'AncientPages' ),
@@ -441,6 +448,7 @@ $specialPageAliases = array(
        'Randomredirect'            => array( 'RandomRedirect' ),
        'Recentchanges'             => array( 'RecentChanges' ),
        'Recentchangeslinked'       => array( 'RecentChangesLinked', 'RelatedChanges' ),
+       'Redirect'                  => array( 'Redirect' ),
        'Revisiondelete'            => array( 'RevisionDelete' ),
        'Search'                    => array( 'Search' ),
        'Shortpages'                => array( 'ShortPages' ),
@@ -680,7 +688,7 @@ XHTML id names.
 'tog-showhiddencats'          => 'Show hidden categories',
 'tog-noconvertlink'           => 'Disable link title conversion', # only translate this message to other languages if you have to change it
 'tog-norollbackdiff'          => 'Omit diff after performing a rollback',
-'tog-useeditwarning'             => 'Warn me when I leave an edit page with unsaved changes',
+'tog-useeditwarning'          => 'Warn me when I leave an edit page with unsaved changes',
 
 'underline-always'  => 'Always',
 'underline-never'   => 'Never',
@@ -1065,83 +1073,111 @@ The administrator who locked it offered this explanation: "$3".',
 'virus-unknownscanner' => 'unknown antivirus:',
 
 # Login and logout pages
-'logouttext'                      => "'''You are now logged out.'''
+'logouttext'                   => "'''You are now logged out.'''
 
 You can continue to use {{SITENAME}} anonymously, or you can <span class='plainlinks'>[$1 log in again]</span> as the same or as a different user.
 Note that some pages may continue to be displayed as if you were still logged in, until you clear your browser cache.",
-'welcomeuser'                     => 'Welcome, $1!',
-'welcomecreation-msg'             => 'Your account has been created.
+'welcomeuser'                  => 'Welcome, $1!',
+'welcomecreation-msg'          => 'Your account has been created.
 Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
-'yourname'                        => 'Username:',
-'userlogin-yourname'              => 'Username',
-'userlogin-yourname-ph'           => 'Enter your username',
-'yourpassword'                    => 'Password:',
-'userlogin-yourpassword'          => 'Password',
-'userlogin-yourpassword-ph'       => 'Enter your password',
-'yourpasswordagain'               => 'Retype password:',
-'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',
-'securelogin-stick-https'         => 'Stay connected to HTTPS after login',
-'yourdomainname'                  => 'Your domain:',
-'password-change-forbidden'       => 'You cannot change passwords on this wiki.',
-'externaldberror'                 => 'There was either an authentication database error or you are not allowed to update your external account.',
-'login'                           => 'Log in',
-'nav-login-createaccount'         => 'Log in / create account',
-'loginprompt'                     => 'You must have cookies enabled to log in to {{SITENAME}}.',
-'userlogin'                       => 'Log in / create account',
-'userloginnocreate'               => 'Log in',
-'logout'                          => 'Log out',
-'userlogout'                      => 'Log out',
-'userlogout-summary'              => '', # do not translate or duplicate this message to other languages
-'notloggedin'                     => 'Not logged in',
-'userlogin-noaccount'             => "Don't have an account?",
-'userlogin-joinproject'           => 'Join {{SITENAME}}',
-'nologin'                         => "Don't have an account? $1.",
-'nologinlink'                     => 'Create an account',
-'createaccount'                   => 'Create account',
-'gotaccount'                      => 'Already have an account? $1.',
-'gotaccountlink'                  => 'Log in',
-'userlogin-resetlink'             => 'Forgotten your login details?',
-'helplogin-url'                   => 'Help:Logging in',
-'userlogin-helplink'              => '[[{{MediaWiki:helplogin-url}}|Help with logging in]]',
-'createaccountmail'               => 'Use a temporary random password and send it to the email address specified below',
-'createaccountreason'             => 'Reason:',
-'badretype'                       => 'The passwords you entered do not match.',
-'userexists'                      => 'Username entered already in use.
+'yourname'                     => 'Username:',
+'userlogin-yourname'           => 'Username',
+'userlogin-yourname-ph'        => 'Enter your username',
+'createacct-helpusername-url'     => '{{ns:Project}}:Username_policy',
+'createacct-helpusername-link'    => '[[{{MediaWiki:createacct-helpusername-url}}|(help me choose)]]',
+'yourpassword'                 => 'Password:',
+'userlogin-yourpassword'       => 'Password',
+'userlogin-yourpassword-ph'    => 'Enter your password',
+'createacct-yourpassword-ph'      => 'Enter a password',
+'yourpasswordagain'            => 'Retype password:',
+'createacct-yourpasswordagain'    => 'Confirm password',
+'createacct-yourpasswordagain-ph' => 'Enter password again',
+'remembermypassword'           => 'Remember my login on this browser (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'userlogin-remembermypassword' => 'Keep me logged in',
+'userlogin-signwithsecure'     => 'Sign in with secure server',
+'securelogin-stick-https'      => 'Stay connected to HTTPS after login',
+'yourdomainname'               => 'Your domain:',
+'password-change-forbidden'    => 'You cannot change passwords on this wiki.',
+'externaldberror'              => 'There was either an authentication database error or you are not allowed to update your external account.',
+'login'                        => 'Log in',
+'nav-login-createaccount'      => 'Log in / create account',
+'loginprompt'                  => 'You must have cookies enabled to log in to {{SITENAME}}.',
+'userlogin'                    => 'Log in / create account',
+'userloginnocreate'            => 'Log in',
+'logout'                       => 'Log out',
+'userlogout'                   => 'Log out',
+'userlogout-summary'           => '', # do not translate or duplicate this message to other languages
+'notloggedin'                  => 'Not logged in',
+'userlogin-noaccount'          => "Don't have an account?",
+'userlogin-joinproject'        => 'Join {{SITENAME}}',
+'nologin'                      => "Don't have an account? $1.",
+'nologinlink'                  => 'Create an account',
+'createaccount'                => 'Create account',
+'gotaccount'                   => 'Already have an account? $1.',
+'gotaccountlink'               => 'Log in',
+'userlogin-resetlink'          => 'Forgotten your login details?',
+'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-captcha-help-url'     => '{{ns:Project}}:Request an account',
+'createacct-imgcaptcha-help'      => 'Can\'t see the image? [[{{MediaWiki:createacct-captcha-help-url}}|Request an account]]',
+'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',
+'createacct-benefit-head1'        => '{{NUMBEROFEDITS}}',
+'createacct-benefit-body1'        => 'edits',
+'createacct-benefit-icon2'        => 'icon-pages',
+'createacct-benefit-head2'        => '{{NUMBEROFARTICLES}}',
+'createacct-benefit-body2'        => 'pages',
+'createacct-benefit-icon3'        => 'icon-contributors',
+'createacct-benefit-head3'        => '{{NUMBEROFACTIVEUSERS}}',
+'createacct-benefit-body3'        => 'recent contributors',
+'badretype'                    => 'The passwords you entered do not match.',
+'userexists'                   => 'Username entered already in use.
 Please choose a different name.',
-'loginerror'                      => 'Login error',
-'createaccounterror'              => 'Could not create account: $1',
-'nocookiesnew'                    => 'The user account was created, but you are not logged in.
+'loginerror'                   => 'Login error',
+'createacct-error'             => 'Account creation error',
+'createaccounterror'           => 'Could not create account: $1',
+'nocookiesnew'                 => 'The user account was created, but you are not logged in.
 {{SITENAME}} uses cookies to log in users.
 You have cookies disabled.
 Please enable them, then log in with your new username and password.',
-'nocookieslogin'                  => '{{SITENAME}} uses cookies to log in users.
+'nocookieslogin'               => '{{SITENAME}} uses cookies to log in users.
 You have cookies disabled.
 Please enable them and try again.',
-'nocookiesfornew'                 => 'The user account was not created, as we could not confirm its source.
+'nocookiesfornew'              => 'The user account was not created, as we could not confirm its source.
 Ensure you have cookies enabled, reload this page and try again.',
-'nocookiesforlogin'               => '{{int:nocookieslogin}}', # only translate this message to other languages if you have to change it
-'noname'                          => 'You have not specified a valid username.',
-'loginsuccesstitle'               => 'Login successful',
-'loginsuccess'                    => "'''You are now logged in to {{SITENAME}} as \"\$1\".'''",
-'nosuchuser'                      => 'There is no user by the name "$1".
+'nocookiesforlogin'            => '{{int:nocookieslogin}}', # only translate this message to other languages if you have to change it
+'noname'                       => 'You have not specified a valid username.',
+'loginsuccesstitle'            => 'Login successful',
+'loginsuccess'                 => "'''You are now logged in to {{SITENAME}} as \"\$1\".'''",
+'nosuchuser'                   => 'There is no user by the name "$1".
 Usernames are case sensitive.
 Check your spelling, or [[Special:UserLogin/signup|create a new account]].',
-'nosuchusershort'                 => 'There is no user by the name "$1".
+'nosuchusershort'              => 'There is no user by the name "$1".
 Check your spelling.',
-'nouserspecified'                 => 'You have to specify a username.',
-'login-userblocked'               => 'This user is blocked. Login not allowed.',
-'wrongpassword'                   => 'Incorrect password entered.
+'nouserspecified'              => 'You have to specify a username.',
+'login-userblocked'            => 'This user is blocked. Login not allowed.',
+'wrongpassword'                => 'Incorrect password entered.
 Please try again.',
-'wrongpasswordempty'              => 'Password entered was blank.
+'wrongpasswordempty'           => 'Password entered was blank.
 Please try again.',
-'passwordtooshort'                => 'Passwords must be at least {{PLURAL:$1|1 character|$1 characters}}.',
-'password-name-match'             => 'Your password must be different from your username.',
-'password-login-forbidden'        => 'The use of this username and password has been forbidden.',
-'mailmypassword'                  => 'Email new password',
-'passwordremindertitle'           => 'New temporary password for {{SITENAME}}',
-'passwordremindertext'            => 'Someone (probably you, from IP address $1) requested a new
+'passwordtooshort'             => 'Passwords must be at least {{PLURAL:$1|1 character|$1 characters}}.',
+'password-name-match'          => 'Your password must be different from your username.',
+'password-login-forbidden'     => 'The use of this username and password has been forbidden.',
+'mailmypassword'               => 'Email new password',
+'passwordremindertitle'        => 'New temporary password for {{SITENAME}}',
+'passwordremindertext'         => 'Someone (probably you, from IP address $1) requested a new
 password for {{SITENAME}} ($4). A temporary password for user
 "$2" has been created and was set to "$3". If this was your
 intent, you will need to log in and choose a new password now.
@@ -1150,53 +1186,53 @@ Your temporary password will expire in {{PLURAL:$5|one day|$5 days}}.
 If someone else made this request, or if you have remembered your password,
 and you no longer wish to change it, you may ignore this message and
 continue using your old password.',
-'noemail'                         => 'There is no email address recorded for user "$1".',
-'noemailcreate'                   => 'You need to provide a valid email address.',
-'passwordsent'                    => 'A new password has been sent to the email address registered for "$1".
+'noemail'                      => 'There is no email address recorded for user "$1".',
+'noemailcreate'                => 'You need to provide a valid email address.',
+'passwordsent'                 => 'A new password has been sent to the email address registered for "$1".
 Please log in again after you receive it.',
-'blocked-mailpassword'            => 'Your IP address is blocked from editing, and so is not allowed to use the password recovery function to prevent abuse.',
-'eauthentsent'                    => 'A confirmation email has been sent to the nominated email address.
+'blocked-mailpassword'         => 'Your IP address is blocked from editing, and so is not allowed to use the password recovery function to prevent abuse.',
+'eauthentsent'                 => 'A confirmation email has been sent to the nominated email address.
 Before any other email is sent to the account, you will have to follow the instructions in the email, to confirm that the account is actually yours.',
-'throttled-mailpassword'          => 'A password reset email has already been sent, within the last {{PLURAL:$1|hour|$1 hours}}.
+'throttled-mailpassword'       => 'A password reset email has already been sent, within the last {{PLURAL:$1|hour|$1 hours}}.
 To prevent abuse, only one password reset email will be sent per {{PLURAL:$1|hour|$1 hours}}.',
-'loginstart'                      => '', # do not translate or duplicate this message to other languages
-'loginend'                        => '', # do not translate or duplicate this message to other languages
-'loginend-https'                  => '', # do not translate or duplicate this message to other languages
-'signupstart'                     => '{{int:loginstart}}', # do not translate or duplicate this message to other languages
-'signupend'                       => '{{int:loginend}}', # do not translate or duplicate this message to other languages
-'signupend-https'                 => '', # do not translate or duplicate this message to other languages
-'mailerror'                       => 'Error sending mail: $1',
-'acct_creation_throttle_hit'      => 'Visitors to this wiki using your IP address have created {{PLURAL:$1|1 account|$1 accounts}} in the last day, which is the maximum allowed in this time period.
+'loginstart'                   => '', # do not translate or duplicate this message to other languages
+'loginend'                     => '', # do not translate or duplicate this message to other languages
+'loginend-https'               => '', # do not translate or duplicate this message to other languages
+'signupstart'                  => '{{int:loginstart}}', # do not translate or duplicate this message to other languages
+'signupend'                    => '{{int:loginend}}', # do not translate or duplicate this message to other languages
+'signupend-https'              => '', # do not translate or duplicate this message to other languages
+'mailerror'                    => 'Error sending mail: $1',
+'acct_creation_throttle_hit'   => 'Visitors to this wiki using your IP address have created {{PLURAL:$1|1 account|$1 accounts}} in the last day, which is the maximum allowed in this time period.
 As a result, visitors using this IP address cannot create any more accounts at the moment.',
-'emailauthenticated'              => 'Your email address was authenticated on $2 at $3.',
-'emailnotauthenticated'           => 'Your email address is not yet authenticated.
+'emailauthenticated'           => 'Your email address was authenticated on $2 at $3.',
+'emailnotauthenticated'        => 'Your email address is not yet authenticated.
 No email will be sent for any of the following features.',
-'noemailprefs'                    => 'Specify an email address in your preferences for these features to work.',
-'emailconfirmlink'                => 'Confirm your email address',
-'invalidemailaddress'             => 'The email address cannot be accepted as it appears to have an invalid format.
+'noemailprefs'                 => 'Specify an email address in your preferences for these features to work.',
+'emailconfirmlink'             => 'Confirm your email address',
+'invalidemailaddress'          => 'The email address cannot be accepted as it appears to have an invalid format.
 Please enter a well-formatted address or empty that field.',
-'cannotchangeemail'               => 'Account email addresses cannot be changed on this wiki.',
-'emaildisabled'                   => 'This site cannot send emails.',
-'accountcreated'                  => 'Account created',
-'accountcreatedtext'              => 'The user account for $1 has been created.',
-'createaccount-title'             => 'Account creation for {{SITENAME}}',
-'createaccount-text'              => 'Someone created an account for your email address on {{SITENAME}} ($4) named "$2", with password "$3".
+'cannotchangeemail'            => 'Account email addresses cannot be changed on this wiki.',
+'emaildisabled'                => 'This site cannot send emails.',
+'accountcreated'               => 'Account created',
+'accountcreatedtext'           => 'The user account for $1 has been created.',
+'createaccount-title'          => 'Account creation for {{SITENAME}}',
+'createaccount-text'           => 'Someone created an account for your email address on {{SITENAME}} ($4) named "$2", with password "$3".
 You should log in and change your password now.
 
 You may ignore this message, if this account was created in error.',
-'usernamehasherror'               => 'Username cannot contain hash characters',
-'login-throttled'                 => 'You have made too many recent login attempts.
+'usernamehasherror'            => 'Username cannot contain hash characters',
+'login-throttled'              => 'You have made too many recent login attempts.
 Please wait before trying again.',
-'login-abort-generic'             => 'Your login was unsuccessful - Aborted',
-'loginlanguagelabel'              => 'Language: $1',
-'loginlanguagelinks'              => '* {{#language:de}}|de
+'login-abort-generic'          => 'Your login was unsuccessful - Aborted',
+'loginlanguagelabel'           => 'Language: $1',
+'loginlanguagelinks'           => '* {{#language:de}}|de
 * {{#language:en}}|en
 * {{#language:eo}}|eo
 * {{#language:fr}}|fr
 * {{#language:es}}|es
 * {{#language:it}}|it
 * {{#language:nl}}|nl', # do not translate or duplicate this message to other languages
-'suspicious-userlogout'           => 'Your request to log out was denied because it looks like it was sent by a broken browser or caching proxy.',
+'suspicious-userlogout'        => 'Your request to log out was denied because it looks like it was sent by a broken browser or caching proxy.',
 
 # Email sending
 'pear-mail-error'        => '$1', # do not translate or duplicate this message to other languages
@@ -1214,6 +1250,7 @@ To finish logging in, you must set a new password here:',
 'oldpassword'               => 'Old password:',
 'newpassword'               => 'New password:',
 'retypenew'                 => 'Retype new password:',
+'resetpass-abort-generic'   => 'Password change has been aborted by an extension.',
 'resetpass_submit'          => 'Set password and log in',
 'resetpass_success'         => 'Your password has been changed successfully!
 Now logging you in...',
@@ -1263,7 +1300,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',
@@ -1813,10 +1850,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',
@@ -1970,6 +2007,7 @@ Your email address is not revealed when other users contact you.',
 'userrights-changeable-col'      => 'Groups you can change',
 'userrights-unchangeable-col'    => 'Groups you cannot change',
 'userrights-irreversible-marker' => '$1*', # only translate this message to other languages if you have to change it
+'userrights-conflict'            => 'User rights conflict! Please apply your changes again.',
 
 # Groups
 'group'               => 'Group:',
@@ -2395,13 +2433,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 +2820,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.
@@ -3880,11 +3928,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',
+'yesterday-at' => 'Yesterday at $1',
+
 # Bad image list
 'bad_image_list' => 'The format is as follows:
 
@@ -3894,8 +3957,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
@@ -4742,12 +4803,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'    => '',
+'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 +4910,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..68c59ec 100644 (file)
@@ -343,8 +343,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 +357,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 +468,7 @@ $messages = array(
 'vector-action-move' => 'Alinomigi',
 'vector-action-protect' => 'Protekti',
 'vector-action-undelete' => 'Malforigi',
-'vector-action-unprotect' => 'Ŝanĝi protekadon',
+'vector-action-unprotect' => 'Ŝanĝi protektadon',
 'vector-simplesearch-preference' => 'Ebligi simpligitan serĉan strion (nur Vektora etoso)',
 'vector-view-create' => 'Krei',
 'vector-view-edit' => 'Redakti',
@@ -731,9 +730,14 @@ Notu ke iuj paĝoj daŭre ŝajnos kvazaŭ vi ankoraŭ estus ensalutinta, ĝis vi
 'welcomecreation-msg' => 'Via konto estas kreita.
 Ne forgesu ŝanĝi viajn [[Special:Preferences|{{SITENAME}}-preferojn]]',
 'yourname' => 'Salutnomo:',
+'userlogin-yourname' => 'Uzantonomo',
+'userlogin-yourname-ph' => 'Enigu vian uzantonomon',
 'yourpassword' => 'Pasvorto:',
+'userlogin-yourpassword' => 'Pasvorto',
+'userlogin-yourpassword-ph' => 'Enigu vian pasvorton',
 'yourpasswordagain' => 'Retajpu pasvorton',
 'remembermypassword' => 'Memori mian ensalutadon ĉe ĉi tiu komputilo (daŭrante maksimume $1 {{PLURAL:$1|tagon|tagojn}})',
+'userlogin-remembermypassword' => 'Memoru mian ensaluton',
 'securelogin-stick-https' => 'Resti konektita al HTTPS post ensalutado',
 'yourdomainname' => 'Via domajno',
 'password-change-forbidden' => 'Ve ne povas ŝanĝi pasvortojn en ĉi tiu vikio.',
@@ -746,12 +750,14 @@ Ne forgesu ŝanĝi viajn [[Special:Preferences|{{SITENAME}}-preferojn]]',
 'logout' => 'Elsaluti',
 'userlogout' => 'Elsaluti',
 'notloggedin' => 'Ne ensalutinta',
+'userlogin-noaccount' => 'Ĉu vi ne havas konton?',
 'nologin' => "Ĉu vi ne havas konton? '''$1'''.",
 'nologinlink' => 'Krei konton',
 'createaccount' => 'Krei novan konton',
 'gotaccount' => "Ĉu vi jam havas konton? '''$1'''.",
 'gotaccountlink' => 'Ensaluti',
 'userlogin-resetlink' => 'Ĉu vi forgesis ensalutajn detalojn?',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Helpo pri ensalutado]]',
 'createaccountmail' => 'Uzi provizoran hazardsignan pasvorton kaj sendi ĝin al la retpoŝto suben',
 'createaccountreason' => 'Kialo:',
 'badretype' => 'La pasvortojn kiujn vi tajpis ne egalas.',
@@ -823,6 +829,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,9 +851,10 @@ 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-text' => 'Plenigu ĉi tiun formularon por renovigi vian pasvorton.',
 'passwordreset-legend' => 'Refari pasvorton',
 'passwordreset-disabled' => 'Pasvortaj restarigoj estis malŝaltitaj en ĉi tiu vikio.',
+'passwordreset-emaildisabled' => 'Retpoŝtaj funkcioj estas malfunkciigitaj en tiu ĉi vikio.',
 'passwordreset-pretext' => '{{PLURAL:$1||Enigi unu el la jenaj datenoj}}',
 'passwordreset-username' => 'Salutnomo:',
 'passwordreset-domain' => 'Domajno:',
@@ -876,9 +884,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 +930,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.',
@@ -1096,6 +1105,8 @@ Verŝajne ĝi estis forigita.',
 'content-failed-to-parse' => 'Oni malsukcesis analizi $2-entenon laŭ la $1-modelo: $3',
 'invalid-content-data' => 'Enhavo estas malvalida',
 'content-not-allowed-here' => 'Enhavo de $1 ne estas permesita en paĝo [[$2]]',
+'editwarning-warning' => 'Forlasante ĉi tiun paĝon kaŭzos al vi perdi iun ajn ŝanĝojn kiujn vi faris.
+Se vi ensalutas, vi povas malŝalti ĉi tiun averton en la sekcio "{{int:prefs-editing}}" de viaj preferoj.',
 
 # Content models
 'content-model-wikitext' => 'vikiteksto',
@@ -1358,7 +1369,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 +1390,7 @@ Provu prefiksi vian mendon kun ''all:'' por serĉi ĉiun enhavon (inkluzivante d
 'search-external' => 'Ekstera serĉo',
 'searchdisabled' => '<p>Oni provizore malŝaltis serĉadon per la plenteksta
 indekso pro troŝarĝita servilo. Intertempe, vi povas serĉi per <i>guglo</i> aŭ per <i>jahu!</i>:</p>',
-
-# Quickbar
-'qbsettings' => 'Preferoj pri ilaro',
-'qbsettings-none' => 'Neniu',
-'qbsettings-fixedleft' => 'Fiksiĝas maldekstre',
-'qbsettings-fixedright' => 'Fiksiĝas dekstre',
-'qbsettings-floatingleft' => 'Ŝvebas maldekstre',
-'qbsettings-floatingright' => 'Ŝvebas dekstre',
-'qbsettings-directionality' => 'Fiksita, laŭ la teksto-direkteco de via lingvo',
+'search-error' => 'Okazis eraro dum serĉado: $1',
 
 # Preferences page
 'preferences' => 'Preferoj',
@@ -1929,7 +1932,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>
@@ -2465,6 +2467,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 +2483,9 @@ Jen la aktualaj valoroj por la paĝo '''$1''':",
 'protect-cascadeon' => 'Ĉi paĝo estas nun protektita kontraŭ redaktado ĉar ĝi estas inkluzivita en {{PLURAL:$1|jena paĝo, kiu mem estas protektita|jenaj paĝoj, kiuj mem estas protektitaj}} per kaskada protekto.
 Vi povas ŝanĝi ties protektnivelon, sed tio ne ŝanĝos la kaskadan protekton.',
 'protect-default' => 'Permesigi ĉiujn uzantojn',
-'protect-fallback' => 'Rajto "$1" nepras.',
+'protect-fallback' => 'Permesi nur uzantojn kun la rajto  "$1"',
 'protect-level-autoconfirmed' => 'Bloki novajn kaj neregistritajn uzantojn',
-'protect-level-sysop' => 'Nur administrantoj',
+'protect-level-sysop' => 'Permesi nur administrantojn',
 'protect-summary-cascade' => 'kaskada',
 'protect-expiring' => 'finiĝas je $1 (UTC)',
 'protect-expiring-local' => 'eksdatiĝas $1',
@@ -3059,13 +3062,8 @@ 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. */',
@@ -3078,13 +3076,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 +3127,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 +3156,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 +3235,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:
 
@@ -3926,13 +3921,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 +4010,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 +4022,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 +4038,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..8a1fe4d 100644 (file)
  * @author Fibonacci
  * @author Fitoschido
  * @author Fluence
+ * @author Fortega
  * @author Gustronico
  * @author Gwickwire
+ * @author Hahc21
  * @author Hazard-SJ
  * @author Hercule
  * @author Icvav
@@ -60,6 +62,7 @@
  * @author Mahadeva
  * @author Manuelt15
  * @author Maor X
+ * @author MarcoAurelio
  * @author McDutchie
  * @author Muro de Aguas
  * @author Omnipaedista
@@ -394,8 +397,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 +411,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',
@@ -778,9 +780,20 @@ 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' => 'Nombre de usuario',
+'userlogin-yourname-ph' => 'Escribe tu nombre de usuario',
+'createacct-helpusername-url' => '{{ns:Project}}:Política_de_nombres_de_usuario',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(ayúdame a elegir)]]',
 '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 iniciada',
+'userlogin-signwithsecure' => 'Idetificarse mediante servidor seguro',
 '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 +806,39 @@ 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' => 'Unirse 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?',
+'helplogin-url' => 'Help:Inicio de sesión',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ayuda para identificarse]]',
+'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-captcha-help-url' => '{{ns:Project}}:Solicitar una cuenta',
+'createacct-imgcaptcha-help' => '¿No ves la imagen? [[{{MediaWiki:createacct-captcha-help-url}}|Solicitar una cuenta]]',
+'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' => 'ediciones',
+'createacct-benefit-body2' => 'páginas',
+'createacct-benefit-body3' => '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.
@@ -894,12 +928,14 @@ 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-legend' => 'Restablecer contraseña',
 'passwordreset-disabled' => 'Se ha desactivado el restablecimiento de contraseñas en este wiki.',
+'passwordreset-emaildisabled' => 'Las funciones de correo electrónico han sido desactivadas en esta wiki.',
 'passwordreset-pretext' => '{{PLURAL:$1||Introduce uno de los elementos de datos siguientes}}',
 'passwordreset-username' => 'Nombre de usuario:',
 'passwordreset-domain' => 'Dominio:',
@@ -907,15 +943,14 @@ Puede que ya hayas cambiado la contraseña o que hayas pedido una temporal.',
 '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 +965,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',
@@ -1145,6 +1180,8 @@ Ya existe.',
 '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' => 'Dejar esta página le causará la pérdida de cualquier cambio que haya hecho.
+Si está "logueado", puede deshabilitar esta advertencia en la sección "{{int:prefs-editing}}" de sus preferencias.',
 
 # Content models
 'content-model-wikitext' => 'texto wiki',
@@ -1430,15 +1467,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 +1476,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 +1609,7 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
 'userrights-notallowed' => 'Tu cuenta no tiene permiso para añadir o retirar permisos de usuario.',
 'userrights-changeable-col' => 'Grupos que puedes cambiar',
 'userrights-unchangeable-col' => 'Grupos que no puedes cambiar',
+'userrights-conflict' => 'Hay un conflicto de permisos de usuario. Aplica tus cambios de nuevo.',
 
 # Groups
 'group' => 'Grupo:',
@@ -2315,6 +2345,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.
@@ -2619,7 +2658,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
@@ -2736,7 +2775,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 +2835,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',
@@ -3108,7 +3148,7 @@ 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" */',
@@ -3290,11 +3330,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:
 
@@ -3885,7 +3939,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 +3953,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 +3967,16 @@ 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.',
+'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 +4068,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',
@@ -4021,12 +4082,12 @@ Este sitio está experimentando dificultades técnicas.',
 '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-legacy' => '$1 modificó la visibilidad de varias ediciones en la página $3',
 'logentry-suppress-delete' => '$1 {{GENDER:$2|borró}}, con restricciones para administradores aplicadas, la página $3',
 'logentry-suppress-event' => '$1 modificó secretamente la visibilidad de {{PLURAL:$5|un evento del registro|$5 eventos del registro}} en $3: $4',
 'logentry-suppress-revision' => '$1 modificó secretamente la visibilidad de {{PLURAL:$5|una edición|$5 ediciones}} en la página $3: $4',
 'logentry-suppress-event-legacy' => '$1 modificó secretamente la visibilidad de los eventos del registro en $3',
-'logentry-suppress-revision-legacy' => '$1 modificó secretamente la visibilidad de las ediciones en la página $3',
+'logentry-suppress-revision-legacy' => '$1 modificó secretamente la visibilidad de varias ediciones en la página $3',
 'revdelete-content-hid' => 'contenido ocultado',
 'revdelete-summary-hid' => 'resumen de edición oculto',
 'revdelete-uname-hid' => 'nombre de usuario ocultado',
@@ -4038,17 +4099,17 @@ Este sitio está experimentando dificultades técnicas.',
 'logentry-move-move' => '$1 movió la página $3 a $4',
 'logentry-move-move-noredirect' => '$1 movió la página $3 a $4 sin dejar una redirección',
 'logentry-move-move_redir' => '$1 movió la página $3 a $4 sobre una redirección',
-'logentry-move-move_redir-noredirect' => '$1 movió la página $3 a $4 sobre una redirección, sin dejar redirección',
-'logentry-patrol-patrol' => '$1 marcó la edición $4 de la página $3 como patrullada',
+'logentry-move-move_redir-noredirect' => '$1 movió la página $3 a $4 sobre una redirección y sin dejar una redirección',
+'logentry-patrol-patrol' => '$1 marcó como patrullada la edición $4 de la página $3',
 'logentry-patrol-patrol-auto' => '$1 marcó automáticamente la edición $4 de la página $3 como patrullada',
-'logentry-newusers-newusers' => 'Se ha creado la cuenta de usuario $1',
-'logentry-newusers-create' => 'Se ha creado la cuenta de usuario $1',
-'logentry-newusers-create2' => '$1 ha creado la cuenta de usuario $3',
-'logentry-newusers-byemail' => '$1 creó la cuenta de usuario $3 y la contraseña se envió por correo electrónico',
+'logentry-newusers-newusers' => 'La cuenta de usuario $1 ha sido 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..c3a4a69 100644 (file)
@@ -320,8 +320,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 +333,7 @@ $messages = array(
 'tog-diffonly' => 'Ära näita erinevuste vaate all lehe sisu',
 'tog-showhiddencats' => 'Näita peidetud kategooriaid',
 'tog-norollbackdiff' => 'Ära näita erinevusi pärast tühistamist',
+'tog-useeditwarning' => 'Hoiata mind, kui lahkun redigeerimisleheküljelt muudatusi salvestamata',
 
 'underline-always' => 'Alati',
 'underline-never' => 'Mitte kunagi',
@@ -703,9 +702,20 @@ 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',
+'createacct-helpusername-url' => '{{ns:Project}}:Kasutajanime põhimõtted',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(aita mul valida)]]',
 'yourpassword' => 'Parool:',
+'userlogin-yourpassword' => 'Parool',
+'userlogin-yourpassword-ph' => 'Sisesta oma parool',
+'createacct-yourpassword-ph' => 'Sisesta parool',
 'yourpasswordagain' => 'Sisesta parool uuesti:',
+'createacct-yourpasswordagain' => 'Parooli kinnitus',
+'createacct-yourpasswordagain-ph' => 'Sisesta uuesti parool',
 'remembermypassword' => 'Jäta parool meelde (kuni $1 {{PLURAL:$1|päevaks|päevaks}})',
+'userlogin-remembermypassword' => 'Jää sisseloginuks',
+'userlogin-signwithsecure' => 'Logi sisse turvaserveri kaudu',
 'securelogin-stick-https' => 'Jätka pärast sisselogimist HTTPS-ühenduse kasutamist',
 'yourdomainname' => 'Sinu domeen:',
 'password-change-forbidden' => 'Selles vikis ei saa paroole muuta.',
@@ -718,18 +728,39 @@ Pane tähele, et seni kuni sa pole oma võrgulehitseja puhvrit tühjendanud, võ
 'logout' => 'Logi välja',
 'userlogout' => 'Logi välja',
 'notloggedin' => 'Sisse logimata',
+'userlogin-noaccount' => 'Kas sul pole kontot?',
+'userlogin-joinproject' => 'Ühine projektiga {{SITENAME}}',
 'nologin' => "Sul pole kontot? '''$1'''.",
 'nologinlink' => 'Registreeru siin',
 'createaccount' => 'Loo uus konto',
 'gotaccount' => "Kui sul on juba konto, '''$1'''.",
 'gotaccountlink' => 'logi sisse',
 'userlogin-resetlink' => 'Kas oled unustanud oma sisselogimisandmed?',
+'helplogin-url' => 'Help:Sisselogimine',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Sisselogimisabi]]',
+'createacct-join' => 'Sisesta allapoole oma andmed.',
+'createacct-emailrequired' => 'E-posti aadress',
+'createacct-emailoptional' => 'E-posti aadress (valikuline)',
+'createacct-email-ph' => 'Sisesta oma e-posti aadress',
 'createaccountmail' => 'Kasuta juhuslikku parooli ja saada see allpool määratud e-posti aadressile',
+'createacct-realname' => 'Pärisnimi (valikuline)',
 'createaccountreason' => 'Põhjus:',
+'createacct-reason' => 'Põhjus',
+'createacct-reason-ph' => 'Miks lood teist kontot?',
+'createacct-captcha' => 'Turvakontroll',
+'createacct-captcha-help-url' => '{{ns:Project}}:Kontotaotlus',
+'createacct-imgcaptcha-help' => 'Kas sa ei näe pilti? [[{{MediaWiki:createacct-captcha-help-url}}|Taotle kontot]]',
+'createacct-imgcaptcha-ph' => 'Sisesta ülalnähtav tekst',
+'createacct-submit' => 'Loo oma konto',
+'createacct-benefit-heading' => '{{SITENAME}} on sinusuguste inimeste tehtud.',
+'createacct-benefit-body1' => 'muudatust',
+'createacct-benefit-body2' => 'lehekülge',
+'createacct-benefit-body3' => 'hiljutist kaastöölist',
 'badretype' => 'Sisestatud paroolid ei lange kokku.',
 'userexists' => 'Sisestatud kasutajanimi on juba kasutusel.
 Palun valige uus nimi.',
 'loginerror' => 'Viga sisselogimisel',
+'createacct-error' => 'Tõrge konto loomisel',
 'createaccounterror' => 'Kasutajakonto loomine ebaõnnestus: $1',
 'nocookiesnew' => 'Kasutajakonto loodi, aga sa ei ole sisse logitud, sest {{SITENAME}} kasutab kasutajate tuvastamisel küpsiseid. Sinu brauseris on küpsised keelatud. Palun sea küpsised lubatuks ja logi siis oma vastse kasutajanime ning parooliga sisse.',
 'nocookieslogin' => '{{SITENAME}} kasutab kasutajate tuvastamisel küpsiseid. Sinu brauseris on küpsised keelatud. Palun sea küpsised lubatuks ja proovi siis uuesti.',
@@ -790,6 +821,7 @@ Palun pea nüüd pisut vahet.',
 # Email sending
 'php-mail-error-unknown' => 'Tundmatu tõrge PHP funktsioonis mail().',
 'user-mail-no-addy' => 'Püüdsid saata e-kirja ilma meiliaadressita.',
+'user-mail-no-body' => 'Püüti saata tühja või ebamõistlikult lühikese sisuosaga e-kirja.',
 
 # Change password dialog
 'resetpass' => 'Parooli muutmine',
@@ -810,12 +842,14 @@ 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-legend' => 'Parooli lähtestamine',
 'passwordreset-disabled' => 'Selles vikis on paroolide lähtestamine keelatud.',
+'passwordreset-emaildisabled' => 'E-posti funktsioonid on selles vikis keelatud.',
 'passwordreset-pretext' => '{{PLURAL:$1||Sisesta üks järgmistest andmeüksustest.}}',
 'passwordreset-username' => 'Kasutajanimi:',
 'passwordreset-domain' => 'Domeen:',
@@ -839,7 +873,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',
@@ -1055,6 +1089,8 @@ See on juba olemas.',
 'defaultmessagetext' => 'Sõnumi vaiketekst',
 'invalid-content-data' => 'Vigased sisuandmed',
 'content-not-allowed-here' => 'Lehekülg [[$2]] ei või sisaldada $1.',
+'editwarning-warning' => 'Sellelt leheküljelt lahkumise tõttu võivad tehtud muudatused kaotsi minna.
+Kui oled sisse loginud, saad selle hoiatuse eelistuste alaosas "{{int:prefs-editing}}" keelata.',
 
 # Content models
 'content-model-wikitext' => 'vikiteksti',
@@ -1333,15 +1369,6 @@ päringu ees prefiksit ''all:''. Konkreetsest nimeruumist otsimiseks kasuta pref
 Vahepeal saad otsimiseks Google'it kasutada.
 Pane tähele, et Google'is talletatud {{GRAMMAR:genitive|{{SITENAME}}}} sisu võib olla iganenud.",
 
-# Quickbar
-'qbsettings' => 'Kiirriba',
-'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',
-
 # Preferences page
 'preferences' => 'Eelistused',
 'mypreferences' => 'Eelistused',
@@ -1464,7 +1491,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 +1507,11 @@ See ei tohi olla pikem kui {{PLURAL:$1|üks märk|$1 märki}}.',
 'userrights-reason' => 'Põhjus:',
 'userrights-no-interwiki' => 'Sul ei ole luba muuta kasutajaõigusi teistes vikides.',
 'userrights-nodatabase' => 'Andmebaasi $1 ei ole olemas või pole see kohalik.',
-'userrights-nologin' => 'Kasutaja õiguste muutmiseks, pead sa administraatori õigustega kontoga [[Special:UserLogin|sisse logima]].',
+'userrights-nologin' => 'Et kasutajaõigusi jagada, pead administraatori kontoga [[Special:UserLogin|sisse logima]].',
 'userrights-notallowed' => 'Sinu kontole pole antud luba lisada või eemaldada kasutajaõigusi.',
 'userrights-changeable-col' => 'Rühmad, mida sa saad muuta',
 'userrights-unchangeable-col' => 'Rühmad, mida sa ei saa muuta',
+'userrights-conflict' => 'Kasutajaõiguste konflikt! Palun tee muudatused uuesti.',
 
 # Groups
 'group' => 'Rühm:',
@@ -1576,7 +1604,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 +1657,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 +2224,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.
@@ -2399,6 +2436,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:',
@@ -2534,7 +2572,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:',
@@ -3155,11 +3193,17 @@ Järgnevas loendis, mis on sorteeritud $2, on '''$1''' {{PLURAL:$1|fail|faili}}.
 'minutes' => '{{PLURAL:$1|üks minut|$1 minutit}}',
 'hours' => '{{PLURAL:$1|üks tund|$1 tundi}}',
 'days' => '{{PLURAL:$1|üks päev|$1 päeva}}',
+'weeks' => '{{PLURAL:$1|$1 nädal|$1 nädalat}}',
 'months' => '{{PLURAL:$1|Üks kuu|$1 kuud}}',
 'years' => '{{PLURAL:$1|Üks aasta|$1 aastat}}',
 'ago' => '$1 tagasi',
 'just-now' => 'just nüüd',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|tund|tundi}} tagasi',
+'minutes-ago' => '$1 {{PLURAL:$1|minut|minutit}} tagasi',
+'seconds-ago' => '$1 {{PLURAL:$1|sekund|sekundit}} tagasi',
+
 # Bad image list
 'bad_image_list' => 'Arvesse võetakse ainult nimekirja ühikud (read, mis algavad sümboliga *).
 Esimene link real peab olema link kõlbmatule failile.
@@ -3743,12 +3787,16 @@ 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.',
+'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 +3887,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 +3925,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 +3992,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 a3ecc82..591f6ed 100644 (file)
@@ -538,6 +538,16 @@ $messages = array(
 'nov' => 'نوامبر',
 'dec' => 'دسامبر',
 
+'monday-at' => 'دوشنبهٔ $1',
+'tuesday-at' => 'سه‌شنبهٔ $1',
+'wednesday-at' => 'چهارشنبهٔ $1',
+'thursday-at' => 'پنج‌شنبهٔ $1',
+'friday-at' => 'جمعهٔ $1',
+'saturday-at' => 'شنبهٔ $1',
+'sunday-at' => 'یک‌شنبهٔ $1',
+'today-at' => '$1',
+'yesterday-at' => 'دیروز $1',
+
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|رده|رده‌ها}}',
 'category_header' => 'صفحه‌های ردهٔ «$1»',
@@ -4272,4 +4282,8 @@ $5
 # Image rotation
 'rotate-comment' => 'تصویر به دست $1 {{PLURAL:$1|درجهٔ|درجهٔ}} ساعت‌گرد چرخانده شد',
 
+# Unknown messages
+'hours-ago' => '$1 {{PLURAL:$1|ساعت|ساعت}} قبل',
+'minutes-ago' => '$1 {{PLURAL:$1|دقیقه|دقیقه}} قبل',
+'seconds-ago' => '$1 {{PLURAL:$1|ثانیه|ثانیه}} قبل',
 );
index 3c5799b..848e4e1 100644 (file)
@@ -720,10 +720,19 @@ 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',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(auta minua valitsemaan)]]',
 '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' => 'Kirjaudu sisään salatun yhteyden yli',
 '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 +745,37 @@ Huomaa, että jotkut sivut saattavat näkyä edelleen kuin olisit kirjautunut si
 'logout' => 'Kirjaudu ulos',
 'userlogout' => 'Kirjaudu ulos',
 'notloggedin' => 'Et ole kirjautunut',
+'userlogin-noaccount' => 'Eikö sinulla vielä ole käyttäjätunnusta?',
+'userlogin-joinproject' => 'Liity {{GRAMMAR:illative|{{SITENAME}}}}',
 'nologin' => "Jos sinulla ei ole vielä käyttäjätunnusta, '''$1'''.",
 'nologinlink' => 'voit luoda sellaisen',
 'createaccount' => 'Luo uusi käyttäjätunnus',
 'gotaccount' => "Jos sinulla on jo tunnus, voit '''$1'''.",
 'gotaccountlink' => 'kirjautua sisään',
 'userlogin-resetlink' => 'Unohditko salasanasi?',
+'userlogin-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-captcha-help-url' => '{{ns:Project}}:Pyydä tunnusta',
+'createacct-imgcaptcha-help' => 'Et näe kuvaa? [[{{MediaWiki:createacct-captcha-help-url}}|Pyydä tunnusta]]',
+'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' => 'muokkausta',
+'createacct-benefit-body2' => 'sivua',
+'createacct-benefit-body3' => 'viimeaikaiset muokkaajat',
 '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.',
@@ -2197,6 +2226,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.
@@ -3758,12 +3796,8 @@ 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.',
+'redirect-submit' => 'Siirry',
+'redirect-file' => 'Tiedostonimi',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Kaksoiskappaleiden haku',
index 4d334d2..e6df159 100644 (file)
@@ -112,58 +112,57 @@ $linkTrail = '/^([áðíóúýæøa-z]+)(.*)$/sDu';
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'Undurstrika ávísingar',
-'tog-justify' => 'Stilla greinpart',
-'tog-hideminor' => 'Goym minni broytingar í seinast broytt listanum',
-'tog-hidepatrolled' => 'Goym eftirkannaðar rættingar í seinastu broytingum',
+'tog-underline' => 'Undirstrika leinki:',
+'tog-justify' => 'Lat tekstin fáa javnan kant til høgru',
+'tog-hideminor' => 'Krógva minni broytingar í seinastu broytingum',
+'tog-hidepatrolled' => 'Krógva eftirkannaðar rættingar í seinastu broytingum',
 'tog-newpageshidepatrolled' => 'Goym eftirkannaðar síður frá listanum yvir nýggjar síður',
 'tog-extendwatchlist' => 'Víðka eftirlitslistan fyri at vísa allar broytingar, ikki bara tær seinastu',
 'tog-usenewrc' => 'Bólkað broytingar eftir síðu í seinastu rættingar og eftirlitslita (krevur JavaScript)',
-'tog-numberheadings' => 'Sjálvtalmerking av yvirskrift',
-'tog-showtoolbar' => 'Vís amboðslinju í rætting',
-'tog-editondblclick' => 'Rætta síðu við at tvíklikkja (JavaScript)',
-'tog-editsection' => 'Rætta greinpart við hjálp av [rætta]-ávísing',
-'tog-editsectiononrightclick' => 'Rætta greinpart við at høgraklikkja á yvirskrift av greinparti (JavaScript)',
-'tog-showtoc' => 'Vís innihaldsyvurlit (Til greinir við meira enn trimun greinpartum)',
-'tog-rememberpassword' => 'Minst til loyniorð á hesum kaga (í mesta lagi $1 {{PLURAL:$1|dag|dagar}})',
+'tog-numberheadings' => 'Sjálvvirkandi talmerking av yvirskriftum',
+'tog-showtoolbar' => 'Vís rættingar tóllinju (krevur JavaScript)',
+'tog-editondblclick' => 'Rætta síður við at tvíklikkja (krevur JavaScript)',
+'tog-editsection' => 'Rætta greinpart við hjálp av [rætta] leinkjum',
+'tog-editsectiononrightclick' => 'Rætta greinpart við at høgraklikkja á yvirskrift av greinparti (krevur JavaScript)',
+'tog-showtoc' => 'Vís innihaldsyvirlit (fyri síður við meira enn trimun yvirskriftum)',
+'tog-rememberpassword' => 'Minst til mítt loyniorð á hesum kaga (í mesta lagi í $1 {{PLURAL:$1|dag|dagar}})',
 'tog-watchcreations' => 'Legg síður, sum eg stovni og fílur sum eg leggi út, afturat mínum eftirlitslista',
 'tog-watchdefault' => 'Legg síður sum eg rætti afturat mínum eftirlitslista',
 'tog-watchmoves' => 'Legg síður og fílur, sum eg flyti, afturat mínum eftirlitslista',
 'tog-watchdeletion' => 'Legg síður og fílur, sum eg striki, afturat mínum eftirlitslista',
 'tog-minordefault' => 'Merk sum standard allar broytingar sum smærri',
 'tog-previewontop' => 'Vís forhondsvísning áðren rættingarkassan',
-'tog-previewonfirst' => 'Sýn forskoðan við fyrstu broyting',
+'tog-previewonfirst' => 'Vís forskoðan við fyrstu rætting',
 'tog-nocache' => 'Deaktivera síðu "caching" í brovsaranum',
 'tog-enotifwatchlistpages' => 'Send mær teldupost, tá ein síða ella fíla á mínum eftirlitslista er broytt',
-'tog-enotifusertalkpages' => 'Send mær teldubræv, tá mín brúarasíða er broytt',
+'tog-enotifusertalkpages' => 'Send mær teldubræv, tá mín brúkarasíða er broytt',
 'tog-enotifminoredits' => 'Send mær eisini ein teldupost viðvíkjandi smærri broytingum á síðum og fílum',
 'tog-enotifrevealaddr' => 'Avdúkað mína teldupost adressu í fráboðanar teldupostum',
 'tog-shownumberswatching' => 'Vís tal av brúkarum sum fylgja við',
 'tog-oldsig' => 'Verandi undirskrift:',
 'tog-fancysig' => 'Viðgerð undirskriftina sum wikitekstur (uttan sjálvvirkandi leinkju)',
-'tog-externaleditor' => 'Nýt útvortis ritil sum fyrimynd (bert fyri fólk við serkunnleika, tað er tørvur á serligum innstillingum á tínari teldu. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'Nýt útvortis diff sum fyrimynd (bert fyri serfrøðingar, tín telda tørvar serligar innstillingar. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-showjumplinks' => 'Ger "far til"-tilgongd virkna',
+'tog-showjumplinks' => 'Ger leinkuna "far til" virknað',
 'tog-uselivepreview' => 'Nýt "live preview" (tørvar JavaScript) (á royndarstøði)',
 'tog-forceeditsummary' => 'Gev mær boð, um eg ikki havi skrivað ein samandrátt um mína rætting',
 'tog-watchlisthideown' => 'Fjal mínar rættingar frá eftirliti',
-'tog-watchlisthidebots' => 'Fjal bot rættingar frá eftirliti',
-'tog-watchlisthideminor' => 'Fjal minni rættingar frá eftirliti',
+'tog-watchlisthidebots' => 'Vís ikki rættingar frá botti í eftirlitslistanum',
+'tog-watchlisthideminor' => 'Fjal minni rættingar frá eftirlitslita',
 'tog-watchlisthideliu' => 'Goym broytingar sum eru gjørdar av brúkarum, sum eru loggaðir á, frá hyggjaralistanum',
-'tog-watchlisthideanons' => 'Goym broytingar sum eru gjørdar av dulnevndum brúkarum frá hyggjaralistanum',
+'tog-watchlisthideanons' => 'Krógva broytingar sum eru gjørdar av dulnevndum brúkarum frá eftirlitslistanum',
 'tog-watchlisthidepatrolled' => 'Fjal eftirhugdar broytingar frá eftirlitslistanum',
-'tog-ccmeonemails' => 'Send mær avrit av teldubrøvum, sum eg sendi til aðrir brúkarar',
-'tog-diffonly' => 'Vís ikki innihaldið av síðuni undir diffs',
+'tog-ccmeonemails' => 'Send mær avrit av teldubrøvum, sum eg sendi til aðrar brúkarar',
+'tog-diffonly' => 'Vís ikki innihaldið av síðuni undir broytingum',
 'tog-showhiddencats' => 'Vís goymdir bólkar',
-'tog-norollbackdiff' => 'Síggj burtur frá diff eftir eina afturrulling',
+'tog-norollbackdiff' => 'Vís ikki munin eftir eina afturrulling',
+'tog-useeditwarning' => 'Ávara meg, tá ið eg fari frá einari rættingarsíðu, sum hevur broytingar ið ikki eru goymdar.',
 
 'underline-always' => 'Altíð',
 'underline-never' => 'Ongantíð',
-'underline-default' => 'Standard fyri útsjónd og kaga',
+'underline-default' => 'Standard fyri útsjónd ella kaga',
 
 # Font style option in Special:Preferences
-'editfont-style' => 'Rættað økið typografi:',
-'editfont-default' => 'Kagi (brovsari) standard',
+'editfont-style' => 'Skriftstílur við rætting:',
+'editfont-default' => 'Standard kagi',
 'editfont-monospace' => 'Føst breidd (monospaced font)',
 'editfont-sansserif' => 'Sans-serif skrift',
 'editfont-serif' => 'Serif skrift',
@@ -222,11 +221,11 @@ $messages = array(
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Bólkur|Bólkar}}',
-'category_header' => 'Greinir í bólki "$1"',
-'subcategories' => 'Undirbólkur',
-'category-media-header' => 'Media í bólkur "$1"',
+'category_header' => 'Síður í bólki "$1"',
+'subcategories' => 'Undirbólkar',
+'category-media-header' => 'Miðlar í bólki "$1"',
 'category-empty' => "''Hesin bólkur inniheldur ongar greinir ella miðlar í løtuni.''",
-'hidden-categories' => '{{PLURAL:$1|Hidden category|Fjaldir bólkar}}',
+'hidden-categories' => '{{PLURAL:$1|Fjaldur bólkur|Fjaldir bólkar}}',
 'hidden-category-category' => 'Fjaldir bólkar',
 'category-subcat-count' => '{{PLURAL:$2|Hesin bólkur hevur bert henda undirbólk.|Hesin bólkur hevur fylgjandi {{PLURAL:$1|undirbólk|$1 undirbólkar}}, av $2 í alt.}}',
 'category-subcat-count-limited' => 'Hesin bólkur hevur fylgjandi {{PLURAL:$1|undirbólk|$1 undirbólkar}}.',
@@ -244,16 +243,16 @@ $messages = array(
 'newwindow' => '(kemur í nýggjan glugga)',
 'cancel' => 'Ógilda',
 'moredotdotdot' => 'Meira...',
-'morenotlisted' => 'Meira, ið ikki verður víst',
+'morenotlisted' => 'Meira, sum ikki er nevnt her...',
 'mypage' => 'Síða',
 'mytalk' => 'Kjak',
-'anontalk' => 'Kjak til hesa ip-adressuna',
+'anontalk' => 'Kjak til hesa IP-adressuna',
 'navigation' => 'Navigatión',
 'and' => '&#32;og',
 
 # Cologne Blue skin
 'qbfind' => 'Finn',
-'qbbrowse' => 'Kaga',
+'qbbrowse' => 'Leita',
 'qbedit' => 'Rætta',
 'qbpageoptions' => 'Henda síðan',
 'qbmyoptions' => 'Mínar síður',
@@ -267,11 +266,11 @@ $messages = array(
 'vector-action-move' => 'Flyt',
 'vector-action-protect' => 'Friða',
 'vector-action-undelete' => 'Endurstovna',
-'vector-action-unprotect' => 'Broyt friðing',
+'vector-action-unprotect' => 'Broyt verju',
 'vector-simplesearch-preference' => 'Ger lættari leititeig virknan (bert Vector útsjónd)',
 'vector-view-create' => 'Stovna',
 'vector-view-edit' => 'Rætta',
-'vector-view-history' => 'Søga',
+'vector-view-history' => 'Vís søgu',
 'vector-view-view' => 'Les',
 'vector-view-viewsource' => 'Vís keldu',
 'actions' => 'Gerningar',
@@ -285,22 +284,22 @@ $messages = array(
 'help' => 'Hjálp',
 'search' => 'Leita',
 'searchbutton' => 'Leita',
-'go' => 'Far til',
+'go' => 'Far',
 'searcharticle' => 'Far',
-'history' => 'Síðusøga',
+'history' => 'Søgan hjá síðuni',
 'history_short' => 'Søga',
 'updatedmarker' => 'dagført síðan mína seinastu vitjan',
 'printableversion' => 'Prentvinarlig útgáva',
 'permalink' => 'Støðug slóð',
 'print' => 'Prenta',
-'view' => 'Les',
+'view' => 's',
 'edit' => 'Rætta',
 'create' => 'Stovna',
 'editthispage' => 'Rætta hesa síðuna',
 'create-this-page' => 'Stovna hesa síðuna',
 'delete' => 'Strika',
 'deletethispage' => 'Strika hesa síðuna',
-'undelete_short' => 'Ógilda striking av {{PLURAL:$1|broyting|$1 broytingar}}',
+'undelete_short' => 'Ógilda striking av {{PLURAL:$1|einari rætting|$1 broytingum}}',
 'viewdeleted_short' => 'Vís {{PLURAL:$1|eina strikaða broyting|$1 strikaðar broytingar}}',
 'protect' => 'Friða',
 'protect_change' => 'broyt',
@@ -310,22 +309,22 @@ $messages = array(
 'newpage' => 'Nýggj síða',
 'talkpage' => 'Kjakast um hesa síðuna',
 'talkpagelinktext' => 'Kjak',
-'specialpage' => 'Serlig síða',
+'specialpage' => 'Serstøk síða',
 'personaltools' => 'Persónlig amboð',
 'postcomment' => 'Nýtt brot',
-'articlepage' => 'Skoða innihaldssíðuna',
+'articlepage' => 'Vís síðu við innihaldi',
 'talk' => 'Kjak',
 'views' => 'Skoðanir',
-'toolbox' => 'Amboð',
-'userpage' => 'Vís brúkarisíðu',
+'toolbox' => 'Amboðskassi',
+'userpage' => 'Vís brúkarasíðu',
 'projectpage' => 'Vís verkætlanarsíðu',
-'imagepage' => 'Vís síðu við fílum',
-'mediawikipage' => 'Vís kervisboðsíðu',
-'templatepage' => 'Vís fyrimyndsíðu',
-'viewhelppage' => 'Vís hjálpsíðu',
-'categorypage' => 'Vís bólkursíðu',
+'imagepage' => 'Vís fílusíðuna',
+'mediawikipage' => 'Vís síðu við boðum',
+'templatepage' => 'Vís fyrimyndasíðu',
+'viewhelppage' => 'Vís hjálparsíðu',
+'categorypage' => 'Vís bólkasíðu',
 'viewtalkpage' => 'Vís kjak',
-'otherlanguages' => 'Onnur mál',
+'otherlanguages' => 'Á øðrum málum',
 'redirectedfrom' => '(Ávíst frá $1)',
 'redirectpagesub' => 'Ávísingarsíða',
 'lastmodifiedat' => 'Hendan síðan var seinast broytt $2, $1.',
@@ -339,7 +338,7 @@ Ov nógvir brúkarir royna at síggja hesa síðuna.
 Vinarliga bíða eina løtu, áðrenn tú roynir enn einaferð at fáa atgongd til hesa síðuna.
 
 $1',
-'pool-timeout' => 'Støðgur bíða verður eftir lásinum',
+'pool-timeout' => 'Støðgur, bíða verður eftir lásinum',
 'pool-queuefull' => 'Køin til "hylin" er full',
 'pool-errorunknown' => 'Ókend villa',
 
@@ -347,19 +346,19 @@ $1',
 'aboutsite' => 'Um {{SITENAME}}',
 'aboutpage' => 'Project:Um',
 'copyright' => 'Innihald er tøkt undir $1.',
-'copyrightpage' => '{{ns:project}}:Útgávurættur',
-'currentevents' => 'Núverandi hendingar',
-'currentevents-url' => 'Project:Núverandi hendingar',
+'copyrightpage' => '{{ns:project}}:Upphavsrættur',
+'currentevents' => 'Aktuellar hendingar',
+'currentevents-url' => 'Project:Aktuellar hendingar',
 'disclaimers' => 'Fyrivarni',
-'disclaimerpage' => 'Project:Fyrivarni',
-'edithelp' => 'Rættihjálp',
-'edithelppage' => 'Help:Rættihjálp',
+'disclaimerpage' => 'Project:Generelt fyrivarni',
+'edithelp' => 'Rættingarhjálp',
+'edithelppage' => 'Help:Rætting',
 'helppage' => 'Help:Innihald',
 'mainpage' => 'Forsíða',
 'mainpage-description' => 'Forsíða',
 'policy-url' => 'Project:Handfaring av persónligum upplýsingum',
-'portal' => 'Forsíða fyri høvundar',
-'portal-url' => 'Project:Forsíða fyri høvundar',
+'portal' => 'Brúkaraportalur',
+'portal-url' => 'Project:Brúkaraportalur',
 'privacy' => 'Handfaring av persónligum upplýsingum',
 'privacypage' => 'Project:Handfaring av persónligum upplýsingum',
 
@@ -372,7 +371,7 @@ $1',
 Sí [[Special:Version|versjón síða]].',
 
 'ok' => 'Í lagi',
-'retrievedfrom' => 'Heinta frá "$1"',
+'retrievedfrom' => 'Heintað frá "$1"',
 'youhavenewmessages' => 'Tú hevur $1 ($2).',
 'newmessageslink' => 'nýggj boð',
 'newmessagesdifflink' => 'seinasta broyting',
@@ -407,7 +406,7 @@ Sí [[Special:Version|versjón síða]].',
 'sort-ascending' => 'Bólkað hækkandi',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'Grein',
+'nstab-main' => 'Síða',
 'nstab-user' => 'Brúkarasíða',
 'nstab-media' => 'Miðil',
 'nstab-special' => 'Serstøk síða',
@@ -528,9 +527,20 @@ 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',
+'createacct-helpusername-url' => '{{ns:Project}}:Username_policy',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(hjálp mær at velja)]]',
 'yourpassword' => 'Títt loyniorð:',
+'userlogin-yourpassword' => 'Loyniorð',
+'userlogin-yourpassword-ph' => 'Skriva títt loyniorð',
+'createacct-yourpassword-ph' => 'Skrivað eitt loyniorð',
 'yourpasswordagain' => 'Skriva loyniorð umaftur:',
+'createacct-yourpasswordagain' => 'Váttað loyniorðið',
+'createacct-yourpasswordagain-ph' => 'Skrivað loyniorðið enn einaferð',
 'remembermypassword' => 'Minst til logg inn hjá mær á hesum kaganum (í mesta lagi í $1 {{PLURAL:$1|dag|dagar}})',
+'userlogin-remembermypassword' => 'Minst til mín',
+'userlogin-signwithsecure' => 'Rita inn við tryggum ambætara',
 'securelogin-stick-https' => 'Varðveit sambandið við HTTPS eftir logg inn',
 'yourdomainname' => 'Títt domene:',
 'password-change-forbidden' => 'Tú kanst ikki broyta loyniorð á hesi wiki.',
@@ -543,18 +553,37 @@ Gloym ikki at broyta tínar [[Special:Preferences|{{SITENAME}}-innstillingar]].'
 'logout' => 'Útrita',
 'userlogout' => 'Rita út',
 'notloggedin' => 'Ikki ritað inn',
+'userlogin-noaccount' => 'Hevur tú ikki nakra kontu?',
+'userlogin-joinproject' => 'Meldað teg til {{SITENAME}}',
 'nologin' => "Hevur tú ikki eina kontu? '''$1'''.",
 'nologinlink' => 'Stovna eina kontu',
 'createaccount' => 'Stovna nýggja kontu',
 'gotaccount' => "Hevur tú longu eina kontu? '''$1'''.",
 'gotaccountlink' => 'Rita inn',
 'userlogin-resetlink' => 'Hevur tú gloymt tínar logg inn upplýsingar',
+'helplogin-url' => 'Help:Innritan',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hjálp til innritan]]',
+'createacct-join' => 'Skrivað tínar upplýsingar niðanfyri.',
+'createacct-emailrequired' => 'Teldupost adressa',
+'createacct-emailoptional' => 'Teldupost adressa (valfrítt)',
+'createacct-email-ph' => 'Skrivað tína email adressu',
 'createaccountmail' => 'Nýt eitt fyribils tilvildarligt loyniorð og send tað til t-post adressuna niðanfyri',
+'createacct-realname' => 'Veruligt navn (valfrítt)',
 'createaccountreason' => 'Orsøk:',
+'createacct-reason' => 'Orsøk',
+'createacct-captcha' => 'Trygdarkekk',
+'createacct-captcha-help-url' => '{{ns:Project}}:Bílegg eina konto',
+'createacct-imgcaptcha-help' => 'Sært tú ikki myndina? [[{{MediaWiki:createacct-captcha-help-url}}|Bið um eina konto]]',
+'createacct-imgcaptcha-ph' => 'Skriva tekstin ið tú sært omanfyri',
+'createacct-benefit-heading' => '{{SITENAME}} er gjørd av fólki sum tær.',
+'createacct-benefit-body1' => 'rættingar',
+'createacct-benefit-body2' => 'síður',
+'createacct-benefit-body3' => 'seinastu høvundar',
 'badretype' => 'Loyniorðið tú hevur skriva er ikki rætt.',
 'userexists' => 'Brúkaranavnið sum tú valdi er longu í nýtslu.
 Vinarliga vel eitt annað navn.',
 'loginerror' => 'Innritanarbrek',
+'createacct-error' => 'Feilur við skapan av konto',
 'createaccounterror' => 'Kundi ikki skapa kontu: $1',
 'nocookiesnew' => 'Brúkarakontan er nú gjørd, men tú ert ikki loggaður inn. 
 {{SITENAME}} brúkar "cookies" fyri at innrita brúkarar.
@@ -652,6 +681,7 @@ Møguliga hevur tú longu broytt títt loyniorð ella biðið um eitt nýtt fyri
 'passwordreset-text' => 'Útfyll hetta skjalið fyri at nullstilla títt loyniorð.',
 'passwordreset-legend' => 'Nulstilla loyniorðið',
 'passwordreset-disabled' => 'Tað ber ikki til at nullstilla loyniorðið á hesi wiki.',
+'passwordreset-emaildisabled' => 'Teldupost funksjónir eru óvirknar á hesi wiki.',
 'passwordreset-pretext' => '{{PLURAL:$1||Skriva ein av upplýsingunum niðanfyri}}',
 'passwordreset-username' => 'Brúkaranavn:',
 'passwordreset-domain' => 'Umdømi (domain):',
@@ -659,29 +689,25 @@ Møguliga hevur tú longu broytt títt loyniorð ella biðið um eitt nýtt fyri
 'passwordreset-capture-help' => 'Um tú setir kross við henda teigin, so verður t-posturin (við fyribils loyniorðinum) vístur fyri tær og verður harumframt sendur til brúkaran.',
 'passwordreset-email' => 'T-post adressur:',
 'passwordreset-emailtitle' => 'konto upplýsingar á {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Onkur (óiva tú, frá IP adressu $1) hevur biðið um eina áminning av tínum konto upplýsingum fyri {{SITENAME}} ($4). Fylgjandi brúkara {{PLURAL:$3|konta er|kontur eru}}
-sett í samband við hesa t-post adressu:
+'passwordreset-emailtext-ip' => 'Onkur (óiva tú, frá IP adressu $1) hevur biðið um nullstillan av tínum loyniorði til {{SITENAME}} ($4). Fylgjandi brúkara {{PLURAL:$3|konta er|kontur eru}}
+settar í samband við hesa t-post adressu:
 
 $2
 
 {{PLURAL:$3|Hetta fyribils loyniorðið|Hesi fyribils loyniorðini}} ganga út um {{PLURAL:$5|ein dag|$5 dagar}}.
-Tú eigur at rita inn og velja eitt nýtt loyniorð nú. Um onkur annar hevur gjørt hesa 
-umbønina, ella um tú ert komin í tankar um títt uppruna loyniorð, og tú ikki longur 
-ynskir at broyta tað, so kanst tú síggja burtur frá hesum boðum og halda fram at brúka títt gamla loyniorð.',
-'passwordreset-emailtext-user' => 'Brúkari $1 á {{SITENAME}} hevur biðið um eina áminning av tínum konto upplýsingum fyri {{SITENAME}}
+Tú eigur at rita inn og velja eitt nýtt loyniorð nú. Um onkur annar hevur gjørt hesa umbønina, ella um tú ert komin í tankar um títt uppruna loyniorð, og tú ikki longur ynskir at broyta tað, so kanst tú síggja burtur frá hesum boðum og halda fram at brúka títt gamla loyniorð.',
+'passwordreset-emailtext-user' => 'Brúkari $1 á {{SITENAME}} hevur biðið um eina nullstillan av tínum loyniorði til {{SITENAME}} 
 ($4). Fylgjandi brúkara {{PLURAL:$3|konta er|kontur eru}} settar í samband við hesa t-post adressuna:
 
 $2
 
 {{PLURAL:$3|Hetta fyribils loyniorðið|Hesi fyribils loyniorðini}} ganga út um {{PLURAL:$5|ein dag|$5 dagar}}.
-Tú eigur at rita inn og velja eitt nýtt loyniorð nú. Um onkur annar hevur gjørt hesa 
-umbønina, ella um tú ert komin í tankar um títt uppruna loyniorð, og tú ikki longur 
-ynskir at broyta tað, so kanst tú síggja burtur frá hesum boðum og halda fram at brúka títt gamla loyniorð.',
+Tú eigur at rita inn og velja eitt nýtt loyniorð nú. Um onkur annar hevur gjørt hesa umbøn, ella um tú ert komin í tankar um títt uppruna loyniorð, og tú ikki longur ynskir at broyta tað, so kanst tú síggja burtur frá hesum boðum og halda fram at brúka títt gamla loyniorð.',
 'passwordreset-emailelement' => 'Brúkaranavn: $1
 Fyribils loyniorð: $2',
 'passwordreset-emailsent' => 'Ein 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',
@@ -901,10 +927,14 @@ Tað sær út til at hon er blivin strikað.',
 'edit-already-exists' => 'Tað var ikki møguligt at upprætta nýggja síðu.
 Síðan er longu til.',
 'defaultmessagetext' => 'Standard boðtekstur',
+'content-failed-to-parse' => 'Kláraði ikki at tulka $2 innihaldi fyri $1 modell: $3',
 'invalid-content-data' => 'Ógyldug innihalds dáta',
 'content-not-allowed-here' => '"$1" innihald er ikki loyvt á síðu [[$2]]',
+'editwarning-warning' => 'Um tú fert frá hesi síðuni, so kanst tú missa tær broytingar ið tú hevur gjørt.
+Um tú hevur ritað inn, so kanst tú sláa hesa ávaring frá í "Rættingar" partinum í tínum innstillingum.',
 
 # Content models
+'content-model-wikitext' => 'wikitekst',
 'content-model-text' => 'simpul tekstur',
 'content-model-javascript' => 'JavaScript',
 'content-model-css' => 'CSS',
@@ -1134,14 +1164,6 @@ Tú kanst royna at brúka ''all:'' sum fyrsta stavilsi fyri at søkja í øllum
 Tú kanst leita via Google ímeðan.
 Legg til merkis, at teirra innihaldsyvirlit av {{SITENAME}} kann vera gamalt og ikki dagført.',
 
-# Quickbar
-'qbsettings' => 'Skundfjøl innstillingar',
-'qbsettings-none' => 'Eingin',
-'qbsettings-fixedleft' => 'Fast vinstru',
-'qbsettings-fixedright' => 'Fast høgru',
-'qbsettings-floatingleft' => 'Flótandi vinstru',
-'qbsettings-floatingright' => 'Flótandi høgra',
-
 # Preferences page
 'preferences' => 'Innstillingar',
 'mypreferences' => 'Innstillingar',
@@ -1150,7 +1172,10 @@ Legg til merkis, at teirra innihaldsyvirlit av {{SITENAME}} kann vera gamalt og
 'changepassword' => 'Broyt loyniorð',
 'prefs-skin' => 'Hamur',
 'skin-preview' => 'Forskoðan',
+'datedefault' => 'Ongi serlig ynskir',
+'prefs-beta' => 'Betafunktiónir',
 'prefs-datetime' => 'Dato og tíð',
+'prefs-labs' => 'Testfunktiónir',
 'prefs-user-pages' => 'Brúkarasíður',
 'prefs-personal' => 'Brúkaradáta',
 'prefs-rc' => 'Nýkomnar broytingar og stubbaskoðan',
@@ -1175,14 +1200,17 @@ Legg til merkis, at teirra innihaldsyvirlit av {{SITENAME}} kann vera gamalt og
 'columns' => 'Teigar:',
 'searchresultshead' => 'Leita',
 'resultsperpage' => 'Úrslit fyri hvørja síðu:',
+'stub-threshold' => 'Avmarkað til <a href="#" class="stub">stubba leinki</a> formatering (bytes):',
 'stub-threshold-disabled' => 'Er gjørt óvirki',
 'recentchangesdays' => 'Dagar av vísa í seinastu broytingum:',
 'recentchangesdays-max' => 'Í mesta lagi $1 {{PLURAL:$1|dagur|dagar}}',
 'recentchangescount' => 'Tal av rættingum at vísa í standard:',
+'prefs-help-recentchangescount' => 'Íroknað seinastu broytingar, søgur hjá síðum og loggar.',
 'savedprefs' => 'Tínar innstillingar eru goymdar.',
 'timezonelegend' => 'Tíðar sona:',
 'localtime' => 'Lokal tíð:',
 'timezoneuseserverdefault' => 'Nýt wiki standard: ($1)',
+'timezoneuseoffset' => 'Annað (skrivað munin)',
 'timezoneoffset' => 'Offset¹:',
 'servertime' => 'Servara tíð:',
 'guesstimezone' => 'Fyll út við kagara',
@@ -1218,6 +1246,8 @@ Tú kanst ikki angra, tá tað fyrst er gjørt.',
 'yourlanguage' => 'Mál til brúkaraflatu:',
 'yournick' => 'Nýggj undirskrift:',
 'prefs-help-signature' => 'Viðmerkingar á kjaksíðum eiga at vera undirskrivaðar við "<nowiki>~~~~</nowiki>", sum verður gjørt um til tína undirskrift og eitt dagfestingarmerki.',
+'badsig' => 'Ógyldug ráð undirskrift.
+Eftirkannað HTML.',
 'badsiglength' => 'Tín undirskrift er ov long. 
 Hon má ikki hava meira enn $1 {{PLURAL:$1|tekn|tekn}}',
 'yourgender' => 'Kyn:',
@@ -1268,9 +1298,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 +1339,7 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
 'right-move-subpages' => 'Flyt síður saman við undirsíðum teirra',
 'right-move-rootuserpages' => 'Flyta høvuðs brúkarasíður',
 'right-movefile' => 'Flyt fílur',
+'right-suppressredirect' => 'Flyta síður uttan at upprætta víðaristilling frá tí gomlu síðuni.',
 'right-upload' => 'Legg upp fílur',
 'right-reupload' => 'Yvirskriva verandi fílur',
 'right-reupload-own' => 'Yvirskriva verandi fílur, sum tú hevur lagt upp',
@@ -1316,6 +1349,7 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
 'right-bigdelete' => 'Strika síður við nógvum versjónum',
 'right-browsearchive' => 'Leita í strikaðum síðum',
 'right-undelete' => 'Endurstovnað eina síðu',
+'right-suppressionlog' => 'Vís privatar loggar',
 'right-block' => 'Nokta øðrum brúkarum at rætta (blokka)',
 'right-blockemail' => 'Nokta einum brúkara at senda teldupost',
 'right-hideuser' => 'Sperra eitt brúkaranavn og goyma tað burtur fyri almenninginum',
@@ -1361,6 +1395,8 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
 'action-undelete' => 'endurstovnað hesa síðu',
 'action-block' => 'noktað hesum brúkara at rætta',
 'action-protect' => 'broyt verjustøðuna hjá hesi síðu',
+'action-patrol' => 'markað rætting hjá øðrum sum eftirhugda',
+'action-autopatrol' => 'fá tina rætting merkta sum eftirhugda',
 'action-unwatchedpages' => 'Síggj listan yvir síður sum ikki eru eftiransaðar',
 'action-mergehistory' => 'samanflætta søguna hjá hesi síðu',
 'action-userrights' => 'broyt øll brúkaraloyvi',
@@ -1390,13 +1426,14 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
 'rclinks' => 'Sýn seinastu $1 broytingarnar seinastu $2 dagarnar<br />$3',
 'diff' => 'munur',
 'hist' => 'søga',
-'hide' => 'Fjal',
-'show' => 'Skoða',
+'hide' => 'Goym',
+'show' => 'Vís',
 'minoreditletter' => 's',
 'newpageletter' => 'N',
 'boteditletter' => 'b',
 'number_of_watching_users_pageview' => '[$1 ansar eftir {{PLURAL:$1|brúkara|brúkarum}}]',
 'rc_categories_any' => 'Nakar',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} eftir broyting',
 'newsectionsummary' => '/* $1 */ nýtt innlegg',
 'rc-enhanced-expand' => 'Vís smálutir (krevur JavaScript)',
 'rc-enhanced-hide' => 'Goym smálutir',
@@ -1473,11 +1510,18 @@ henda fílin er $2.',
 Frágreiðingin sum tú hevur skrivað kemur ikki at síggjast á síðuni.
 Fyri at tín frágreiðing skal síggjast á síðuni, noyðist tú at skriva tað manuelt.
 [[$1|thumb]]',
+'fileexists-extension' => 'Ein fíla við líknandi navni finst longu: [[$2|thumb]]
+* Heitið á fíluni tú leggur út: <strong>[[:$1]]</strong>
+* Heitið á fílu ið longu finst: <strong>[[:$2]]</strong>
+Vinarliga vel eitt annað navn.',
 'file-deleted-duplicate' => 'Ein fíla, sum er líka sum henda ([[:$1]]) er fyrr blivin strikað.
 Tú eigur at kanna eftir strikingarsøguna hjá hesi fílu, áðrenn tú heldur áframm við at leggja hana út enn einaferð.',
 'uploadwarning' => 'Ávaring',
 'savefile' => 'Goym fílu',
 'uploadedimage' => 'sent "[[$1]]" upp',
+'uploadvirus' => 'Fílan inniheldur ein virus!
+Smálutir: $1',
+'upload-source' => 'Keldufíla',
 'sourcefilename' => 'Kelda fílunavn:',
 'sourceurl' => 'Kelda URL:',
 'destfilename' => 'Destinatión fílunavn:',
@@ -1487,13 +1531,32 @@ Tú eigur at kanna eftir strikingarsøguna hjá hesi fílu, áðrenn tú heldur
 'watchthisupload' => 'Halt eyga við hesi fílu',
 'filewasdeleted' => 'Ein fíla við hesum heitinum hevur fyrr verið upplóta og er seinni blivin strikað.
 Tú eigur at eftirkanna $1 áðrenn tú heldur á við at upplóta fíluna enn einaferð.',
+'filename-bad-prefix' => "Navnið á fíluni ið tú leggur út byrjar við '''\"\$1\"''', sum er eitt ikki-frágreiðandi navn, slík verða ofta givin sjálvvirkandi av talgildm myndatólum.
+Vinarliga vel eitt navn ið greiður eitt sindur frá til tína fílu.",
 'upload-success-subj' => 'Upplegging væleydnað',
+'upload-success-msg' => 'Tín útlegging frá [$2] eydnaðist væl. Hon er tøk her: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Trupulleiki við útlegging',
+'upload-failure-msg' => 'Har var ein trupulleiki við tínari útleggin frá [$2]:
+
+$1',
+'upload-warning-subj' => 'Ávaring um upplótan',
 
 'upload-file-error' => 'Innvortis brek',
+'upload-misc-error' => 'Ókend villa tá tú legði út',
+'upload-misc-error-text' => "Ein ókend villa fór fram meðan tú legði út.
+Vinariga vátta, at URL'urin er gyldugur og atkomuligur og royn aftur.
+Um trupulleikin heldur fram, set teg so vinarliga í samband við ein [[Special:ListUsers/sysop|administrator]].",
+'upload-too-many-redirects' => "URL'urin innihelt ov nógvar umdirigeringar",
 'upload-unknown-size' => 'Ókend stødd',
+'upload-http-error' => 'Ein HTTP villa hendi: $1',
+'upload-copy-upload-invalid-domain' => 'Upplótan av avritum ber ikki til frá hesum domeninum.',
 
 # File backend
+'backend-fail-stream' => 'Tað bar ikki til at stroyma fílu "$1".',
+'backend-fail-backup' => 'Tað bar ikki til at taka backup av fílu "$1".',
 'backend-fail-notexists' => 'Fílan $1 er ikki til.',
+'backend-fail-notsame' => 'Ein ikki-eins fíla finst longu á "$1".',
+'backend-fail-alreadyexists' => 'Fílan "$1" finst longu.',
 'backend-fail-store' => 'Kundi ikki goyma fílu $1 á $2.',
 'backend-fail-copy' => 'Kundi ikki avrita fílu $1 til $2.',
 'backend-fail-move' => 'Kundi ikki flyta fílu $1 til $2.',
@@ -1502,6 +1565,7 @@ Tú eigur at eftirkanna $1 áðrenn tú heldur á við at upplóta fíluna enn e
 'backend-fail-closetemp' => 'Kundi ikki aftur fyribils fílu.',
 'backend-fail-read' => 'Kundi ikki lesa fílu $1.',
 'backend-fail-create' => 'Kundi ikki skriva fílu $1.',
+'backend-fail-maxsize' => 'Tað bar ikki til at lesa fíluna "$1" tí hon er størri enn {{PLURAL:$2|eitt byte|$2 bytes}}.',
 
 # Lock manager
 'lockmanager-notlocked' => 'Kundi ikki lata upp "$1"; hon er ikki stongd.',
@@ -1511,6 +1575,9 @@ Tú eigur at eftirkanna $1 áðrenn tú heldur á við at upplóta fíluna enn e
 'lockmanager-fail-openlock' => 'Kundi ikki læsa upp fíluna til: "$1".',
 'lockmanager-fail-releaselock' => 'Kundi ikki læsa upp læsingina fyri: "$1".',
 
+# Special:UploadStash
+'uploadstash-refresh' => 'Uppfrískað listan við fílum',
+
 # img_auth script messages
 'img-auth-accessdenied' => 'Atgongd noktað',
 'img-auth-nologinnWL' => 'Tú ert ikki ritað/ur inn, og "$1" er ikki á hvítalista.',
@@ -1528,7 +1595,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 +1627,7 @@ Tú kanst eisini royna aftur, tá tað ikki eru so nógv í gongd her í senn.',
 
 # File description page
 'file-anchor-link' => 'Mynd',
-'filehist' => 'Søga fílu',
+'filehist' => 'Søgan hjá fíluni',
 'filehist-help' => 'Trýst á dato/tíð fyri at síggja fíluna, sum hon sá út tá.',
 'filehist-deleteall' => 'strika alt',
 'filehist-deleteone' => 'strika',
@@ -1584,17 +1650,33 @@ Ein [[Special:WhatLinksHere/$2|fullur listi]] er tøkur.',
 'nolinkstoimage' => 'Ongar síður slóða til hesa myndina.',
 'morelinkstoimage' => 'Sí [[Special:WhatLinksHere/$1|fleiri leinkjur]] til hesa fílu.',
 'linkstoimage-redirect' => '$1 (fílu víðaristilling) $2',
+'duplicatesoffile' => 'Henda {{PLURAL:$1|fílan er eitt avrit|$1 fílur eru avrit}} av hesi fílu ([[Special:FileDuplicateSearch/$2|meira kunning]]):',
+'sharedupload' => 'Henda fílan er frá $1 og kann verða brúkt av øðrum verkætlanum.',
+'sharedupload-desc-there' => 'Henda fílan er frá $1 og kann verða brúkt av øðrum verkætlanum.
+Vinarliga hygg at [$2 fílu frágreiðingarsíðu] fyri nærri kunning.',
 'sharedupload-desc-here' => 'Henda fíla er frá $1 og kann verða brúka í øðrum verkætlanum.
 Frágreiðingin á [$2 fílu frágreiðingar síðu] er víst her niðanfyri.',
+'filepage-nofile' => 'Ongin fíla við hesum navninum finst.',
+'filepage-nofile-link' => 'Ongin fíla við hesum navninum finst, men tú kanst [$1 leggja hana út].',
+'uploadnewversion-linktext' => 'Legg eina nýggja versjón av hesi fílu út',
 'shared-repo-from' => 'frá $1',
+'shared-repo' => 'eitt felags fíluarkiv',
+'upload-disallowed-here' => 'Tú kanst ikki yvirskriva hesa fílu.',
+
+# File reversion
+'filerevert-comment' => 'Orsøk:',
 
 # File deletion
 'filedelete' => 'Strika $1',
+'filedelete-legend' => 'Sletta fílu',
+'filedelete-intro' => "Tú ert í ferð við at sletta fíluna '''[[Media:$1|$1]]''' saman við allari søguni.",
+'filedelete-intro-old' => "Tú slettar versjón '''[[Media:$1|$1]]''' hin [$4 $3, $2].",
 'filedelete-comment' => 'Orsøk:',
 'filedelete-submit' => 'Strika',
 'filedelete-success' => "'''$1''' er blivin strikað.",
 'filedelete-success-old' => "Versjónin av '''[[Media:$1|$1]]''' frá kl. $3, hin $2 er blivið strikað.",
 'filedelete-nofile' => "'''$1''' er ikki til.",
+'filedelete-maintenance-title' => 'Ógjørligt at sletta fílu',
 
 # MIME search
 'mimesearch' => 'MIME-leit',
@@ -1650,7 +1732,7 @@ Víðaristilling verður nú gjørd til [[$2]].',
 'fewestrevisions' => 'Greinir við minstum útgávum',
 
 # Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|být|být}}',
+'nbytes' => '$1 {{PLURAL:$1|beit}}',
 'ncategories' => '$1 {{PLURAL:$1|bólkur|bólkar}}',
 'nlinks' => '$1 {{PLURAL:$1|slóð|slóðir}}',
 'nmembers' => '$1 {{PLURAL:$1|limur|limir}}',
@@ -1691,6 +1773,7 @@ Vinarliga legg merki til, at vevsíður kunnu slóða til eina fílu við beinle
 'notargettitle' => 'Onki mál',
 'pager-newer-n' => '{{PLURAL:$1|nýggjari 1|nýggjari $1}}',
 'pager-older-n' => '{{PLURAL:$1|eldri 1|eldri $1}}',
+'suppress' => 'Yvirlit',
 
 # Book sources
 'booksources' => 'Bókakeldur',
@@ -1737,6 +1820,11 @@ Sí eisini [[Special:WantedCategories|ynsktir bólkar]].',
 'listusers-submit' => 'Sýna',
 'listusers-noresult' => 'Ongin brúkari var funnin.',
 
+# Special:ActiveUsers
+'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.
@@ -1762,7 +1850,7 @@ og hava virkandi teldupostadressu í [[Special:Preferences|innstillingum]] tínu
 fyri at senda teldupost til aðrar brúkarar.',
 'emailuser' => 'Send t-post til brúkara',
 'emailpage' => 'Send t-post til brúkara',
-'emailpagetext' => 'Tú kanst brúka skjalið niðanfyri til at senda ein teldupost til henda brúkaran.
+'emailpagetext' => 'Tú kanst brúka skjalið niðanfyri til at senda ein teldupost til henda {{GENDER:$1|brúkara}}.
 Teldupost adressan sum tú skrivaði í [[Special:Preferences|tíni brúkara ynskir]] kemur síðan fram sum "Frá" adressan í teldupostinum, soleiðis at móttakarin kann svara beinleiðis til tín.',
 'defemailsubject' => '{{SITENAME}} t-postur frá brúkara $1',
 'usermaildisabled' => 'Brúkara t-postur er óvirkin',
@@ -1787,13 +1875,10 @@ Teldupost adressan sum tú skrivaði í [[Special:Preferences|tíni brúkara yns
 'watchlistfor2' => 'Fyri $1 $2',
 'nowatchlist' => 'Tú hevur ongar lutir í eftirlitinum.',
 'watchnologin' => 'Tú hevur ikki ritað inn',
-'addedwatchtext' => "Síðan \"<nowiki>\$1</nowiki>\" er løgd undir [[Special:Watchlist|eftirlit]] hjá tær.
-Framtíðar broytingar á hesi síðu og tilknýttu kjaksíðuni verða at síggja her.
-Tá sæst síðan sum '''feit skrift''' í [[Special:RecentChanges|broytingaryvirlitinum]] fyri at gera hana lættari at síggja.
-
-Vilt tú flyta síðuna undan tínum eftirliti, kanst tú trýsta á \"Strika eftirlit\" á síðuni.",
+'addedwatchtext' => 'Síðan  "[[:$1]]" er løgd undir [[Special:Watchlist|eftirlitslistan]] hjá tær.
+Framtíðar broytingar á hesi síðu og tilknýttu kjaksíðuni verða at síggja har.',
 'removedwatchtext' => 'Síðan "[[:$1]]" er strikað úr [[Special:Watchlist|tínum eftirliti]].',
-'watch' => 'Eftirlit',
+'watch' => 'Eygleið',
 'watchthispage' => 'Hav eftirlit við hesi síðuni',
 'unwatch' => 'strika eftirlit',
 'notanarticle' => 'Ongin innihaldssíða',
@@ -1866,9 +1951,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:',
@@ -1987,10 +2072,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 +2115,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 +2145,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 +2157,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 +2177,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 +2189,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 +2211,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
@@ -2276,9 +2359,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..e5d0ade 100644 (file)
@@ -430,7 +430,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',
@@ -780,7 +780,7 @@ $2",
 Le motif avancé est « ''$2'' ».",
 'filereadonlyerror' => "Impossible de modifier le fichier « $1 » parce que le répertoire de fichiers « $2 » est en lecture seule.
 
-L'administrateur qui l'a verrouillé a fourni ce motif: « $3 ».",
+L'administrateur qui l'a verrouillé a fourni ce motif : « $3 ».",
 'invalidtitle-knownnamespace' => "Titre invalide avec l'espace de noms « $2 » et l'intitulé « $3 »",
 'invalidtitle-unknownnamespace' => "Titre invalide avec le numéro d'espace de noms $1 et l'intitulé « $2 » inconnus",
 'exception-nologin' => 'Non connecté',
@@ -802,12 +802,17 @@ N'oubliez pas de modifier [[Special:Preferences|vos préférences pour {{SITENAM
 'yourname' => "Nom d'utilisateur :",
 'userlogin-yourname' => "Nom d'utilisateur",
 'userlogin-yourname-ph' => "Entrez votre nom d'utilisateur",
+'createacct-helpusername-url' => "{{ns:Project}}:Nom d'utilisateur",
+'createacct-helpusername-link' => '([[{{MediaWiki:createacct-helpusername-url}}|(aidez moi à choisir)]])',
 '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',
+'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{{PLURAL:$1|jour|jours}})',
+'userlogin-remembermypassword' => 'Garder ma session active',
 'userlogin-signwithsecure' => "S'inscrire avec un serveur sécurisé",
 'securelogin-stick-https' => 'Rester connecté en HTTPS après la connexion',
 'yourdomainname' => 'Votre domaine :',
@@ -829,12 +834,31 @@ 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',
+'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-captcha-help-url' => '{{ns:Project}}:Demander un compte',
+'createacct-imgcaptcha-help' => "Vous ne pouvez pas voir l'image ? [[{{MediaWiki:createacct-captcha-help-url}}|Demandez la création d'un compte]]",
+'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' => 'modifications',
+'createacct-benefit-body2' => 'articles',
+'createacct-benefit-body3' => '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.',
@@ -919,6 +943,7 @@ 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',
@@ -947,7 +972,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 +982,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',
 
@@ -1121,7 +1146,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 />
@@ -1235,9 +1260,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 +1409,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',
@@ -1440,7 +1465,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 +1544,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 :",
@@ -1583,6 +1608,7 @@ Elle ne doit pas dépasser $1 caractère{{PLURAL:$1||s}}.',
 'userrights-notallowed' => "Votre compte n'a pas la permission de modifier des droits d'utilisateur.",
 'userrights-changeable-col' => 'Les groupes que vous pouvez modifier',
 'userrights-unchangeable-col' => 'Les groupes que vous ne pouvez pas modifier',
+'userrights-conflict' => 'Conflit de droits utilisateur ! Veuillez appliquer de nouveau vos modifications.',
 
 # Groups
 'group' => 'Groupe :',
@@ -1992,7 +2018,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é.',
@@ -2323,6 +2349,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.
@@ -2728,7 +2763,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',
@@ -2996,7 +3031,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 +3065,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 +3084,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 +3155,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é',
 
@@ -3269,7 +3304,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 +3316,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 +3339,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 :
 
@@ -4010,12 +4059,16 @@ 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é.",
+'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 +4102,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 +4161,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 +4171,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 +4181,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 +4211,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 +4255,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 +4277,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 0b0f09a..e9ca509 100644 (file)
@@ -338,8 +338,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Montrar lo nombro d’utilisators que siuvont na pâge',
 'tog-oldsig' => 'Signatura ègzistenta :',
 'tog-fancysig' => 'Trètar la signatura coment de vouiquitèxto (sen lim ôtomatico)',
-'tog-externaleditor' => 'Empleyér per dèfôt un changior de tèxto de defôr (solament por los utilisators avanciês, at fôta d’una configuracion spèciâla sur voutron ordenator. [//www.mediawiki.org/wiki/Manual:External_editors Més d’enformacions.])',
-'tog-externaldiff' => 'Empleyér per dèfôt un comparator de defôr (solament por los utilisators avanciês, at fôta d’una configuracion spèciâla sur voutron ordenator. [//www.mediawiki.org/wiki/Manual:External_editors Més d’enformacions.])',
 'tog-showjumplinks' => 'Activar los lims d’accèssibilitât « {{int:jumpto}} »',
 'tog-uselivepreview' => 'Empleyér l’apèrçu rapido (at fôta de JavaScript) (èxpèrimentâl)',
 'tog-forceeditsummary' => 'Mè balyér na semonce quand j’é pas buchiê de rèsumâ de changement',
@@ -354,6 +352,7 @@ $messages = array(
 'tog-showhiddencats' => 'Montrar les catègories cachiêes',
 'tog-noconvertlink' => 'Dèsactivar la convèrsion des titros des lims',
 'tog-norollbackdiff' => 'Pas fâre vêre la dif pendent na rèvocacion',
+'tog-useeditwarning' => 'M’avèrtir quand quito una pâge de changement sen sôvar los changements',
 
 'underline-always' => 'Tojorn',
 'underline-never' => 'Jamés',
@@ -1114,6 +1113,8 @@ Semble que seye étâye suprimâye.',
 'content-failed-to-parse' => 'Falyita de l’analisa du contegnu de $2 por lo modèlo $1 : $3',
 'invalid-content-data' => 'Balyês du contegnu pas justes',
 'content-not-allowed-here' => 'Lo contegnu « $1 » est pas ôtorisâ sur la pâge [[$2]]',
+'editwarning-warning' => 'Quitar ceta pâge vos farat pèrdre tôs los changements que vos éd fêts.
+Se vos éte branchiê, vos pouede enlevar ceti avèrtissement dens la sèccion « Fenétra d’èdicion » de voutres prèferences.',
 
 # Content models
 'content-model-wikitext' => 'vouiquitèxto',
@@ -1403,15 +1404,6 @@ Vos pouede trovar més de dètalys sur lo [{{fullurl:{{#Special:Log}}/delete|pag
 Pendent cél temps, vos pouede fâre na rechèrche avouéc Google.
 Notâd que lor endèxacion du contegnu de {{SITENAME}} pôt pas étre a jorn.',
 
-# Quickbar
-'qbsettings' => 'Bârra rapida',
-'qbsettings-none' => 'Pas yona',
-'qbsettings-fixedleft' => 'Fix’a gôche',
-'qbsettings-fixedright' => 'Fix’a drêta',
-'qbsettings-floatingleft' => 'Fllotent’a gôche',
-'qbsettings-floatingright' => 'Fllotent’a drêta',
-'qbsettings-directionality' => 'Fixa, d’aprés la dirèccionalitât d’ècritura de voutra lengoua',
-
 # Preferences page
 'preferences' => 'Prèferences',
 'mypreferences' => 'Prèferences',
@@ -1980,7 +1972,6 @@ Por na sècuritât pèrfèta, img_auth.php est dèsactivâ.',
 'http-read-error' => 'Fôta de lèctura HTTP.',
 'http-timed-out' => 'La demanda HTTP at èxpirâ.',
 'http-curl-error' => 'Fôta pendent la rècupèracion de l’URL : $1',
-'http-host-unreachable' => 'Y at pas moyen d’avengiér l’URL.',
 'http-bad-status' => 'Y at avu un problèmo pendent la demanda HTTP : $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -3124,13 +3115,8 @@ 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. */',
@@ -3143,13 +3129,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 +3201,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',
 
index 81b35f8..f6a12c2 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Inkowik
  * @author Maartenvdbent
  * @author Merlissimo
  * @author Murma174
@@ -261,7 +262,7 @@ $1',
 'edithelp' => 'Beårbingsheelp',
 'edithelppage' => 'Help:Beårbe',
 'helppage' => 'Help:Inhåltsfertiiknis',
-'mainpage' => 'Wikipedia:Hoodsid',
+'mainpage' => 'Hoodsid',
 'mainpage-description' => 'Hoodsid',
 'policy-url' => 'Project:Ruchtliinje',
 'portal' => 'Gemiinschaps-portåål',
index 15a1cfd..f5bebb2 100644 (file)
@@ -141,11 +141,10 @@ $messages = array(
 'tog-enotifrevealaddr' => 'Distapone fûr il gno recapit email tai messaçs di notifiche',
 'tog-shownumberswatching' => 'Mostre il numar di utents che a stan tignint di voli',
 'tog-fancysig' => 'Interprete lis firmis come test wiki (cence un leam automatic)',
-'tog-externaleditor' => 'Dopre un editôr esterni come opzion predeterminade (dome par utents esperts, a coventin impuestazions specifichis, [//www.mediawiki.org/wiki/Manual:External_editors cjale culì par altris informazions.])',
-'tog-externaldiff' => 'Dopre editôr difarencis esterni come opzion predeterminade',
 'tog-watchlisthideown' => 'Plate i miei cambiaments inte liste des pagjinis tignudis di voli',
 'tog-ccmeonemails' => 'Mandimi une copie dai messaçs che o mandi ai altris utents',
 'tog-showhiddencats' => 'Mostre categoriis platadis',
+'tog-useeditwarning' => 'Visimi cuant che o stoi par lassâ une pagjine dulà che a son cambiaments no salvâts',
 
 'underline-always' => 'Simpri',
 'underline-never' => 'Mai',
@@ -229,7 +228,7 @@ $messages = array(
 'cancel' => 'Scancele',
 'moredotdotdot' => 'Plui...',
 'mypage' => 'Mê pagjine',
-'mytalk' => 'Mês discussions',
+'mytalk' => 'Discussions',
 'anontalk' => 'Discussion par chest IP',
 'navigation' => 'somari',
 'and' => '&#32;e',
@@ -546,12 +545,13 @@ La password par cheste identitât e pues jessi cambiade su la pagjine ''[[Specia
 Tu puedis [[Special:Search/{{PAGENAME}}|cirî chest titul]] in altris pagjinis o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cirî i regjistris leâts],
 o ben [{{fullurl:{{FULLPAGENAME}}|action=edit}} cambiâ cheste pagjine]</span>.',
 'noarticletext-nopermission' => 'Par cumò nol è nuie in cheste pagjine.
-Tu puedis [[Special:Search/{{PAGENAME}}|cirî chest titul]] in altris pagjinis o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cirî i regjistris leâts].',
+Tu puedis [[Special:Search/{{PAGENAME}}|cirî chest titul]] in altris pagjinis o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cirî i regjistris leâts]</span>, ma no tu âs a vonde permès par creâ cheste pagjine.',
 'userpage-userdoesnotexist' => 'La identitât "<nowiki>$1</nowiki>" no je di un utent regjistrât. Controle che tu vuelis pardabon creâ o modificâ cheste pagjine.',
 'clearyourcache' => "'''Ocjo: dopo vê salvât, tu podaressis scugnî netâ la cache dal to sgarfadôr par viodi i cambiaments.''' Par '''Mozilla / Firefox / Safari''': frache ''Torne a cjamâ'' tignint jù ancje il tast des maiusculis, o se no frache ''Ctrl-F5'' o ''Ctrl-R'' (''Command-R'' su Mac); par '''Konqueror''': frache ''Reload'' o il tast ''F5''; par '''Opera''' al pues jessi necessari disvuedâ dal dut la cache doprant il menù ''Tools → Preferencis''; par '''Internet Explorer:''' ten fracât il tast ''Ctrl'' cuant che tu cjalcjis su ''Aggiorna'' o frache ''Ctrl-F5''.",
 'updated' => '(Inzornât)',
 'note' => "'''Note:'''",
-'previewnote' => "'''Visiti che cheste e je dome une anteprime, e no je stade ancjemò salvade!'''",
+'previewnote' => "'''Visiti che cheste e je dome une anteprime.'''
+I tiei cambiaments no son stâts ancjemò salvâts!",
 'editing' => 'Cambiament di $1',
 'editingsection' => 'Cambiament di $1 (sezion)',
 'editingcomment' => 'Cambiament di $1 (gnove sezion)',
@@ -703,17 +703,9 @@ Leiende: (cur) = difarencis cun la version atuâl, (prec) = difarencis cun la ve
 'search-external' => 'Ricercje esterne',
 'searchdisabled' => 'La ricercje in {{SITENAME}} no je ative. Tu puedis doprâ Google intant. Sta atent che lis lôr tabelis sul contignût di {{SITENAME}} a puedin jessi pôc inzornadis.',
 
-# Quickbar
-'qbsettings' => 'Sbare svelte',
-'qbsettings-none' => 'Nissune',
-'qbsettings-fixedleft' => 'Fis a Çampe',
-'qbsettings-fixedright' => 'Fis a Drete',
-'qbsettings-floatingleft' => 'Flutuant a çampe',
-'qbsettings-floatingright' => 'Flutuant a diestre',
-
 # Preferences page
 'preferences' => 'Preferencis',
-'mypreferences' => 'mês preferencis',
+'mypreferences' => 'Preferencis',
 'prefs-edits' => 'Numar di cambiaments fats:',
 'prefsnologin' => 'No tu sês jentrât',
 'changepassword' => 'Gambie peraule clâf',
@@ -936,7 +928,7 @@ Par includi une figure intune pagjine, dopre un leam inte form
 'filehist-dimensions' => 'Dimensions',
 'filehist-filesize' => 'Dimension dal file',
 'filehist-comment' => 'Coment',
-'imagelinks' => 'Leams ae figure',
+'imagelinks' => 'Ûs dal file',
 'linkstoimage' => '{{PLURAL:$1|La pagjine ca sot e je leade|Lis $1 pagjinis ca sot a son leadis}} a cheste figure:',
 'nolinkstoimage' => 'No son pagjinis leadis a chest file.',
 'sharedupload' => 'Chest file al è ven di $1 e al pues jessi doprât di altris progjets.',
@@ -1043,7 +1035,7 @@ La descrizion su la sô [$2 pagjine di descrizion] e je mostrade ca sot.',
 'protectedtitles' => 'Titui protezûts',
 'listusers' => 'Liste dai utents',
 'usereditcount' => '$1 {{PLURAL:$1|contribût|contribûts}}',
-'usercreated' => 'Creât ai $1 a lis $2',
+'usercreated' => '{{GENDER:$3|Creât|Creade}} ai $1 a lis $2',
 'newpages' => 'Gnovis pagjinis',
 'newpages-username' => 'Non utent:',
 'ancientpages' => 'Pagjinis plui vecjis',
@@ -1107,22 +1099,13 @@ Cjale ancje lis [[Special:WantedCategories|categoriis desideradis]].',
 'listusers-noresult' => 'Nissun utent cjatât.',
 'listusers-blocked' => '({{GENDER:$1|blocât|blocade}})',
 
-# Special:ActiveUsers
-'activeusers' => 'Liste dai utents atîfs',
-'activeusers-intro' => 'Cheste e je une liste dai utents che a àn vût cualchi gjenar di ativitât {{PLURAL:$1|te ultime dì|tai ultins $1 diis}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|cambiament|cambiaments}} {{PLURAL:$3|te ultime dì|tai ultins $3 diis}}',
-'activeusers-from' => 'Mostre i utents scomençant di:',
-'activeusers-hidebots' => 'Plate i bots',
-'activeusers-hidesysops' => 'Plate i aministradôrs',
-'activeusers-noresult' => 'Nissun utent cjatât.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Dirits dai grups di utents',
 'listgrouprights-group' => 'Grup',
 '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 +1123,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',
@@ -1254,9 +1237,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 +1274,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 +1464,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
@@ -1568,7 +1549,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.',
index 95b292c..d705ba9 100644 (file)
@@ -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' => '冇改動注解時要同我話',
@@ -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。',
+'lastmodifiedat' => '箇頁晏嗰改動係:$1 $2。',
 'viewcount' => '箇頁拕人眵嘞$1回。',
 'protectedpage' => '拕保護頁',
-'jumpto' => 'è·³å\88°:',
+'jumpto' => 'è½\89å\8e»:',
 'jumptonavigation' => '導航',
 'jumptosearch' => '尋',
 'view-pool-error' => '不過意,箇隻伺服器到箇時間超吥最大負荷。
@@ -311,13 +309,13 @@ $1',
 'retrievedfrom' => '版本頁「$1」',
 'youhavenewmessages' => '汝有 $1 ($2).',
 'newmessageslink' => '新消息',
-'newmessagesdifflink' => '晏嗰改動',
+'newmessagesdifflink' => '晏嗰改動',
 'youhavenewmessagesmulti' => '$1 上有倷嗰新消息',
 'editsection' => '編寫',
 'editold' => '編寫',
-'viewsourceold' => '望原碼',
+'viewsourceold' => '望原碼',
 'editlink' => '編輯',
-'viewsourcelink' => '望原碼',
+'viewsourcelink' => '望原碼',
 'editsectionhint' => '編寫段落:$1',
 'toc' => '目錄',
 'showtoc' => '敨開',
@@ -568,7 +566,7 @@ $2',
 若係汝伓係特事來到箇首,捺吖瀏覽器嗰「去還」鍵即得去還。',
 'anontalkpagetext' => "---- ''箇係匿名用戶嗰討論頁,話伓定佢哈冇開隻帳戶。別人單用得正IP地址同佢聯繫。箇隻IP地址可能有好幾隻用戶共用。如果倷係匿名用戶,覺得箇頁嗰內容同倷冇關,歡迎去[[Special:UserLogin|開隻新帳戶或登入]],省得同別嗰匿名用戶扤混來。''",
 'noarticletext' => '眼下箇頁哈冇內容,汝到別嗰頁面[[Special:Search/{{PAGENAME}}|尋得正箇頁嗰標題]],
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 尋有關日誌]或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 編寫箇頁]</span>。',
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 尋有關日誌]或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 編寫箇頁]</span>。',
 'noarticletext-nopermission' => '眼下箇頁哈冇內容,汝可以到別嗰頁面[[Special:Search/{{PAGENAME}}|尋吖箇頁嗰標題]],
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 尋吖有關日誌]或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 編寫箇頁]</span>。',
 'clearyourcache' => "'''注意:''' 保存之後, 倷要清吥瀏覽器嗰緩存才眵得正改嗰內容。 '''Mozilla / Firefox / Safari:''' 按到 ''Shift'' 接到按''刷新''(或按吖''Ctrl-Shift-R'',到蘋果Mac上按''Cmd-Shift-R'');'''IE:''' 按到 ''Ctrl''接到按''刷新'',或按吖''Ctrl-F5'';'''Konqueror:''' 單只要按 ''刷新'';'''Opera:''' 用戶要到 ''工具-設置'' 完全嗰清除緩存。",
@@ -635,7 +633,7 @@ $2',
 
 汝要想下接得編輯箇頁嗰必要性。
 為到方便,箇頁嗰刪除記錄已經提供嘚下首:",
-'moveddeleted-notice' => 'ç®\87é\9a»ç\89\88é\9d¢å·²ç¶\93æ\8b\95å\88ªå\90¥å\98\8d
+'moveddeleted-notice' => 'ç®\87é\9a»ç\89\88é\9d¢å·²ç¶\93æ\8b\95å\88ªå\90¥å\93©
 下頭提供箇隻版面嗰刪除日誌,以供參考。',
 'edit-conflict' => '編輯仗。',
 
@@ -674,7 +672,7 @@ $2',
 'histlegend' => "差異選擇:標到伓共樣版本嗰單選鍵,接到捺吖督上嗰鍵對比吖。<br />
 說明:'''({{int:cur}})'''係跟得眼前版本嗰比較,'''({{int:last}})'''係跟到先頭修改版本嗰比較,細 = 細修改。",
 'history-fieldset-title' => '瀏覽歷史',
-'history-show-deleted' => '係刪吥嗰',
+'history-show-deleted' => '係刪吥嗰',
 'histfirst' => '最早嗰版本',
 'histlast' => '最晏嗰版本',
 'historysize' => '({{PLURAL:$1|1 字節|$1 字節}})',
@@ -762,9 +760,9 @@ $2',
 'prevn-title' => '頭$1隻{{PLURAL:$1|結果}}',
 'nextn-title' => '後$1隻結果',
 'shown-title' => '每頁顯示$1隻{{PLURAL:$1|結果}}',
-'viewprevnext' => '望($1 {{int:pipe-separator}} $2) ($3)',
+'viewprevnext' => '望($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''箇隻wiki已有一隻叫「[[:$1]]」嗰頁。'''",
-'searchmenu-new' => "'''å\98\9a箇隻wiki上建立「[[:$1]]」頁!'''",
+'searchmenu-new' => "'''å\88°箇隻wiki上建立「[[:$1]]」頁!'''",
 'searchhelp-url' => 'Help:説明',
 'searchprofile-articles' => '內容頁',
 'searchprofile-project' => '幫助同得計劃頁',
@@ -798,14 +796,6 @@ $2',
 'powersearch-field' => '尋',
 'searchdisabled' => '{{SITENAME}}嗰搜索功能已經關閉。倷可以用Google尋吖。但係佢嗰索引可能係早先嗰。',
 
-# Quickbar
-'qbsettings' => '快捷導航條',
-'qbsettings-none' => '冇',
-'qbsettings-fixedleft' => '左首固定',
-'qbsettings-fixedright' => '右首固定',
-'qbsettings-floatingleft' => '左首漂移',
-'qbsettings-floatingright' => '左首漂移',
-
 # Preferences page
 'preferences' => '參數設置',
 'mypreferences' => '我嗰參數設置',
@@ -901,7 +891,7 @@ $2',
 
 # Recent changes
 'nchanges' => '$1道改動',
-'recentchanges' => '晏嗰改動',
+'recentchanges' => '晏嗰改動',
 'recentchanges-legend' => '箇晝子嗰更改選項',
 'recentchanges-summary' => '跟到箇隻wiki上嗰最新改動。',
 'recentchanges-feed-description' => '跟到箇隻 wiki 上集合嗰最後改動。',
@@ -939,8 +929,8 @@ $2',
 'recentchangeslinked-toolbox' => '連結頁嗰更改',
 'recentchangeslinked-title' => '連結頁嗰改動到 "$1"',
 'recentchangeslinked-noresult' => '箇段時間嗰連結頁冇更改。',
-'recentchangeslinked-summary' => "箇隻特殊頁列出箇頁連出去頁面嗰最晏改動(或係某隻分類嗰頁面)。
-[[Special:Watchlist|嗰監視列表]]頁面會用'''粗體'''顯到。",
+'recentchangeslinked-summary' => "箇隻特殊頁列出箇頁連出去頁面嗰頂晏嗰改動(或係某隻分類嗰頁面)。
+[[Special:Watchlist|嗰監視列表]]頁面會用'''粗體'''顯到。",
 'recentchangeslinked-page' => '頁面名子:',
 'recentchangeslinked-to' => '顯示連到搦出來嗰頁面',
 
@@ -1043,7 +1033,7 @@ $2',
 'filehist-help' => '按到日期/時間去眵吖許時間有過嗰檔案。',
 'filehist-deleteall' => '全部刪掉',
 'filehist-deleteone' => '刪吥箇隻',
-'filehist-revert' => '還原',
+'filehist-revert' => '還原',
 'filehist-current' => '眼前',
 'filehist-datetime' => '日期/時間',
 'filehist-thumb' => '縮圖',
@@ -1135,7 +1125,7 @@ $2',
 'statistics-mostpopular' => '眵嗰人最多嗰頁面',
 
 'disambiguations' => '扤清楚頁',
-'disambiguationspage' => 'Template:清楚',
+'disambiguationspage' => 'Template:清楚',
 'disambiguations-text' => "底下嗰頁面都有到'''扤清楚頁'''嗰連結, 但係佢俚應當係連到正當嗰標題。<br />
 如果一隻頁面係連結自[[MediaWiki:Disambiguationspage]],佢會拕當成扤清楚頁。",
 
@@ -1206,7 +1196,7 @@ $2',
 
 # Book sources
 'booksources' => '書籍來源',
-'booksources-search-legend' => '尋書籍來源',
+'booksources-search-legend' => '尋書籍來源',
 'booksources-go' => '跳到',
 'booksources-text' => '底下係一部分網絡書店嗰連結列表,可以提供到倷要找嗰書籍嗰更多資料:',
 
@@ -1300,7 +1290,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 '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
@@ -1460,7 +1450,7 @@ $1',
 
 # Namespace form on various pages
 'namespace' => '空間名:',
-'invert' => '倒得',
+'invert' => '倒得',
 'blanknamespace' => '(主要)',
 
 # Contributions
@@ -1629,7 +1619,7 @@ $1',
 'movelogpage' => '移動日誌',
 'movelogpagetext' => '下底係移動嘞嗰頁面列表:',
 'movereason' => '原因:',
-'revertmove' => '恢復',
+'revertmove' => '舞還原',
 'delete_and_move' => '刪除跟到移動',
 'delete_and_move_text' => '==需要刪除==
 
@@ -1721,7 +1711,7 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'tooltip-ca-talk' => '內容頁嗰討論',
 'tooltip-ca-edit' => '汝編得正箇頁,但勞為汝望多一眼起,再存到佢。',
 'tooltip-ca-addsection' => '開隻新嗰討論',
-'tooltip-ca-viewsource' => '箇頁已拕保護。但倷能望吖佢嗰原始碼。',
+'tooltip-ca-viewsource' => '箇頁已拕保護。但汝望得正佢嗰原始碼。',
 'tooltip-ca-history' => '箇頁早先嗰版本',
 'tooltip-ca-protect' => '護到箇頁',
 'tooltip-ca-unprotect' => '改吥箇頁嗰保護',
@@ -1730,15 +1720,15 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'tooltip-ca-move' => '移動箇頁',
 'tooltip-ca-watch' => '拿箇頁加到監視列表',
 'tooltip-ca-unwatch' => '拿箇頁從監視列表移走',
-'tooltip-search' => '尋{{SITENAME}}',
+'tooltip-search' => '尋{{SITENAME}}',
 'tooltip-search-go' => '要係一樣嗰標題存在嗰話就直接去箇一版',
 'tooltip-search-fulltext' => '尋箇隻文字嗰頁面',
 'tooltip-p-logo' => '封面',
-'tooltip-n-mainpage' => '望封面',
-'tooltip-n-mainpage-description' => '望封面',
-'tooltip-n-portal' => 'å°\8dæ\96¼ç®\87é\9a»è¨\88å\8a\83ï¼\8cæ±\9då¾\97å\81\9aä»\80å\93©ï¼\8cå\8f\88å\95·å\81\9a',
-'tooltip-n-currentevents' => '提供目前嗰事嗰背景',
-'tooltip-n-recentchanges' => '列出箇隻網站該朝子嗰改動',
+'tooltip-n-mainpage' => '望封面',
+'tooltip-n-mainpage-description' => '望封面',
+'tooltip-n-portal' => 'å°\8dæ\96¼ç®\87é\9a»è¨\88å\8a\83ï¼\8cæ±\9då\81\9aå¾\97ä»\80å\93©æ­£ï¼\8cå\95·å\81\9aå¾\97æ­£',
+'tooltip-n-currentevents' => '去曉得眼下新聞嗰頭腦',
+'tooltip-n-recentchanges' => '列出箇隻網站頂晏嗰改動',
 'tooltip-n-randompage' => '隨機載進一隻頁面',
 'tooltip-n-help' => '尋人幫',
 'tooltip-t-whatlinkshere' => '列出全部同箇頁連到嗰頁面',
@@ -1748,22 +1738,22 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'tooltip-t-contributions' => '望吖箇隻用戶嗰貢獻',
 'tooltip-t-emailuser' => '發封郵件到箇隻用戶',
 'tooltip-t-upload' => '上傳圖像或多媒體文件',
-'tooltip-t-specialpages' => 'å\85¨é\83¨ç\89¹æ®\8aé \81å\88\97表',
+'tooltip-t-specialpages' => 'å\85¨é\83¨ç\89¹æ®\8aé \81å\97°æ¸\85å\96®',
 'tooltip-t-print' => '箇隻頁面嗰打印版',
 'tooltip-t-permalink' => '箇隻頁面嗰永久連結',
-'tooltip-ca-nstab-main' => '望內容頁',
-'tooltip-ca-nstab-user' => '望用戶頁',
+'tooltip-ca-nstab-main' => '望內容頁',
+'tooltip-ca-nstab-user' => '望用戶頁',
 'tooltip-ca-nstab-media' => '望吖媒體頁',
-'tooltip-ca-nstab-special' => '箇係隻特殊頁,編佢伓正',
+'tooltip-ca-nstab-special' => '箇係隻特殊頁,編佢伓正',
 'tooltip-ca-nstab-project' => '望吖計劃頁',
 'tooltip-ca-nstab-image' => '望吖圖像頁',
 'tooltip-ca-nstab-mediawiki' => '望吖系統消息',
-'tooltip-ca-nstab-template' => '望模板',
+'tooltip-ca-nstab-template' => '望模板',
 'tooltip-ca-nstab-help' => '望吖幫助頁',
-'tooltip-ca-nstab-category' => '望分類頁',
+'tooltip-ca-nstab-category' => '望分類頁',
 'tooltip-minoredit' => '搦佢設做細修改',
 'tooltip-save' => '存到汝嗰修改',
-'tooltip-preview' => '望汝嗰改動起,存到佢之前勞為汝咁舞吖!',
+'tooltip-preview' => '望汝嗰改動起,存到佢之前勞為汝咁舞吖!',
 'tooltip-diff' => '顯示汝對文章嗰改動。',
 'tooltip-compareselectedversions' => '望吖箇頁兩隻選定版本之間嗰伓同之處。',
 'tooltip-watch' => '搦箇頁加到汝嗰監視列表',
@@ -2230,7 +2220,7 @@ $3
 'watchlistedit-raw-removed' => '移嘞$1隻標題:',
 
 # Watchlist editing tools
-'watchlisttools-view' => '望相關更改',
+'watchlisttools-view' => '望相關更改',
 'watchlisttools-edit' => '望吖同到編寫監視列表',
 'watchlisttools-raw' => '編寫原始監視列表',
 
@@ -2256,11 +2246,6 @@ $3
 'version-software' => '裝正嗰軟件',
 'version-software-version' => '版本',
 
-# Special:FilePath
-'filepath' => '文件路徑',
-'filepath-page' => '文件:',
-'filepath-submit' => '路徑',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => '文件名:',
 'fileduplicatesearch-submit' => '尋',
index 99f2746..cb7442c 100644 (file)
@@ -664,9 +664,20 @@ 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',
+'createacct-helpusername-url' => '{{ns:Project}}:Política de nomes de usuario',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(axudádeme a elixir)]]',
 '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' => 'Acceder ao sistema no servidor seguro',
 '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 +690,39 @@ 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?',
+'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-captcha-help-url' => '{{ns:Project}}:Solicitar unha conta',
+'createacct-imgcaptcha-help' => 'Non pode ver a imaxe? [[{{MediaWiki:createacct-captcha-help-url}}|Solicite unha conta]]',
+'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' => 'edicións',
+'createacct-benefit-body2' => 'páxinas',
+'createacct-benefit-body3' => '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.
@@ -776,8 +808,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,6 +818,7 @@ 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',
@@ -823,7 +857,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',
@@ -1044,7 +1078,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',
@@ -1473,6 +1507,7 @@ Ha de ter menos {{PLURAL:$1|dun carácter|de $1 caracteres}}.',
 'userrights-notallowed' => 'A súa conta non dispón dos permisos necesarios para asignar ou retirar dereitos de usuario.',
 'userrights-changeable-col' => 'Os grupos que pode cambiar',
 'userrights-unchangeable-col' => 'Os grupos que non pode cambiar',
+'userrights-conflict' => 'Hai un conflito cos dereitos de usuario! Aplique de novo os seus cambios.',
 
 # Groups
 'group' => 'Grupo:',
@@ -2220,6 +2255,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.
@@ -3200,11 +3244,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:
 
@@ -3835,12 +3893,16 @@ 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.',
+'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 +3994,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 e38cb95..f4b8e28 100644 (file)
@@ -162,8 +162,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 +176,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',
@@ -893,6 +892,8 @@ Si isch schyns glescht wore.',
 'content-failed-to-parse' => 'Parse vum Inhalt $2 fir Modell $1 fählgschlaa: $3',
 'invalid-content-data' => 'Uugiltigi Inhaltsdate',
 'content-not-allowed-here' => 'Dr Inhalt „$1“ isch uf dr Syte [[$2]] nit erlaubt',
+'editwarning-warning' => 'Wänn Du die Syte verlosch, cha s syy, ass Du alli Bearbeitige verliersch, wu Du do dra gmacht hesch.
+Wänn Du aagmäldet bisch, chasch s Anzeige vu däre Warnig im „{{int:prefs-editing}}“-Beryych vu Dyyne Yystelligen abstelle.',
 
 # Content models
 'content-model-wikitext' => 'Wikitext',
@@ -1170,15 +1171,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 +1709,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>
@@ -2029,15 +2020,6 @@ Lueg au d Lischt vu dr [[Special:WantedCategories|gwinschte Kategorie]].',
 'listusers-noresult' => 'Kei Benutzer gfunde.',
 'listusers-blocked' => '(gsperrt)',
 
-# Special:ActiveUsers
-'activeusers' => 'Lischt vu dr aktive Benutzer',
-'activeusers-intro' => 'Des isch e Lischt vu Benutzer, wu irgedebis bearbeitet hän {{PLURAL:$1|am letschte Tag|in dr letschte $1 Täg}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|Bearbeitig|Bearbeitige}} {{PLURAL:$3|am letschte Tag|in dr letschte $3 Täg}}',
-'activeusers-from' => 'Zeig Benutzer ab:',
-'activeusers-hidebots' => 'Bötli uusblände',
-'activeusers-hidesysops' => 'Ammanne (Administratore) uusblände',
-'activeusers-noresult' => 'Kei Benutzer gfunde.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Benutzergruppe-Rächt',
 'listgrouprights-summary' => 'Des isch e Liste vu dr Benutzergruppe, wu in däm Wiki definiert sin, un dr Rächt, wu dermit verbunde sin.
index 4a90c60..bbfe803 100644 (file)
@@ -570,9 +570,14 @@ $2',
 'welcomecreation-msg' => 'તમારૂં ખાતું ખુલી ગયું છે.
 તમારી [[Special:Preferences|{{SITENAME}} પસંદ]] બદલવાનું ભૂલશો નહીં.',
 'yourname' => 'સભ્ય નામ:',
+'userlogin-yourname' => 'સભ્ય નામ',
+'userlogin-yourname-ph' => 'તમારૂં સભ્ય નામ દાખલ કરો',
 'yourpassword' => 'ગુપ્ત સંજ્ઞા:',
+'userlogin-yourpassword' => 'ગુપ્ત સંજ્ઞા',
+'userlogin-yourpassword-ph' => 'ગુપ્ત સંજ્ઞા લખો',
 'yourpasswordagain' => 'ગુપ્ત સંજ્ઞા (પાસવર્ડ) ફરી લખો',
 'remembermypassword' => 'આ કોમ્યૂટર પર મારી લૉગ ઇન વિગતો ધ્યાનમાં રાખો (વધુમાં વધુ $1 {{PLURAL:$1|દિવસ|દિવસ}} માટે)',
+'userlogin-remembermypassword' => 'મને યાદ રાખો',
 'securelogin-stick-https' => 'લોગ-ઈન કર્યા પછી  HTTPS સાથે જોડાયેલા રહો.',
 'yourdomainname' => 'તમારૂં ડોમેઇન:',
 'password-change-forbidden' => 'તમે આ વિકિ માટે પાસવર્ડ્સ બદલી શકતા નથી.',
@@ -585,6 +590,8 @@ $2',
 'logout' => 'બહાર નીકળો',
 'userlogout' => 'બહાર નીકળો/લૉગ આઉટ',
 'notloggedin' => 'પ્રવેશ કરેલ નથી',
+'userlogin-noaccount' => 'શું તમારૂં ખાતું નથી ?',
+'userlogin-joinproject' => '{{SITENAME}} સાથે જોડાવ',
 'nologin' => "શું તમારૂં ખાતું નથી? તો નવું '''$1'''.",
 'nologinlink' => 'ખાતું ખોલો',
 'createaccount' => 'નવું ખાતું ખોલો',
@@ -640,8 +647,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 સમયે પ્રમાણિત કરેલું છે.',
@@ -697,6 +704,7 @@ $2',
 'passwordreset-text' => 'તમારો પાસવર્ડ બદલવા માટે આ ફોર્મ પૂરુ કરો.',
 'passwordreset-legend' => 'પાસવર્ડ રીસેટ કરો',
 'passwordreset-disabled' => 'આ વિકી પર પાસવર્ડ રીસેટ કરવા પર પ્રતિબંધ છે.',
+'passwordreset-emaildisabled' => 'આ વિકિ પર ઇમેઇલ સગવડ બંધ છે.',
 'passwordreset-pretext' => '{{PLURAL: $1| | એક નીચે માહિતીના ટુકડાઓ દાખલ}}',
 'passwordreset-username' => 'સભ્ય નામ:',
 'passwordreset-domain' => 'ડોમેઈન:',
@@ -704,14 +712,14 @@ $2',
 '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 +728,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' => 'àª\8fàª\95 àªªàª¾àª¸àªµàª°à«\8dડ àª°àª¿àª¸à«\87àª\9f àª\87મà«\87લ àª¬àª¨àª¾àªµàªµàª¾àª®àª¾àª\82 àª\86વà«\8dયà«\8b àª\9bà«\87, àª\9cà«\87 àª¨à«\80àª\9aà«\87 àªªà«\8dરમાણà«\87 àª\9bà«\87, àªªàª°àª\82તà«\81 àª¤à«\87 àª¸àª­à«\8dયનà«\87 àª®à«\8bàª\95લવામાં નિષ્ફળ થયો છે: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'ઈ મેલ ખાતુ બદલવા માટે',
@@ -896,7 +904,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' => "'''ચેતવણી : આ પાના પર સંરક્ષણ વિકલ્પ સક્રીય છે અને માત્ર પ્રબંધકો જ આમાં ફેરફાર કરી શકે.'''
@@ -2070,7 +2078,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 +2088,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' => 'નીચે આ વિકિ પર વ્યાખ્યાયિત સભ્ય જૂથોની યાદી, તેમની સાથે સંકળાયેલા હક્કો સાથે આપી છે.
@@ -2620,7 +2637,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ય.
+એ વાતની નોંધ લેશો કે, જો તમે પસંદ કરેલા નવા નામ વાળું પાનું અસ્તિત્વમાં હશે તો જુનું પાનું '''નહી ખસે''', સિવાયકે તે પણ અન્યત્ર વાળતું પાનું હોય અને તેનો કોઈ ઇતિહાસ ના હોય.
 આનો અર્થ એમ થાય છે કે જો તમે કોઈ તબક્કે ભુલ કરશો તો જે પાનાનું નામ બદલવાનો પ્રયત્ન કરતા હોવ તેને તમે ફરી પાછા જુના નામ પર જ પાછું વાળી શકશો, અને બીજું કે પહેલેથી બનેલા પાનાનું નામ તમે નામફેર કરવા માટે ના વાપરી શકો.
 
 '''ચેતવણી!'''
@@ -2943,6 +2960,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' => 'હા',
@@ -3638,13 +3657,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' => 'હેશ કિંમત પર આધારિત આબેહૂબ ફાઇલો શોધો.',
@@ -3734,14 +3746,16 @@ $5
 'htmlform-submit' => 'જમા કરો',
 'htmlform-reset' => 'ફેરફાર ઉલટાવો',
 'htmlform-selectorother-other' => 'અન્ય',
+'htmlform-no' => 'ના',
+'htmlform-yes' => 'હા',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 પૂર્ણ શબ્દ શોધ સહીત',
 'sqlite-no-fts' => '$1 પૂર્ણ શબ્દ  શોધ વિકલ્પ વગર',
 
 # New logging system
-'logentry-delete-delete' => '$1 દ્વારા પાનું $3 દૂર કરવામાં આવ્યું',
-'logentry-delete-restore' => '$1 પુનઃસંગ્રહ પાનું $3',
+'logentry-delete-delete' => '$1 દ્વારા પાનું $3 {{GENDER:$2|દૂર કરવામાં આવ્યું}}',
+'logentry-delete-restore' => '$1 {{GENDER:$2|પુનઃસંગ્રહ}} પાનું $3',
 'logentry-delete-event' => '$1 બદલાઈ ના દૃશ્યતા {{PLURAL: $5 | લોગ ઘટના | $5 લોગ}} $3 ઘટનાઓ પર $4',
 'logentry-delete-revision' => '$1 બદલાઈ ના દૃશ્યતા {{PLURAL: $5 | સુધારણા | $5 આવૃત્તિઓ}} $3 પાનાં પર: $4',
 'logentry-delete-event-legacy' => '$1 બદલાઈ $3 પર લોગ ઘટનાઓ દૃશ્યતા',
@@ -3802,6 +3816,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 +3836,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..ad945fc 100644 (file)
@@ -66,6 +66,7 @@ $messages = array(
 'tog-watchlisthidepatrolled' => 'Follee arraghyn er nyn scrutaghey er my rolley arrey',
 'tog-ccmeonemails' => 'Cur coip dou jeh dagh post-l verrym da ymmydeyr elley',
 'tog-showhiddencats' => 'Taishbyn ny ronnaghyn follit',
+'tog-useeditwarning' => 'Cur raaue dou my ta mee faagail duillag reaghey gyn sauail yn obbyr jeant aym',
 
 'underline-always' => 'Dagh keayrt',
 'underline-never' => 'Ny jean eh arragh',
@@ -500,6 +501,8 @@ Foddee shiu goll er ash as reaghey duillag t'ayn nish, ny [[Special:UserLogin|lo
 
 By chair dhyt smooinagh vel eh kiart goll er oai lesh reaghey yn duillag shoh.<br />
 Ta lioar ny scryssaghyn magh kiarit ayns shoh rere dty chaays hene:",
+'editwarning-warning' => "My faagys oo y duillag, hed caghlaaghyn erbee er coayl, foddee.
+My t'ou uss loggalt stiagh, foddee oo lhiettal y raaue shoh 'sy tosheeaghtyn ayd, 'sy rheynn \"Reaghey\".",
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Cha nod coontys y chroo',
@@ -594,9 +597,6 @@ My t'ou uss son ronsaghey dagh cooid (as shen goaill stiagh duillagyn resooney,
 'powersearch-field' => 'Ronsee er son',
 'search-external' => 'Ronsaghey mooie',
 
-# Quickbar
-'qbsettings-none' => 'Veg',
-
 # Preferences page
 'preferences' => 'Tosheeaghtyn',
 'mypreferences' => 'My hosheeaghtyn',
index 1031e4d..01201f7 100644 (file)
  * @ingroup Language
  * @file
  *
+ * @author Anson2812
  * @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' => '展示隱藏分類',
+
+'underline-always' => '總係使用',
+'underline-never' => '從來毋用',
+'underline-default' => '外皮或瀏覽器默認',
 
 # Font style option in Special:Preferences
-'editfont-default' => 'Hi-khí yi-thin',
+'editfont-default' => '瀏覽器默認',
 
 # 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-article-count' => '{{PLURAL:$2|本分類有以下一隻頁面。|本分類有$2隻頁面,以下列出矣$1隻。}}',
+'category-file-count' => '{{PLURAL:$2|邇隻分類有以下一隻文件。|邇隻分類有$2隻文件,以下列出矣$1隻。}}',
+'listingcontinuesabbrev' => '繼續',
+'noindex-category' => '還無索引嘅頁面',
+
+'about' => '關於',
+'article' => '內容頁面',
+'newwindow' => '(在新視窗肚打開)',
+'cancel' => '取消',
+'moredotdotdot' => '還較多...',
+'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-unprotect' => '更改保護',
+'vector-view-create' => '建立',
+'vector-view-edit' => '編寫',
+'vector-view-history' => '查看歷史',
+'vector-view-view' => '閱讀',
+'vector-view-viewsource' => '查看源碼',
+'actions' => '動作',
+'namespaces' => '名字空間',
+'variants' => '變換',
+
+'navigation-heading' => '導航菜單',
+'errorpagetitle' => '差錯',
+'returnto' => '轉頭到$1。',
+'tagline' => '從{{SITENAME}}來',
+'help' => '幫手',
+'search' => '搜尋',
+'searchbutton' => '搜尋',
+'go' => '入',
+'searcharticle' => '入',
+'history' => '頁面歷史',
+'history_short' => '歷史',
+'updatedmarker' => '亻厓上擺訪問以來嘅更新',
+'printableversion' => '做得印刷嘅版本',
+'permalink' => '永久鏈接',
+'print' => '印刷',
+'view' => '查看',
+'edit' => '編寫',
+'create' => '建立',
+'editthispage' => '編寫本頁',
+'create-this-page' => '建立本頁',
+'delete' => '刪除',
+'deletethispage' => '刪除本頁',
+'undelete_short' => '恢復$1隻分删除嘅编寫',
+'viewdeleted_short' => '查看$1項已刪除嘅修訂',
+'protect' => '保護',
+'protect_change' => '更改',
+'protectthispage' => '保護本頁',
+'unprotect' => '更改保護',
+'unprotectthispage' => '更改本頁保護',
+'newpage' => '新頁面',
+'talkpage' => '討論本頁',
+'talkpagelinktext' => '交流',
+'specialpage' => '特殊頁面',
+'personaltools' => '私人工具',
+'postcomment' => '新段落',
+'articlepage' => '查看內容頁',
+'talk' => '討論',
+'views' => '查看數',
+'toolbox' => '工具箱',
+'userpage' => '查看用戶頁面',
+'projectpage' => '查看項目頁面',
+'imagepage' => '查看文件頁面',
+'mediawikipage' => '查看消息頁面',
+'templatepage' => '查看模板頁面',
+'viewhelppage' => '查看幫手頁面',
+'categorypage' => '查看分類頁面',
+'viewtalkpage' => '查看討論',
+'otherlanguages' => '其他語言',
+'redirectedfrom' => '(重定向自$1)',
+'redirectpagesub' => '重定向頁',
+'lastmodifiedat' => '邇隻頁面最近修訂於$1 $2。',
+'viewcount' => '邇隻頁面已經分人瀏覽過$1次。',
+'protectedpage' => '受保護頁面',
+'jumpto' => '跳轉到:',
+'jumptonavigation' => '導航',
+'jumptosearch' => '搜尋',
+'view-pool-error' => '毋好意思,忒多用戶嘗試緊流覽邇頁,使伺服器超出負荷。請等多一刻再嘗試。
+
+$1',
+'pool-timeout' => '等待鎖定逾時',
+'pool-queuefull' => '請求隊列满矣',
+'pool-errorunknown' => '無知得嘅差錯',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite' => 'Yû-kôan {{SITENAME}}',
-'aboutpage' => 'Project:Kôan-yî',
-'copyright' => 'Pún-chham ke chhiòn-phu vùn-pún nui-yùng chhai $1 chṳ̂ thiàu-khóan hâ thì-kiûng.',
-'copyrightpage' => '{{ns:project}}:Pán-khièn sin-sit',
-'currentevents' => 'Hien-sṳ̀ sṳ-khien',
-'currentevents-url' => 'Project:Hien-sṳ̀ sṳ-khien',
-'disclaimers' => 'Miên-chit sâng-mìn',
-'disclaimerpage' => 'Project:Yit-pân ke miên-chit sâng-mìn',
-'edithelp' => 'Phiên-siá pông-chhu',
-'edithelppage' => 'Help:Phiên-cho hong-mien',
-'helppage' => 'Help:Pông-chhu',
-'mainpage' => 'Thèu Ya̍p',
-'mainpage-description' => 'Thèu-chông',
-'policy-url' => 'Project:Fông-chṳ̂m',
-'portal' => 'Sa-khî',
-'portal-url' => 'Project:Sa-khî',
-'privacy' => 'Yún-sṳ̂ chṳn-chhet',
-'privacypage' => 'Project:Yún-sṳ̂ chṳn-chhet',
-
-'badaccess' => 'Khièn-han chho-ngu',
-'badaccess-group0' => 'Ngì kông-chhòi ke chhiáng-khiù mò yún-chún chṳp-hàng.',
-'badaccess-groups' => 'Ngì kông-chhòi ke chhiáng-khiù chṳ́-yû $1 yung-fu-chû ke yung-fu chhòi-nèn sṳ́-yung.',
-
-'versionrequired' => 'Sî-yeu MediaWiki $1-pán',
-'versionrequiredtext' => 'Sî-yeu pán-pún $1-ke MediaWiki chhòi-nèn sṳ́-yung chhṳ́-chông. Chhâm-cheu [[Special:Version|Pán-pún]].',
-
-'ok' => 'OK',
-'retrievedfrom' => 'Chhí-chhṳ "$1"',
-'youhavenewmessages' => 'Ngì yû $1($2)。',
-'newmessageslink' => 'Sîn sin-sit',
-'newmessagesdifflink' => 'Sông-chhṳ kiên-kói',
-'youhavenewmessagesmulti' => 'Ngì chhai $1 yû yit-thiàu sîn sêu-sit',
-'editsection' => 'phiên-siá',
-'editold' => 'phiên-cho',
-'viewsourceold' => 'Tshà-khon Kîn-ngièn',
-'editlink' => 'piên-sip',
-'viewsourcelink' => 'tshà-khon kîn-ngièn',
-'editsectionhint' => 'Phiên-siá thon-lo̍k: $1',
-'toc' => 'Muk-liu̍k',
-'showtoc' => 'Hién-sṳ',
-'hidetoc' => 'yún-chhòng',
-'thisisdeleted' => 'Chhà-khon fe̍t-chá fî-fu̍k $1?',
-'viewdeleted' => 'Kiám-sṳ $1?',
-'restorelink' => '$1-ke pûn chhù-hi ke pán-pún',
-'feedlinks' => 'Só-thin:',
-'feed-invalid' => 'Mò-háu ke só-thin lui-hìn.',
-'site-rss-feed' => '$1 ke RSS thin-ye̍t',
-'site-atom-feed' => '$1 ke Atom thin-ye̍t',
-'page-rss-feed' => '"$1" ke RSS thin-ye̍t',
-'page-atom-feed' => '"$1" ke Atom thin-ye̍t',
-'red-link-title' => '$1 (Liá-ya̍p hàn-mò chhùn-chhai)',
+'aboutsite' => '關於 {{SITENAME}}',
+'aboutpage' => 'Project:關於',
+'copyright' => '本站內容使用$1條款授權。',
+'copyrightpage' => '{{ns:project}}:版權信息',
+'currentevents' => '新聞動態',
+'currentevents-url' => 'Project:新聞動態',
+'disclaimers' => '免責聲明',
+'disclaimerpage' => 'Project:一般免責聲明',
+'edithelp' => '編寫幫手',
+'edithelppage' => 'Help:編寫',
+'helppage' => 'Help:目錄',
+'mainpage' => '頭頁',
+'mainpage-description' => '頭頁',
+'policy-url' => 'Project:方針',
+'portal' => '社區主頁',
+'portal-url' => 'Project:社區主頁',
+'privacy' => '隱私政策',
+'privacypage' => 'Project:隱私政策',
+
+'badaccess' => '權限差錯',
+'badaccess-group0' => '系統毋准汝執行頭先講求嘅操作。',
+'badaccess-groups' => '您正先請求嘅操作單淨有{{PLURAL:$2|這個|這些}}用戶群組嘅用戶做得使用:$1',
+
+'versionrequired' => '愛有MediaWiki $1版',
+'versionrequiredtext' => '愛有版本$1嘅MediaWiki正做得使用本頁。
+參詳[[Special:Version|版本頁面]]。',
+
+'ok' => '做得',
+'retrievedfrom' => '來自"$1"',
+'youhavenewmessages' => '汝有$1($2)。',
+'newmessageslink' => '新消息',
+'newmessagesdifflink' => '上擺更改',
+'youhavenewmessagesfromusers' => '汝有來自{{PLURAL:$3|另一位用戶|$3位用戶}}嘅$1($2)。',
+'youhavenewmessagesmanyusers' => '你有來自多位用戶嘅$1( $2 )。',
+'newmessageslinkplural' => '{{PLURAL:$1|一條新信息|新信息}}',
+'newmessagesdifflinkplural' => '最新{{PLURAL:$1|更改|更改}}',
+'youhavenewmessagesmulti' => '汝在$1肚有新消息',
+'editsection' => '編寫',
+'editold' => '編寫',
+'viewsourceold' => '查看源碼',
+'editlink' => '編寫',
+'viewsourcelink' => '查看源碼',
+'editsectionhint' => '編寫章節: $1',
+'toc' => '目錄',
+'showtoc' => '顯示',
+'hidetoc' => '隱藏',
+'collapsible-collapse' => '摺叠',
+'collapsible-expand' => '展開',
+'thisisdeleted' => '查看或者恢復$1?',
+'viewdeleted' => '查看$1?',
+'restorelink' => '$1隻分人刪除嘅版本',
+'feedlinks' => '訂閱:',
+'feed-invalid' => '無效嘅訂閱類型。',
+'feed-unavailable' => '毋提供聯合訂閱源',
+'site-rss-feed' => '$1嘅RSS訂閱',
+'site-atom-feed' => '$1嘅Atom訂閱',
+'page-rss-feed' => '“$1”嘅RSS訂閱',
+'page-atom-feed' => '“$1”嘅Atom訂閱',
+'red-link-title' => '$1(頁面還無存在)',
+'sort-descending' => '降序',
+'sort-ascending' => '升序',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'Vùn-chông',
-'nstab-user' => 'Yung-fu thiàu-muk',
-'nstab-media' => 'Chhiòn-thí hong-mien',
-'nstab-special' => 'Thi̍t-sû-ya̍p',
-'nstab-project' => 'Kie-va̍k hong-mien',
-'nstab-image' => 'Tóng-on',
-'nstab-mediawiki' => 'Sin-sit',
-'nstab-template' => 'Mù-pán',
-'nstab-help' => 'Pông-chhu sot-mìn',
-'nstab-category' => 'Fûn-lui',
+'nstab-main' => '頁面',
+'nstab-user' => '用戶頁面',
+'nstab-media' => '媒體頁面',
+'nstab-special' => '特殊頁面',
+'nstab-project' => '項目頁面',
+'nstab-image' => '文件',
+'nstab-mediawiki' => '信息',
+'nstab-template' => '模板',
+'nstab-help' => '幫手頁面',
+'nstab-category' => '分類',
 
 # Main script and global functions
-'nosuchaction' => 'Mò-yû liá-ke min-lin',
-'nosuchactiontext' => 'URL chhiáng-khiù ke min-lin mò-fap pûn liá-ke wiki sṳt-phe̍t',
-'nosuchspecialpage' => 'Mò-yû liá-ke thi̍t-sû hong-mien',
-'nospecialpagetext' => 'Ngì chhiáng-khiù ke vùn-chông mò-fap pûn liá-ke wiki sṳt-phe̍t.',
+'nosuchaction' => '無邇條命令',
+'nosuchactiontext' => '該URL所指定嘅動作無效。
+汝可能打錯URL,或撳到錯誤連結。
+還可能係{{SITENAME}}所使用嘅軟件出現矣錯誤。',
+'nosuchspecialpage' => '邇隻特殊页面毋存在',
+'nospecialpagetext' => '<strong>您請求嘅特殊頁面無效。</strong>
+
+[[Special:SpecialPages|{{int:specialpages}}]]中載有所有效特殊頁面嘅列表。',
 
 # General errors
-'error' => 'Chho-ngu',
-'databaseerror' => 'Chṳ̂-liau-khu ke chho-ngu',
-'dberrortext' => 'Fat-sên chṳ̂-liau-khu chhà-chhìm fa-ngî chho-ngu. Khó-nèn he ngiôn-thí chhṳ-sṳ̂n ke chho-ngu só yîn-hí. Chui-heu yit-chhṳ chṳ̂-liau-khu chhà-chhìm chṳ́-lin he: <blockquote><tt>$1</tt></blockquote> lòi-chhṳ "<tt>$2</tt>"。 MySQL fán-fì chho-ngu "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Fat-sên liáu yit-ke chṳ̂-liau-khu thiàu-chhà fa-ngî chho-ngu. Chui-heu yit-chhṳ ke chṳ̂-liau-khu thiàu-chhà he: "$1" lòi-ngièn "$2". MySQL fì-chón chho-ngu "$3: $4".',
-'laggedslavemode' => 'Kín-ko: Vùn-chông khó-nèn put pâu-hàm chui-khiûn ke kiên-kói.',
-'readonly' => 'Chṳ̂-liau-khu kim-chṳ́ fóng-mun',
-'enterlockreason' => 'Chhiáng sû-ngi̍p kim-chṳ́ fóng-mun ke ngièn-yîn, pâu-hàm kû-kie chhùng-sîn khôi-fong ke sṳ̀-kiên',
-'readonlytext' => 'Chṳ̂-liau-khu muk-chhièn kim-chṳ́ sû-ngi̍p sîn nui-yùng khi̍p kiên-kói, liá-hàn khó-nèn he chhut-yì chṳ̂-liau-khu chang-chhai vì-chhṳ̀ chhùng-siû, chṳ̂-heu hí-khó fî-fu̍k. Kón-lî-yèn yû yî-ha ke kié-sṳt: <p>$1</p>',
-'missing-article' => 'Chṳ̂-liau-khù cháu-put-chhok vùn-sṳ "$1" $2.
-
-<p>Thûng-sòng liá-he yîn-vi siù-thin li̍t-sṳ́-ya̍p sông ko-sṳ̀ ke lièn-kiet to yí-kîn pûn chhù-thet ke ya̍p só thô-chṳ ke.</p>
-
-<p>Na-he chhìn-khóng m-hè liá-yong, ngì khó-nèn cháu-táu liáu ngiôn-thí nui ke yit-ke chhu-chhùng.
-Chhiáng ki-liu̍k hâ URL thi-chí, pin hiong [[Special:ListUsers/sysop|Kón-lî-yèn]] po-ko.</p>',
-'missingarticle-rev' => '(siù-thin #: $1)',
-'missingarticle-diff' => '(Tshâ-phe̍t: $1, $2)',
-'readonly_lag' => 'Fu-su̍k chṳ̂-liau-khu fu̍k-vu-hi chang-chhai chiông khoai-chhí kiên-sîn to chú fu̍k-vu-hi, chṳ̂-liau-khu yí-kîn pûn chhṳ-thung fûng-só',
-'internalerror' => 'Nui-phu chho-ngu',
-'internalerror_info' => 'Nui-phu tsho-ngu: $1',
-'filecopyerror' => 'Mò-fap fuk-chṳ vùn-khien "$1" to "$2".',
-'filerenameerror' => 'Mò-fap chhùng min-miàng vùn-khien "$1" to "$2".',
-'filedeleteerror' => 'Mò-fap chhù-thet vùn-khien "$1".',
-'filenotfound' => 'Put-nèn chhìm-cháu to vùn-khien "$1".',
-'fileexistserror' => 'Mò-fap siá-ngi̍p tóng-on "$1": tóng-on yí-kîn tshùn-tshai',
-'unexpected' => 'Put-chṳn-sòng chhṳ̍t: "$1"="$2".',
-'formerror' => 'Chho-ngu: mò-fap thì-kâu péu-tân',
-'badarticleerror' => 'Vù-fap chhai pún-hong song chin-hàng chhṳ́-hong ke chhâu-chok.',
-'cannotdelete' => 'Mò-fap chhù-thet sién-thin ke vùn-chông fe̍t-he thù-chhiong (Kí khó-nèn yí-kîn pûn khì-thâ-ngìn chhù-hi liáu).',
-'badtitle' => 'Chho-ngu ke phêu-thì',
-'badtitletext' => 'Só chhiáng-khiù hong-mien ke phêu-thì he mò-háu ke, mò-chhùn-chhai, khiam-ko ngî-ngièn fe̍t-chá khiam-ko wiki lièn-kiet ke phêu-thì chho-ngu.',
+'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' => '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.',
+'querypage-no-updates' => '當前禁止對邇頁面進行更新。
+邇處嘅數據將做毋得分立即重新整理。',
+'wrong_wfQuery_params' => '有錯嘅參數分傳遞到wfQuery()<br />
+函數:$1<br />
+查詢:$2',
+'viewsource' => '查看源碼',
+'viewsource-title' => '查看$1嘅源代碼',
+'actionthrottled' => '動作已經壓制',
+'actionthrottledtext' => '基於反垃圾嘅考量,短時間內毋可以多次重複某操作,今下汝已經超過邇隻上限。
+請在數分鐘後再嘗試。',
+'protectedpagetext' => '邇隻頁面已經分人保護以防止編輯或其他操作。',
+'viewsourcetext' => '汝做得查看並複製本頁面嘅源碼:',
+'viewyourtext' => "汝可以查看並複製'''汝對邇隻頁面作出編輯後'''嘅源代碼:",
 '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)',
+'sqlhidden' => '(隱藏SQL查詢)',
 '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.',
+'ns-specialprotected' => '邇兜特殊頁面係毋做得編輯嘅。',
+'exception-nologin' => '還吂登入',
+'exception-nologin-text' => '你愛登錄本wiki正做得查閲邇頁或進行操作。',
 
 # Virus scanner
-'virus-unknownscanner' => 'vù-tî ke fòng phiang-thu̍k:',
+'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.',
+'logouttext' => "汝已經登出。
+
+汝做得用匿名方式繼續使用{{SITENAME}},或用相同或毋同用戶身份<span class='plainlinks'>[$1 登入]</span>。
+請注意,假使汝再次登入,本頁可能會繼續顯示,直到汝清除瀏覽器緩存。",
+'welcomeuser' => '歡迎,$1!',
+'yourname' => '用戶名:',
+'userlogin-yourname' => '用戶名',
+'userlogin-yourname-ph' => '輸入汝嘅用戶名',
+'yourpassword' => '密碼:',
+'userlogin-yourpassword' => '密碼',
+'userlogin-yourpassword-ph' => '輸入汝嘅密碼',
+'yourpasswordagain' => '再一擺輸入密碼:',
+'createacct-yourpasswordagain' => '確認密碼',
+'createacct-yourpasswordagain-ph' => '再一擺輸入密碼',
+'remembermypassword' => '在邇隻瀏覽器上記下亻厓嘅登入狀態(最長$1日)',
+'securelogin-stick-https' => '登入後繼續用HTTPS連接',
+'yourdomainname' => '汝嘅域名:',
+'password-change-forbidden' => '汝做毋得更改本wiki上嘅密碼。',
+'externaldberror' => '邇可能係由於驗證數據庫差錯或者汝分系統禁止更新汝嘅外部賬號。',
+'login' => '登入',
+'nav-login-createaccount' => '登入/建立新帳號',
+'loginprompt' => '汝必須啟用Cookies正做得成功登入{{SITENAME}}。',
+'userlogin' => '登入/建立新帳號',
+'userloginnocreate' => '登入',
+'logout' => '登出',
+'userlogout' => '登出',
+'notloggedin' => '還吂登入',
+'nologin' => '還無帳號係無?$1。',
+'nologinlink' => '建立帳號',
+'createaccount' => '建立帳號',
+'gotaccount' => '已經擁有帳號係無?$1。',
+'gotaccountlink' => '登入',
+'userlogin-resetlink' => '毋記得汝嘅登入信息?',
+'createacct-emailrequired' => '電郵地址:',
+'createaccountmail' => '使用一隻臨時嘅隨機密碼,並發送其到以下指定嘅電子郵件地址',
+'createacct-realname' => '實名(可選)',
+'createaccountreason' => '原因:',
+'createacct-reason' => '原因',
+'createacct-captcha' => '安全檢查',
+'createacct-benefit-body1' => '編寫數目',
+'createacct-benefit-body2' => '頁面數',
+'createacct-benefit-body3' => '近期貢獻人',
+'badretype' => '汝所撳入嘅密碼並無相同',
 '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',
+'loginerror' => '登入差錯',
+'createacct-error' => '帳戶建立差錯',
+'createaccounterror' => '無辦法建立帳號:$1',
 '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.',
+'nocookiesfornew' => 'lià ke yong-fu ke chong-ho hàn-màng kien-li̍p,ngài-tên mò-pan-fap khok-ngin kì ke lòi-ngièn. chhiáng khén-thin ǹ yî-kîn kôi-khí cookies,chhòng-sîn chai-ngi̍p heu chhai sṳ.',
 '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.',
+'loginsuccesstitle' => '登入成功',
+'loginsuccess' => '汝今下以"$1"嘅身份在{{SITENAME}}登入。',
+'nosuchuser' => '尋毋到用戶 "$1"。
+用戶名稱係有大小寫區分嘅。
+檢查汝嘅拼寫,或者用下面嘅表格[[Special:UserLogin/signup|建立一隻新賬號]]。',
 '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.',
+'passwordtooshort' => '汝嘅密碼毋得少過$1隻字符。',
 '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.',
+'eauthentsent' => '一封確認信已經發送到推薦地址。在發送其它郵件到邇隻賬戶前,汝必須首先按照邇封信肚嘅指導確認邇隻電子郵件信箱真實有效。',
 '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.',
@@ -381,30 +472,38 @@ Ngì khó-yî ki-siu̍k yî ngia̍k-miàng fông-sṳt sṳ́-yung {{SITENAME}},
 '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',
+'loginlanguagelabel' => '語言:$1',
 
 # 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' => '更改密碼',
+'resetpass_announce' => '汝係通過一隻發送到電子郵件肚嘅臨時代碼登入的。愛完成登入,汝必須在邇位設定一隻新密碼:',
+'resetpass_text' => '<!-- 在邇處加入文字 -->',
 '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...',
+'oldpassword' => '舊密碼:',
+'newpassword' => '舊密碼:',
+'retypenew' => '再一擺輸入密碼:',
+'resetpass_submit' => '設定密碼並登入',
+'resetpass_success' => '汝成功更改矣汝嘅密碼!
+今下為汝登入緊...',
 '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-submit-loggedin' => '更改密碼',
+'resetpass-submit-cancel' => '取消',
 
 # Special:PasswordReset
-'passwordreset-username' => 'Yung-fu-miàng',
+'passwordreset-username' => '用戶名:',
+'passwordreset-domain' => '域名:',
+'passwordreset-email' => '電郵地址:',
+
+# Special:ChangeEmail
+'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ṳ',
+'bold_sample' => '粗體文字',
+'bold_tip' => '粗體文字',
+'italic_sample' => '斜體文字',
+'italic_tip' => '斜體文字',
 '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ì',
@@ -413,8 +512,8 @@ Ngì khó-yî ki-siu̍k yî ngia̍k-miàng fông-sṳt sṳ́-yung {{SITENAME}},
 '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' => '-thí tóng-on lièn-kiet',
+'image_tip' => 'Khàm-ngi̍p thù-phién',
+'media_tip' => 'Mòi-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)',
 
@@ -424,7 +523,7 @@ Ngì khó-yî ki-siu̍k yî ngia̍k-miàng fông-sṳt sṳ́-yung {{SITENAME}},
 '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',
+'preview' => '預覽',
 'showpreview' => 'Hién-sṳ yi-ko',
 'showlivepreview' => 'Chit-sṳ̀ yi-ko',
 'showdiff' => 'Hién-sṳ chhâ-phe̍t',
@@ -448,12 +547,17 @@ Liá-chhṳ chhà-fûng he yù $1 só fûng ke. Tông-chûng ke ngièn-yîn he '
 '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.',
 'accmailtext' => "'$1' ke pi-me̍t yí-kîn ki-kî to $2.",
-'newarticle' => '(Sîn)',
+'newarticle' => '()',
 '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ì.',
 '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].',
+'noarticletext' => '邇頁當前無內容,汝做得在其他頁[[Special:Search/{{PAGENAME}}|搜尋邇頁標題]],
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜尋有關日誌],
+或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 編寫邇頁]</span>。',
+'noarticletext-nopermission' => 'Liá-ke ya̍p muk-chhièn mò nui-yùng. 
+Ngì cho-tet chhai khì-thâ ya̍p [[Special:Search/{{PAGENAME}}|sêu-chhìm chhṳ́ ya̍p-thì]],fe̍t-chá <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sêu-chhìm yû-kôan ngit-chì]</span>,than-he ngì mò 
+khièn-han kien-li̍p chhṳ́ ya̍p.',
 '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-é.',
 '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í.",
@@ -462,28 +566,29 @@ Tshiáng chhai kien-li̍p/piên-sip liá-ke vùn-tsông tshièn siên kiám-ts
 '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:'''",
+'updated' => '(已經更新)',
+'note' => "'''注意:'''",
 '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.'''",
 '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',
+'editconflict' => '編寫衝突:$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',
+'yourtext' => '汝嘅文字',
+'storedversion' => '已保存嘅修訂版本',
 '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',
+'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 />
@@ -494,22 +599,48 @@ Ngì thùng-sṳ̀ ya-yeu hiong Wikimedia pó-chṳn ngì só thì-kâu ke nui-y
 '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û:',
+'templatesused' => 'Chhai liá-ke ya̍p-mien song sṳ́-yung ke {{PLURAL:$1|mù-pán|mù-pán}}:',
 '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)',
+'template-protected' => '(保護)',
+'template-semiprotected' => '(半保護)',
 '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. -->',
 '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',
+'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:',
+'permissionserrorstext-withaction' => 'Ngì mò-fap khièn-han hi siá-chok $2, kîn-kí yî-ha ke {{PLURAL:$1|ngièn-yîn|ngièn-yîn}}:',
+'recreate-moveddeleted-warn' => "'''Kín-ko: Ngì hien-chhai chhùng-sîn kien-li̍p yit-ke siên-chhièn chên-kîn san-chhù-ko ke ya̍p-mien.'''
+
+Ngì yin-kôi yeu kháu-li yit-ha ki-siu̍k phiên-si̍p liá yit-ke ya̍p-mien sṳ-fî ha̍p-sṳt. 
+Vi-liáu fông-phien hí-kien, liá yit-ke ya̍p-mien ke san-chhù ki-liu̍k yí-kîn chhai ha-mien  
+thì-kiûng:",
+'moveddeleted-notice' => 'Liá-ke ya̍p-mien yí-kîn chhù-thet.
+Liá-ke ya̍p-mien ke san-chhù lâu yì-thung ngit-chì yí-kîn chhai ha-mien thì-kiûng chok-vi chhâm-kháu.',
+'log-fulllog' => '查看完整日誌',
+'edit-hook-aborted' => '編輯分鈎取消。
+其並無分出解釋。',
 '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-conflict' => '編寫衝突。',
 '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.',
+'defaultmessagetext' => '默認消息文字',
+
+# 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' => 'Kín-ko: Pâu-hàm mù-pan thai-séu ko-thai.
+Mêu-chúng mù-pan chiông put-nèn pâu-hàm.',
+'post-expand-template-inclusion-category' => 'Mù-pán pâu-hàm sông-han yí-kîn chhêu-ko ke ya̍p-mien',
+'post-expand-template-argument-warning' => 'Kín-ko: Liá-ke ya̍p-mien yû chui-séu yit-ke 
+mù-chhâm-sṳ yû ko-thai khóng-chán thai-séu.
+Mêu-yit chhâm-sṳ voi pûn lio̍k-ko.',
+'post-expand-template-argument-category' => 'Pâu-hàm chho̍k-lio̍k ko mù-pan chhâm-sú ke ya̍p-mien',
 
 # "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á.',
@@ -518,7 +649,7 @@ Ngì thùng-sṳ̀ ya-yeu hiong Wikimedia pó-chṳn ngì só thì-kâu ke nui-y
 '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',
+'cantcreateaccounttitle' => '無法建立帳號',
 '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ṳ́ .
 
 Tông-tsûng pûn $3 fûng-só ke ngièn-yîn he ''$2''",
@@ -527,57 +658,65 @@ Tông-tsûng pûn $3 fûng-só ke ngièn-yîn he ''$2''",
 '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)',
+'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-user' => '(用戶名已移除)',
 'rev-deleted-event' => '(hong-muk yí-kîn yì-chhù)',
 '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-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',
+'logdelete-success' => "'''事件嘅可見性已經成功設定。'''",
+'revdel-restore' => '更改可見性',
+'revdel-restore-deleted' => '已刪除嘅修訂版本',
+'revdel-restore-visible' => '見得到嘅修訂版本',
 'pagehist' => 'Vùn-tsông li̍t-sṳ́',
 'deletedhist' => 'Yí-kîn tshù-me̍t ke li̍t-sṳ́',
 
@@ -589,20 +728,22 @@ Tông-tsûng pûn $3 fûng-só ke ngièn-yîn he ''$2''",
 '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-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:',
+'lineno' => '第$1行:',
 '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ṳ.)',
+'editundo' => '撤銷',
+'diff-multi' => '({{PLURAL:$2|1 miàng yung-fu|$2 miàng yung-fu}}
+chok-chhut ke {{PLURAL:$1|yit-ke chûng-thù siû-thin pán-pún|$1-ke chûng-thù siû-thin pán-pún}}hàn-mò pûn hién-sṳ)',
 
 # Search results
-'searchresults' => 'Chhìm-cháu kiet-kó',
-'searchresults-title' => 'Tui "$1" ke sêu-chhà kiet-kó',
+'searchresults' => '搜尋結果',
+'searchresults-title' => '搜尋"$1"嘅結果',
 '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}}]].',
 '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"',
@@ -610,20 +751,40 @@ Tông-tsûng pûn $3 fûng-só ke ngièn-yîn he ''$2''",
 '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).',
+'prevn' => '前頭$1隻',
+'nextn' => '後背$1隻',
+'prevn-title' => '前頭$1隻結果',
+'nextn-title' => '後背$1隻結果',
+'shown-title' => '每頁展示$1項結果',
+'viewprevnext' => '查看($1 {{int:pipe-separator}} $2)($3)',
+'searchmenu-exists' => "'''Pún wiki sông yû-miàng chhṳ̂n-cho “[[:$1]]” ke ya̍p-mien'''",
+'searchmenu-new' => "'''Chhai liá-ke wiki sông kien-li̍p liá-ke ya̍p-mien \"[[:\$1]]\"!'''",
 '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)',
+'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' => '{{PLURAL:$1|1-ke sṳ̀n-yèn|$1-ke sṳ̀n-yèn}} ({{PLURAL:$2|1-ke chṳ́  fûn-lui|$2-ke chṳ́  fûn-lui}}, {{PLURAL:$3|1-ke tóng-on|$3-ke tóng-on}})',
+'search-redirect' => '(重定向 $1)',
+'search-section' => '(段落 $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ô)',
+'searchrelated' => 'siông-kôan',
+'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ó:",
+'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í.',
+'search-nonefound' => 'Chhà-chhìm chûng mò kiet-kó siông-fù.',
 '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à:',
@@ -632,39 +793,32 @@ Tông-tsûng pûn $3 fûng-só ke ngièn-yîn he ''$2''",
 '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',
-
 # Preferences page
 'preferences' => 'Chhâm-su sat-chṳ',
-'mypreferences' => 'Ngài-ke chhâm-su sat-chṳ',
+'mypreferences' => '偏好設定',
 'prefsnologin' => 'Hàn-mò tên-ngi̍p',
 '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',
+'prefs-skin' => '外皮',
 '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-rc' => '最近更改',
 'prefs-watchlist' => 'Kam-sṳ lie̍t-péu',
 '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',
 'resetprefs' => 'Sat-thin',
-'prefs-editing' => 'Phiên-cho',
+'restoreprefs' => '恢復所有默認設定',
+'prefs-editing' => '編寫緊',
 '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:',
+'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.',
 'timezonelegend' => 'Sṳ̀-khî',
@@ -688,7 +842,8 @@ Tông-tsûng pûn $3 fûng-só ke ngièn-yîn he ''$2''",
 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.',
+'prefs-help-email' => '電郵地址係選填項目,但係,假使汝毋記得汝嘅密碼,其做得用於重設密碼。',
+'prefs-help-email-others' => 'Ngì yi̍t khó-yî chhai ngì mò kûng-khôi chhṳ-kí ke yung-fu sṳ̂n-fun sṳ̀  theu-ko ngì-ke yung-fu-ya̍p fe̍t-chá yung-fu thó-lun-ya̍p lâu ngì lièn-kiê.',
 
 # User rights
 'userrights' => 'Yung-fu khièn-han kón-lî',
@@ -709,12 +864,15 @@ Tshòng-tón pit-sî chhai $1-ke sṳ-ngièn yî-ha.',
 'group-all' => '(chhiòn-phu)',
 
 '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}}: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.',
@@ -728,11 +886,15 @@ Tshòng-tón pit-sî chhai $1-ke sṳ-ngièn yî-ha.',
 
 # 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' => '最近更改',
+'recentchanges-legend' => '最近更改選項',
 '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:",
+'recentchanges-feed-description' => '跟蹤本訂閱在wiki上嘅最近更改。',
+'recentchanges-label-newpage' => '邇次編輯建立起一隻新頁面',
+'recentchanges-label-minor' => 'Liá-he yit-ke séu phiên-si̍p',
+'recentchanges-label-bot' => 'liá-chhṳ phiên-si̍p he yù kî-hi-ngìn chin-hàng',
+'recentchanges-label-unpatrolled' => 'Liá-chhṳ phiên-si̍p hàn-mò sùn-chhà ko',
+'rcnote' => "Yî-ha {{PLURAL:$1|he '''1''' kiên-kói|he chui-khiûn  '''$1''' ke kiên-kói }} chhai chui-khiûn {{PLURAL:$2|thiên|'''$2'''-thiên}}, chhṳ-chhiùng $5, $4.",
 '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',
@@ -742,14 +904,14 @@ Tshòng-tón pit-sî chhai $1-ke sṳ-ngièn yî-ha.',
 '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',
+'diff' => '差別',
+'hist' => '歷史',
+'hide' => '隱藏',
+'show' => '展示',
+'minoreditletter' => '細微',
 'newpageletter' => 'Sîn',
 'boteditletter' => 'Kî-hi',
-'number_of_watching_users_pageview' => '[$1-ke kôan-chu yung-fu]',
+'number_of_watching_users_pageview' => '[$1隻用戶關注]',
 '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)',
@@ -758,7 +920,7 @@ Tshòng-tón pit-sî chhai $1-ke sṳ-ngièn yî-ha.',
 # 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-toolbox' => '相關更改',
 '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).
@@ -767,9 +929,9 @@ Chhai [[Special:Watchlist|ngì-ke kam-sṳ lie̍t-péu]] chûng ke ya̍p fi hié
 'recentchangeslinked-to' => 'Hién-sṳ lièn-to só pûn-chhut  ke  ya̍p',
 
 # 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.',
+'upload' => '上傳文件',
+'uploadbtn' => '上傳文件',
+'reuploaddesc' => '取消上載並返回上載表單',
 '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.',
@@ -781,11 +943,11 @@ Chhai [[Special:Watchlist|ngì-ke kam-sṳ lie̍t-péu]] chûng ke ya̍p fi hié
 '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:',
+'filestatus' => '版權狀態:',
 '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',
+'ignorewarnings' => '忽略所有警告',
 '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.',
@@ -805,27 +967,29 @@ Kó-yèn kiám-chhà heu ke tóng-on he khiung-thùng ngièn-pún thù-hiong ke
 '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]]',
+'fileexists-forbidden' => '既存在相同名稱个檔案,且毋可以覆蓋;請返回並用一隻新名稱來上傳邇隻檔案。[[File:$1|thumb|center|$1]]',
+'fileexists-shared-forbidden' => '在共享檔案庫中既存在同名檔案。
+係話汝仍然想愛上載其个話,請返回並用一隻新个名稱來上傳邇隻檔案。[[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',
 'uploaddisabledtext' => 'Tóng-on song-chhòn chhai chhṳ́ miong-chham put hí-khó yung.',
+'php-uploaddisabledtext' => 'PHP 文件上載已經停用。請檢查 file_uploads 設定。',
 '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',
+'sourcefilename' => '來源文件名',
+'destfilename' => '目標文件名',
+'watchthisupload' => '監視本文件',
 '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-file-error-text' => '當嘗試在服務器上建立臨時檔案時發生內部差錯。請撈[[Special:ListUsers/sysop|管理員]]聯繫。',
 '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ê.',
+'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',
@@ -833,7 +997,7 @@ Kó-yèn ngì yû liá-ke thù-hìn ke vàn-cháng thai-séu.",
 '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ṳ.',
 
-'license' => 'Su-khièn',
+'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)',
@@ -851,9 +1015,10 @@ Kó-yèn ngì yû liá-ke thù-hìn ke vàn-cháng thai-séu.",
 
 # File description page
 'file-anchor-link' => 'Tóng-on',
-'filehist' => 'Tóng-on li̍t-sṳ́',
+'filehist' => '文件歷史',
 '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-revert' => 'fu̍k-ngièn',
 'filehist-current' => 'muk-chhièn',
 'filehist-datetime' => 'Ngit-khì/Sṳ̀-kiên',
 'filehist-thumb' => 'Sok-thù',
@@ -861,10 +1026,12 @@ Kó-yèn ngì yû liá-ke thù-hìn ke vàn-cháng thai-séu.",
 '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:',
+'imagelinks' => '文件用處',
+'linkstoimage' => 'Yî-ha {{PLURAL:$1|ya̍p-mien|$1-ke ya̍p-mien}} lièn-chiap chṳ pún vùn-khien:',
 '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.',
+'sharedupload' => '本檔案來自於$1,渠可能在其它計劃項目肚分人應用。',
+'sharedupload-desc-here' => 'Liá-ke tóng-on lòi-chhṳ yî $1,kì khó-nèn chhai khì-thâ kie-va̍k hong-muk chûng pûn yin-yung.
+Kì chhai [$2 tóng-on mèu-su̍t ya̍p-mien] piên-kin ke mèu-su̍t yî ha-mien hién-sṳ.',
 'uploadnewversion-linktext' => 'Song-chhòn tóng-on ke sîn pán-pún',
 
 # File deletion
@@ -888,7 +1055,7 @@ Kó-yèn ngì yû liá-ke thù-hìn ke vàn-cháng thai-séu.",
 'unusedtemplateswlh' => 'Khì-thâ lièn-kiet',
 
 # 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
@@ -901,6 +1068,7 @@ Kó-yèn ngì yû liá-ke thù-hìn ke vàn-cháng thai-séu.",
 'statistics-mostpopular' => 'Pûn-ngìn chhà-khon chhṳ-su chui-tô ke vùn-chông',
 
 'disambiguations' => 'Sêu-hàm fù-chông',
+'disambiguationspage' => 'Template:sêu-chhù khi-ngi',
 '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',
@@ -908,7 +1076,7 @@ Kó-yèn ngì yû liá-ke thù-hìn ke vàn-cháng thai-séu.",
 
 'brokenredirects' => 'Sún-fái ke chhûng-thin hiong-hong',
 '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-edit' => '編寫',
 'brokenredirects-delete' => 'Chhù-thet',
 
 'withoutinterwiki' => 'Mò-yû ngî-ngièn lièn-chiap ke vùn-chông',
@@ -917,7 +1085,7 @@ Kó-yèn ngì yû liá-ke thù-hìn ke vàn-cháng thai-séu.",
 'fewestrevisions' => 'Chui-séu siù-chho ke vùn-chông',
 
 # Miscellaneous special pages
-'nbytes' => '$1-vi ngièn-chû',
+'nbytes' => '$1字節',
 'ncategories' => '$1-ke fûn-lui',
 'nlinks' => '$1-ke lièn-kiet',
 'nmembers' => '$1-ke sṳ̀n-yèn',
@@ -948,7 +1116,8 @@ Kó-yèn ngì yû liá-ke thù-hìn ke vàn-cháng thai-séu.",
 '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',
+'usercreated' => '$1 $2{{GENDER:$3|chhóng-kien}}',
+'newpages' => '新頁面',
 'newpages-username' => 'Yung-fu-miàng:',
 'ancientpages' => 'Chui-khiu ke hong-mien',
 'move' => 'Yì-thung',
@@ -961,7 +1130,7 @@ Kó-yèn ngì yû liá-ke thù-hìn ke vàn-cháng thai-séu.",
 'pager-older-n' => 'khiu $1-chhṳ',
 
 # Book sources
-'booksources' => 'Chham-ngoi sû-ngièn',
+'booksources' => '網絡書源',
 '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:',
@@ -981,12 +1150,12 @@ Kó-yèn ngì yû liá-ke thù-hìn ke vàn-cháng thai-séu.",
 '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',
+'allarticles' => '全部頁面',
 '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',
+'allpagessubmit' => '提交',
 '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.',
 
@@ -999,6 +1168,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Special:LinkSearch
 'linksearch' => 'Ngoi-phu lièn-chiap',
 'linksearch-ok' => 'Chhìm-cháu',
+'linksearch-line' => '$1 lièn-chhṳ $2',
 
 # Special:ListUsers
 'listusersfrom' => 'Hién-sṳ yung-fu lie̍t-péu chhiùng:',
@@ -1029,21 +1199,22 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'emailsenttext' => 'Ngì-ke email yí-kîn fat-chhut.',
 
 # Watchlist
-'watchlist' => 'Kam-sṳ lie̍t-péu',
-'mywatchlist' => 'Ngài-ke kam-sṳ lie̍t-péu',
+'watchlist' => '監視列表',
+'mywatchlist' => '監視列表',
+'watchlistfor2' => '$1嘅監視列表$2',
 '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.',
 '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ṳ',
+'watch' => '監視',
 '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.',
+'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' => 'Kiám-chhà pûn kam-sṳ hong-mien ke chui-khiûn phiên-cho',
@@ -1057,6 +1228,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # 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ṳ',
+'watcherrortext' => '更改“$1”嘅監視列表設定時出現差錯。',
 
 '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.',
@@ -1079,6 +1251,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 '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',
+'actionfailed' => 'Chhâu-chok sṳt-phai',
 '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.',
@@ -1091,7 +1264,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Rollback
 'rollback' => 'Fî-fu̍k',
 'rollback_short' => 'Fî-fu̍k',
-'rollbacklink' => 'fî-fu̍k',
+'rollbacklink' => '打轉頭',
 '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á.',
 '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]])。',
@@ -1136,7 +1309,7 @@ Yî-ha he '''$1''' hien-sṳ̀ ke pó-fu khi̍p-phe̍t:",
 'pagesize' => '(Vi-ngièn-chû)',
 
 # Restrictions (nouns)
-'restriction-edit' => 'Phiên-siá',
+'restriction-edit' => '編寫',
 'restriction-move' => 'Yì-thung',
 'restriction-create' => 'Tshóng-kien',
 
@@ -1159,7 +1332,8 @@ Pûn chhù-thet chhièn ke só-yû siû-thin pán-pún, lièn-thùng chhù-thet
 'undelete-revision' => 'Chhù-thet pán-pún $1 chhṳ $2:',
 'undeleterevision-missing' => 'Chhṳ́ pán-pún ke nui-yùng put chṳn-khok fe̍t-chá yí-kîn yì-sṳt. Khó-nèn lièn-kiet chho-ngu, pûn yì-chhù fe̍t-he yí-kîn pûn fî-fu̍k.',
 'undeletebtn' => 'Fî-fu̍k',
-'undeletelink' => 'kiám-sṳ/fî-fu̍k',
+'undeletelink' => '查看/恢復',
+'undeleteviewlink' => '查看',
 'undeletereset' => 'Chhùng-sat',
 'undeletecomment' => 'Ngièn-yîn:',
 'undeletedrevisions' => '$1-ke siû-thin pán-pún yí-kîn fî-fu̍k',
@@ -1176,33 +1350,36 @@ Chhiáng chhâm-kháu [[Special:Log/delete|chhù-hi ngit-ki]] lòi chhà-chhut c
 'undelete-no-results' => 'Chhù-thet ki-liu̍k lî mò-yû fù-ha̍p ke kiet-kó.',
 
 # Namespace form on various pages
-'namespace' => 'Miàng-sṳ khûng-kiên:',
+'namespace' => '名字空間:',
 'invert' => 'Fán-hiong sién-chet',
-'blanknamespace' => '(Chú)',
+'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',
+'contributions' => '{{GENDER:$1|用戶}}貢獻',
+'contributions-title' => '$1嘅用戶貢獻',
+'mycontris' => '貢獻',
+'contribsub2' => '$1嘅貢獻($2)',
 '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)',
+'uctop' => '(最新修改)',
 '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',
+'sp-contributions-uploads' => 'sông-chhòn',
+'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-toponly' => 'Chṳ́  hién-sṳ chui-sîn siû-thin pán-pún ke phiên-si̍p',
 'sp-contributions-submit' => 'Chhìm-cháu',
 
 # What links here
-'whatlinkshere' => 'Lièn-ngi̍p to liá-chham',
+'whatlinkshere' => '鏈接入頁面',
 'whatlinkshere-title' => 'Lièn-chiap to "$1" ke ya̍p',
-'whatlinkshere-page' => 'Vùn-chông:',
+'whatlinkshere-page' => '頁面:',
 '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]].',
@@ -1215,6 +1392,7 @@ Chhiáng chhâm-kháu [[Special:Log/delete|chhù-hi ngit-ki]] lòi chhà-chhut c
 'whatlinkshere-hideredirs' => '$1 chhûng-thin-hiong',
 'whatlinkshere-hidetrans' => '$1 pâu-hàm',
 'whatlinkshere-hidelinks' => '$1 lièn-kiet',
+'whatlinkshere-hideimages' => '$1-ke vùn-khien lièn-kiet',
 'whatlinkshere-filters' => 'Ko-li-khí',
 
 # Block/unblock
@@ -1236,7 +1414,7 @@ Chhiáng chhâm-kháu [[Special:Log/delete|chhù-hi ngit-ki]] lòi chhà-chhut c
 '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',
+'ipboptions' => '2小時:2 hours,1日:1 day,3日:3 days,1星期:1 week,2星期:2 weeks,1隻月:1 month,3隻月:3 months,6隻月:6 months,1年:1 year,無限期:infinite',
 'ipbotheroption' => 'khì-thâ',
 'ipbotherreason' => 'Khì-thâ lî-yù:',
 'ipbhidename' => 'Chhai chhà-fûng ngit-ki, fa̍t-chhiok chhà-fûng lie̍t-péu yî-khi̍p yung-fu lie̍t-péu chûng yún-chhòng yung-fu-miàng.',
@@ -1252,7 +1430,7 @@ Chhiáng chhâm-kháu [[Special:Log/delete|chhù-hi ngit-ki]] lòi chhà-chhut c
 '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' => 'Pûn fûng-kim yung-fu lie̍t-péu',
 'ipblocklist-submit' => 'Chhìm-cháu',
 'infiniteblock' => 'yún-kiú',
 'expiringblock' => '$1 $2 to-khì',
@@ -1261,10 +1439,10 @@ Chhiáng chhâm-kháu [[Special:Log/delete|chhù-hi ngit-ki]] lòi chhà-chhut c
 'createaccountblock' => 'Kim-chṳ́ chhóng-kien chong-ho',
 'ipblocklist-empty' => 'Chhà-fûng lie̍t-péu he khûng-hî.',
 'ipblocklist-no-results' => 'Só yêu-khiù ke IP thi-tiám/yung-fu-miàng mò-yû pûn chhà-fûng.',
-'blocklink' => 'Kim-fûng',
-'unblocklink' => 'kié-chhù kim-fûng',
-'change-blocklink' => 'kiên-kói fûng-kim',
-'contribslink' => 'Kung-hien',
+'blocklink' => '查封',
+'unblocklink' => '解封',
+'change-blocklink' => '更改封禁',
+'contribslink' => '貢獻',
 'autoblocker' => 'Ngì-ke IP lâu pûn fûng-liáu ke "$1" he yit-yong ke. Fûng-só ngièn-yîn: "$2".',
 'blocklogpage' => 'Fûng-só ki-liu̍k',
 'blocklogentry' => '"[[$1]]" yí-kîn pûn chhà-fûng $3, chûng-chṳ́ sṳ̀-kiên he $2',
@@ -1332,10 +1510,10 @@ chhiáng chhai hàng-thung chṳ̂-chhièn siên liáu-kié khì-thâ khó-nèn
 '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'''.",
 'movedto' => 'yì-thung to',
 'movetalk' => 'Chhiáng thùng-sṳ̀ yì-thung tui-fa-chông',
-'movelogpage' => 'Yì-thung ngit-ki',
+'movelogpage' => '移動日誌',
 'movelogpagetext' => 'Yî-ha he yí-kîn yì-thung ke vùn-chông chhîn-tân.',
 'movereason' => 'Ngièn-yîn:',
-'revertmove' => 'fî-fu̍k ke-yì-thung',
+'revertmove' => '恢復',
 'delete_and_move' => 'Chhù-chhîn lâu yì-thung',
 'delete_and_move_text' => '==Sî-yeu chhù-thet==
 
@@ -1346,31 +1524,30 @@ Ngì khok-ngin sî-yeu chhù-thet ngièn hong-mien khi̍p chin-hàng yì-thung m
 '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ì',
@@ -1379,87 +1556,90 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 '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-move' => '移動本頁',
+'tooltip-ca-watch' => '加邇頁入監視列表',
 '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' => '搜尋{{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-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-feed-atom' => '訂閱邇頁嘅Atom源',
 '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-t-upload' => '上傳文件',
+'tooltip-t-specialpages' => '全部特殊文章嘅列表',
+'tooltip-t-print' => '本頁面做得打印嘅版本',
+'tooltip-t-permalink' => '邇隻頁面修訂版本嘅永久鏈接',
+'tooltip-ca-nstab-main' => '查看內容頁',
 'tooltip-ca-nstab-user' => 'Chhà-khon yung-fu-chông',
 '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-image' => '查看文件頁面',
 'tooltip-ca-nstab-mediawiki' => 'Chhà-khon ne-thúng chṳ̂-liau',
 'tooltip-ca-nstab-template' => 'Chhà-khon mù-pán',
 '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-ca-nstab-category' => '查看分類頁面',
 '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!',
@@ -1467,8 +1647,9 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 '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-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' => 'Sû-ngi̍p yit-ke kién-tón ke chak-yeu',
 
 # Stylesheets
 'common.css' => '/* Chhṳ́-chhu ke CSS chiông-chhiu yin-yung chhai só-yû ke mien-pán */',
@@ -1504,7 +1685,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à.',
@@ -1540,14 +1721,15 @@ 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' => 'Chhṳ́ tóng-on chûng pâu-hàm yû khóng-chán ke sín-sit. Liá-ke sín-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-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.
@@ -1570,13 +1752,14 @@ yèn-heu thùng yit-hòng heu-fông ke lièn-chiap chiông-voi pûn sṳ-vì li-
 '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.',
 
 # '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 +1791,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',
@@ -1656,6 +1839,9 @@ Sòn-chhṳ phêu-chún yi-liau.',
 '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',
 
+# Core parser functions
+'duplicate-defaultsort' => '\'\'\'警告\'\'\': Yi-sat ke phài-sì khèn "$2" fu̍k-koi siên-chhièn ke yi-sat phài-sì khèn "$1"',
+
 # Special:Version
 'version' => 'Pán-pún',
 
@@ -1663,11 +1849,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' => ' #Liù-hâ liá-hàng yit-yong ke vùn-sṳ<pre>
+#Chhai ha-mien (/chṳ̂ chûng-kiên phu-fun)
+sû-ngi̍p chang-kûi péu-tha̍t-sṳt 
+#Liá-he chiông-voi kiên ngoi-phu (yí-kîn chhêu lièn-kiet ke) thù-phién phi-ha̍p
+#Phi-ha̍p to chhut-lòi ke voi hién-sṳ sṳ̀n thù-phién,féu-chet chṳ́-nèn hién-sṳ sṳ̀n lièn-kiet 
+#Yû #Khôi-thèu ke hàng voi tông-sṳ̀n chu-kié 
+#Thai-séu siá pin-mò khî-fûn
+#Chhai liá-hàng song-mien sû-ngi̍p só-yû ke regex. Liù-hâ liá-hàng yit-yong ke vùn-sṳ</pre>',
+
+# Special:Tags
+'tag-filter' => '[[Special:Tags|Phêu-chhiâm]] ko-li-khí:',
 
 # 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 5eef837..6f9a5ae 100644 (file)
@@ -371,21 +371,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' => 'הסתרת עריכות של משתמשים אנונימיים ברשימת המעקב',
@@ -482,7 +482,7 @@ $messages = array(
 'about' => 'אודות',
 'article' => 'דף תוכן',
 'newwindow' => '(נפתח בחלון חדש)',
-'cancel' => 'ביטול / יציאה',
+'cancel' => 'ביטול',
 'moredotdotdot' => 'עוד…',
 'morenotlisted' => 'עוד פריטים שאינם ברשימה…',
 'mypage' => 'דף משתמש',
@@ -770,12 +770,17 @@ $2',
 'yourname' => 'שם משתמש:',
 'userlogin-yourname' => 'שם משתמש',
 'userlogin-yourname-ph' => 'יש להקליד את שם המשתמש',
+'createacct-helpusername-url' => '{{ns:Project}}:מדיניות_שמות_משתמש',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(עזרה בבחירה)]]',
 '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ת×\99',
+'userlogin-remembermypassword' => '×\9cש×\90×\99ר ×\90×\95ת×\99 ×\9e×\97×\95×\91ר',
 'userlogin-signwithsecure' => 'כניסה לחשבון עם שרת מאובטח',
 'securelogin-stick-https' => 'המשך שימוש ב־HTTPS אחרי הכניסה',
 'yourdomainname' => 'המתחם שלך:',
@@ -799,12 +804,29 @@ $2',
 'userlogin-resetlink' => 'שכחת את פרטי הכניסה?',
 'helplogin-url' => 'Help:כניסה לחשבון',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|עזרה בכניסה לחשבון]]',
+'createacct-join' => 'נא להקליד להלן את הפרטים שלך.',
+'createacct-emailrequired' => 'כתובת דוא"ל',
+'createacct-emailoptional' => 'כתובת דוא"ל (לא חובה)',
+'createacct-email-ph' => 'יש להקליד את כתובת הדוא"ל שלך',
 'createaccountmail' => 'שימוש בסיסמה זמנית אקראית ושליחתה לכתובת הדוא"ל המצוינת להלן',
+'createacct-realname' => 'שם אמיתי (לא חובה)',
 'createaccountreason' => 'סיבה:',
+'createacct-reason' => 'סיבה',
+'createacct-reason-ph' => 'סיבה ליצירת חשבון חדש',
+'createacct-captcha' => 'בדיקת אבטחה',
+'createacct-captcha-help-url' => '{{ns:Project}}:בקשה לחשבון',
+'createacct-imgcaptcha-help' => 'לא רואים את התמונה? [[{{MediaWiki:createacct-captcha-help-url}}|בקשו חשבון]]',
+'createacct-imgcaptcha-ph' => 'יש להקליד את הטקסט המופיע למעלה',
+'createacct-submit' => 'יצירת החשבון שלך',
+'createacct-benefit-heading' => 'את האתר {{SITENAME}} יוצרים אנשים כמוך.',
+'createacct-benefit-body1' => 'עריכות',
+'createacct-benefit-body2' => 'דפים',
+'createacct-benefit-body3' => 'תורמים לאחרונה',
 'badretype' => 'הסיסמאות שהזנתם אינן מתאימות.',
 'userexists' => 'שם המשתמש שבחרתם כבר נמצא בשימוש.
 אנא בחרו שם אחר.',
 'loginerror' => 'שגיאה בכניסה לאתר',
+'createacct-error' => 'שגיאה ביצירת חשבון',
 'createaccounterror' => 'לא ניתן היה ליצור את החשבון: $1',
 'nocookiesnew' => 'חשבון המשתמש שלכם נוצר, אך לא נכנסתם כמשתמשים רשומים.
 {{SITENAME}} משתמש בעוגיות כדי להכניס משתמשים למערכת.
@@ -897,6 +919,7 @@ $2',
 'resetpass-wrong-oldpass' => 'הסיסמה הזמנית או הנוכחית אינה תקינה.
 ייתכן שכבר שיניתם את סיסמתכם או שכבר ביקשתם סיסמה זמנית חדשה.',
 'resetpass-temp-password' => 'סיסמה זמנית:',
+'resetpass-abort-generic' => 'שינוי הסיסמה בוטל על ידי הרחבה.',
 
 # Special:PasswordReset
 'passwordreset' => 'איפוס סיסמה',
@@ -934,7 +957,7 @@ $2
 סיסמה זמנית: $2',
 'passwordreset-emailsent' => 'נשלח דואר אלקטרוני לאיפוס הסיסמה.',
 'passwordreset-emailsent-capture' => 'נשלח דואר אלקטרוני לאיפוס הסיסמה, והוא מוצג להלן.',
-'passwordreset-emailerror-capture' => 'נוצר דואר אלקטרוני לאיפוס הסיסמה, והוא מוצג להלן, אך שליחתו למשתמש נכשלה: $1',
+'passwordreset-emailerror-capture' => 'נוצר דואר אלקטרוני לאיפוס הסיסמה, והוא מוצג להלן, אך שליחתו ל{{GENDER:$2|משתמש|משתמשת}} נכשלה: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'שינוי כתובת דוא"ל',
@@ -1465,7 +1488,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 +1602,7 @@ $1",
 'userrights-notallowed' => 'לחשבון המשתמש שלכם אין הרשאה להוסיף או להסיר הרשאות של משתמשים.',
 'userrights-changeable-col' => 'קבוצות שבאפשרותכם לשנות',
 'userrights-unchangeable-col' => 'קבוצות שאין באפשרותכם לשנות',
+'userrights-conflict' => 'התנגשות הרשאות משתמש! אנא בצעו את השינויים שלכם שוב.',
 
 # Groups
 'group' => 'קבוצה:',
@@ -2007,8 +2031,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 +2345,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' => 'זוהי רשימה של קבוצות המשתמש המוגדרות באתר זה, עם ההרשאות של כל אחת.
@@ -3302,11 +3335,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' => 'דרך הכתיבה בהודעה היא כמתואר להלן:
 
@@ -3990,12 +4037,16 @@ $5
 'version-entrypoints-header-entrypoint' => 'נקודת כניסה',
 'version-entrypoints-header-url' => 'כתובת',
 
-# Special:FilePath
-'filepath' => 'נתיב לקובץ',
-'filepath-page' => 'הקובץ:',
-'filepath-submit' => 'הצגה',
-'filepath-summary' => 'דף זה מציג את הנתיב המלא לקבצים שהועלו.
-תמונות מוצגות ברזולוציה מלאה, וסוגי קבצים אחרים מוצגים ישירות באמצעות התוכנה שהוגדרה להצגתם.',
+'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 +4138,7 @@ $5
 'htmlform-selectorother-other' => 'אחר',
 'htmlform-no' => 'לא',
 'htmlform-yes' => 'כן',
+'htmlform-chosen-placeholder' => 'נא לבחור אפשרות',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 עם תמיכה בחיפוש בטקסט מלא',
@@ -4129,8 +4181,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..202df38 100644 (file)
@@ -217,8 +217,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ध्यान रखने वाले सदस्यों की संख्या दिखाएँ',
 'tog-oldsig' => 'वर्तमान हस्ताक्षर:',
 'tog-fancysig' => 'हस्ताक्षर का विकिपाठ के समान उपयोग करें (बिना स्वचालित कड़ी के)',
-'tog-externaleditor' => 'डिफ़ॉल्ट रूप से बाह्य सम्पादक का उपयोग करें (केवल विशेषज्ञों के लिए, इसके लिए संगणक पर विशेष जमाव चाहिए होंगे। [//www.mediawiki.org/wiki/Manual:External_editors अधिक जानकारी।])',
-'tog-externaldiff' => 'डिफ़ॉल्ट रूप से बाह्य अन्तर का उपयोग करें (केवल विशेषज्ञों के लिए, इसके लिए संगणक पर विशेष जमाव चाहिए होंगे। [//www.mediawiki.org/wiki/Manual:External_editors अधिक जानकारी।])',
 'tog-showjumplinks' => '"की ओर जाएं" कड़ियाँ उपलब्ध कराएँ',
 'tog-uselivepreview' => 'सजीवन झलक का उपयोग करें (जावास्क्रिप्ट चाहिए) (प्रयोगक्षम)',
 'tog-forceeditsummary' => 'यदि बदलाव सारांश ना दिया गया हो तो मुझे सूचित करें',
@@ -1237,15 +1235,6 @@ $1",
 आप गूगल से खोज कर सकते हैं।
 ध्यान रखें कि उनकी {{SITENAME}} सामग्री की सूची पुरानी हो सकती है।',
 
-# Quickbar
-'qbsettings' => 'शीघ्रपट',
-'qbsettings-none' => 'बिल्कुल नहीं',
-'qbsettings-fixedleft' => 'स्थिर बाईं ओर',
-'qbsettings-fixedright' => 'स्थिर दाहिनी ओर',
-'qbsettings-floatingleft' => 'अस्थिर बाईं ओर',
-'qbsettings-floatingright' => 'अस्थिर दाहिनी ओर',
-'qbsettings-directionality' => 'निश्चित, आपकी भाषा की लिपि की दिशात्मकता पर निर्भर',
-
 # Preferences page
 'preferences' => 'मेरी वरीयताएँ',
 'mypreferences' => 'पसंद',
@@ -1805,7 +1794,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
 'http-read-error' => 'एच॰टी॰टी॰पी पढ़ने में त्रुटि।',
 'http-timed-out' => 'एच॰टी॰टी॰पी अनुरोध का समय समाप्त (टाइम आउट)',
 'http-curl-error' => 'यू॰आर॰एल $1 पाने में त्रुटि',
-'http-host-unreachable' => 'यू॰आर॰एल तक पहुँचा नहीं जा सका।',
 'http-bad-status' => 'एच॰टी॰टी॰पी अनुरोध के दौरान समस्या थी: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2125,15 +2113,6 @@ 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' => 'नीचे इसे विकि के लिए परिभाषित सदस्य समूहों की सूची है, साथ में हर समूह से जुड़े अधिकार भी वर्णित हैं।
index b1bc115..68c5ae4 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',
index 7b38419..48c6df3 100644 (file)
@@ -48,8 +48,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ipakita ang numero sang mga nagalantaw nga manug-gamit',
 'tog-oldsig' => 'Nagapabilin nga pirma:',
 'tog-fancysig' => 'Tratoha ang pirma bilang wikitext (wala sang tabid nga dayon)',
-'tog-externaleditor' => 'Gamiton dayon ang pang-guha nga manug-ilis (para sa mga sagad lamang, nagakinahanglan sang espesyal nga pagkay-o sa imo computer. [//www.mediawiki.org/wiki/Manual:External_editors Mas madamo pa nga impormasyon.])',
-'tog-externaldiff' => 'Gamiton dayon ang pang-guha nga diff (para sa mga sagad lamang, nagakinahanglan sang espesyal nga pagkay-o sa imo computer. [//www.mediawiki.org/wiki/Manual:External_editors Mas madamo pa nga impormasyon.])',
 'tog-showjumplinks' => 'Sugtan ang "maglumpat sa" nga mga tabid sang paalagyan',
 'tog-uselivepreview' => 'Gamiton ang preview nga live (nagakinahanglan sang JavaScript) (experimentohanon)',
 'tog-forceeditsummary' => 'Sugidi ako kon magasulod ako sa blanko nga kabilogan sang pag-ilis',
@@ -1110,15 +1108,6 @@ Testingan mo i-prefiks ang imo pamangkot upod sang ''tanan:'' para makita mo ang
 Mahimo ka nga magpangita gamit ang Google sa sini nga tion.
 Tandai nga ang ila nga palasulundan sang mga unod sang {{SITENAME}} mahimo nga madaan na.',
 
-# Quickbar
-'qbsettings' => 'Bar nga mahapos',
-'qbsettings-none' => 'Wala',
-'qbsettings-fixedleft' => 'Gintadlong sa wala',
-'qbsettings-fixedright' => 'Gintadlong sa too',
-'qbsettings-floatingleft' => 'Nagalutaw sa wala',
-'qbsettings-floatingright' => 'Nagalutaw sa too',
-'qbsettings-directionality' => 'Indi na maliwat, depende sa direksyon sang iskrip sang imo lenggwahe',
-
 # Preferences page
 'preferences' => 'Mga Ginabasehan',
 'mypreferences' => 'Mga Ginabasehan',
index f1bc100..6906a66 100644 (file)
@@ -343,8 +343,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 +356,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 +429,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.',
@@ -1076,6 +1075,8 @@ Stranica već postoji.',
 'content-failed-to-parse' => "Obrada (''parsiranje'') formata $2 za model $1 nije uspjela: $3",
 'invalid-content-data' => 'Nevaljani sadržaj',
 'content-not-allowed-here' => 'Sadržaj napisan u obliku "$1"-a nije dozvoljen na stranici [[$2]]',
+'editwarning-warning' => 'Napuštanje ove stranice može uzrokovati gubitak svake izmjene koju ste napravili.
+Možete onemogućiti ovo upozorenje u odjeljku "{{int:prefs-editing}}" Vaših postavki.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1356,15 +1357,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 +1889,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>
@@ -3082,12 +3073,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',
index 6e5cb8c..234e031 100644 (file)
@@ -184,8 +184,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 +197,7 @@ $messages = array(
 'tog-diffonly' => 'Jenož rozdźěle pokazać (nic pak zbytny wobsah)',
 'tog-showhiddencats' => 'Schowane kategorije pokazać',
 'tog-norollbackdiff' => 'Rozdźěl po wróćostajenju zanjechać',
+'tog-useeditwarning' => 'Warnować, hdyž so wobdźěłowanska strona z njeskładowanymi změnami wopušća',
 
 'underline-always' => 'Přeco',
 'underline-never' => 'Ženje',
@@ -565,8 +564,16 @@ 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',
+'createacct-helpusername-url' => '{{ns:Project}}:Prawidła_za_wužiwarske_mjena',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(pomóž wubrać)]]',
 'yourpassword' => 'Hesło:',
+'userlogin-yourpassword' => 'Hesło',
+'userlogin-yourpassword-ph' => 'Zapodaj swoje hesło',
+'createacct-yourpassword-ph' => 'Zapodaj hesło',
 'yourpasswordagain' => 'Hesło znowa zapodać:',
+'createacct-yourpasswordagain' => 'Hesło wobkrućić',
 'remembermypassword' => 'Na tutym ličaku přizjewjeny wostać (za maksimalnje $1 {{PLURAL:$1|dźeń|dnjej|dny|dnjow}})',
 'securelogin-stick-https' => 'Po přizjewjenju z HTTPS zwjazany wostać',
 'yourdomainname' => 'Twoja domejna:',
@@ -586,8 +593,13 @@ Njezabudź swoje [[Special:Preferences|nastajenja za {{GRAMMAR:akuzatiw|{{SITENA
 'gotaccount' => 'Maš hižo wužiwarske konto? $1.',
 'gotaccountlink' => 'Přizjewić',
 'userlogin-resetlink' => 'Přizjewjenske daty zabył?',
+'createacct-emailrequired' => 'E-mejlowa adresa',
 'createaccountmail' => 'Nachwilne přidatne hesło wužiwać a jo na slědowacu e-mejlowu adresu pósłać',
 'createaccountreason' => 'Přičina:',
+'createacct-reason' => 'Přičina',
+'createacct-imgcaptcha-ph' => 'Zapodaj tekst, kotryž deleka widźiš',
+'createacct-benefit-body1' => 'změny',
+'createacct-benefit-body2' => 'strony',
 'badretype' => 'Hesle, kotrejž sy zapodał, so njekryjetej.',
 'userexists' => 'Wužiwarske mjeno, kotrež sy zapodał, so hižo wužiwa.
 Prošu wubjer druhe mjeno.',
@@ -698,7 +710,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ć',
@@ -904,6 +916,7 @@ Eksistuje hižo.',
 'content-failed-to-parse' => 'Parsowanje wobsaha $2 za model $1 je so njeporadźiło: $3',
 'invalid-content-data' => 'Njepłaćiwe wobsahowe daty',
 'content-not-allowed-here' => 'Wobsah "$1" njeje na stronje [[$2]] dowoleny',
+'editwarning-warning' => 'Hdyž so strona wopušća, móžeja so změny zhubić, kotrež sy přewjedł. Jeli sy přizjewjeny, móžeš tute warnowanje we wotrězku {{int:prefs-editing}} swojich nastajenjow znjemóžnić.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1494,9 +1507,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).
@@ -2978,11 +2991,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 mjeńšinu|$1 mjeńšinomaj|$1 mjeńšinami|$1 mjeńšinami}}',
 'hours' => '{{PLURAL:$1|$1 hodźinu|$1 hodźinomaj|$1 hodźinami|$1 hodźinami}}',
 'days' => '{{PLURAL:$1|$1 dnjom|$1 dnjomaj|$1 dnjemi|$1 dnjemi}}',
+'weeks' => '{{PLURAL:$1|$1 tydźeń|$1 njedźeli|$1 njedźele|$1 njedźel}}',
 'months' => '{{PLURAL:$1|$1 měsacom|$1 měsacomaj|$1 měsacami}}',
 'years' => '{{PLURAL:$1|$1 lětom|$1 lětomaj|$1 lětami}}',
 'ago' => 'před $1',
 'just-now' => 'runje',
 
+# Human-readable timestamps
+'hours-ago' => 'před $1 {{PLURAL:$1|hodźinu|hodźinomaj|hodźinami|hodźinami}}',
+'minutes-ago' => 'před $1 {{PLURAL:$1|mjeńšinu|mjeńšinomaj|mjeńšinami|mjeńšinami}}',
+'seconds-ago' => 'před $1 {{PLURAL:$1|sekundu|sekundomaj|sekundami|sekundami}}',
+'monday-at' => 'Póndźela $1',
+'tuesday-at' => 'Wutora $1',
+'wednesday-at' => 'Srjeda $1',
+'thursday-at' => 'Štwórtk $1',
+'friday-at' => 'Pjatk $1',
+'saturday-at' => 'Sobota $1',
+'sunday-at' => 'Njedźela $1',
+'yesterday-at' => 'Wčera $1',
+
 # Bad image list
 'bad_image_list' => 'Format:
 
@@ -3595,13 +3622,6 @@ Ty měł [{{SERVER}}{{SCRIPTPATH}}/COPYING kopiju licency GNU General Public Lic
 'version-entrypoints-header-entrypoint' => 'Zastupny dypk',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Datajowy puć',
-'filepath-page' => 'Dataja:',
-'filepath-submit' => 'Pytać',
-'filepath-summary' => 'Tuta specialna strona wróća dospołny puć aktualneje datajoweje wersije.
-Wobrazy so połnym rozeznaću pokazuja, druhe datajowe typy so ze zwjazanym programom startuja.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Dwójne dataje pytać',
 'fileduplicatesearch-summary' => 'Pytanje za duplikatnymi datajemi na zakładźe jich hašoweje hódnoty.',
@@ -3691,6 +3711,8 @@ Wobrazy so połnym rozeznaću pokazuja, druhe datajowe typy so ze zwjazanym prog
 'htmlform-submit' => 'Wotpósłać',
 'htmlform-reset' => 'Změny cofnyć',
 'htmlform-selectorother-other' => 'Druhe',
+'htmlform-no' => 'Ně',
+'htmlform-yes' => 'Haj',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 połnotekstowe pytanje podpěruje.',
index 178f1e5..89d91eb 100644 (file)
@@ -343,8 +343,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 +356,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',
@@ -723,9 +722,13 @@ 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',
 'yourpassword' => 'Jelszavad:',
+'userlogin-yourpassword' => 'Jelszó',
 'yourpasswordagain' => 'Jelszavad ismét:',
 'remembermypassword' => 'Emlékezzen rám ezen a számítógépen (legfeljebb $1 napig)',
+'userlogin-remembermypassword' => 'Emlékezzen rám',
+'userlogin-signwithsecure' => 'Bejelentkezés a biztonságos kiszolgálón keresztül',
 '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,12 +741,16 @@ Ne felejtsd el módosítani a [[Special:Preferences|{{SITENAME}} beállításaid
 'logout' => 'Kijelentkezés',
 'userlogout' => 'Kijelentkezés',
 'notloggedin' => 'Nem vagy bejelentkezve',
+'userlogin-noaccount' => 'Nem rendelkezel még felhasználói fiókkal?',
+'userlogin-joinproject' => 'Csatlakozz a(z) {{SITENAME}} wikihez',
 'nologin' => "Nem rendelkezel még felhasználói fiókkal? '''$1'''.",
 'nologinlink' => 'Itt regisztrálhatsz',
 'createaccount' => 'Regisztráció',
 'gotaccount' => "Ha már korábban regisztráltál, '''$1'''.",
 'gotaccountlink' => 'Bejelentkezés',
 'userlogin-resetlink' => 'Elfelejtetted a bejelentkezési adataidat?',
+'helplogin-url' => 'Help:Bejelentkezés',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Segítség a bejelentkezéshez]]',
 'createaccountmail' => 'Átmeneti, véletlenszerű jelszó használata és kiküldése az alábbi e-mail címre',
 'createaccountreason' => 'Indoklás:',
 'badretype' => 'A megadott jelszavak nem egyeznek.',
@@ -837,9 +844,10 @@ Lehet, hogy már sikeresen megváltoztattad a jelszavad, vagy pedig időközben
 
 # Special:PasswordReset
 'passwordreset' => 'Jelszó törlése',
-'passwordreset-text' => 'Az alábbi űrlap kitöltése után egy értesítő e-mailt kapsz a fiókod adataival.',
+'passwordreset-text' => 'Az alábbi űrlap kitöltése után egy jelszóemlékeztető e-mailt kapsz a fiókod adataival.',
 'passwordreset-legend' => 'Új jelszó kérése',
 'passwordreset-disabled' => 'Új jelszó kérése nem engedélyezett ezen a wikin.',
+'passwordreset-emaildisabled' => 'Az e-mail funkció le van tiltva ezen a wikin.',
 'passwordreset-pretext' => '{{PLURAL:$1||Írd be az alábbi adatok egyikét}}',
 'passwordreset-username' => 'Felhasználónév:',
 'passwordreset-domain' => 'Tartomány:',
@@ -1075,6 +1083,8 @@ Már létezik.',
 'content-failed-to-parse' => 'Hiba történt a $2 tartalom $1 modellre történő konvertálása során: $3',
 'invalid-content-data' => 'Érvénytelen tartalom adat',
 'content-not-allowed-here' => '"$1" tartalom nem engedélyezett a [[$2]] oldalon',
+'editwarning-warning' => 'A lap elhagyásával az összes itt végzett változtatás elveszhet.
+Ha be vagy jelentkezve letilthatod ezt a figyelmeztetést a beállításaid „{{int:prefs-editing}}” szakaszában.',
 
 # Content models
 'content-model-wikitext' => 'wikiszöveg',
@@ -1351,15 +1361,6 @@ Ezt általában egy elavult, törölt oldalra mutató laptörténeti hivatkozás
 'search-external' => 'Külső kereső',
 'searchdisabled' => 'Elnézésed kérjük, de a teljes szöveges keresés terhelési okok miatt átmenetileg nem használható. Ezidő alatt használhatod a lenti Google keresést, mely viszont lehetséges, hogy nem teljesen friss adatokkal dolgozik.',
 
-# Quickbar
-'qbsettings' => 'Gyorsmenü',
-'qbsettings-none' => 'Nincs',
-'qbsettings-fixedleft' => 'Fix baloldali',
-'qbsettings-fixedright' => 'Fix jobboldali',
-'qbsettings-floatingleft' => 'Lebegő baloldali',
-'qbsettings-floatingright' => 'Lebegő jobboldali',
-'qbsettings-directionality' => 'Rögzített, a nyelved írásának irányától függően',
-
 # Preferences page
 'preferences' => 'Beállítások',
 'mypreferences' => 'Beállítások',
@@ -1909,7 +1910,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>
@@ -3033,13 +3033,8 @@ 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 */',
@@ -3052,13 +3047,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 +3125,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
@@ -3843,13 +3828,6 @@ A MediaWikit abban a reményben terjesztjük, hogy hasznos lesz, de GARANCIA NÉ
 'version-entrypoints-header-entrypoint' => 'Belépési pont',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Fájlelérés',
-'filepath-page' => 'Fájl:',
-'filepath-submit' => 'Elérési út',
-'filepath-summary' => 'Ezen lap segítségével lekérheted egy adott fájl pontos útvonalát.
-A képek teljes méretben jelennek meg, más fájltípusok közvetlenül a hozzájuk rendelt programmal indulnak el.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Duplikátumok keresése',
 'fileduplicatesearch-summary' => 'Fájlok duplikátumainak keresése hash értékük alapján.',
@@ -3946,14 +3924,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..50f8747 100644 (file)
@@ -303,8 +303,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ցույց տալ էջ հսկող մասնակիցների թիվը',
 'tog-oldsig' => 'Ներկայիս ստորագրությունն է․',
 'tog-fancysig' => 'Ստորագրությունը վիքիտեքստի տեսքով (առանց ավտոմատ հղման)',
-'tog-externaleditor' => 'Օգտագործել արտաքին խմբագրիչ ըստ լռության (պահանջում է հատուկ նախընտրություններ ձեր համակարգչում)',
-'tog-externaldiff' => 'Օգտագործել տարբերակների համեմատման արտաքին ծրագիր ըստ լռության (պահանջում է հատուկ նախընտրություններ ձեր համակարգչում)',
 'tog-showjumplinks' => 'Միացնել «անցնել դեպի» օգնական հղումները',
 'tog-uselivepreview' => 'Օգտագործել ուղիղ նախադիտում (JavaScript) (Փորձնական)',
 'tog-forceeditsummary' => 'Նախազգուշացնել խմբագրման ամփոփումը դատարկ թողնելու դեպքում',
@@ -318,6 +316,7 @@ $messages = array(
 'tog-diffonly' => 'Չցուցադրել էջի պարունակությունը տարբերությունների ներքևից',
 'tog-showhiddencats' => 'Ցուցադրել թաքնված կատեգորիաները',
 'tog-norollbackdiff' => 'Չցուցադրել տարբերությունները հետ գլորելուց հետո',
+'tog-useeditwarning' => 'Զգուշացնել ինձ, երբ ես լքում եմ խմբագրման էջը առանց կատարած փոփոխությունները հիշելու։',
 
 'underline-always' => 'Միշտ',
 'underline-never' => 'Երբեք',
@@ -1004,6 +1003,8 @@ $2',
 'edit-conflict' => 'Խմբագրման ընհարում։',
 'edit-no-change' => 'Ձեր խմբագրումը անտեսվել է, քանի որ ոչ մի փոփոխություն չի կատարվել տեքստի մեջ։',
 'defaultmessagetext' => 'Լռելյան տեքստը',
+'editwarning-warning' => 'Այս էջը լքելով դուք կարող եք կորցնել ձեր կատարած փոփոխությունները։
+Եթե դուք գրանցված եք համակարգում, կարող եք անջատել այս նախազգուշացումը ձեր նախընրությունների «{{int:prefs-editing}}» բաժնում։',
 
 # Content models
 'content-model-wikitext' => 'վիքիտեքստ',
@@ -1181,14 +1182,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' => 'Նախընտրություններ',
@@ -1755,10 +1748,6 @@ $1-ը հղվել է $2 ից',
 'listusers-noresult' => 'Այդպիսի մասնակիցներ չգտնվեցին։',
 'listusers-blocked' => '(արգելափակված)',
 
-# Special:ActiveUsers
-'activeusers' => 'Ակտիվ մասնակիցների ցանկ',
-'activeusers-noresult' => 'Այդպիսի մասնակիցներ չեն գտնվել։',
-
 # Special:ListGroupRights
 'listgrouprights-members' => '(անդամների ցանկ)',
 'listgrouprights-addgroup' => 'Ավելացնեել {{PLURAL:$2|խումբ|խմբեր}}՝  $1',
@@ -2440,13 +2429,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' => 'Սովորական',
 
index 2bc316d..72c4c1a 100644 (file)
@@ -172,8 +172,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 +186,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',
@@ -252,6 +251,16 @@ $messages = array(
 'nov' => 'nov',
 'dec' => 'dec',
 
+'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',
+'today-at' => '$1',
+'yesterday-at' => 'Heri a $1',
+
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categoria|Categorias}}',
 'category_header' => 'Articulos in le categoria "$1"',
@@ -559,7 +568,9 @@ 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�',
 'yourpassword' => 'Contrasigno:',
+'userlogin-yourpassword' => 'Contrasigno',
 'yourpasswordagain' => 'Repete contrasigno:',
 'remembermypassword' => 'Memorar mi contrasigno in iste navigator (pro un maximo de $1 {{PLURAL:$1|die|dies}})',
 'securelogin-stick-https' => 'Remaner connectite via HTTPS post apertura de session',
@@ -946,6 +957,8 @@ Illo existe ja.',
 'content-failed-to-parse' => 'Impossibile processar le contento $2 pro le modello $1: $3',
 'invalid-content-data' => 'Datos de contento invalide',
 'content-not-allowed-here' => 'Le contento "$1" non es permittite in le pagina [[$2]]',
+'editwarning-warning' => 'Quitar iste pagina pote causar le perdita de omne modificationes que tu ha facite.
+Si tu ha aperite un session, tu pote disactivar iste aviso in le section "{{int:prefs-editing}}" de tu preferentias.',
 
 # Content models
 'content-model-wikitext' => 'wikitexto',
@@ -1236,15 +1249,6 @@ Tenta prefixar tu consulta con ''all:'' pro cercar in tote le contento (includen
 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',
-
 # Preferences page
 'preferences' => 'Preferentias',
 'mypreferences' => 'Preferentias',
@@ -1806,7 +1810,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>
@@ -2960,13 +2963,8 @@ 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 */',
@@ -2974,13 +2972,8 @@ Es possibile adder un motivo in le summario.',
 
 # 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 +3049,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
@@ -3984,4 +3972,8 @@ Si non, tu pote usar le formulario facile hic infra. Tu commento essera addite a
 # Image rotation
 'rotate-comment' => 'Imagine rotate de $1 {{PLURAL:$1|grado|grados}} in senso horologic',
 
+# Unknown messages
+'hours-ago' => '$1 {{PLURAL:$1|hora|horas}} retro',
+'minutes-ago' => '$1 {{PLURAL:$1|minuta|minutas}} retro',
+'seconds-ago' => '$1 {{PLURAL:$1|secunda|secundas}} retro',
 );
index 82212ea..4c5a2c7 100644 (file)
@@ -749,9 +749,20 @@ 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',
+'createacct-helpusername-url' => '{{ns:Project}}:Kebijakan nama pengguna',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(pilihan nama pengguna)]]',
 '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' => 'Masuk log dengan 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 +775,39 @@ Perhatikan bahwa beberapa halaman mungkin masih terus menunjukkan bahwa Anda mas
 'logout' => 'Keluar log',
 'userlogout' => 'Keluar log',
 'notloggedin' => 'Belum masuk log',
+'userlogin-noaccount' => 'Belum punya akun?',
+'userlogin-joinproject' => 'Join {{SITENAME}}',
 'nologin' => "Belum mempunyai akun? '''$1'''.",
 'nologinlink' => 'Daftarkan akun baru',
 'createaccount' => 'Buat akun baru',
 'gotaccount' => "Sudah terdaftar sebagai pengguna? '''$1'''.",
 'gotaccountlink' => 'Masuk log',
 'userlogin-resetlink' => 'Lupa detail info masuk Anda?',
+'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-captcha-help-url' => '{{ns:Project}}:Mohon buatkan akun',
+'createacct-imgcaptcha-help' => 'Tidak dapat melihat gambar? [[{{MediaWiki:createacct-captcha-help-url}}|Mohon buatkan akun]]',
+'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' => 'suntingan',
+'createacct-benefit-body2' => 'halaman',
+'createacct-benefit-body3' => '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,12 +889,14 @@ 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-disabled' => 'Penyetelan ulang sandi telah dimatikan di wiki ini.',
+'passwordreset-emaildisabled' => 'Fitur surel telah dinonaktifkan pada wiki ini.',
 'passwordreset-pretext' => '{{PLURAL:$1||Masukkan salah satu data di bawah ini}}',
 'passwordreset-username' => 'Nama pengguna:',
 'passwordreset-domain' => 'Domain:',
@@ -893,7 +927,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',
@@ -1538,6 +1572,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 +1585,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}}',
@@ -2108,7 +2143,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 +2159,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 +2189,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',
@@ -2163,7 +2198,7 @@ Nama yang telah <del>dicoret</del> berarti telah dibetulkan.',
 'mostcategories' => 'Halaman dengan kategori terbanyak',
 'mostimages' => 'Berkas yang tersering digunakan',
 'mostinterwikis' => 'Halaman dengan interwiki terbanyak',
-'mostrevisions' => 'Halaman dengan perubahan terbanyak',
+'mostrevisions' => 'Laman jo parubahan tabanyak',
 'prefixindex' => 'Semua halaman dengan awalan',
 'prefixindex-namespace' => 'Semua halaman dengan awalan (ruang nama $1)',
 'shortpages' => 'Halaman pendek',
@@ -2180,7 +2215,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 +2266,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 +2308,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 +2328,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',
@@ -3071,7 +3115,7 @@ 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 */',
@@ -3113,7 +3157,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 +3193,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',
@@ -3250,11 +3294,25 @@ Jika dijalankan, sistem Anda akan berisiko terserang.",
 '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 +3322,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',
@@ -3672,8 +3728,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 +3967,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 +4060,7 @@ 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.',
+'redirect-submit' => 'Lanjut',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Pencarian berkas duplikat',
@@ -4019,7 +4070,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 +4150,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 bc66a9e..2e151fd 100644 (file)
@@ -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',
@@ -839,6 +838,8 @@ Adda met daytoyen.',
 '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',
@@ -1127,15 +1128,6 @@ Padasem a  pasarunuan ti panagbiruk mo ti ''all:'' tapno birukem amin a nagyan (
 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',
-
 # Preferences page
 'preferences' => 'Kakaykayatan',
 'mypreferences' => 'Kakaykayatan',
index fad44dd..fb4d15a 100644 (file)
@@ -12,6 +12,7 @@
  * @author Reedy
  * @author Sapral Mikail
  * @author Tagir
+ * @author Умар
  */
 
 $fallback = 'ru';
@@ -47,8 +48,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ший теркама дагарленгах оагӀув чулаьца бола дакъалаьцархой таьрах хьахьокха',
 'tog-oldsig' => 'Дола кулгайоазув:',
 'tog-fancysig' => 'Ший кулга яздара массахоамбаккхам (ший лоӀаме Ӏинка йоацаш)',
-'tog-externaleditor' => 'Арена гӀалатнийсдарца болх бе (ший болх ховш болачара мара мегаш дац, хьамлоархIара ший-тайпара оттам эша; [//www.mediawiki.org/wiki/Manual:External_editors хьажа эша])',
-'tog-externaldiff' => 'Арена бӀасакхосса болхоагӀувца болх бе (ший болх ховш болачара мара мегаш дац, хьамлоархIара ший-тайпара оттам эша; [//www.mediawiki.org/wiki/Manual:External_editors хьажа эша])',
 'tog-showjumplinks' => '"Дехьадала" яха новкъостала Ӏинк хьахьокха',
 'tog-uselivepreview' => 'Сиха бӀарахьажар (JavaScript) (Экспериментально)',
 'tog-forceeditsummary' => 'Хоам бе, хувцамий лоацам белгал даь деце',
@@ -556,9 +555,6 @@ $messages = array(
 'powersearch-toggleall' => 'Деррига',
 'powersearch-togglenone' => 'Цхьаккха',
 
-# Quickbar
-'qbsettings-none' => 'Цхьаккха',
-
 # Preferences page
 'preferences' => 'Оттамаш',
 'mypreferences' => 'Оттамаш',
@@ -796,7 +792,7 @@ $messages = array(
 # Special:ListGroupRights
 'listgrouprights-members' => '(тоабий дагарче)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Дакъалаьцархочоа д-хоамни:',
 
 # Watchlist
index c97e167..e6240cd 100644 (file)
@@ -262,8 +262,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Sýna fjölda vaktandi notenda',
 'tog-oldsig' => 'Núverandi undirskrift:',
 'tog-fancysig' => 'Meðhöndla undirskrift sem wikimál (án sjálfvirks tengils)',
-'tog-externaleditor' => 'Nota utanaðkomandi ritil sjálfgefið (eingöngu fyrir reynda, þarfnast sérstakra stillinga á tölvunni þinni. [//www.mediawiki.org/wiki/Manual:External_editors Frekari upplýsingar.])',
-'tog-externaldiff' => 'Nota utanaðkomandi mismun sjálfgefið (eingöngu fyrir reynda, þarfnast sérstakra stillinga á tölvunni þinni. [//www.mediawiki.org/wiki/Manual:External_editors Frekari upplýsingar.])',
 'tog-showjumplinks' => 'Virkja „stökkva á“ aðgengitengla',
 'tog-uselivepreview' => 'Nota beina forskoðun (JavaScript) (Á tilraunastigi)',
 'tog-forceeditsummary' => 'Birta áminningu þegar breytingarágripið er tómt',
@@ -277,6 +275,7 @@ $messages = array(
 'tog-diffonly' => 'Ekki sýna síðuefni undir mismunum',
 'tog-showhiddencats' => 'Sýna falda flokka',
 'tog-norollbackdiff' => 'Sleppa breytingu eftir að endurvakning síðu hefur verið gerð.',
+'tog-useeditwarning' => 'Vara mig við þegar ég fer frá breytingarsíðu með óvistaðar breytingar',
 
 'underline-always' => 'Alltaf',
 'underline-never' => 'Aldrei',
@@ -1010,6 +1009,8 @@ Hún er nú þegar til.',
 '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',
index 06d4955..f0c1915 100644 (file)
@@ -446,7 +446,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',
@@ -505,7 +505,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',
@@ -542,7 +542,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 +576,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',
@@ -701,9 +700,20 @@ 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',
+'createacct-helpusername-url' => '{{ns:Project}}:Nome utente',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(aiutami a scegliere)]]',
 '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' => 'Accedi con il server sicuro',
 '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 +726,39 @@ 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'''.",
+'gotaccount' => 'Hai già un accesso? $1.',
 'gotaccountlink' => 'Entra',
 'userlogin-resetlink' => 'Hai dimenticato i tuoi dati di accesso?',
+'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-captcha-help-url' => '{{ns:Project}}:Richieste di utenze',
+'createacct-imgcaptcha-help' => "Non riesci a vedere l'immagine? [[{{MediaWiki:createacct-captcha-help-url}}|Richiedi un'utenza]]",
+'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' => 'modifiche',
+'createacct-benefit-body2' => 'pagine',
+'createacct-benefit-body3' => '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.",
@@ -808,12 +839,14 @@ Riprovare più tardi.',
 'resetpass-wrong-oldpass' => 'Password temporanea o attuale non valida.
 La password potrebbe essere stata già cambiata, oppure potrebbe essere stata richiesta una nuova password temporanea.',
 'resetpass-temp-password' => 'Password temporanea:',
+'resetpass-abort-generic' => "La modifica della password è stata interrotta da un'estensione.",
 
 # Special:PasswordReset
 'passwordreset' => 'Reimposta password',
 'passwordreset-text' => 'Compila questo modulo per reimpostare la tua password.',
 'passwordreset-legend' => 'Reimposta password',
 'passwordreset-disabled' => 'La reimpostazione delle password è stata disabilitata su questa wiki',
+'passwordreset-emaildisabled' => 'Le funzionalità di posta elettronica sono state disabilitate su questa wiki.',
 'passwordreset-pretext' => '{{PLURAL:$1||Immetti uno dei dati richiesti qui sotto}}',
 'passwordreset-username' => 'Nome utente:',
 'passwordreset-domain' => 'Dominio:',
@@ -841,7 +874,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",
@@ -1078,7 +1111,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 +1129,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',
@@ -1451,7 +1485,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 +1498,7 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
 'userrights-notallowed' => "Il tuo account non dispone dell'autorizzazione per aggiungere o rimuovere i permessi utente.",
 'userrights-changeable-col' => 'Gruppi modificabili',
 'userrights-unchangeable-col' => 'Gruppi non modificabili',
+'userrights-conflict' => 'Conflitto di diritti utente! Applica nuovamente le tue modifiche.',
 
 # Groups
 'group' => 'Gruppo:',
@@ -1725,7 +1760,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.',
@@ -2126,7 +2161,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 +2223,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.
@@ -2408,7 +2452,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 +2496,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 +2521,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.",
@@ -3093,7 +3138,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 +3180,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:
 
@@ -3678,7 +3737,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 +3746,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 +3835,16 @@ 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.',
+'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 +3937,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..f1cb087 100644 (file)
@@ -417,8 +417,8 @@ $messages = array(
 'editfont-style' => '編集エリアのフォント:',
 'editfont-default' => 'ブラウザーの設定を使用',
 'editfont-monospace' => '等幅フォント',
-'editfont-sansserif' => 'Sans Serif フォント',
-'editfont-serif' => 'Serif フォント',
+'editfont-sansserif' => 'サンセリフ体のフォント',
+'editfont-serif' => 'セリフ体のフォント',
 
 # Dates
 'sunday' => '日曜日',
@@ -785,12 +785,17 @@ $2',
 'yourname' => '利用者名:',
 'userlogin-yourname' => '利用者名',
 'userlogin-yourname-ph' => '利用者名を入力',
+'createacct-helpusername-url' => '{{ns:Project}}:利用者名の指針',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(選び方を教えてください)]]',
 'yourpassword' => 'パスワード:',
 'userlogin-yourpassword' => 'パスワード',
 'userlogin-yourpassword-ph' => 'パスワードを入力',
+'createacct-yourpassword-ph' => 'パスワードを入力',
 'yourpasswordagain' => 'パスワード再入力:',
+'createacct-yourpasswordagain' => 'パスワード再入力',
+'createacct-yourpasswordagain-ph' => 'パスワードを再入力',
 'remembermypassword' => 'このブラウザーにログイン情報を保存 (最長 $1 {{PLURAL:$1|日|日間}})',
-'userlogin-remembermypassword' => 'ログイン情報を保存',
+'userlogin-remembermypassword' => 'ログイン状態を保持',
 'userlogin-signwithsecure' => 'セキュリティで保護された接続でログイン',
 'securelogin-stick-https' => 'ログイン後にHTTPS接続を維持',
 'yourdomainname' => 'ドメイン:',
@@ -814,12 +819,29 @@ $2',
 'userlogin-resetlink' => 'ログイン情報をお忘れですか?',
 'helplogin-url' => 'Help:ログイン',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|ログインのヘルプ]]',
+'createacct-join' => '以下の情報を入力してください。',
+'createacct-emailrequired' => 'メールアドレス',
+'createacct-emailoptional' => 'メールアドレス (省略可能)',
+'createacct-email-ph' => 'メールアドレスを入力',
 'createaccountmail' => '一時的でランダムなパスワードを生成して、以下に指定したメールアドレスに送信する',
+'createacct-realname' => '本名 (省略可能)',
 'createaccountreason' => '理由:',
+'createacct-reason' => '理由',
+'createacct-reason-ph' => 'アカウントを作成する理由',
+'createacct-captcha' => '自動作成防止チェック',
+'createacct-captcha-help-url' => '{{ns:Project}}:アカウント申請',
+'createacct-imgcaptcha-help' => '画像が表示されない場合は[[{{MediaWiki:createacct-captcha-help-url}}|アカウント作成を依頼してください]]',
+'createacct-imgcaptcha-ph' => '上に表示されている文字列を入力',
+'createacct-submit' => 'アカウントを作成',
+'createacct-benefit-heading' => '{{SITENAME}}は、あなたのような人々が創っています。',
+'createacct-benefit-body1' => '編集',
+'createacct-benefit-body2' => 'ページ',
+'createacct-benefit-body3' => '最近の貢献者',
 'badretype' => '入力したパスワードが一致しません。',
 'userexists' => '入力された利用者名は既に使用されています。
 他の名前を選んでください。',
 'loginerror' => 'ログインのエラー',
+'createacct-error' => 'アカウント作成エラー',
 'createaccounterror' => 'アカウントを作成できませんでした: $1',
 'nocookiesnew' => '利用者アカウントは作成されましたが、ログインしていません。
 {{SITENAME}}では利用者のログインに Cookie を使用します。
@@ -917,6 +939,7 @@ Cookieを有効にしていることを確認して、このページを再読
 'resetpass-wrong-oldpass' => '仮パスワードまたは現在のパスワードが正しくありません。
 パスワードを既に変更した、または新しい仮パスワードを依頼した可能性があります。',
 'resetpass-temp-password' => '仮パスワード:',
+'resetpass-abort-generic' => '拡張機能により、パスワードの変更は取り消されました。',
 
 # Special:PasswordReset
 'passwordreset' => 'パスワードの再設定',
@@ -957,7 +980,7 @@ $2
 仮パスワード: $2',
 'passwordreset-emailsent' => 'パスワード再設定メールをお送りしました。',
 'passwordreset-emailsent-capture' => '下記の内容の、パスワード再設定メールをお送りしました。',
-'passwordreset-emailerror-capture' => '以下の内容のパスワード再設定メールを生成しましたが、利用者への送信に失敗しました: $1',
+'passwordreset-emailerror-capture' => '以下の内容のパスワード再設定メールを生成しましたが、{{GENDER:$2|利用者}}への送信に失敗しました: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'メールアドレスの変更',
@@ -1625,6 +1648,7 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'userrights-changeable-col' => '変更できるグループ',
 'userrights-unchangeable-col' => '変更できないグループ',
 'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => '利用者権限に競合があります! 変更内容をもう一度適用してください。',
 
 # Groups
 'group' => 'グループ:',
@@ -1691,7 +1715,7 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'right-unblockself' => '自身に対するブロックを解除',
 'right-protect' => '保護レベルを変更し、保護されたページを編集',
 'right-editprotected' => '保護ページ (カスケード保護を除く) を編集',
-'right-editinterface' => 'ã\83¦ã\83¼ã\82¶ã\83¼ã\82¤ã\83³ã\82¿ã\83¼ã\83\95ã\82§ã\82¤スを編集',
+'right-editinterface' => 'ã\83¦ã\83¼ã\82¶ã\83¼ã\82¤ã\83³ã\82¿ã\83¼ã\83\95ã\82§ã\83¼スを編集',
 'right-editusercssjs' => '他の利用者のCSSファイル/JavaScriptファイルを編集',
 'right-editusercss' => '他の利用者のCSSファイルを編集',
 'right-edituserjs' => '他の利用者のJavaScriptファイルを編集',
@@ -2383,6 +2407,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' => '以下は、このウィキに登録されている利用者グループと、それぞれに割り当てられている権限の一覧です。
@@ -3389,11 +3422,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 +3450,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' => '中国語 (簡体)',
@@ -4155,12 +4200,16 @@ 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' => 'この特別ページは、ファイルへの完全なパスを返します。
-画像は最大解像度で表示され、他のファイルタイプは関連付けされたプログラムが直接起動します。',
+'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 +4302,7 @@ MediaWikiは、有用であることを期待して配布されていますが
 'htmlform-selectorother-other' => 'その他',
 'htmlform-no' => 'いいえ',
 'htmlform-yes' => 'はい',
+'htmlform-chosen-placeholder' => '選択してください',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 (全文検索あり)',
index a9ecb16..b8e50b5 100644 (file)
@@ -10,6 +10,7 @@
  * @author Hazard-SJ
  * @author Ukabia
  * @author Yocahuna
+ * @author គីមស៊្រុន
  */
 
 $messages = array(
@@ -42,8 +43,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Shuo di nomba a wachin yuuza',
 'tog-oldsig' => 'Priivyuu a egzisin signicha:',
 'tog-fancysig' => 'Chriit signicha az wikitex (widoutn aatamatik lingk)',
-'tog-externaleditor' => 'Yuuz extoernal edita bai difaalt (fi expoert onli, niid speshal setn pahn yu kompiuta)',
-'tog-externaldiff' => 'Yuuz extoernal dif bai difaalt (fi expoert onli, niid speshal setn pahn yu kompiuta)',
 'tog-showjumplinks' => 'Eniebl "jomp tu" aksesibiliti lingk',
 'tog-uselivepreview' => 'Yuuz laiv priivyuu (rikwaya JavaScript) (experimental)',
 'tog-forceeditsummary' => 'Pramp mi wen entarin blangk edit somari',
@@ -244,7 +243,7 @@ $1',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => 'Habowt {{SITENAME}}',
-'aboutpage' => 'Project: About',
+'aboutpage' => 'Project: អំពី',
 'copyright' => 'Kantent avielobl anda $1.',
 'copyrightpage' => '{{ns:project}}:Kapirait',
 'currentevents' => 'Korant ivent',
index e2c8beb..47bcc97 100644 (file)
@@ -454,6 +454,8 @@ Cathet yèn sapérangan kaca mungkin isih nampilaké tulisan yèn Sampéyan isih
 'welcomeuser' => 'Sugeng Rawuh, $1!',
 'welcomecreation-msg' => 'Akun panjenengan wis kacipta. Aja lali nata konfigurasi [[Special:Preferences|preferensi {{SITENAME}}]] panjenengan.',
 'yourname' => 'Asma pangangeman',
+'userlogin-yourname' => 'Jeneng panganggo',
+'userlogin-yourname-ph' => 'Lebokaké jenengné panganggo',
 'yourpassword' => 'Tembung sandhi:',
 'yourpasswordagain' => 'Balènana tembung sandhi',
 'remembermypassword' => 'Émut tembung sandi kula (salebeting $1 {{PLURAL:$1|dinten|dinten}})',
index 2e70002..ea8dd4d 100644 (file)
@@ -197,8 +197,6 @@ $messages = array(
 'tog-shownumberswatching' => 'მაკონტროლებელ მომხმარებელთა რიცხვის ჩვენება',
 'tog-oldsig' => 'არსებული ხელმოწერა:',
 'tog-fancysig' => 'საკუთარი ვიკიფორმატიანი ხელმოწერა (ავტომატური ბმულის გარეშე)',
-'tog-externaleditor' => 'გამოიყენეთ გარე რედაქტორი სტანდარტული ფორმით (მხოლოდ ექსპერტებისთვის, მოითხოვს სპეციალურ კონფიგურაციას თქვენს კომპიუტერში. [//www.mediawiki.org/wiki/Manual:External_editors ვრცლად.])',
-'tog-externaldiff' => 'გამოიყენეთ გარე განსხვავება სტანდარტული ფორმით (მხოლოდ ექსპერტთათვის, მოითხოვს სპეციალურ კონფიგურაციას თქვენს კომპიუტერში. [//www.mediawiki.org/wiki/Manual:External_editors ვრცლად.])',
 'tog-showjumplinks' => 'დამხმარე ბმულების „გადასვლა-კენ“ ჩართვა',
 'tog-uselivepreview' => 'გამოიყენეთ ახალი წინასწარი გადახედვა (ჯავასკრიპტი)  (ექსპერიმენტული)',
 'tog-forceeditsummary' => 'გამაფრთხილე ცარიელი რედაქტირების რეზიუმეს შემთხვევაში',
@@ -213,6 +211,7 @@ $messages = array(
 'tog-showhiddencats' => 'დამალული კატეგორიების ჩვენება',
 'tog-noconvertlink' => 'სათაურის გარდაქმნის ბმულის გამორთვა',
 'tog-norollbackdiff' => 'გამოტოვეთ ცვლილება გაუქმებისას',
+'tog-useeditwarning' => 'გამაფრთხილე, როდესაც დავტოვებ რედაქტირებად გვერდს, დაუმახსოვრებელი ცვლილებებით',
 
 'underline-always' => 'მუდამ',
 'underline-never' => 'არასდროს',
@@ -746,7 +745,7 @@ $2
 დროებითი პაროლი: $2',
 'passwordreset-emailsent' => 'პაროლის თავიდან დასაყენებელი ელ.ფოსტა გაიგზავნა.',
 'passwordreset-emailsent-capture' => 'ქვემოთ ნაჩვენები პაროლის თავიდან დასაყენებელი წერილი გაიგზავნა.',
-'passwordreset-emailerror-capture' => 'ქვემოთ მოცემულია შექმნილი პაროლის დასაყენებელი წერილი, რომლის გაგზავნაც ვერ მოხერხდა: $1 გამო',
+'passwordreset-emailerror-capture' => 'ქვემოთ მოცემულია შექმნილი პაროლის დასაყენებელი წერილი, რომლის გაგზავნაც {{GENDER:$2|მომხმარებელთან}} ვერ მოხერხდა: $1 გამო',
 
 # Special:ChangeEmail
 'changeemail' => 'ელ-ფოსტის მისამართის შეცვლა',
@@ -965,6 +964,8 @@ $2
 'content-failed-to-parse' => '$2-ის შინაარსი არ შეესაბამება $1-ის ტიპს: $3.',
 'invalid-content-data' => 'დაუშვებელი მონაცემები',
 'content-not-allowed-here' => '„$1“-ის შინაარსი დაუშვებელია [[$2]] გვერდზე',
+'editwarning-warning' => 'სხვა გვერდზე გადასვლამ შესაძლოა გამოიწვიოს ცვლილებების დაკარგვა.
+თუკი თქვენ დარეგისტრირებული ხართ სისტემაში, მაში შეგიძლიათ გამორთოთ ეს გაფრთხილება „{{int:prefs-editing}}“ თქვენი კონფიგურაციის განყოფილებაში.',
 
 # Content models
 'content-model-wikitext' => 'ვიკიტექსტი',
@@ -3797,12 +3798,6 @@ 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:FileDuplicateSearch
 'fileduplicatesearch' => 'ერთნაირი ფაილების ძიება',
 'fileduplicatesearch-summary' => 'ერთნაირი ფაილების ძიება ჰეშ-კოდის მიხედვით.',
index 33a9490..cc32f1c 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',
@@ -152,6 +150,16 @@ $messages = array(
 'nov' => 'Wam',
 'dec' => 'Duj',
 
+'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',
+'today-at' => '$1',
+'yesterday-at' => 'Iḍelli af $1',
+
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Taggayt|Taggayin}}',
 'category_header' => 'Imagraden deg taggayt "$1"',
@@ -1060,15 +1068,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 +1606,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>
@@ -1922,15 +1920,6 @@ Ineggafen imazdayen : <code>$1</code> (ur d-renu acemma deg unadi inek/inem)',
 'listusers-noresult' => 'Ur yufi ḥedd (amseqdac).',
 'listusers-blocked' => '(yekyef)',
 
-# Special:ActiveUsers
-'activeusers' => 'Umuɣ n iseqdacen urmiden',
-'activeusers-intro' => 'Wagi d umuɣ n iseqdacen yexedmen armud deg {{PLURAL:$1|ass agi aneggaru|$1 ussan agi ineggura}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|abeddel n ussan agi ineggura|ibeddilen n ussan agi ineggura}} deg {{PLURAL:$3|ass aneggaru|$3 ussan ineggura}}',
-'activeusers-from' => 'Ssken iseqdacen seg :',
-'activeusers-hidebots' => 'Ffer iṛubuten',
-'activeusers-hidesysops' => 'Ffer inedbalen',
-'activeusers-noresult' => 'Ur yufi aseqdac.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Izerfan n igrawen n iseqdacen',
 'listgrouprights-summary' => 'Asebter agi yesɛa yiwen umuɣ n igrawen i sengelen deg wiki agi dɣa izerfan n wadduf i qqenen.
@@ -3024,4 +3013,8 @@ G leɛnaya-k sentem belli ṣaḥḥ tebɣiḍ ad tɛiwedeḍ axlaq n usebter-ag
 'duration-centuries' => '$1 {{PLURAL:$1|timiḍi|timiḍa}}',
 'duration-millennia' => '$1 {{PLURAL:$1|agimseggwas|agimseggwasen}}',
 
+# Unknown messages
+'hours-ago' => '$1 {{PLURAL:$1|asrag|isragen}} aya',
+'minutes-ago' => '$1 {{PLURAL:$1|tamrect|timercin}} aya',
+'seconds-ago' => '$1 {{PLURAL:$1|tasint|tisinin}} aya',
 );
index 3a6fa9d..0ed38f1 100644 (file)
@@ -82,8 +82,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Amorê karberunê şêrkerdoğu bıasne',
 'tog-oldsig' => 'İmza mewcude:',
 'tog-fancysig' => 'İmza rê mamelê wikimeqaley bıke (bê girewo otomatik)',
-'tog-externaleditor' => 'Editorê teberi standart bıgurene (teyna serba ekspertuno, komputerê sıma de ayarê xusışiy lazımê. [//www.mediawiki.org/wiki/Manual:External_editors Melumato jêdêr.])',
-'tog-externaldiff' => 'Têversanaene pê programê teberi vıraze (teyna serba ekspertuno, komputerê sıma de ayarê xısuşiy lazımê. [//www.mediawiki.org/wiki/Manual:External_editors Melumato jêdêr.])',
 'tog-showjumplinks' => 'Girê "so"y feal ke',
 'tog-uselivepreview' => 'Verqayto cande bıgurene (JavaScript) (hona cerrebnayene dero)',
 'tog-forceeditsummary' => 'Mı ke xulasa kerde cı vira, hay be mı ser de',
@@ -782,14 +780,6 @@ Verê cıfeteliyaene de be ilawekerdena verbendê '''all:'''i ra (ebe pelunê hu
 Sıma şikinê na sıre ''Google'' de şêr kerê.
 Diqet kerê, beno ke tedeestê {{SITENAME}} uza endi rozane niyê.",
 
-# Quickbar
-'qbsettings' => 'Herbişiyaena hedefi',
-'qbsettings-none' => 'Qet',
-'qbsettings-fixedleft' => 'Çhep de bestniyo pa',
-'qbsettings-fixedright' => 'Rast de bestniyo pa',
-'qbsettings-floatingleft' => 'Çhepi ser aznino',
-'qbsettings-floatingright' => 'Rasti ser aznino',
-
 # Preferences page
 'preferences' => 'Tercihi',
 'mypreferences' => 'Tercihê mı',
@@ -803,7 +793,7 @@ Diqet kerê, beno ke tedeestê {{SITENAME}} uza endi rozane niyê.",
 'prefs-datetime' => 'Tarix u zeman',
 'prefs-personal' => 'Dosya karberi',
 'prefs-rc' => 'Vurnaisê peyêni',
-'prefs-watchlist' => 'Lista şêr-kerdişi',
+'prefs-watchlist' => 'Lista şêrkerdene',
 'prefs-watchlist-days' => 'Rozê ke lista şêr-kerdişi de asenê:',
 'prefs-watchlist-edits' => 'Miqdarê tewr jêdêr vurnaisuno ke lista şêr-kerdişia hirakerdiye derê:',
 'prefs-misc' => 'Ğelet',
@@ -844,8 +834,8 @@ Diqet kerê, beno ke tedeestê {{SITENAME}} uza endi rozane niyê.",
 'prefs-files' => 'Dosyey',
 'youremail' => 'E-poste:',
 'username' => 'Namê karberi:',
-'uid' => 'Kamiya karberi:',
-'prefs-memberingroups' => 'Ezaê de {{PLURAL:$1|gruba|grubunê}}:',
+'uid' => 'Kamiya {{GENDER:$1|karberi}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Ezayê}} {{PLURAL:$1|grube|grubu}}:',
 'yourrealname' => 'Namo rastıkên:',
 'yourlanguage' => 'Zon:',
 'yourvariant' => 'Varyant:',
@@ -1125,9 +1115,6 @@ Cêr [$2 pela arezekerdena dosya de] arezekerdene asnina.',
 'listusers-noresult' => 'Karber nêdiya.',
 'listusers-blocked' => '(kilıt biyo)',
 
-# Special:ActiveUsers
-'activeusers' => 'Lista karberunê fealu',
-
 # Special:ListGroupRights
 'listgrouprights-group' => 'Kome',
 'listgrouprights-rights' => 'Heqi',
@@ -1148,7 +1135,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 +1187,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 +1455,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',
@@ -1558,10 +1543,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 +1558,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 3dd54eb..c12d1f8 100644 (file)
@@ -388,8 +388,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Бақылап тұрған қатысушылардың санын көрсет',
 'tog-oldsig' => 'Ағымдағы қолтаңбаңыз:',
 'tog-fancysig' => 'Қолтаңбаны уикимәтін ретінде қарастыру (автоматты сілтеме қойылмайды)',
-'tog-externaleditor' => 'Шеттік өңдеуішті әдепкіден қолдан (тек сарапшылар үшін, компьютеріңізде арнаулы бапталымдар керек)',
-'tog-externaldiff' => 'Шеттік айырмағышты әдепкіден қолдан (тек сарапшылар үшін, компьютеріңізде арнаулы бапталымдар керек)',
 'tog-showjumplinks' => '«Өтіп кету» қатынау сілтемелерін қос',
 'tog-uselivepreview' => 'Тура қарап шығуды қолдану (JavaScript) (Сынақтама)',
 'tog-forceeditsummary' => 'Өңдеменің қысқаша мазмұндамасы бос қалғанда маған ескерт',
@@ -1076,6 +1074,8 @@ IP-мекенжайыңыз бұл беттің түзету тарихында
 'edit-already-exists' => 'Жаңа бет жасау мүмкін емес.
 Ол әлдеқашан бар.',
 'defaultmessagetext' => 'Әдепкі мәтіні',
+'editwarning-warning' => 'Басқа бетке өтсеңіз сіздің жазған соңғы өңдемелеріңіз жойылуы мүмкін. 
+Егер сiз жүйеде тiркелсеңiз, онда сiз баптауларыңыздағы «{{int:prefs-editing}}» бөлігіне кіріп, бұл ескертуді өшіре аласыз.',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Құлақтандыру: Бұл бетте тым көп шығыс алатын құрылым талдатқыш жетелерінің қоңырау шалулары бар.
@@ -1291,14 +1291,6 @@ $3 келтірілген себебі: ''$2''",
 Әзірше Google арқылы іздеуге болады.
 Аңғартпа: {{SITENAME}} торабының мағлұмат тізбелері ескірген болуы мүмкін.',
 
-# Quickbar
-'qbsettings' => 'Мәзір',
-'qbsettings-none' => 'Ешқандай',
-'qbsettings-fixedleft' => 'Солға бекітілген',
-'qbsettings-fixedright' => 'Оңға бекітілген',
-'qbsettings-floatingleft' => 'Солға қалқыған',
-'qbsettings-floatingright' => 'Оңға қалқыған',
-
 # Preferences page
 'preferences' => 'Бапталымдар',
 'mypreferences' => 'Баптауларым',
@@ -2542,24 +2534,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 +2567,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
index 3d6afa0..8d43ade 100644 (file)
@@ -291,8 +291,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 +304,7 @@ $messages = array(
 'tog-diffonly' => 'កុំបង្ហាញខ្លឹមសារទំព័រនៅពីក្រោមតារាងប្រៀបធៀបចំណុចខុសគ្នា',
 'tog-showhiddencats' => 'បង្ហាញចំណាត់ថ្នាក់ក្រុមដែលត្រូវបានលាក់',
 'tog-norollbackdiff' => 'បំភ្លេច​ភាព​ខុស​គ្នា​បន្ទាប់​ពី​អនុវត្តការ​ស្ដារវិញ',
+'tog-useeditwarning' => 'សូមព្រមាន​ខ្ញុំ​ ពេលដែលខ្ញុំ​ចាកចេញ​ពី​ទំព័រ​កែប្រែដោយមិន​បានរក្សា​ទុកបំលាស់ប្ដូរ​នានា​',
 
 'underline-always' => 'ជានិច្ច',
 'underline-never' => 'កុំអោយសោះ',
@@ -1073,6 +1072,8 @@ $2
 
 ទំព័រនេះមានរួចហើយ។',
 'defaultmessagetext' => 'អត្ថបទសារតាមលំនាំដើម',
+'editwarning-warning' => 'ចាកចេញពីទំព័រនេះ នឹងធ្វើឲ្យអ្នកបាត់បង់កំណែប្រែដែលអ្នកបានធ្វើ។
+ប្រសិនបើអ្នកបាន​ឡុកអ៊ីនរួចហើយ អ្នកអាច​បិទ​បម្រាម​នេះ​នៅ​ក្នុងផ្នែក​ "{{int:prefs-editing}}" នៃ​ចំណូល​ចិត្ត​របស់​អ្នក​។',
 
 # Content models
 'content-model-wikitext' => 'អត្ថបទវិគី',
@@ -1339,15 +1340,6 @@ $1",
 ក្នុង​ពេល​ឥឡូវ​នេះ​ អ្នកអាច​ស្វែង​រក​តាម​រយៈ​ Google បាន​។
 សូមចងចាំ​ថា​ លិបិក្រម​នៃ​មាតិការ​របស់​{{SITENAME}} អាចហួស​សម័យ​។​',
 
-# Quickbar
-'qbsettings' => 'របារទាន់ចិត្ត',
-'qbsettings-none' => 'ទទេ',
-'qbsettings-fixedleft' => 'ចុងខាងឆ្វេង',
-'qbsettings-fixedright' => 'ចុងខាងស្តាំ',
-'qbsettings-floatingleft' => 'អណ្តែតឆ្វេង',
-'qbsettings-floatingright' => 'អណ្តែតស្តាំ',
-'qbsettings-directionality' => 'នៅមួយកន្លែង, អាស្រ័យលើទិសដៅសរសេររបស់ភាសារបស់អ្នក',
-
 # Preferences page
 'preferences' => 'ចំណង់ចំណូលចិត្ត',
 'mypreferences' => 'ចំណង់ចំណូលចិត្ត​',
@@ -1857,7 +1849,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',
@@ -2915,13 +2906,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 +2972,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' => 'វ៉ិចទ័រ​​',
 
index d4937e4..e279bad 100644 (file)
@@ -94,8 +94,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ಪುಟವನ್ನು ವೀಕ್ಷಿಸುತ್ತಿರುವ ಸದಸ್ಯರ ಸಂಖ್ಯೆಯನ್ನು ತೋರಿಸು',
 'tog-oldsig' => 'ಪ್ರಸ್ತುತ ಸಹಿ',
 'tog-fancysig' => 'ಸರಳ ಸಹಿಗಳು (ಕೊಂಡಿ ಇಲ್ಲದಿರುವಂತೆ)',
-'tog-externaleditor' => 'ಬಾಹ್ಯ ಸಂಪಾದನೆ ಸಲಕರಣೆಯನ್ನು ಯಾವಾಗಲೂ ಉಪಯೋಗಿಸು (ಅನುಭವ ಹೊಂದಿರುವ ಬಳಕೆದಾರರಿಗೆ ಮಾತ್ರ, ನಿಮ್ಮ ಗಣಕಯಂತ್ರದಲ್ಲಿ ವಿಶೇಷ ಬದಲಾವಣೆಗಳು ಬೇಕಾಗುತ್ತದೆ)',
-'tog-externaldiff' => 'ಬಾಹ್ಯ ಅಂತರದರ್ಶಕವನ್ನು ಯಾವಗಲೂ ಉಪಯೋಗಿಸು (ಅನುಭವ ಹೊಂದಿರುವ ಬಳಕೆದಾರರಿಗೆ ಮಾತ್ರ, ನಿಮ್ಮ ಗಣಕಯಂತ್ರದಲ್ಲಿ ವಿಶೇಷ ಬದಲಾವಣೆಗಳು ಬೇಕಾಗುತ್ತದೆ)',
 'tog-showjumplinks' => 'ಶಕ್ತಗೊಳಿಸಲು "ನೆಗೆ ಇಲ್ಲಿಗೆ" ಲಭ್ಯಕೆ ಕೊಡ',
 'tog-uselivepreview' => 'ನೇರ ಮುನ್ನೋಟವನ್ನು ಉಪಯೋಗಿಸು (JavaScript) (ಪ್ರಾಯೋಗಿಕ)',
 'tog-forceeditsummary' => 'ಸಂಪಾದನೆ ಸಾರಾಂಶವನ್ನು ಖಾಲಿ ಬಿಟ್ಟಲ್ಲಿ ನೆನಪಿಸು',
@@ -109,6 +107,7 @@ $messages = array(
 'tog-diffonly' => 'ವ್ಯತ್ಯಾಸಗಳ ಕೆಳಗಿರುವ ಪುಟದ ವಿವರಗಳನ್ನು ತೋರಿಸಬೇಡ',
 'tog-showhiddencats' => 'ಅಡಗಿಸಲ್ಪಟ್ಟ ವರ್ಗಗಳನ್ನು ತೋರಿಸು',
 'tog-norollbackdiff' => 'ತೊಡೆದುಹಾಕಿದ ನಂತರ ವ್ಯತ್ಯಸವನ್ನು ಬಿದು',
+'tog-useeditwarning' => 'ಸಂಪಾದನೆಯನ್ನು ಉಳಿಸದೆ ಹೊರಟಲ್ಲಿ ನನಗೆ ಎಚ್ಚರಿಸು',
 
 'underline-always' => 'ಯಾವಾಗಲೂ',
 'underline-never' => 'ಎಂದಿಗೂ ಇಲ್ಲ',
@@ -197,6 +196,7 @@ $messages = array(
 'newwindow' => '(ಹೊಸ ಕಿಟಕಿಯನ್ನು ತೆರೆಯುತ್ತದೆ)',
 'cancel' => 'ವಜಾ ಮಾಡಿ',
 'moredotdotdot' => 'ಇನ್ನಷ್ಟು...',
+'morenotlisted' => 'ಹೆಚ್ಚಿನದನ್ನು ಪಟ್ಟಿಮಾಡಲಾಗಿಲ್ಲ...',
 'mypage' => 'ಪುಟ',
 'mytalk' => 'ಚರ್ಚೆ',
 'anontalk' => 'ಈ ಐ.ಪಿ ಗೆ ಮಾತನಾಡಿ',
@@ -322,6 +322,7 @@ $messages = array(
 'youhavenewmessages' => 'ನಿಮಗೆ $1 ಇವೆ ($2).',
 'newmessageslink' => 'ಹೊಸ ಸಂದೇಶಗಳು',
 'newmessagesdifflink' => 'ಕೊನೆಯ ಬದಲಾವಣೆ',
+'newmessagesdifflinkplural' => 'ಕಡೆಯ {{PLURAL:$1|ಬದಲಾವಣೆ|ಬದಲಾವಣೆಗಳು}}',
 'youhavenewmessagesmulti' => '$1 ಅಲ್ಲಿ ನಿಮಗೆ ಹೊಸ ಸಂದೇಶಗಳಿವೆ',
 'editsection' => 'ಬದಲಾಯಿಸಿ',
 'editold' => 'ಬದಲಾಯಿಸಿ',
@@ -371,12 +372,12 @@ $messages = array(
 # General errors
 'error' => 'ದೋಷ',
 'databaseerror' => 'ಡೇಟಬೇಸ್ ದೋಷ',
-'dberrortext' => '!!FUZZY!ಒಂದು ಡೇಟಾಬೇಸ್ ನಿಮ್ಮಪ್ರಶ್ನೆಗೆ ಸಿಂಟಾಕ್ಸ್ ತಪ್ಪು ಸಂಭವಿಸಿದೆ
+'dberrortext' => 'ಒಂದು ಡೇಟಾಬೇಸ್ ನಿಮ್ಮಪ್ರಶ್ನೆಗೆ ಸಿಂಟಾಕ್ಸ್ ತಪ್ಪು ಸಂಭವಿಸಿದೆ
 ಈ ಸಾಫ್ಟ್ವೇರ್ ಒಂದು ದೋಷವನ್ನು ನಿವಾರಿಸಲಾಗಿದೆ ಸೂಚಿಸಬಹುದು.
 ಕೊನೆಯ ಪ್ರಯತ್ನ ಡೇಟಾಬೇಸ್ ನಿಮ್ಮಪ್ರಶ್ನೆಗೆ ಮಾಡಲಾಯಿತು:
-<blockquote><tt>$1</tt></blockquote>
-ಕ್ರಿಯೆ ಒಳಗಿನಿಂದಲೇ "<tt>$2</tt>" 
-ಡೇಟಾಬೇಸ್ ದೋಷವನ್ನು ತಿಳಿಸಿದೆ"<tt>$3: $4</tt>".',
+<blockquote><code>$1</code></blockquote>
+ಕ್ರಿಯೆ ಒಳಗಿನಿಂದಲೇ "<code>$2</code>" 
+ಡೇಟಾಬೇಸ್ ದೋಷವನ್ನು ತಿಳಿಸಿದೆ"<code>$3: $4</code>".',
 'dberrortextcl' => 'ಡೇಟಾಬೇಸ್ ಪ್ರಶ್ನೆಯ ವಿನ್ಯಾಸದಲ್ಲಿ ದೋಷ ಉಂಟಾಗಿದೆ.
 ಕೊನೆಯದಾಗಿ ಪ್ರಯತ್ನಿಸಲಾದ ಡೇಟಾಬೇಸ್ ಪ್ರಶ್ನೆಯು:
 "$1"
@@ -410,7 +411,7 @@ MySQL ಹಿಂದಿರುಗಿಸಿದ ದೋಷ "$3: $4"',
 'unexpected' => 'ಅನಿರೀಕ್ಷಿತ ಮೌಲ್ಯ: "$1"="$2".',
 'formerror' => 'ದೋಷ: ಅರ್ಜಿ ಕಳುಹಿಸಲಾಗಲಿಲ್ಲ',
 'badarticleerror' => 'ಈ ಪುಟದ ಮೇಲೆ ನೀವು ಪ್ರಯತ್ನಿಸಿದ ಕಾರ್ಯವನ್ನು ನಡೆಸಲಾಗದು.',
-'cannotdelete' => 'ಈ ಪುಟ ಅಥವಾ ಚಿತ್ರವನ್ನು ಅಳಿಸಲಾಗಲಿಲ್ಲ. (ಬೇರೊಬ್ಬ ಸದಸ್ಯರಿಂದ ಆಗಲೇ ಅಳಿಸಲ್ಪಟ್ಟಿರಬಹುದು.)',
+'cannotdelete' => '"$1" ಈ ಪುಟ ಅಥವಾ ಚಿತ್ರವನ್ನು ಅಳಿಸಲಾಗಲಿಲ್ಲ. (ಬೇರೊಬ್ಬ ಸದಸ್ಯರಿಂದ ಆಗಲೇ ಅಳಿಸಲ್ಪಟ್ಟಿರಬಹುದು.)',
 'cannotdelete-title' => '"$1" ಪುಟವನ್ನು ಅಳಿಸಲಾಗುವುದಿಲ್ಲ',
 'badtitle' => 'ಸರಿಯಿಲ್ಲದ ಹೆಸರು',
 'badtitletext' => 'ನೀವು ಕೋರಿದ ಪುಟದ ಶೀರ್ಷಿಕೆ ಸಿಂಧುವಲ್ಲದ್ದು ಅಥವ ಖಾಲಿ ಅಥವ ಸರಿಯಾದ ಕೊಂಡಿಯಲ್ಲದ ಅಂತರ-ಭಾಷೆ/ಅಂತರ-ವಿಕಿ ಸಂಪರ್ಕವಾಗಿದೆ.
@@ -454,7 +455,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 +648,7 @@ $2',
 ಅಥವ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ಈ ಪುಟವನ್ನು ಸಂಪಾದಿಸಬಹುದು]</span>.',
 'noarticletext-nopermission' => 'ಈ ಪುಟದಲ್ಲಿ ಸದ್ಯಕ್ಕೆ ಯಾವ ಪಠ್ಯವೂ ಇಲ್ಲ.
 ನೀವು ಇತರ ಪುಟಗಳಲ್ಲಿ [[ವಿಶೇಷ:Search/{{PAGENAME}}|ಈ ಶೀರ್ಷಿಕೆಗಾಗಿ ಹುಡುಕಬಹುದು]],
-à²\85ಥವಾ <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} à²¸à²\82ಬà²\82ಧಿಸಿದ à²¦à²¾à²\96ಲಾತಿ à²¹à³\81ಡà³\81à²\95ಿ]</span>.',
+à²\85ಥವಾ <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} à²¸à²\82ಬà²\82ಧಿಸಿದ à²¦à²¾à²\96ಲಾತಿ à²¹à³\81ಡà³\81à²\95ಬಹà³\81ದà³\81]</span>, à²\86ದರà³\86 à²¨à²¿à²®à²\97à³\86 à²\88 à²ªà³\81à²\9fವನà³\8dನà³\81 à²¸à²\82ಪಾದಿಸಲà³\81 à²\85ನà³\81ಮತಿಯಿಲà³\8dಲ.',
 'userpage-userdoesnotexist' => 'ಬಳಕೆದಾರ ಖಾತೆ "<nowiki>$1</nowiki>" ದಾಖಲಾಗಿಲ್ಲ. ನೀವು ಇದೇ ಪುಟವನ್ನು ಸೃಷ್ಟಿ/ಸಂಪಾದನೆ ಮಾಡಬೇಕೆಂದಿರುವಿರಿ ಎಂದು ಖಾತ್ರಿ ಮಾಡಿಕೊಳ್ಳಿ.',
 'blocked-notice-logextract' => 'ಈ ಬಳಕೆದಾರರನ್ನು  ಪ್ರಸ್ತುತವಾಗಿ  ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ. 
 ಇತ್ತೀಚಿನ  ನಿರ್ಬಂಧನೆಯ ದಾಖಲೆಯನ್ನು ಉಲ್ಲೇಖಕ್ಕಾಗಿ ಕೆಳಗೆ ಕೊಟ್ಟಿದೆ:',
@@ -655,7 +661,8 @@ $2',
 'sitejspreview' => "'''ನೆನಪಿಡಿ: ನೀವು ಇಲ್ಲಿ ಕೇವಲ ನಿಮ್ಮ ಬಳಕೆದಾರ CSSನ ಮುನ್ನೋಟ ನೋಡುತ್ತಿರುವಿರಿ.''''''ಅದನ್ನು ಇನ್ನೂ ಉಳಿಸಲಾಗಿಲ್ಲ!'''",
 'updated' => '(ನಕಲೆರಿಸಲಾಗಿದೆ)',
 'note' => "'''ಸೂಚನೆ:'''",
-'previewnote' => "'''ಇದು ಕೇವಲ ಮುನ್ನೋಟ; ಪುಟವನ್ನು ಇನ್ನೂ ಉಳಿಸಲಾಗಿಲ್ಲ ಎಂಬುದನ್ನು ಮರೆಯದಿರಿ!'''",
+'previewnote' => "'''ಇದು ಕೇವಲ ಮುನ್ನೋಟ.'''
+ಪುಟವನ್ನು ಇನ್ನೂ ಉಳಿಸಲಾಗಿಲ್ಲ ಎಂಬುದನ್ನು ಮರೆಯದಿರಿ!",
 'continue-editing' => 'ಸಂಪಾದನೆಯ ಪ್ರದೇಶಕ್ಕೆ  ಹೋಗಿ',
 'editing' => "'$1' ಲೇಖನ ಬದಲಾಯಿಸಲಾಗುತ್ತಿದೆ",
 'editingsection' => '$1 (ವಿಭಾಗ) ಅನ್ನು ಸಂಪಾದಿಸುತ್ತಿರುವಿರಿ',
@@ -831,7 +838,7 @@ $2',
 'compareselectedversions' => 'ಆಯ್ಕೆ ಮಾಡಿದ ಆವೃತ್ತಿಗಳನ್ನು ಹೊಂದಾಣಿಕೆ ಮಾಡಿ ನೋಡಿ',
 'showhideselectedversions' => 'ಆಯ್ದ ಆವೃತ್ತಿಗಳನ್ನು ತೋರಿಸು/ಅಡಗಿಸು',
 'editundo' => 'ಹಿಂದಿನಂತೆ',
-'diff-multi' => '(ಮಧ್ಯದಲ್ಲಿ ಆಗಿರುವ {{PLURAL:$1|೧ ಬದಲಾವಣೆಯನ್ನು|$1 ಬದಲಾವಣೆಗಳನ್ನು}} ತೋರಿಸಲಾಗಿಲ್ಲ.)',
+'diff-multi' => '(ಮಧ್ಯದಲ್ಲಿ {{PLURAL:$2|ಒಬ್ಬ|$2}} ಸದಸ್ಯರಿಂದ ಆಗಿರುವ {{PLURAL:$1|೧ ಬದಲಾವಣೆಯನ್ನು|$1 ಬದಲಾವಣೆಗಳನ್ನು}} ತೋರಿಸಲಾಗಿಲ್ಲ.)',
 
 # Search results
 'searchresults' => 'ಶೋಧನೆಯ ಫಲಿತಾಂಶಗಳು',
@@ -893,11 +900,6 @@ $2',
 ಈ ವೇಳೆಯಲ್ಲಿ ನೀವು ಗೂಗಲ್ ಉಪಯೋಗಿಸಿ ಹುಡುಕಾಟ ನಡೆಸಬಹುದು.
 ಗಮನಿಸಿ: ಅವರ {{SITENAME}} ಮಾಹಿತಿಯು ಪ್ರಸಕ್ತವಾಗಿಲ್ಲದಿರಬಹುದು.',
 
-# Quickbar
-'qbsettings-none' => 'ಯಾವುದೂ ಇಲ್ಲ',
-'qbsettings-floatingleft' => 'ಎಡಕ್ಕ ತೇಲುತ್ತಿದೆ',
-'qbsettings-floatingright' => 'ಬಲಕ್ಕೆ ತೇಲುತ್ತಿದೆ',
-
 # Preferences page
 'preferences' => 'ಪ್ರಾಶಸ್ತ್ಯಗಳು',
 'mypreferences' => 'ಪ್ರಾಶಸ್ತ್ಯಗಳು',
@@ -962,8 +964,7 @@ $2',
 'gender-female' => 'ಸ್ತ್ರೀ',
 'email' => 'ಇ-ಅಂಚೆ',
 'prefs-help-realname' => 'ನಿಜ ಹೆಸರು ನೀಡುವುದು ಐಚ್ಛಿಕ. ನೀವು ಅದನ್ನು ನೀಡಿದಲ್ಲಿ ನಿಮ್ಮ ಕಾಣಿಕೆಗಳಿಗೆ ನಿಮಗೆ ಮನ್ನಣೆ ನೀಡಲಾಗುವುದು.',
-'prefs-help-email' => 'ಇ-ಅಂಚೆ ವಿಳಾಸ ಕಡ್ಡಾಯವಲ್ಲ, ಆದರೆ ನೀವು ಅದನ್ನು ನೀಡಿದರೆ ನೀವು ನಿಮ್ಮ ಪ್ರವೇಶ ಪದವನ್ನು ಮರೆತರೆ ಅದನ್ನು ನಿಮಗೆ ಇ-ಅಂಚೆಯಿಂದ ಕಳುಹಿಸಿಬಹುದು.
-ಅಲ್ಲದೆ ಬೇರೆಯವರು ನಿಮ್ಮನ್ನು ಇತರರಿಗೆ ತಿಳಿಯದಂತೆ ನಿಮ್ಮ ಸದಸ್ಯ ಪುಟ ಅಥವ ಚರ್ಚೆ ಪುಟದ ಮೂಲಕ ಸಂಪರ್ಕಿಸಬಹುದು.',
+'prefs-help-email' => 'ಇ-ಅಂಚೆ ವಿಳಾಸ ಕಡ್ಡಾಯವಲ್ಲ, ಆದರೆ ನೀವು ಅದನ್ನು ನೀಡಿದರೆ ನೀವು ನಿಮ್ಮ ಪ್ರವೇಶ ಪದವನ್ನು ಮರೆತರೆ ಅದನ್ನು ನಿಮಗೆ ಇ-ಅಂಚೆಯಿಂದ ಕಳುಹಿಸಿಬಹುದು.',
 'prefs-help-email-required' => 'ಇ-ಅಂಚೆ ವಿಳಾಸ ಬೇಕಾಗಿದೆ.',
 'prefs-i18n' => 'ಅಂತರರಾಷ್ಟ್ರೀಕರಣ',
 'prefs-signature' => 'ಸಹಿ',
@@ -1438,6 +1439,10 @@ $2',
 'listusers-submit' => 'ತೋರು',
 'listusers-noresult' => 'ಯಾವ ಬಳಕೆದಾರರೂ ಸಿಗಲಿಲ್ಲ.',
 
+# Special:ActiveUsers
+'activeusers' => 'ಸಕ್ರಿಯ ಸದಸ್ಯರ ಪಟ್ಟಿ',
+'activeusers-noresult' => 'ಯಾವ ಬಳಕೆದಾರರೂ ಸಿಗಲಿಲ್ಲ.',
+
 # Special:ListGroupRights
 'listgrouprights' => 'ಬಳಕೆದಾರ ಗುಂಪು ಹಕ್ಕುಗಳು',
 'listgrouprights-summary' => 'ಈ ವಿಕಿಯಲ್ಲಿ ಪ್ರಚಲಿತವಾಗಿರುವ ಬಳಕೆದಾರ ಗುಂಪುಗಳು ಮತ್ತು ಆ ಗುಂಪುಗಳಿಗೆ ಅನ್ವಯಿಸುವ ಹಕ್ಕುಗಳು ಈ ಕೆಳಗಿನಂತಿದೆ.',
@@ -1602,7 +1607,7 @@ $2',
 'blanknamespace' => '(ಮುಖ್ಯ)',
 
 # Contributions
-'contributions' => 'ಸದಸ್ಯರ ಕಾಣಿಕೆಗಳು',
+'contributions' => '{{GENDER:$1|User}} ಕಾಣಿಕೆಗಳು',
 'contributions-title' => '$1 ಸದಸ್ಯರ ಕಾಣಿಕೆಗಳು',
 'mycontris' => 'ಕಾಣಿಕೆಗಳು',
 'contribsub2' => '$1 ($2) ಗೆ',
@@ -1676,7 +1681,7 @@ $2',
 'ipusubmit' => 'ಈ ವಿಳಾಸದ ತಡೆಯನ್ನು ತೆಗೆ',
 'unblocked' => '[[User:$1|$1]] ಖಾತೆಯ ತಡೆಯನ್ನು ತೆಗೆಯಲಾಗಿದೆ',
 'unblocked-id' => '$1 ತಡೆಯನ್ನು ತೆಗೆಯಲಾಗಿದೆ',
-'ipblocklist' => 'ನಿರ್ಬಂಧಿಸಲಾಗಿರುವ IP ವಿಳಾಸಗಳು ಹಾಗೂ ಬಳಕೆಯ ಹೆಸರುಗಳು',
+'ipblocklist' => 'ನಿರ್ಬಂಧಿಸಲಾಗಿರುವ ಸದಸ್ಯರು',
 'ipblocklist-legend' => 'ತಡೆಹಿಡಿಯಲಾದ ಬಳಕೆದಾರನನ್ನು ಹುಡುಕು',
 'ipblocklist-submit' => 'ಹುಡುಕು',
 'infiniteblock' => 'ಅನಂತ',
@@ -2142,11 +2147,6 @@ $5
 'version-software-product' => 'ಉತ್ಪನ್ನ',
 'version-software-version' => 'ಆವೃತ್ತಿ',
 
-# Special:FilePath
-'filepath' => 'ಫೈಲಿನ ಮಾರ್ಗ',
-'filepath-page' => 'ಫೈಲು:',
-'filepath-submit' => 'ಹೋಗು',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ದ್ವಿಪ್ರತಿ ಫೈಲುಗಳಿಗೆ ಹುಡುಕು',
 'fileduplicatesearch-legend' => 'ದ್ವಿಪ್ರತಿಯನ್ನು ಹುಡುಕು',
index d0bf0bc..fd61709 100644 (file)
@@ -608,11 +608,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 +625,8 @@ $1',
 'hidetoc' => '숨기기',
 'collapsible-collapse' => '접기',
 'collapsible-expand' => '펼치기',
-'thisisdeleted' => '$1 보거나 되살리겠습니까?',
-'viewdeleted' => '$1 보겠습니까?',
+'thisisdeleted' => '$1 문서를 보거나 되살리겠습니까?',
+'viewdeleted' => '$1 문서를 보겠습니까?',
 'restorelink' => '{{PLURAL:$1|삭제된 편집 $1개}}',
 'feedlinks' => '피드:',
 'feed-invalid' => '잘못된 구독 피드 방식입니다.',
@@ -708,7 +708,7 @@ URL을 잘못 입력하였거나, 잘못된 링크를 따라갔을 수 있습니
 'delete-hook-aborted' => '훅에 의해 삭제가 중단되었습니다.
 아무런 설명도 주어지지 않았습니다.',
 'badtitle' => '잘못된 제목',
-'badtitletext' => '문서 제목이 잘못되었거나 비어있습니다. 또는 잘못된 인터위키 제목으로 링크했습니다.
+'badtitletext' => '요청한 문서 제목이 잘못되었거나, 비어있거나, 잘못된 인터위키 제목으로 링크했습니다.
 문서 제목에 사용할 수 없는 문자를 사용했을 수 있습니다.',
 'perfcached' => '다음 자료는 캐시된 것이므로 현재 상황을 반영하지 않을 수 있습니다. 캐시에 최대 {{PLURAL:$1|결과 $1개}}가 있습니다.',
 'perfcachedts' => '다음 자료는 캐시된 것으로, $1에 마지막으로 새로 고쳐졌습니다.  캐시에 최대 {{PLURAL:$4|결과 $4개}}가 있습니다.',
@@ -761,14 +761,19 @@ $2',
 'welcomecreation-msg' => '계정이 만들어졌습니다.
 [[Special:Preferences|{{SITENAME}} 사용자 환경 설정]]을 바꿀 수 있습니다.',
 'yourname' => '사용자 이름:',
-'userlogin-yourname' => '계정 이름',
-'userlogin-yourname-ph' => '계정 이름을 입력하십시오',
+'userlogin-yourname' => '사용자 이름',
+'userlogin-yourname-ph' => '사용자 이름을 입력하세요',
+'createacct-helpusername-url' => '{{ns:Project}}:사용자_이름_정책',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(선택 방법을 알려주세요)]]',
 '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-remembermypassword' => 'ë¡\9cê·¸ì\9d¸ ì\83\81í\83\9c를 ì\9c ì§\80하기',
 'userlogin-signwithsecure' => '보안 서버로 로그인',
 'securelogin-stick-https' => '로그인 후에도 HTTPS 연결 상태를 유지합니다',
 'yourdomainname' => '도메인 이름:',
@@ -792,12 +797,29 @@ $2',
 'userlogin-resetlink' => '사용자 이름이나 비밀번호를 잊으셨나요?',
 '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-captcha-help-url' => '{{ns:Project}}:계정 요청',
+'createacct-imgcaptcha-help' => '그림을 볼 수 없습니까? [[{{MediaWiki:createacct-captcha-help-url}}|계정을 요청할 수 있습니다]]',
+'createacct-imgcaptcha-ph' => '위에 보이는 텍스트를 입력하세요',
+'createacct-submit' => '계정 만들기',
+'createacct-benefit-heading' => '{{SITENAME}}(은)는 여러분과 같은 사람으로 이루어집니다.',
+'createacct-benefit-body1' => '편집 수',
+'createacct-benefit-body2' => '문서 수',
+'createacct-benefit-body3' => '최근 기여자',
+'badretype' => '입력한 비밀번호가 일치하지 않습니다.',
 'userexists' => '입력하신 사용자 이름이 이미 등록되어 있습니다.
 다른 이름을 선택하세요.',
 'loginerror' => '로그인 오류',
+'createacct-error' => '계정 만들기 오류',
 'createaccounterror' => '계정을 만들지 못했습니다: $1',
 'nocookiesnew' => '사용자 계정을 만들었지만, 아직 로그인하지 않았습니다.
 {{SITENAME}}에서는 로그인 정보를 저장하기 위해 쿠키를 사용합니다.
@@ -864,7 +886,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,6 +915,7 @@ $2',
 'resetpass-wrong-oldpass' => '비밀번호가 잘못되었거나 현재의 비밀번호와 같습니다.
 이미 비밀번호를 성공적으로 바꾸었거나 새 임시 비밀번호를 요청했을 수 있습니다.',
 'resetpass-temp-password' => '임시 비밀번호:',
+'resetpass-abort-generic' => '비밀번호 바꾸기가 확장 기능에 의해 중단되었습니다.',
 
 # Special:PasswordReset
 'passwordreset' => '비밀번호 재설정',
@@ -929,7 +952,7 @@ $2
 임시 비밀번호: $2',
 'passwordreset-emailsent' => '비밀번호 재설정 이메일을 보냈습니다.',
 'passwordreset-emailsent-capture' => '비밀번호 재설정 이메일이 발송되었으며, 아래에 나타나 있습니다.',
-'passwordreset-emailerror-capture' => '비밀번호 재설정 이메일이 ë§\8cë\93¤ì\96´ì ¸ ì\95\84ë\9e\98ì\97\90 ë\82\98í\83\80ë\82¬ì§\80ë§\8c ë°\9cì\86¡í\95\98ë\8a\94 ë\8d°ì\97\90ë\8a\94 ì\8b¤í\8c¨í\96\88ì\8aµë\8b\88ë\8b¤: $1',
+'passwordreset-emailerror-capture' => '비밀번호 재설정 이메일이 ì\83\9dì\84±ë\90\98ì\96´ ì\95\84ë\9e\98ì\97\90 í\91\9cì\8b\9cë\90\98ì\96´ ì\9e\88ì§\80ë§\8c, {{GENDER:$2|ì\82¬ì\9a©ì\9e\90}}ì\97\90ê²\8c ë°\9cì\86¡í\95\98ë\8a\94 ë\8d°ì\97\90ë\8a\94 ì\8b¤í\8c¨í\96\88ì\8aµë\8b\88ë\8b¤: $1',
 
 # Special:ChangeEmail
 'changeemail' => '이메일 주소 바꾸기',
@@ -1021,7 +1044,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' => '(새 문서)',
@@ -1191,7 +1214,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' => '계정을 만들 수 없음',
@@ -1544,8 +1567,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 +1590,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 +1613,7 @@ HTML 태그를 확인하세요.',
 'userrights-notallowed' => '다른 사용자의 권한을 조정할 권한이 없습니다.',
 'userrights-changeable-col' => '바꿀 수 있는 권한',
 'userrights-unchangeable-col' => '바꿀 수 없는 권한',
+'userrights-conflict' => '사용자 권한에 충돌이 있습니다! 바뀜을 다시 적용하세요.',
 
 # Groups
 'group' => '그룹:',
@@ -1918,7 +1942,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 +2044,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 +2056,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 
 # Special:ListFiles
 'listfiles-summary' => '이 위키에 올라와 있는 모든 파일이 나열되어 있습니다.
-사용자별로 필터링했을 경우에는 사용자가 올린 가장 최신 버전만이 보여집니다.',
+사용자별로 필터링했을 경우에는 사용자가 올린 가장 최신 만이 보여집니다.',
 'listfiles_search_for' => '다음 이름을 가진 미디어 찾기:',
 'imgfile' => '파일',
 'listfiles' => '파일 목록',
@@ -2172,8 +2196,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 +2242,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'uncategorizedtemplates' => '분류되지 않은 틀 목록',
 'unusedcategories' => '사용하지 않는 분류 목록',
 'unusedimages' => '사용하지 않는 파일 목록',
-'popularpages' => '인기있는 문서 목록',
+'popularpages' => '인기 있는 문서 목록',
 'wantedcategories' => '필요한 분류 목록',
 'wantedpages' => '필요한 문서 목록',
 'wantedpages-badtitle' => '문서 제목이 잘못되었습니다: $1',
@@ -2262,7 +2286,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'unusedcategoriestext' => '사용하지 않는 분류 문서의 목록입니다.',
 'notargettitle' => '해당하는 문서 없음',
 'notargettext' => '기능을 수행할 대상 문서나 사용자를 지정하지 않았습니다.',
-'nopagetitle' => '해당 문서 없음',
+'nopagetitle' => '해당하는 문서 없음',
 'nopagetext' => '찾는 문서가 존재하지 않습니다.',
 'pager-newer-n' => '{{PLURAL:$1|다음 1개|다음 $1개}}',
 'pager-older-n' => '{{PLURAL:$1|이전 1개|이전 $1개}}',
@@ -2302,7 +2326,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'allpagesnext' => '다음',
 'allpagessubmit' => '보기',
 'allpagesprefix' => '다음으로 시작하는 문서 보기:',
-'allpagesbadtitle' => '문서 제목이 잘못되었거나 다른 사이트로 연결되는 인터위키를 가지고 있습니다.
+'allpagesbadtitle' => '주어진 문서 제목이 잘못되었거나 다른 사이트로 연결되는 인터위키가 있습니다.
 문서 제목에 사용할 수 없는 문자를 사용했을 수 있습니다.',
 'allpages-bad-ns' => '{{SITENAME}}에서는 "$1" 이름공간을 사용하지 않습니다.',
 'allpages-hide-redirects' => '넘겨주기 숨기기',
@@ -2343,15 +2367,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',
@@ -2523,7 +2556,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}}]])의 편집을 되돌릴 수 없습니다.
 누군가가 이미 문서를 고치거나 되돌렸습니다.
 
@@ -2826,7 +2859,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' => '이 사용자 이름이 숨겨져 있기 때문에 이 사용자를 차단 해제할 수 없습니다.',
@@ -2905,13 +2938,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 +2953,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 +2978,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' => '파일을 파일이 아닌 이름공간으로 옮길 수 없습니다.',
@@ -3206,7 +3239,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 바깥 사이트로 연결하는 링크 중에 블랙리스트에 포함된 사이트가 있을 것입니다.',
 'spamprotectionmatch' => '문제가 되는 부분은 다음과 같습니다: $1',
 'spambot_username' => 'MediaWiki 스팸 제거',
-'spam_reverting' => '$1 포함하지 않는 최신 버전으로 되돌림',
+'spam_reverting' => '$1(을)를 포함하지 않는 최신 버전으로 되돌림',
 'spam_blanking' => '모든 버전에 $1 링크를 포함하고 있어 차단함',
 'spam_deleting' => '모든 버전에 $1 링크를 포함하고 있어 삭제함',
 
@@ -3338,11 +3371,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 +3399,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' => '간체',
@@ -3786,7 +3831,7 @@ Variants for Chinese language
 
 # Email address confirmation
 'confirmemail' => '이메일 주소 확인',
-'confirmemail_noemail' => '[[Special:Preferences|환경 설정]]에 이메일을 설정하지 않았습니다.',
+'confirmemail_noemail' => '[[Special:Preferences|사용자 환경 설정]]에 올바른 이메일주소를 설정하지 않았습니다.',
 'confirmemail_text' => '{{SITENAME}}에서는 이메일 기능을 사용하기 전에 이메일 인증을 받아야 합니다.
 아래의 버튼을 누르면 인증 메일을 보냅니다.
 메일에는 인증 코드가 들어있는 링크가 있습니다.
@@ -3984,12 +4029,16 @@ $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 주소를 엽니다.
-그림 파일일 경우 원본 해상도의 파일이 열립니다. 다른 종류의 파일일 경우 그 파일의 종류에 맞는 프로그램이 실행됩니다.',
+'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' => '중복된 파일 찾기',
@@ -4063,7 +4112,7 @@ $5
 'dberr-header' => '이 위키에 문제가 있습니다.',
 'dberr-problems' => '죄송합니다!
 이 사이트는 기술적인 문제가 있습니다.',
-'dberr-again' => '잠시 후에 다시 시도해주세요.',
+'dberr-again' => '잠시 기다리고 나서 다시 불러오세요.',
 'dberr-info' => '(데이터베이스에 접속할 수 없습니다: $1)',
 'dberr-usegoogle' => '그 동안 구글을 통해 검색할 수도 있습니다.',
 'dberr-outofdate' => '참고로 구글의 내용 개요는 오래된 것일 수도 있습니다.',
@@ -4082,6 +4131,7 @@ $5
 'htmlform-selectorother-other' => '기타',
 'htmlform-no' => '아니오',
 'htmlform-yes' => '예',
+'htmlform-chosen-placeholder' => '선택하세요',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 (본문 전체 찾기)',
index 58716fb..0e938a6 100644 (file)
@@ -91,15 +91,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 +111,7 @@ $messages = array(
 'tog-diffonly' => 'Версия тенглешдириуню тюбю бла бетни ичиндегисин кёргюзме',
 'tog-showhiddencats' => 'Джашыртын категорияланы кёргюз',
 'tog-norollbackdiff' => 'Къайтарыудан сора версияланы башхалыкъларын кёргюзме',
+'tog-useeditwarning' => 'Тюрлендириулени сакълатмай редакторлау бетден кетген сагъатымда билдир',
 
 'underline-always' => 'Хаманда',
 'underline-never' => 'Бирзаманда да',
@@ -443,7 +442,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 +479,18 @@ $2',
 'welcomecreation-msg' => 'Сизни тергеу джазыуугъуз (аккаунтугъуз) къуралды.
 {{SITENAME}} сайтда [[Special:Preferences|джарашдырыуларыгъызны]] тюрлендирирге унутмагъыз.',
 'yourname' => 'Къошулуучуну аты',
+'userlogin-yourname' => 'Тергеу джазыуну аты',
+'userlogin-yourname-ph' => 'Тергеу джазыуугъузну атын джазыгъыз',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(сайлауда болушлукъ)]]',
 'yourpassword' => 'Паролюгъуз:',
+'userlogin-yourpassword' => 'Пароль',
+'userlogin-yourpassword-ph' => 'Паролунгу джаз',
+'createacct-yourpassword-ph' => 'Пароль джаз',
 'yourpasswordagain' => 'Паролну джангыдан джаз:',
+'createacct-yourpasswordagain' => 'Паролну бегит',
+'createacct-yourpasswordagain-ph' => 'Паролну энтда бир кере джаз',
 'remembermypassword' => 'Бу компьютерде мени тергеў джазыўуму унутма (эм кёб $1 {{PLURAL:$1|кюн|кюн}})',
+'userlogin-remembermypassword' => 'Мени эсде тутуу',
 'securelogin-stick-https' => 'Чыкъгъандан сора да HTTPS бла байламлы къой',
 'yourdomainname' => 'Сизни доменигиз:',
 'password-change-forbidden' => 'Бу викиде паролугъузну тюрлендиреллик тюлсюз.',
@@ -495,18 +503,34 @@ $2',
 'logout' => 'Чыгъыу',
 'userlogout' => 'Чыгъыу',
 'notloggedin' => 'Авторизация ётмегенсиз',
+'userlogin-joinproject' => '{{SITENAME}} сайтха къошул',
 'nologin' => 'Тергеу джазыуугъуз (аккаунтугъуз) джокъмуду? $1.',
 'nologinlink' => 'Тергеу джазыу (аккаунт) къурагъыз',
 'createaccount' => 'Джангы къошулуучуну регистрация эт',
 'gotaccount' => 'Тергеу джазыуугъуз (аккаунтугъуз) энди бармыды? $1.',
 'gotaccountlink' => 'Кириу',
 'userlogin-resetlink' => 'Кирир ючюн билгилеригизни унутхан этгенмисиз?',
+'helplogin-url' => 'Help:Кириу',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Системагъа кириуде болушлукъ]]',
+'createacct-join' => 'Информациягъызны тюбюрекде джазыгъыз.',
+'createacct-emailrequired' => 'Электрон почтаны адреси',
+'createacct-emailoptional' => 'Электрон почтаны адреси (ажымсыз керек тюлдю)',
+'createacct-email-ph' => 'Электрон почта адресигизни джазыгъыз',
 'createaccountmail' => 'Эсде болмагъанлай генерация этилген болджаллы паролну хайырландыр эм тюбюрекде берилген электрон почта адресге ий:',
+'createacct-realname' => 'Керти атыгъыз (ажымсыз керек тюлдю)',
 'createaccountreason' => 'Чурум:',
+'createacct-reason' => 'Чурум',
+'createacct-captcha' => 'Къоркъуусузлукъну тинтиу',
+'createacct-imgcaptcha-ph' => 'Башыракъда кёрюннген текстни джазыгъыз',
+'createacct-benefit-heading' => '{{SITENAME}} сизнича адамла бла этилгенди.',
+'createacct-benefit-body1' => 'тюрлениу',
+'createacct-benefit-body2' => 'бет',
+'createacct-benefit-body3' => 'арт заманда къатышхан',
 'badretype' => 'Джазгъан паролларыгъыз бир-бирине келишмейдиле.',
 'userexists' => 'Джазылгъан ат хайырландырылады.
 Башха ат сайлагъыз.',
 'loginerror' => 'Кириу хата',
+'createacct-error' => 'Тергеу джазыу къурауда халат',
 'createaccounterror' => 'Быллай тергеу джазыу (аккаунт) къураргъа болмайды: $1',
 'nocookiesnew' => 'Къошлуучу регистрацияны ётгенди, алай кирмегенди. {{SITENAME}} къошулуучуланы таныр ючюн «cookies»-ни хайырландырады. Сиз «cookies»-ни эркин этмегенсиз. «Cookies»-ни эркин этигиза да, андан сора джангы атыгъыз эм паролюгъуз бла киригиз.',
 'nocookieslogin' => '{{SITENAME}} къошулуучуланы таныр ючюн «cookies»-ни хаырландырады. Сиз аны джукълатыб турасыз. «Cookies»-ни эркин этигизда джангыдан кёрюгюз.',
@@ -538,8 +562,8 @@ $2',
 Паролну алгъандан сора, джангыдан киригиз системагъа.',
 'blocked-mailpassword' => 'Сизни IP-адресигиз блокланыб турады, аны бла паролну къайтарыу функцияда.',
 'eauthentsent' => 'Джазылгъан электрон почтагъа адресни тюрлениуюн бегитирге соруу джиберилгенди. Письмода бу сизни электрон почтагъызны адреси болгъанын бегитир ючюн не этерге керек болгъаны да чертилгенди.',
-'throttled-mailpassword' => 'Паролну электрон почтагъа джибериу амалны сиз {{PLURAL:$1|ахыр $1 сагъаны}} ичинде хайырландыргъансыз энди.
\91Ñ\83 Ð°Ð¼Ð°Ð»Ð°Ð½Ñ\8b $1 {{PLURAL:$1|Ñ\81агÑ\8aаÑ\82нÑ\8b}} Ð¸Ñ\87инде ÐºÑ\8aÑ\83Ñ\80Ñ\83 Ð±Ð¸Ñ\80 ÐºÐµÑ\80ек Ñ\85айÑ\8bÑ\80ландÑ\8bÑ\80ыргъа болады.',
+'throttled-mailpassword' => 'Паролну билдириу амал {{PLURAL:$1|ахыр $1 сагъатны}} ичинде бир кере хайырланылгъанды.
\94жоÑ\80Ñ\83кÑ\8aдан Ñ\87Ñ\8bгÑ\8aÑ\8bÑ\83дан Ñ\81акÑ\8aланÑ\8bÑ\80 Ñ\8eÑ\87Ñ\8eн $1 {{PLURAL:$1|Ñ\81агÑ\8aаÑ\82нÑ\8b}} Ð¸Ñ\87инде ÐºÑ\8aÑ\83Ñ\80Ñ\83 Ð±Ð¸Ñ\80 Ð±Ð¸Ð»Ð´Ð¸Ñ\80иÑ\83 Ð°Ð»ыргъа болады.',
 'mailerror' => 'Почта джибериу хата: $1',
 'acct_creation_throttle_hit' => 'Кюн бла кечеге сизни IP-адресигизден {{PLURAL:$1|$1 тергеу джазыу (аккаунт)}} къуралгъанды. Бу амал энди бусагъатда джабыкъды.',
 'emailauthenticated' => 'Сизни электрон почта адресигиз бегитилгенди: $3, $2.',
@@ -586,9 +610,10 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Паролну атыу',
-'passwordreset-text' => 'ЭлекÑ\82Ñ\80он Ð´Ð¶Ð°Ð·Ð¼Ð° Ð±Ð»Ð° Ñ\82еÑ\80геÑ\83 Ð´Ð¶Ð°Ð·Ñ\8bÑ\83Ñ\83гÑ\8aÑ\83знÑ\83 (аккаÑ\83нÑ\82Ñ\83гÑ\8aÑ\83знÑ\83) Ð¿Ð°Ñ\80амеÑ\82Ñ\80леÑ\80ини Ñ\8eÑ\81Ñ\8eнден Ð±Ð¸Ð»Ð´Ð¸Ñ\80иÑ\83 Ð°Ð»Ñ\8bр ючюн бу форманы толтуругъуз.',
+'passwordreset-text' => 'Ð\9fаÑ\80олÑ\83гÑ\8aÑ\83з Ð´Ð¶Ð¸Ð±ÐµÑ\80илир ючюн бу форманы толтуругъуз.',
 'passwordreset-legend' => 'Паролну атыу',
 'passwordreset-disabled' => 'Бу викиде паролла атыу амал джукъланыбды.',
+'passwordreset-emaildisabled' => 'Бу викиде электрон почтаны функциялары джукъланыбдыла.',
 'passwordreset-pretext' => '{{PLURAL:$1||Тюбюрекде берилген билгиледен бирин джазыгъыз}}',
 'passwordreset-username' => 'Къошулуучуну аты:',
 'passwordreset-domain' => 'Домен:',
@@ -600,7 +625,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 +635,7 @@ $2',
 'changeemail-oldemail' => 'Почтаны бусагъатдагъы адреси:',
 'changeemail-newemail' => 'Электрон почтаны джангы адреси:',
 'changeemail-none' => '(джокъ)',
+'changeemail-password' => '«{{SITENAME}}» проектде паролугъуз:',
 'changeemail-submit' => 'Адресни тюрлендир',
 'changeemail-cancel' => 'Ызына алыу',
 
@@ -762,9 +788,7 @@ $2',
 Сиз дагъыда этген къошакъларыгъызны автору болгъаныгъызны неда информацияны чыкъгъан джери эркин джаяргъа эм тюрлендирирге къойгъанын аны бегитесиз (къарагъыз: $1).
 '''ЭРКИНЛИКСИЗ АВТОР ХАКЪ БЛА ДЖАКЪЛАННГАН МАТЕРИАЛЛА САЛМАГЪЫЗ БЫЛАЙГЪА!'''",
 'longpageerror' => "'''ХАЛАТ: сиз сакълатхан текстни  {{PLURAL:$1|бир килобайт|$1 килобайт}} ёлчеми барды, ол {{PLURAL:$2|бир килобайт|$2 килобайт}} чекден кёбдю. Бет сакъланныкъ тюлдю.'''",
-'readonlywarning' => "'''Эс бёлюгюз: Билгилени базасы бусагъатда киритленибди. Ол себебден тюрлениулеригиз къошулаллыкъ тюлдю. Джазгъанларыгъызны башха бир файлда сакълаб, кечирек къошаргъа боллукъсуз'''
-
-Киритлеген администратор бу билдириуню къойгъанды: $1",
+'readonlywarning' => "'''Эсгертиу. Кереклилерин тындырыу ишле себебли, билгилени базасы бусагъатда киритленибди. Ол себебден тюрлениулеригизни бусагъатда сакълаталлыкъ тюлсюз.''' Джазгъанларыгъызны башха бир текст файлда сакълаб, кечирек къошаргъа боллукъсуз. Киритлеген администратор бу билдириуню къойгъанды: $1",
 'protectedpagewarning' => "'''Эсгертиу: бу бет тюрлениуледен джакъланыбды, къуру администарторла тюрлендирелликдиле'''
 Тюбюнде, билги ючюн  журналдагъы ахыр джазыу берилгенди:",
 'semiprotectedpagewarning' => "'''Эсгертиу:''' бу бетни джангыз регистрация этген къошулуучула тюрлендирелликдиле.
@@ -806,6 +830,8 @@ $2',
 'content-failed-to-parse' => '$2 контент $1 типге келишмейди: $3',
 'invalid-content-data' => 'Джаламагъан билгиле',
 'content-not-allowed-here' => '[[$2]] бетни ичинде "$1" контент джарамайды',
+'editwarning-warning' => 'Башха бетге кёчсегиз, этген тюрлениулеригиз тас болургъа боллукъдула.
+Системада регистрацияны ётген эсегиз, бу билдириуню джарашдырыуларыгъызны «Тюрлендириу» деген бёлюмюнде джукълатыргъа боллукъсуз.',
 
 # Content models
 'content-model-wikitext' => 'вики-текст',
@@ -1069,7 +1095,7 @@ $1",
 'search-interwiki-default' => '$1 эсеблери:',
 'search-interwiki-more' => '(дагъыда)',
 'search-relatedarticle' => 'Байламлы',
-'mwsuggest-disable' => 'AJAX юретиулени джукълатыгъыз',
+'mwsuggest-disable' => 'Излеуде юретиулени джукълат',
 'searcheverything-enable' => 'Атланы бютеу аламларында изле',
 'searchrelated' => 'бейламлы',
 'searchall' => 'бютеу',
@@ -1088,15 +1114,7 @@ $1",
 'powersearch-togglenone' => 'Бири да',
 'search-external' => 'Тыш излеу',
 'searchdisabled' => '{{SITENAME}} сайтда излеу талай заманнга тохтатылгъанды. Бусагъатда Google бла хайырланыб {{SITENAME}} ичинде излеу этерге боллукъсуз. Излеу сайтлада индекслери бир кесек эски болургъа боллугъун унутмагъыз.',
-
-# Quickbar
-'qbsettings' => 'Джюрютюуню панели',
-'qbsettings-none' => 'Кёргюзтме',
-'qbsettings-fixedleft' => 'Солу къатды',
-'qbsettings-fixedright' => 'Онгу къатды',
-'qbsettings-floatingleft' => 'Солгъа джюзеди',
-'qbsettings-floatingright' => 'Оннга джюзеди',
-'qbsettings-directionality' => 'Тилигизни джазмасыны онг/сол таба джазылгъанына кёре бегитилибди',
+'search-error' => 'Излеуде халат чыкъды: $1',
 
 # Preferences page
 'preferences' => 'Джарашдырыула',
@@ -1120,7 +1138,7 @@ $1",
 'prefs-watchlist-edits' => 'Кёзде тургъан тизмени кенглешдирилген вариантында кёргюзюллюк тюрлениулени саны:',
 'prefs-watchlist-edits-max' => 'Максимум саны:1000',
 'prefs-watchlist-token' => 'Кёзде тыргъан тизмени токени:',
-'prefs-misc' => 'Башха джарашдыдырыула',
+'prefs-misc' => 'Башха джарашдырыула',
 'prefs-resetpass' => 'Паролну тюрлендир',
 'prefs-changeemail' => 'Электрон почтаны адресин ауушдур',
 'prefs-setemail' => 'Лл. почтаны адресин айырыу',
@@ -1176,9 +1194,9 @@ $1",
 'prefs-emailconfirm-label' => 'Электрон почтаны бегитиу:',
 'prefs-textboxsize' => 'Тюрлендириу терезени ёлчеми',
 'youremail' => 'Электрон почта:',
-'username' => 'Къошулуучу ат:',
-'uid' => 'Къошулуучуну идентификатору:',
-'prefs-memberingroups' => '{{PLURAL:$1|Группаны|Группаланы}} члени:',
+'username' => '{{GENDER:$1|Къошулуучу ат}}:',
+'uid' => '{{GENDER:$1|Къошулуучуну}} коду:',
+'prefs-memberingroups' => '{{PLURAL:$1|Группаны|Группаланы}} {{GENDER:$2|члени}}:',
 'prefs-memberingroups-type' => '$1',
 'prefs-registration' => 'Регистрацияны этилген заманы:',
 'prefs-registration-date-time' => '$1',
@@ -1573,6 +1591,8 @@ URL-адрес тюз болгъанын осмакълагъыз эмда дж
 'upload-http-error' => 'HTTP хата болду: $1',
 
 # File backend
+'backend-fail-backup' => '«$1» файлны резерв копиясын этерге болмайды.',
+'backend-fail-notexists' => '$1 файл джокъду.',
 'backend-fail-delete' => '«$1» файл кетерилмеди.',
 'backend-fail-store' => '$1 файл $2 ичинде сакъланылынмады.',
 'backend-fail-read' => '«$1» файлны окъуялмады.',
@@ -1609,7 +1629,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 +1780,8 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 Аны орнуна ала белгили бир статьягъа джибериу этерге керек болурла.<br />
 [[MediaWiki:Disambiguationspage]] бетде аты салыннган шаблон бар эсе, ол бет кёб магъаналы бетге саналады.",
 
+'pageswithprop-submit' => 'Таб',
+
 'doubleredirects' => 'Джибериу болгъан джибериуле',
 'doubleredirectstext' => 'Бу бетде башхы джибериулеге этилген джибериулени тизмеси барды.
 Хар тизгин биринчи неда экинчи джибериуню эмда асламысында бетни аты джазылгъан, биринчи джибериу кёргюзген, экинчи джибериуню нюзюр бети джазылады.
@@ -1914,6 +1935,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' => 'Тюбюндеги бу викиде танылгъан къошулуучу къауумланы эмда аланы хакъларыны тизмеси.
@@ -2045,7 +2075,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 +2320,7 @@ $1',
 'ipbhidename' => 'Къошулуучуну атын тюрлендириуле бла спиоскладан джашыр',
 'ipbwatchuser' => 'Бу къошулуучуну, къошулуучу эмда сюзюу бетлерин кёзде тургъан тизмеге къош',
 'ipb-change-block' => 'Бу джарашдырыула бла къошулуучуну джангыдан тый',
+'ipb-confirm' => 'Блок салыуну бегит',
 'badipaddress' => 'Терс IP-адрес',
 'blockipsuccesssub' => 'Тыйыу джетишимли болду',
 'blockipsuccesstext' => '[[Special:Contributions/$1|«$1»]] блокланды.<br />
@@ -2705,13 +2736,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' => 'Вектор',
 
@@ -3433,13 +3459,6 @@ MediaWiki хайырлы боллукъду деген умут бла джай
 'version-entrypoints-header-entrypoint' => 'Кириу нохта',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Файлгъа джол',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Кёч',
-'filepath-summary' => 'Бу къуллукъчу бет файл ючюн толу джолну береди.
-Суратла толу резолюциялары бла кёргюзюледиле, башха файл типле алагъа джараулу программала бла ачыладыла.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Дубликат файлланы изле',
 'fileduplicatesearch-summary' => 'Хэш-кодлары бла дубликат файланны изле.',
index 50bfb7e..6795366 100644 (file)
@@ -489,7 +489,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 +514,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 +640,15 @@ 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',
 'yourpasswordagain' => 'Noch ens dat Passwood',
 '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,12 +661,16 @@ Wann De wells, künnts De Ding [[Special:Preferences|Enschtällonge aanpaße]].'
 'logout' => 'Ußlogge',
 'userlogout' => 'Ußlogge',
 'notloggedin' => 'Nit enjelogg',
+'userlogin-noaccount' => 'Do häß noch keine Zohjang?',
+'userlogin-joinproject' => 'Aanmälde zom Metmaache!',
 'nologin' => "Wann De Dich noch nit aanjemeldt häs, dann dun Dich '''$1'''.",
 'nologinlink' => 'neu aanmelde',
 'createaccount' => 'Aanmelde als ene neue Metmaacher',
 'gotaccount' => "Do bes ald aanjemeldt {{GRAMMAR:en|{{SITENAME}}}}? Dann jangk nohm '''$1'''.",
 'gotaccountlink' => 'Enlogge',
 'userlogin-resetlink' => 'Häß De Ding Daate för et Enlogge verjäße?',
+'helplogin-url' => 'Hölp:Övver et Enlogge',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hölp bem Enlogge]]',
 'createaccountmail' => 'Scheck mer en E-Mail met enem neu ußjedachte Passwood op Zick',
 'createaccountreason' => 'Jrond:',
 'badretype' => 'Ding zwëij ennjejovve Paßßwööter sinn nit ejaal. Do muss De Dich för ein entscheide.',
@@ -785,9 +795,9 @@ 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:',
 
 # Special:PasswordReset
@@ -795,6 +805,7 @@ Do häs Der enzwesche e neuZweschepasswood jehollt.',
 '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-emaildisabled' => 'Heh dat Wiki määt nix met <i lang="en">e-mail</i>!',
 'passwordreset-pretext' => '{{PLURAL:$1||Jiff ein vun dä Saache heh dronger enn|}}',
 'passwordreset-username' => 'Metmaacher Name:',
 'passwordreset-domain' => 'Domähn:',
@@ -830,7 +841,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',
@@ -1203,7 +1214,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 +1239,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ß)',
@@ -1361,8 +1372,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.
@@ -1510,7 +1521,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',
@@ -1685,7 +1696,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 +1811,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 +2000,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',
@@ -2105,12 +2116,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 +2225,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 +2276,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 +2335,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.
@@ -2904,7 +2924,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',
@@ -3949,13 +3969,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 +4012,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 +4028,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,18 +4040,11 @@ 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:FileDuplicateSearch
 'fileduplicatesearch' => 'Sök noh dubbelte Dateie',
 'fileduplicatesearch-summary' => 'Söhhk noh dubbelte Dateie övver dänne iere Häsh-Zahl.',
@@ -4068,7 +4081,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.
@@ -4170,7 +4183,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 356b857..e7cdfc6 100644 (file)
@@ -61,8 +61,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Көзөмөлдөп жаткан катышуучулардын санын көрсөтүү',
 'tog-oldsig' => 'Кезектеги кол тамга:',
 'tog-fancysig' => 'Кол тамганын өз уики-белгиси (автоматтык шилтемесиз)',
-'tog-externaleditor' => 'Тышкы редакторду жарыяланбасча колдонуу (адистер үчүн гана, компьютериңизде өзгөчө ырастоолор керек. [//www.mediawiki.org/wiki/Manual:External_editors кошумча маалымат.])',
-'tog-externaldiff' => 'Салыштыруу үчүн тышкы программаны жарыяланбасча колдонуу (адистер үчүн гана, компьютериңизде өзгөчө ырастоолор керек. [//www.mediawiki.org/wiki/Manual:External_editors кошумча маалымат.])',
 'tog-showjumplinks' => '«өтүү» деген жардамчы шилтемелерди күйгүзүү',
 'tog-uselivepreview' => 'Тез алдын ала көрсөтүүнү колдонуу (JavaScript талап кылынат) (эксперименталдык)',
 'tog-forceeditsummary' => 'Оңдоо баяндоосунун талаасы бош болгон кезинде мага алдын ала эскертүү',
@@ -721,14 +719,6 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'powersearch-togglenone' => 'Эчтеке',
 'search-external' => 'Тышкы издөө',
 
-# Quickbar
-'qbsettings' => 'Навигация панели',
-'qbsettings-none' => 'Көрсөтпөө',
-'qbsettings-fixedleft' => 'Жылбаган сол',
-'qbsettings-fixedright' => 'Жылбаган оң',
-'qbsettings-floatingleft' => 'Оома сол',
-'qbsettings-floatingright' => 'Оома оң',
-
 # Preferences page
 'preferences' => 'Ырастоолор',
 'mypreferences' => 'Ырастоолор',
@@ -1099,12 +1089,6 @@ HTML-тегдеринин тууралыгын текшериңиз.',
 'listusers-noresult' => 'Катышуучу табылган жок.',
 'listusers-blocked' => '(блокировкаланды)',
 
-# Special:ActiveUsers
-'activeusers' => 'Активдүү катышуучулардын тизмеси',
-'activeusers-hidebots' => 'Ботторду жашыруу',
-'activeusers-hidesysops' => 'Администраторлорду жашыруу',
-'activeusers-noresult' => 'Катышуучулар табылган жок.',
-
 # Special:ListGroupRights
 'listgrouprights-group' => 'Топ',
 'listgrouprights-rights' => 'Укуктар',
index 2585393..d89e23e 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Amahoney
  * @author Andrew Dalby
+ * @author Autokrator
  * @author Dferg
  * @author Esteban97
  * @author Kaganer
@@ -188,8 +189,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Numerum usorum custodientium monstrare',
 'tog-oldsig' => 'Subscriptio ad tempus adhibita:',
 'tog-fancysig' => 'Subscriptio vicitext (sine nexu automatico)',
-'tog-externaleditor' => '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 +197,7 @@ $messages = array(
 'tog-watchlisthideminor' => 'Celare recensiones minores in paginarum custoditarum indice',
 'tog-watchlisthideliu' => 'Celare recensiones usorum notorum in paginarum custoditarum indice',
 'tog-watchlisthideanons' => 'Celare recensiones usorum ignotorum in paginarum custoditarum indice',
+'tog-watchlisthidepatrolled' => 'Recensiones vigilatae paginas custoditas celare',
 'tog-ccmeonemails' => 'Mitte mihi transcriptiones litterarum quas ad alios usores mitto',
 'tog-diffonly' => 'Noli monstrare contenta paginae infra dissimilitudinem',
 'tog-showhiddencats' => 'Categorias celatas monstrare',
@@ -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',
+'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' => 'recensiones',
+'createacct-benefit-body2' => 'paginae',
 'badretype' => 'Tesserae quas scripsisti inter se non congruunt.',
 'userexists' => 'Nomen usoris quod selegisti iam est.
 Nomen usoris alium selige.',
@@ -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',
@@ -843,6 +862,7 @@ Titulus: '''({{int:cur}})''' = dissimilis ab emendatione novissima,
 'searchprofile-articles-tooltip' => 'Quaerere in $1',
 'searchprofile-project-tooltip' => 'Quaerere in $1',
 'searchprofile-images-tooltip' => 'Fasciculos quaerere',
+'searchprofile-advanced-tooltip' => 'In spatiis nominalibus accommotis quaerere',
 'search-result-size' => '$1 ({{PLURAL:$2|1 verbum|$2 verba}})',
 'search-result-score' => 'Gravitas: $1%',
 'search-redirect' => '(redirectio $1)',
@@ -860,6 +880,7 @@ Titulus: '''({{int:cur}})''' = dissimilis ab emendatione novissima,
 'showingresultsnum' => "Subter monstrans {{PLURAL:$3|'''1''' eventum|'''$3''' eventus}} incipiens ab #'''$2'''.",
 'nonefound' => "'''Adnotatio''': Solum aliquae spatia nominalia quaesita sunt semper.
 Conare praefixare tua inquisitionem cum ''all:'' ut quaeras contenta omnia (paginas, formulas et cetera) vel utere spatio nominali desiderato quasi praefixo.",
+'search-nonefound' => 'Nullae paginae quaesitionem tuam adaequant.',
 'powersearch' => 'Quaerere callidissime',
 'powersearch-legend' => 'Quaerere callidissime',
 'powersearch-ns' => 'Quaerere in spatiis nominalibus:',
@@ -1411,6 +1432,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 +1682,7 @@ Si pagina nova cum ipso nomine post deletionem creata est, emendationes restitut
 'sp-contributions-newbies-title' => 'Conlationes rationum novarum',
 'sp-contributions-blocklog' => 'acta obstructionum',
 'sp-contributions-deleted' => 'conlationes usoris deletae',
+'sp-contributions-uploads' => 'Fasciculi impositi',
 'sp-contributions-logs' => 'acta',
 'sp-contributions-talk' => 'disputatio',
 'sp-contributions-userrights' => 'usorum potestates',
@@ -1949,6 +1978,7 @@ Paginae nomen petitum "[[:$1]]" iam existit. Vin tu eam delere ut pagina illic m
 'tooltip-upload' => 'Incipere imponere',
 'tooltip-rollback' => '"Revertere" omnes ultimi editoris in hac pagina recensiones statim revertit',
 'tooltip-undo' => '"Abrogare" fenestram recensionis aperit (hac recensione reversa). Summarium addere licet.',
+'tooltip-summary' => 'Summarium breve addere',
 
 # Attribution
 'anonymous' => '{{PLURAL:$1|Usor ignotus|Usores ignoti}} {{grammar:genitive|{{SITENAME}}}}',
@@ -2323,11 +2353,6 @@ Quaesumus, adfirma ut iterum hanc paginam crees.",
 'version-software-product' => 'Productum',
 'version-software-version' => 'Versio',
 
-# Special:FilePath
-'filepath' => 'Fasciculorum inscriptio',
-'filepath-page' => 'Fasciculus:',
-'filepath-submit' => 'Ire',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-legend' => 'Duplicatum quaerere',
 'fileduplicatesearch-filename' => 'Fasciculi nomen:',
index e84ecab..06ee292 100644 (file)
@@ -211,8 +211,6 @@ $messages = array(
 'tog-shownumberswatching' => "D'Zuel vun de Benotzer déi dës Säit iwwerwaache weisen",
 'tog-oldsig' => 'Aktuell Ënnerschrëft:',
 'tog-fancysig' => 'Ënnerschrëft als Wiki-Text behandelen (Ouni automatesche Link)',
-'tog-externaleditor' => 'Externen Editeur als Standard benotzen (Nëmme fir Experten, et musse speziell Astellungen op ärem Computer gemaach ginn. [//www.mediawiki.org/wiki/Manual:External_editors Méi Informatiounen.])',
-'tog-externaldiff' => 'En Externen Diff-Programm als Standard benotzen (nëmme fir Experten, et musse speziell Astellungen op ärem Computer gemaach ginn. [//www.mediawiki.org/wiki/Manual:External_editors Méi Informatiounen])',
 'tog-showjumplinks' => 'Aktivéiere vun de "Sprang op"-Linken',
 'tog-uselivepreview' => 'Live-Preview benotzen (JavaScript) (experimentell)',
 'tog-forceeditsummary' => 'Warnen, wa beim Späicheren de Resumé feelt',
@@ -227,6 +225,7 @@ $messages = array(
 'tog-showhiddencats' => 'Verstoppt Kategorië weisen',
 'tog-noconvertlink' => 'Ëmwandlung vum Titel desaktivéieren',
 'tog-norollbackdiff' => 'Ënnerscheed nom Zrécksetzen ënnerdrécken',
+'tog-useeditwarning' => "Mech warne wann ech d'Ännerung vun enger Säit verloosen, ouni Ännerunge gespäichert ze hunn",
 
 'underline-always' => 'Ëmmer',
 'underline-never' => 'Ni',
@@ -372,7 +371,7 @@ $messages = array(
 'delete' => 'Läschen',
 'deletethispage' => 'Dës Säit läschen',
 'undelete_short' => '$1 {{PLURAL:$1|Versioun|Versioune}} restauréieren',
-'viewdeleted_short' => '{{PLURAL:$1|Eng geläschte Versioun|$1 geläschte Versioune}} weisen',
+'viewdeleted_short' => '{{PLURAL:$1|Eng geläschte Versioun|$1 geläscht Versioune}} weisen',
 'protect' => 'Spären',
 'protect_change' => 'änneren',
 'protectthispage' => 'Dës Säit schützen',
@@ -497,7 +496,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',
@@ -598,9 +597,20 @@ 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',
+'createacct-helpusername-url' => '{{ns:Project}}:Benotzernumm Richtlinnen',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(hëlleft mir beim Eraussichen)]]',
 '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' => 'Mat engem séchere Server umellen',
 '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 +623,39 @@ Vergiesst net fir Är [[Special:Preferences|{{SITENAME}} Astellungen]] z'ännere
 'logout' => 'Ofmellen',
 'userlogout' => 'Ausloggen',
 'notloggedin' => 'Net ageloggt',
+'userlogin-noaccount' => 'Hutt Dir kee Benotzerkont?',
+'userlogin-joinproject' => 'Maacht mat bäi {{SITENAME}}',
 'nologin' => "Hutt Dir kee Benotzerkont? '''$1'''.",
 'nologinlink' => 'Neie Benotzerkont maachen',
 'createaccount' => 'Neie Kont opmaachen',
 'gotaccount' => "Dir hutt schonn e Benotzerkont? '''$1'''.",
 'gotaccountlink' => 'Umellen',
 'userlogin-resetlink' => "Hutt Dir d'Detailer vun Ärem Login vergiess?",
+'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-captcha-help-url' => '{{ns:Project}}:E Benotzerkont ufroen',
+'createacct-imgcaptcha-help' => "Dir kënnt D'bild net gesinn? [[{{MediaWiki:createacct-captcha-help-url}}|Frot e Benotzerkont]]",
+'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' => 'Ännerungen',
+'createacct-benefit-body2' => 'Säiten',
+'createacct-benefit-body3' => 'rezent 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.
@@ -715,12 +746,14 @@ 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-legend' => 'Passwuert zrécksetzen',
 'passwordreset-disabled' => "D'Zerécksetze vum Passwuert ass op dëser Wiki ausgeschalt.",
+'passwordreset-emaildisabled' => "D'E-Mail-Fonctioune goufen op dëser Wiki ausgeschalt.",
 'passwordreset-pretext' => '{{PLURAL:$1||Gitt eng vun dësen Donnéeën an}}',
 'passwordreset-username' => 'Benotzernumm:',
 'passwordreset-domain' => 'Domaine:',
@@ -732,13 +765,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',
@@ -953,6 +994,8 @@ Si gouf anscheinend geläscht.",
 'defaultmessagetext' => 'Standardtext',
 '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 "{{int:prefs-editing}}" vun Ären Astellungen ausschalten.',
 
 # Content models
 'content-model-wikitext' => 'Wikitext',
@@ -1092,10 +1135,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 +1205,7 @@ Denkt w.e.g drunn datt d'Navigatiounslinken d'Wiel vun de Versiounen nees zréck
 'difference-multipage' => '(Ënnerscheed tëschent Säiten)',
 'lineno' => 'Linn $1:',
 'compareselectedversions' => 'Ausgewielte Versioune vergläichen',
-'showhideselectedversions' => 'Erausgesichte Versioune weisen/verstoppen',
+'showhideselectedversions' => 'Erausgesicht Versioune weisen/verstoppen',
 'editundo' => 'zréck',
 'diff-multi' => '({{PLURAL:$1|Eng Tëscheversioun|$1 Tëscheversioune}} vun {{PLURAL:$2|engem|$2}} Benotzer {{PLURAL:$1|gëtt|ginn}} net gewisen)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Eng Tëscheversioun|$1 Tëscheversioune}} vu méi wéi $2 {{PLURAL:$2|Benotzer|Benotzer}} ginn net gewisen)',
@@ -1232,15 +1275,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 +1418,7 @@ Si muss manner wéi $1 {{PLURAL:$1|Zeechen|Zeechen}} hunn.',
 'userrights-notallowed' => "Äre Benotzerkont hutt net déi néideg Rechter fir d'Rechter vun anere Benotzer z'änneren.",
 'userrights-changeable-col' => 'Gruppen déi Dir ännere kënnt',
 'userrights-unchangeable-col' => 'Gruppen déi Dir net ännere kënnt',
+'userrights-conflict' => 'Konflikt bäi de Benotzerrechter! Maacht Är Ännerunge w.e.g. nach eng Kéier.',
 
 # Groups
 'group' => 'Grupp:',
@@ -1433,10 +1469,11 @@ Si muss manner wéi $1 {{PLURAL:$1|Zeechen|Zeechen}} hunn.',
 'right-writeapi' => "API benotze fir d'Wiki z'änneren",
 'right-delete' => 'Säite läschen',
 'right-bigdelete' => 'Säite mat engem groussen Historique läschen',
+'right-deletelogentry' => 'Eenzel Androungen an de Logbicher läschen a restauréieren',
 'right-deleterevision' => 'Spezifesch Versioune vu Säite läschen a restauréieren',
-'right-deletedhistory' => 'Weis geläschte Versiounen am Historique, ouni den assoziéierten Text',
+'right-deletedhistory' => 'Weis geläscht Versiounen am Historique, ouni den associéierten Text',
 'right-deletedtext' => "Geläschten Text an d'Ännerungen tëschent de geläschte Versioune weisen",
-'right-browsearchive' => 'Geläschte Säite sichen',
+'right-browsearchive' => 'Geläscht Säite sichen',
 'right-undelete' => 'Eng Säit restauréieren',
 'right-suppressrevision' => 'Virun den Administrateure verstoppte Versiounen nokucken a restauréieren',
 'right-suppressionlog' => 'Privat Lëschte kucken',
@@ -1495,7 +1532,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',
@@ -1931,6 +1968,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 +2013,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 +2047,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 +2113,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 +2134,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.
@@ -2197,6 +2244,7 @@ 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_lastvisited' => 'All Ännerungen op ee Bléck: $1',
 'enotif_lastdiff' => 'Kuckt $1 fir dës Ännerung.',
 'enotif_anon_editor' => 'Anonyme Benotzer $1',
@@ -2359,10 +2407,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 +2438,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 +2478,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',
@@ -2817,6 +2865,7 @@ Späichert en op Ärem Computer of a luet en hei nees erop.',
 'javascripttest-pagetext-unknownframework' => 'Onbekannten Test-Framework "$1".',
 'javascripttest-pagetext-frameworks' => 'Sicht w.e.g. eng vun dësen Test-Strukturen eraus: $1',
 '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',
@@ -3047,11 +3096,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:
 
@@ -3238,6 +3301,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,6 +3312,7 @@ 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',
@@ -3649,12 +3714,14 @@ 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.',
+'redirect-legend' => 'Viruleedung op ee Fichier oder eng Säit',
+'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 +3812,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",
@@ -3778,6 +3848,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..4581026 100644 (file)
@@ -25,29 +25,29 @@ $fallback = 'ru';
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'ЭлячIунрин кIаникай цIар чIугун',
+'tog-underline' => 'ЭлячӀунрин кӀаникай цӀар чӀугун',
 'tog-justify' => 'Ччинин гьяркьуьвилихъ текст дуьзрун',
-'tog-hideminor' => 'Мукьвара хьайи дегишвилера авай гъвечIи дуьзар хъувунар чуьнуьхун',
+'tog-hideminor' => 'Мукьвара хьайи дегишвилера авай гъвечӀи дуьзар хъувунар чуьнуьхун',
 'tog-hidepatrolled' => 'Мукьвара хьайи дегишвилера авай къаравулвал авунвай дуьзар хъувунар чуьнуьхун',
-'tog-newpageshidepatrolled' => 'ЦIийи ччинрин сиягьда къаравулвал авунвай ччинар чуьнуьхун',
+'tog-newpageshidepatrolled' => 'ЦӀийи ччинрин сиягьда къаравулвал авунвай ччинар чуьнуьхун',
 'tog-extendwatchlist' => 'ЧӀехи сиягь килигунин, кутазвай вири дегишунар, амма са эхирбур туш',
-'tog-usenewrc' => 'Мукьвара хьайи масакIавилерин ччина ва вилив хуьнин сиягьда  дуьзар хъувунар кIеретIриз ччара авун. (JavaScript герекзава)',
+'tog-usenewrc' => 'Мукьвара хьайи масакӀавилерин ччина ва вилив хуьнин сиягьда дуьзар хъувунар кӀеретӀриз ччара авун. (JavaScript герекзава)',
 'tog-numberheadings' => 'Кьилин цӀарариз автоматдаказ номерар эцигун',
 'tog-showtoolbar' => 'Дуьзар хъувунин алатрин кьвати къалура (JavaScript)',
-'tog-editondblclick' => 'Ччинар кьве тIампIуналди дуьзар хъувун (JavaScript герекзава)',
-'tog-editsection' => 'Пай [дуьзар хъувун] патал элячIун къалура',
-'tog-editsectiononrightclick' => 'Пайдин кьилинцIардиз эрчIи патан тIампI авуна пайдин дуьзар хъувуниз мумкинвал гун (JavaScript герекзава)',
+'tog-editondblclick' => 'Ччинар кьве тӀампӀуналди дуьзар хъувун (JavaScript герекзава)',
+'tog-editsection' => 'Пай [дуьзар хъувун] патал элячӀун къалура',
+'tog-editsectiononrightclick' => 'Пайдин кьилинцӀардиз эрчӀи патан тӀампӀ авуна пайдин дуьзар хъувуниз мумкинвал гун (JavaScript герекзава)',
 'tog-showtoc' => 'Къенеавайбурун сиягь къалурун (3-й гзаф кьилинцӀарар авай ччинар патал)',
-'tog-rememberpassword' => 'И браузерда зи логин рикlел хуьхь (лап гзаф $1 {{PLURAL:$1|югъ|йикъар}})',
-'tog-watchcreations' => 'За туькIуьрнавай ччинар зи гуьзетунин сиягьдиз алава авун',
+'tog-rememberpassword' => 'И браузерда зи логин рикӀел хуьхь (лап гзаф $1 {{PLURAL:$1|югъ|йикъар}})',
+'tog-watchcreations' => 'За туькӀуьрнавай ччинар зи гуьзетунин сиягьдиз алава авун',
 'tog-watchdefault' => 'За дуьзар хъувунвай ччинар зи гуьзетунин сиягьдиз алава авун',
-'tog-watchmoves' => 'За тIвар эхцигай ччинар зи гуьзетунин сиягьдиз алава авун',
+'tog-watchmoves' => 'За тӀвар эхцигай ччинар зи гуьзетунин сиягьдиз алава авун',
 'tog-watchdeletion' => 'За алуднавай ччинар зи гуьзетунин сиягьдиз алава авун',
-'tog-minordefault' => 'Авайвилелди, вири дуьзар хъувунар гъвечIи дуьзар хъувунар хьиз лишан авун',
-'tog-previewontop' => 'Сифтедин килигун дуьзар хъувундин дакIардин вилик эцига',
-'tog-previewonfirst' => 'Дуьзар хъувундиз эгечIайла сифтедин килигун къалурун',
-'tog-enotifwatchlistpages' => 'Зи гуьзетунин ччин масакIа хьайила заз эмейл ракъура.',
-'tog-enotifusertalkpages' => 'КЬилди жуван веревирдрин ччина хьанвай дегишвилерикай э-почтадиз чар ракъурун.',
+'tog-minordefault' => 'Авайвилелди, вири дуьзар хъувунар гъвечӀи дуьзар хъувунар хьиз лишан авун',
+'tog-previewontop' => 'Сифтедин килигун дуьзар хъувундин дакӀардин вилик эцига',
+'tog-previewonfirst' => 'Дуьзар хъувундиз эгечӀайла сифтедин килигун къалурун',
+'tog-enotifwatchlistpages' => 'Зи гуьзетунин ччин масакӀа хьайила заз эмейл ракъура.',
+'tog-enotifusertalkpages' => 'Кьилди жуван веревирдрин ччина хьанвай дегишвилерикай э-почтадиз чар ракъурун.',
 'tog-oldsig' => 'Алай къул:',
 'tog-showhiddencats' => 'Чуьнуьхай категорияр къалурун',
 
@@ -59,8 +59,8 @@ $messages = array(
 'editfont-style' => 'Дуьзар хъувунин чкадин шрифтдин жуьре',
 'editfont-default' => 'Браузердин низамарунрикай шрифт',
 'editfont-monospace' => 'Моногьяркьуьвилер авай шрифт',
-'editfont-sansserif' => 'КЬацI авачир шрифт',
-'editfont-serif' => 'КьацI авай кхьин',
+'editfont-sansserif' => 'КьацӀ авачир шрифт',
+'editfont-serif' => 'КьацӀ авай кхьин',
 
 # Dates
 'sunday' => 'Гьяд',
@@ -77,65 +77,65 @@ $messages = array(
 'thu' => 'Xем',
 'fri' => 'Жум',
 'sat' => 'Киш',
-'january' => 'гьер (январь)',
-'february' => 'Ñ\8dÑ\85ен (Ñ\84евÑ\80алÑ\8c)',
-'march' => 'ибне (маÑ\80Ñ\82)',
-'april' => 'нава (апÑ\80елÑ\8c)',
-'may_long' => 'тӀул (май)',
-'june' => 'кÑ\8cамÑ\83г (иÑ\8eнÑ\8c)',
-'july' => 'чиле (июль)',
-'august' => 'паÑ\85Ñ\83н (авгÑ\83Ñ\81Ñ\82)',
-'september' => 'мара (сентябрь)',
-'october' => 'баÑ\81кÓ\80Ñ\83м (окÑ\82Ñ\8fбÑ\80Ñ\8c)',
-'november' => 'цӀехуьл (ноябрь)',
-'december' => 'фундукӀ (декабрь)',
-'january-gen' => 'гьер (январдиз)',
-'february-gen' => 'Ñ\8dÑ\85ен (Ñ\84евÑ\80алдиз)',
-'march-gen' => 'ибне (маÑ\80Ñ\82диз)',
-'april-gen' => 'нава (апÑ\80елдиз)',
-'may-gen' => 'тӀул (майдиз)',
-'june-gen' => 'кÑ\8cамÑ\83г (иÑ\8eндиз)',
-'july-gen' => 'чиле (июлдиз)',
-'august-gen' => 'паÑ\85Ñ\83н (авгÑ\83Ñ\81Ñ\82диз)',
-'september-gen' => 'мара (сентябрдиз)',
-'october-gen' => 'баÑ\81кÓ\80Ñ\83м (окÑ\82Ñ\8fбÑ\80диз)',
-'november-gen' => 'цӀехуьл (ноябрдиз)',
-'december-gen' => 'фундукӀ (декабрдиз)',
-'jan' => 'гьер (январь)',
-'feb' => 'Ñ\8dÑ\85ен (Ñ\84евÑ\80алÑ\8c)',
-'mar' => 'ибне (маÑ\80Ñ\82)',
-'apr' => 'нава (апÑ\80елÑ\8c)',
-'may' => 'тӀул (май)',
-'jun' => 'кÑ\8cамÑ\83г (иÑ\8eнÑ\8c)',
-'jul' => 'чиле (июль)',
-'aug' => 'паÑ\85Ñ\83н (авгÑ\83Ñ\81Ñ\82)',
-'sep' => 'мара (сентябрь)',
-'oct' => 'баÑ\81кÓ\80Ñ\83м (окÑ\82Ñ\8fбÑ\80Ñ\8c)',
-'nov' => 'цӀехуьл (ноябрь)',
-'dec' => 'фандукl (декабрь)',
+'january' => 'январь',
+'february' => 'Ñ\84евÑ\80алÑ\8c',
+'march' => 'маÑ\80Ñ\82',
+'april' => 'апÑ\80елÑ\8c',
+'may_long' => 'май',
+'june' => 'иÑ\8eнÑ\8c',
+'july' => 'июль',
+'august' => 'авгÑ\83Ñ\81Ñ\82',
+'september' => 'сентябрь',
+'october' => 'окÑ\82Ñ\8fбÑ\80Ñ\8c',
+'november' => 'ноябрь',
+'december' => 'декабрь',
+'january-gen' => 'январь',
+'february-gen' => 'Ñ\84евÑ\80алÑ\8c',
+'march-gen' => 'маÑ\80Ñ\82',
+'april-gen' => 'апÑ\80елÑ\8c',
+'may-gen' => 'май',
+'june-gen' => 'иÑ\8eнÑ\8c',
+'july-gen' => 'июль',
+'august-gen' => 'авгÑ\83Ñ\81Ñ\82',
+'september-gen' => 'сентябрь',
+'october-gen' => 'окÑ\82Ñ\8fбÑ\80Ñ\8c',
+'november-gen' => 'ноябрь',
+'december-gen' => 'декабрь',
+'jan' => 'янв',
+'feb' => 'Ñ\84ев',
+'mar' => 'маÑ\80',
+'apr' => 'апÑ\80',
+'may' => 'май',
+'jun' => 'иÑ\8eн',
+'jul' => 'июл',
+'aug' => 'авг',
+'sep' => 'сен',
+'oct' => 'окÑ\82',
+'nov' => 'ноя',
+'dec' => 'дек',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|Категория|Категории}}',
+'pagecategories' => '{{PLURAL:$1|Категория|Категорияр}}',
 'category_header' => '"$1" категориядин ччинар',
 'subcategories' => 'агъакатегорияр',
-'category-media-header' => '"$1" категоридин медиа',
-'category-empty' => "''Алай чIава и категория ичIи я.\"",
-'hidden-categories' => '{{PLURAL:$1|Чуьнуьхай категория |Чуьнуьхай категорияр }}',
+'category-media-header' => '"$1" категориядин медиа',
+'category-empty' => "''Алай чӀава и категория ичӀи я.\"",
+'hidden-categories' => '{{PLURAL:$1|Чуьнуьхай категория|Чуьнуьхай категорияр}}',
 'hidden-category-category' => 'Чуьнуьхай категорияр',
-'category-subcat-count' => '{{PLURAL:$2|Ð\98 ÐºÐ°Ñ\82егоÑ\80иÑ\8fда Ð°Ð½Ð¶Ð°Ñ\85 Ð³Ñ\83Ñ\8cгÑ\8aÑ\83Ñ\8cна Ð°Ð²Ð°Ð¹ Ð¿Ð¾Ð´ÐºÐ°Ñ\82егоÑ\80иÑ\8f Ð°Ð²Ð°.|$2-кай {{PLURAL:$1|подкаÑ\82егоÑ\80иÑ\8f|$1 Ð¿Ð¾Ð´ÐºÐ°Ñ\82егоÑ\80иÑ\8f}} къалурнава }}',
-'category-subcat-count-limited' => 'И категорияда {{PLURAL:$1|$1 агъакатегория|$1 агъакатегорияр|$1 подкатегорий}} ава.',
+'category-subcat-count' => '{{PLURAL:$2|Ð\98 ÐºÐ°Ñ\82егоÑ\80иÑ\8fда Ð°Ð½Ð¶Ð°Ñ\85 Ð³Ñ\83Ñ\8cгÑ\8aÑ\83Ñ\8cна Ð°Ð²Ð°Ð¹ Ð¿Ð¾Ð´ÐºÐ°Ñ\82егоÑ\80иÑ\8f Ð°Ð²Ð°.|$2-кай {{PLURAL:$1|агÑ\8aакаÑ\82егоÑ\80иÑ\8f|$1 Ð°Ð³Ñ\8aакаÑ\82егоÑ\80иÑ\8fÑ\80}} къалурнава }}',
+'category-subcat-count-limited' => 'И категорияда {{PLURAL:$1|агъакатегория|$1 агъакатегорияр}} ава.',
 'category-article-count' => '{{PLURAL:$2|И категорияда анжах гуьгъуьна авайди ччин ава |$2-кай къалурнавай {{PLURAL:$1|ччин|$1 ччин}} гьа а категориядин ччин я}}',
-'category-article-count-limited' => 'И категорияда {{PLURAL:$1|$1 ччин}} ава.',
+'category-article-count-limited' => 'И категорияда {{PLURAL:$1|ччин|$1 ччин}} ава.',
 'category-file-count' => '{{PLURAL:$2|И категорияда анжах гуьгъуьна авайди файл ава |$2-кай къалурнавай {{PLURAL:$1|файл|$1 файлар}} гьа а категориядин файл я}}',
-'category-file-count-limited' => 'И категорияда {{PLURAL:$1|$1 файл}} ава.',
-'listingcontinuesabbrev' => '(кьатI)',
+'category-file-count-limited' => 'И категорияда {{PLURAL:$1|файл|$1 файлар}} ава.',
+'listingcontinuesabbrev' => '(кьатӀ)',
 'index-category' => 'Индексавунвай ччинар',
 'noindex-category' => 'Индекстежезвай ччин',
-'broken-file-category' => 'ЧIуру файлдин элячIунар авай ччинар',
+'broken-file-category' => 'ЧӀуру файлдин элячӀунар авай ччинар',
 
 'about' => 'Гьакъиндай',
 'article' => 'Макъала',
-'newwindow' => '(цlийи дакlарда ахъа жезва)',
+'newwindow' => '(цӀийи дакӀарда ахъа жезва)',
 'cancel' => 'Гьич авун',
 'moredotdotdot' => 'Мад...',
 'mypage' => 'Зин чар',
@@ -150,61 +150,61 @@ $messages = array(
 'qbedit' => 'Дегишарун',
 'qbpageoptions' => 'Ччинин низамарунар',
 'qbmyoptions' => 'Зи ччинар',
-'qbspecialpages' => 'Кьетlен хъувун',
+'qbspecialpages' => 'КьетӀен хъувун',
 'faq' => 'Фад-фад гузвай жузунар (ФГЖ)',
 'faqpage' => 'Project:ФГС',
 
 # Vector skin
 'vector-action-addsection' => 'Тема алава авун',
 'vector-action-delete' => 'Алудун',
-'vector-action-move' => 'ТIвар эхцигун',
+'vector-action-move' => 'ТӀвар эхцигун',
 'vector-action-protect' => 'Хуьн',
-'vector-action-undelete' => 'ТуькIуьр хъувун',
+'vector-action-undelete' => 'ТуькӀуьр хъувун',
 'vector-action-unprotect' => 'Хуьн дегишарун',
-'vector-simplesearch-preference' => 'Гегьенш жагъурунин рикIел гъун кутун (кьилди "Вектор" акунар патал)',
-'vector-view-create' => 'Туькlуьрун',
+'vector-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,22 +217,22 @@ $messages = array(
 'viewhelppage' => 'Куьмекдин ччиниз килигун',
 'categorypage' => 'Категориядин ччиниз килигун',
 'viewtalkpage' => 'Веревирдриз килигун',
-'otherlanguages' => 'Маса чIаларал',
+'otherlanguages' => 'Маса чӀаларал',
 'redirectedfrom' => '($1-кай рахкъурнава )',
 'redirectpagesub' => 'Рахкъурунин ччин',
-'lastmodifiedat' => 'Ччинин эхиримжи масакIа хьун:  $1,  $2',
+'lastmodifiedat' => 'Ччинин эхиримжи масакӀа хьун:  $1,  $2',
 'protectedpage' => 'Хвенвай ччин',
-'jumpto' => 'ЭлячIун иниз:',
-'jumptonavigation' => 'Навигаци',
+'jumpto' => 'ЭлячӀун иниз:',
+'jumptonavigation' => 'Навигация',
 'jumptosearch' => 'Жугъурун',
-'pool-queuefull' => 'ТIалабар кIватзавайди ацIа я',
-'pool-errorunknown' => 'Малумтушир гъалатI',
+'pool-queuefull' => 'ТӀалабар кӀватзавайди ацӀа я',
+'pool-errorunknown' => 'Малумтушир гъалатӀ',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => ' {{SITENAME}}кай',
 'aboutpage' => 'Project:Гьакъиндай',
-'copyright' => 'КЪене авайбур $1 жугъуриз жеда.',
-'copyrightpage' => '{{ns:project}}: Автордин ихтияр',
+'copyright' => 'Къене авайбур $1 жугъуриз жеда.',
+'copyrightpage' => '{{ns:project}}:Автордин ихтияр',
 'currentevents' => 'Алай вакъиаяр',
 'currentevents-url' => 'Project:Алай вакъиаяр',
 'disclaimers' => 'Жавабдарвал хивяй акъудун',
@@ -243,19 +243,19 @@ $messages = array(
 'mainpage' => 'Кьилин ччин',
 'mainpage-description' => 'Кьилин ччин',
 'policy-url' => 'Project:Къайдаяр',
-'portal' => 'КIапIалдин портал',
-'portal-url' => 'Project:КIапIалдин портал',
+'portal' => 'КӀапӀалдин портал',
+'portal-url' => 'Project:КӀапӀалдин портал',
 'privacy' => 'Чинебанвилин сиясат',
 'privacypage' => 'Project:Чинебанвилин политика',
 
-'badaccess' => 'ГЬатунин гъалатlдин',
+'badaccess' => 'Гьатунин гъалатӀдин',
 
 'ok' => 'ОК',
 'retrievedfrom' => 'Чешне "$1" я',
-'youhavenewmessages' => 'Квез  $1 ($2) атанва.',
-'newmessageslink' => 'цlийи чарар',
-'newmessagesdifflink' => 'Эхиримжи масакIавилер',
-'youhavenewmessagesmulti' => '"$1"-да квез цIийи чарар атанва.',
+'youhavenewmessages' => 'Квез $1 ($2) атанва.',
+'newmessageslink' => 'цӀийи чарар',
+'newmessagesdifflink' => 'Эхиримжи масакӀавилер',
+'youhavenewmessagesmulti' => '"$1"-да квез цӀийи чарар атанва.',
 'editsection' => 'Дуьзар хъувун',
 'editold' => 'Дуьзар хъувун',
 'viewsourceold' => 'сифте кьилин коддиз килига',
@@ -267,19 +267,19 @@ $messages = array(
 'hidetoc' => 'чуьнуьхун',
 'collapsible-collapse' => 'Алчудрун',
 'collapsible-expand' => 'Гегьеншрун',
-'thisisdeleted' => '$1 килигун ва я туькIуьр хъувун?',
+'thisisdeleted' => '$1 килигун ва я туькӀуьр хъувун?',
 'viewdeleted' => '$1 килигун?',
 'feedlinks' => 'Хулан жуьре',
 'site-rss-feed' => '$1 — RSS-зул',
-'site-atom-feed' => '$1 -  атом-зул',
-'page-rss-feed' => '"$1" РСС Xуьрек',
+'site-atom-feed' => '$1 - атом-зул',
+'page-rss-feed' => '"$1" RSS Xуьрек',
 'page-atom-feed' => '"$1" Атом-зул',
 'red-link-title' => '$1 (ихьтин ччин авайди туш)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Ччин',
 'nstab-user' => 'Уртахдин ччин',
-'nstab-media' => 'Медия ччин',
+'nstab-media' => 'Медиа ччин',
 'nstab-special' => 'Квимекдин ччин',
 'nstab-project' => 'Проектдин ччин',
 'nstab-image' => 'Файл',
@@ -293,8 +293,8 @@ $messages = array(
 'nosuchspecialpage' => 'Ихьтин куьмекчи ччин авайд ттуш',
 
 # General errors
-'error' => 'Гъалатl',
-'databaseerror' => 'Ганайбурун базадин гъалатI',
+'error' => 'ГъалатӀ',
+'databaseerror' => 'Ганайбурун базадин гъалатӀ',
 'missing-article' => 'Малуматрин базада, квез герек авай "$1" $2 тӀвар алай ччиндин текст жагъанвач
 
 Ихьтин гьал адет яз алуднавай ччинин масакӀавилерин тарихдиз цӀуру рекьяй элячӀайла арадал къвезва.
@@ -302,14 +302,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 +319,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 +422,7 @@ $messages = array(
 Квевай [[Special:Search/{{PAGENAME}}| и тlвар алай ччин]] муькуь ччинра жугъуриз,
 <span class="plainlinks"> [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} журналрин талукь тир кхьей затIар жугъуриз],
 ва я [{{fullurl:{{FULLPAGENAME}}|action=edit}} и тlвар алай ччин туькIуьриз жеда] </span>.',
-'noarticletext-nopermission' => 'Исятда и  ччина са текстни авач.
+'noarticletext-nopermission' => 'Исятда и ччина са текстни авач.
 Квевай [[Special:Search/{{PAGENAME}}| и тӀвар алай ччин]] муькуь ччинра жугъуриз ва я
 <span class="plainlinks"> [{{fullurl: {{# Special:Log}} | page = {{FULLPAGENAMEE}}}} журналрин талукь тир кхьей затӀар жугъуриз] жеда.',
 'blocked-notice-logextract' => 'И уртах алайчIава блокарнава.
@@ -525,7 +525,7 @@ $messages = array(
 'revertmerge' => 'Ччара авун',
 
 # Diffs
-'history-title' => '$1  -  масакӀавилерин тарих',
+'history-title' => '$1 - масакӀавилерин тарих',
 'lineno' => 'ЦIар $1:',
 'compareselectedversions' => 'Хкягъай жуьреяр гекъигун',
 'editundo' => 'гьич авун',
@@ -585,14 +585,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 +930,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 +1017,7 @@ $messages = array(
 # Contributions
 'contributions' => 'Уртахди кутур крар',
 'contributions-title' => '$1 уртахди кутур крар',
-'mycontris' => 'Ð\97а Ðºутур кар',
+'mycontris' => 'Ð\9aутур кар',
 'contribsub2' => '($1)-ин кутур пай  ($2)',
 'uctop' => '(вини кьил)',
 'month' => ' Вацралай (ва адалай вилик)',
@@ -1182,7 +1174,7 @@ $messages = array(
 'tooltip-diff' => 'Сифте кьилин текстдиз талукь тир куьне авунвай масакIавилер къалурун',
 'tooltip-compareselectedversions' => 'И ччинин кьве хкягъай жуьрейрин арада авай тафаватдиз килигун',
 'tooltip-watch' => 'И ччин куь вилив хуьнин сиягьдиз алава авун',
-'tooltip-rollback' => '« КЬулухъди чIугун »  и ччиндиз эхиримжи кар кутазвайди патай  авунвай дуьзар хъувунар са т!ампуналди  paxкурзава',
+'tooltip-rollback' => '«Кьулухъди чӀугун» и ччиндиз эхиримжи кар кутазвайди патай авунвай дуьзар хъувунар са тӀампуналди paxкурзава',
 'tooltip-undo' => '«Гьич авун»  авунвай дуьзар хъувун paxкурзава ва сифтедин килигунин режимда  дуьзар хъувундин форма ахъа йийзва. Им нетижадиз себеб алава йийз мумкинвал гузва',
 'tooltip-summary' => 'Куьруь нетижа гьадрун',
 
index d7d50bb..bbee13e 100644 (file)
@@ -187,8 +187,6 @@ $messages = array(
 'tog-shownumberswatching' => "'t Aantal gebroekers tuine die dees pagina volg",
 'tog-oldsig' => 'Bestaonde ongerteikening:',
 'tog-fancysig' => 'Es wikiteks behanjele (zonder autematische verwiezing)',
-'tog-externaleditor' => "Sjtanderd 'ne externe teksbewirker gebroeke (inkel veur experts, speciaal instellinge zien nudig. [//www.mediawiki.org/wiki/Manual:External_editors Mie infermasie])",
-'tog-externaldiff' => "Sjtanderd 'n extern vergeliekingsprogramma gebroeke (inkel veur experts, speciaal instellinge zien nudig [//www.mediawiki.org/wiki/Manual:External_editors Mie infermasie])",
 'tog-showjumplinks' => '"gank nao"-toegankelikheidslinks mäögelik make',
 'tog-uselivepreview' => '"live veurbesjouwing" gebroeke (vereis JavaScript - experimenteel)',
 'tog-forceeditsummary' => "'n Melding gaeve bie 'n laeg samevatting",
@@ -202,6 +200,7 @@ $messages = array(
 'tog-diffonly' => 'Pagina-inhaud zónger verangeringe neet tuine',
 'tog-showhiddencats' => 'Verbórge categorië tuine',
 'tog-norollbackdiff' => 'Wieziginge eweglaote nao trökdrieje',
+'tog-useeditwarning' => "Waorssjoew mich es ich 'n bewerkdje pagina die nag neet is opgeslage wil verlaote",
 
 'underline-always' => 'Altied',
 'underline-never' => 'Noets',
@@ -892,6 +891,8 @@ Ze lik eweggesjaf te zien.',
 'edit-already-exists' => 'De pagina is neet aangemaak.
 Zie besjteit al.',
 'defaultmessagetext' => 'Obligaten teks',
+'editwarning-warning' => "Es se dees pagina verleets verluus se meugelik wieziginge die se haes gemaak.
+Es se bös aangemeld, kins se dees waorsjoewing oetzètten in 't bewerkingstabblaad in dien veurkäöre.",
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Waarschuwing:''' dees pagina gebroek te väöl kosbare parserfuncties.
@@ -1167,15 +1168,6 @@ Doe kans ouch 'n naamruumde es veurvoegsel gebroeke.",
 Zoelang as de servers nog neet sjterk genog zunt kins e zeuke bie Google.
 Mèrk op dat hun indexe van {{SITENAME}} content e bietje gedatierd kint zien.',
 
-# Quickbar
-'qbsettings' => 'Menubalkinsjtèllinge',
-'qbsettings-none' => 'Oetgesjakeld',
-'qbsettings-fixedleft' => 'Links vas',
-'qbsettings-fixedright' => 'Rechts vas',
-'qbsettings-floatingleft' => 'Links zjwevend',
-'qbsettings-floatingright' => 'Rechs zjwevend',
-'qbsettings-directionality' => 'Vas, aafhenkelik vanne sjrifrichting van dien sjpraok',
-
 # Preferences page
 'preferences' => 'Veurkäöre',
 'mypreferences' => 'Mien veurkäöre',
@@ -1715,7 +1707,6 @@ Om beveiligingsrede is img_auth.php oetgesjakeld.",
 'http-read-error' => 'HTTP-laezingsfout.',
 'http-timed-out' => 'HTTP-verzeuktimeout',
 'http-curl-error' => 'Óphaolingsfout URL: $1',
-'http-host-unreachable' => 'Kòs de URL neet bereike',
 'http-bad-status' => "d'r Is e perbleem ópgetraoje bie 't HTTP-verzeuk: $1 $2",
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2028,15 +2019,6 @@ Haet mèndestes e toepleveldomein, wie beveurbeildj "*.org".<br />
 'listusers-noresult' => 'Gein(e) gebroeker(s) gevonje.',
 'listusers-blocked' => '(geblok)',
 
-# Special:ActiveUsers
-'activeusers' => 'Aktief gebroekers',
-'activeusers-intro' => "Dit is 'n lies mit gebroekers die aktief zeen gewaes in de aafgeloupe {{PLURAL:$1|daag|$1 daag}}.",
-'activeusers-count' => '$1 {{PLURAL:$1|bewèrking|bewèrkinger}} inne {{PLURAL:$3|lèsten daag|lès $3 daag}}',
-'activeusers-from' => 'Tuin gebroekers vanaaf:',
-'activeusers-hidebots' => 'Verberg bots',
-'activeusers-hidesysops' => 'Verberg admins',
-'activeusers-noresult' => 'Gein gebroekers gevónje.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Rechte van gebroekersgróppe',
 'listgrouprights-summary' => 'Op dees pazjena sjtaon de gebroekersgróppe in deze wiki besjreve, mit zien biebehurende rechte.
@@ -2830,8 +2812,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
index 6442f4a..81dfab4 100644 (file)
@@ -10,6 +10,7 @@
  * @author Dario vet
  * @author Dedee
  * @author Gastaz
+ * @author Giromin Cangiaxo
  * @author Malafaya
  * @author Urhixidur
  * @author ZeneizeForesto
@@ -128,27 +129,52 @@ $messages = array(
 'tog-underline' => 'Sottolineâ i collegamenti',
 'tog-justify' => 'Alliniamento di paragrafi giustificòu',
 'tog-hideminor' => 'asconde e modifiche minori inte ùrtime modifiche',
-'tog-hidepatrolled' => 'Ascondi e modifiche verific inte ùrtime modifiche',
-'tog-newpageshidepatrolled' => 'Ascondi e paggine verifiché da-o elenco de paggine ciù reçenti',
-'tog-extendwatchlist' => 'mostrâ tùtte e modifiche a-i òsserve speciali',
-'tog-usenewrc' => 'Usâ e ùrtime modifiche avansê (serve Javascript)',
+'tog-hidepatrolled' => 'Ascondi e modifiche verificæ inte ùrtime modifiche',
+'tog-newpageshidepatrolled' => "Ascondi e paggine verificæ da  l'elenco de paggine ciù reçenti",
+'tog-extendwatchlist' => "mostra tùtte e modifiche a-i osservæ speciali, non solo l'urtima",
+'tog-usenewrc' => 'Ammuggia pe paggina e modifiche in urtime modifiche e sotta oservaçion (serve o Javascript)',
 'tog-numberheadings' => 'Nùmeraçion aotomàtica di tìtoli de seçión',
-'tog-showtoolbar' => 'Fâ vedde a barra de strumenti de modìffica (con JavaScript)',
-'tog-editondblclick' => 'Modifica e paggine co-o dópio clic (serve Javascrpt)',
+'tog-showtoolbar' => 'Fanni vedde a barra di strumenti de modìffica (serve JavaScript)',
+'tog-editondblclick' => 'Modifica e paggine co-o doggio clic (serve Javascrpt)',
 'tog-editsection' => 'Modifica e seçión co-o colegamento [modifica]',
-'tog-editsectiononrightclick' => 'Modifica e seçión co-o clic destro in sciô tìtolo (serve Javascipt)',
+'tog-editsectiononrightclick' => 'Modifica e seçión co-o clic drito in sciô tìtolo (serve Javascipt)',
 'tog-showtoc' => "Fanni védde l'indiçe pe-e pàgine con ciù de 3 seçioìn",
 'tog-rememberpassword' => "Arregorda a mæ paròlla d'ordine (a-o màscimo pe $1 {{PLURAL:$1|day|days}})",
-'tog-watchcreations' => 'Azónzi e pàgine a-i oservæ speciâli',
+'tog-watchcreations' => 'Azonzi e paggine che creo e i file che carrego a-i oservæ speciâli',
+'tog-watchdefault' => 'Azonzi e paggine e i files che modiffico a-i mæ sotta oservaçion',
+'tog-watchmoves' => 'Azonzi e paggine e i file che mescio a-i mæ sotta oservaçion',
+'tog-watchdeletion' => 'Azonzi e paggine e i files che scancello a-i mæ sotta oservaçion',
+'tog-minordefault' => 'Indica de longo comme menô e modiffiche',
 'tog-previewontop' => "Veddi l'anteprimma de d'äto a-o spaçio pe cangiâ",
 'tog-previewonfirst' => "Veddi l'anteprimma a-o primmo cangiamento",
-'tog-enotifwatchlistpages' => "Fammelo savéi via e-mail quande 'na paggina inta mæ lista in osservassion a va cangiaa.",
+'tog-nocache' => 'Disabilita a cache de pagine do navegatô',
+'tog-enotifwatchlistpages' => "Famme savéi via e-mail quande 'na paggina o in file inti mæ osservæ a ven cangiâ.",
 'tog-enotifusertalkpages' => "Màndime un messaggio e-mail se gh'é de-e modìffiche inta pagina de discuscion da mæ pagina d'utente.",
+'tog-enotifminoredits' => 'Inviami una email pe e modifiche menoî ascì de pagine e di file',
+'tog-enotifrevealaddr' => 'Mostra o mæ indirizzo e-mail inti messaggi de notifica',
+'tog-shownumberswatching' => "Mostra o numero di utenti che tegnan d'oeuggio sta pagina",
+'tog-oldsig' => 'Firma attuale:',
+'tog-fancysig' => 'Tratta a firma comme wikitesto (sensa un collegamento aotomatico)',
+'tog-showjumplinks' => 'Attiva i collegamenti d\'accescibilitæ "sata a"',
+'tog-uselivepreview' => "Doeuvia l'anteprimma in diretta (ghe voeu o JavaScript)(sperimentâ)",
+'tog-watchlisthideown' => "Ascondi e mæ modiffiche da-a lista che tegno d'oeuggio",
+'tog-watchlisthidebots' => "Ascondi e modiffiche di bot da-a lista che tegno d'oeuggio",
+'tog-watchlisthideminor' => "Ascondi e modiffiche menoî da-a lista che tegno d'oeuggio",
+'tog-watchlisthideliu' => "Ascondi e modiffiche di utenti intræ da-a lista che tegno d'oeuggio",
+'tog-watchlisthideanons' => "Ascondi e modiffiche di utenti anonnimi da-a lista che tegno d'oeuggio",
+'tog-watchlisthidepatrolled' => "Ascondi e modiffiche za controllæ da-a lista che tegno d'oeuggio",
+'tog-ccmeonemails' => "Mandime 'na coppia de e-mail che mando a-i atri utenti",
+'tog-diffonly' => 'No mostrâ o contegnuo da paggina sotta o confronto tra verscioin',
 'tog-showhiddencats' => 'Fa vedde e categorîe ascose',
+'tog-norollbackdiff' => "Ometti o confronto tra verscioin doppo ch'ho fæto o ripristino",
+'tog-useeditwarning' => "Avertime se lascio 'na paggina de modiffica sens'avei sarvou i cangi",
 
 'underline-always' => 'Sempre',
 'underline-never' => 'Mâi',
 
+# Font style option in Special:Preferences
+'editfont-style' => "Stile do carattere de l'aera de modiffica",
+
 # Dates
 'sunday' => 'Domenega',
 'monday' => 'Lunedì',
@@ -205,42 +231,50 @@ $messages = array(
 'pagecategories' => '{{PLURAL:$1|Categorîa|Categorîe}}',
 'category_header' => 'Pàgine inta categorîa "$1"',
 'subcategories' => 'Sottocategorîe',
-'category-media-header' => 'Archivio inta categorîa "$1"',
-'category-empty' => "''Pe òua sta categorîa a no contegne nisciùnn-a pàgina ò archivio moltimedia.''",
+'category-media-header' => 'Media inta categorîa "$1"',
+'category-empty' => "''Pe òua sta categorîa a no contegne pàgine ò file murtimediæ.''",
 'hidden-categories' => '{{PLURAL:$1|Categoria ascoza|Categorie ascoze}}',
 'hidden-category-category' => 'Categorîe ascôse',
 'category-subcat-count' => "{{PLURAL:$2|Sta categoria a contegne sôlo 'na sottocategoria, chi de segoito.|Sta categoria a contegne {{PLURAL:$1|a sottocategoria indicâ|e $1 sottocategorie indicæ}} di segoito, pe in totale de $2.}}",
 'category-subcat-count-limited' => "'Sta categorîa a contegne {{PLURAL:$1|ûnn-a sottocategorîa, indicaa|$1 sottocategorîe, indicæ}} chì inzû.",
-'category-article-count' => "{{PLURAL:$2|Sta categoria a contegne sôlo inna pagina, chi de segoito.|Sta categoria a contegne {{PLURAL:$1|a pàgina a l'é|e $1 pàgine son}} de segoito, pe in totale de $2.}}",
+'category-article-count' => "{{PLURAL:$2|Questa categoria a contegne solo sta pagina chì.|Questa categoria a contegne {{PLURAL:$1|a pagina indicâ|e $1 pagine indicæ}} chì de sotta , insce 'n totale de $2.}}",
 'category-article-count-limited' => "'Sta categorîa a contegne {{PLURAL:$1|'sta paggina|'ste $1 paggine}}.",
-'category-file-count' => "{{PLURAL:$2|Sta categoria a contegne sôlo in file, chi de segoito.|Sta categoria a contegne {{PLURAL:$1|o file o l'é|e $1 file son}} de segoito, pe in totale de $2.}}",
+'category-file-count' => "{{PLURAL:$2|Sta categoria a contegne sôlo sto file.|{{PLURAL:$1|Sto file o l'é|Sti $1 file son}} inte sta categoria, pe in totale de $2.}}",
+'category-file-count-limited' => 'Questa categoria a contegne {{PLURAL:$1|o file indicao|i $1 file indicæ}} chi de sotta.',
 'listingcontinuesabbrev' => 'cont.',
+'index-category' => 'Paggine indiçizzæ',
 'noindex-category' => 'Pàgine sénsa indiçe',
+'broken-file-category' => 'Paggine con di colegamenti a di file che no ghe son',
 
 'about' => 'Informaçioìn',
 'article' => 'Pagina de i contenùi',
 'newwindow' => "(O s'arve inte 'n âtro barcon)",
 'cancel' => 'Scancella',
 'moredotdotdot' => 'De ciû...',
-'mypage' => 'A mea pagina',
-'mytalk' => 'Mæ discuscioin',
+'morenotlisted' => 'Atro...',
+'mypage' => 'Paggina',
+'mytalk' => 'Discuscioin',
 'anontalk' => 'Discuscion pe questo indirisso IP',
 'navigation' => 'Navegaçión',
 'and' => '&#32;e',
 
 # Cologne Blue skin
 'qbfind' => 'Attrêuva',
+'qbbrowse' => 'Navvega',
 'qbedit' => 'Cangia',
 'qbpageoptions' => "Opsioîn de 'sta paggina",
 'qbmyoptions' => 'E mæ paggine',
 'qbspecialpages' => 'Pagine speçiä',
 'faq' => 'Domande frequenti',
+'faqpage' => 'Project:Domande frequente',
 
 # Vector skin
 'vector-action-addsection' => 'Azónzi discusción',
 'vector-action-delete' => 'Scancella',
 'vector-action-move' => 'Mescia',
-'vector-action-protect' => 'Protezzi',
+'vector-action-protect' => 'Protezi',
+'vector-action-undelete' => 'Recuppera',
+'vector-action-unprotect' => 'Cangia a proteçion',
 'vector-view-create' => 'Crea',
 'vector-view-edit' => 'Càngia',
 'vector-view-history' => 'Fanni védde a Stöia',
@@ -250,8 +284,9 @@ $messages = array(
 'namespaces' => 'Namespaces',
 'variants' => 'Diferense',
 
+'navigation-heading' => 'Menu de navegaçion',
 'errorpagetitle' => 'Erô',
-'returnto' => 'Tornâ a $1.',
+'returnto' => 'Torna a $1.',
 'tagline' => 'Da {{SITENAME}}',
 'help' => 'Agiùtto',
 'search' => 'Çerca',
@@ -260,8 +295,9 @@ $messages = array(
 'searcharticle' => 'Vanni',
 'history' => 'Stöia da pàgina',
 'history_short' => 'Stöia',
+'updatedmarker' => 'modificâ da-a mæ urtima vixita',
 'printableversion' => 'Verscion da stanpâ',
-'permalink' => 'Inganso fisso',
+'permalink' => 'Ingancio fisso',
 'print' => 'Stampa',
 'edit' => 'Càngia',
 'create' => 'Crea',
@@ -269,42 +305,56 @@ $messages = array(
 'create-this-page' => "Crea 'sta paggina",
 'delete' => 'Scancella',
 'deletethispage' => "Scassa 'sta paggina",
-'protect' => 'Proteze',
-'protect_change' => 'cangiâ',
+'undelete_short' => 'Recuppera {{PLURAL:$1|una revixon|$1 revixoin}}',
+'protect' => 'Protezi',
+'protect_change' => 'cangia',
 'protectthispage' => "Proteze 'sta paggina.",
 'unprotect' => 'Càngia proteçión',
 'unprotectthispage' => 'Càngia a proteçión de sta paggina',
 'newpage' => 'Nêuva pàgina',
-'talkpage' => 'Paggina de discûxon',
+'talkpage' => 'Paggina de discuscion',
 'talkpagelinktext' => 'Ciæti',
 'specialpage' => 'Pagina speçiâ',
 'personaltools' => 'Strùmenti personâli',
+'postcomment' => 'Noeuva seçion',
 'articlepage' => 'Veddi a voxe',
 'talk' => 'Ciæti',
 'views' => 'Vìxite',
 'toolbox' => 'Arneixi',
+'userpage' => 'Veddi a paggina utente',
 'projectpage' => 'Veddi a pagina de o progetto',
+'imagepage' => 'Vizualizza a paggina do file',
+'mediawikipage' => 'Vizualizza o messaggio',
+'templatepage' => 'Vizualizza o modello',
+'viewhelppage' => "Vizualizza a paggina d'agiutto",
+'categorypage' => 'Veddi a paggina da categoria',
 'viewtalkpage' => 'Veddi o ciæto',
 'otherlanguages' => 'In âtre lengóe',
-'redirectedfrom' => '(Rediritto da $1)',
+'redirectedfrom' => '(Rendirissou da $1)',
 'redirectpagesub' => 'Paggina de rindirissamento',
 'lastmodifiedat' => "Sta pagina a l'è stæta cangiâ l'urtima votta a e $2 do $1.",
 'viewcount' => "'Sta paggina a l'è stæta vista {{PLURAL:$1|solo 'na vòtta|$1 vòtte}}.",
-'protectedpage' => 'Paggina protea',
+'protectedpage' => 'Paggina protetta',
 'jumpto' => 'Vanni a:',
 'jumptonavigation' => 'Navegaçión',
 'jumptosearch' => 'çerca',
+'view-pool-error' => "Scuza ma a-o momento i server sono stracarreghi.
+Troppi utenti çercan d' amiâ sta paggina.
+Aspeta quarche menuto primma de çercâ torna d'accede a sta pagina.
+
+$1",
+'pool-errorunknown' => 'Aro sconosciuo',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => 'Informaçioìn in sciô {{SITENAME}}',
 'aboutpage' => 'Project:Informaçioìn',
 'copyright' => 'O contegnûo o se peu trovâ a $1.',
-'copyrightpage' => "{{ns:project}}:Diritti d'autô",
+'copyrightpage' => "{{ns:project}}:Driti d'autô",
 'currentevents' => 'Atualitæ',
 'currentevents-url' => 'Project:Atualitæ',
-'disclaimers' => 'Avértense',
+'disclaimers' => 'Avertense',
 'disclaimerpage' => 'Project:Avertense generâli',
-'edithelp' => "Agiùtto pe l'ediçion",
+'edithelp' => 'Agiùtto',
 'edithelppage' => 'Help:Modiffica',
 'helppage' => 'Help:Contegnûi',
 'mainpage' => 'Pàgina prinçipâ',
@@ -313,17 +363,24 @@ $messages = array(
 'portal' => 'Pòrtego da comunitæ',
 'portal-url' => 'Project:Pòrtego da comunitæ',
 'privacy' => 'Politica in sci dæti privæ',
-'privacypage' => 'Project:Leze in sci dæti privæ',
+'privacypage' => 'Project:Politica in scî dæti privæ',
 
 'badaccess' => "No ti g'hæ o permisso",
 'badaccess-group0' => "No ti g'hæ o permisso pe fâ quest'assion.",
-'badaccess-groups' => "L'assion che ti vêu fâ a l'è permissa solo a i ûtenti de ûn di grûppi $1.",
+'badaccess-groups' => "L'assion che ti vêu fâ a l'è permissa solo a i ûtenti {{PLURAL:$2|do gruppo|de un de sti gruppi}}: $1.",
+
+'versionrequired' => 'Ghe voeu a verscion $1 de MediaWiki',
+'versionrequiredtext' => "Pe doeuviâ sta paggina ghe voeu a verscion $1 do software MediaWiki. Amia [[Special:Version|l'appoxita paggina]].",
 
 'ok' => "D'accòrdio",
 'retrievedfrom' => 'Estræto da "$1"',
 'youhavenewmessages' => "Ti gh'æ $1 ($2).",
 'newmessageslink' => 'Nêuvi messaggi',
-'newmessagesdifflink' => 'Differensa co-a revixon preçedente',
+'newmessagesdifflink' => 'urtima modiffica',
+'youhavenewmessagesfromusers' => "Ti g'hæ $1 da {{PLURAL:$3|un atro utente|$3 utenti}} ($2).",
+'youhavenewmessagesmanyusers' => "Ti g'hæ $1 da tanti utenti ($2).",
+'newmessageslinkplural' => '{{PLURAL:$1|un noeuvo messaggio|noeuvi messaggi}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|urtima modifica|urtime modifiche}}',
 'youhavenewmessagesmulti' => "Ti t'æ neuvi messaggi in scia $1",
 'editsection' => 'Càngia',
 'editold' => 'càngia',
@@ -334,30 +391,45 @@ $messages = array(
 'toc' => 'Indiçe',
 'showtoc' => 'Fâ vedde',
 'hidetoc' => 'Asconde',
+'collapsible-collapse' => 'Comprimmi',
+'collapsible-expand' => 'Espandi',
+'thisisdeleted' => 'Amia o ripristina $1?',
 'viewdeleted' => 'Vedde $1?',
+'restorelink' => '{{PLURAL:$1|una modifica scancelâ|$1 modifiche scancelæ}}',
+'feedlinks' => 'Feed:',
+'feed-invalid' => 'Modalitæ de sottoscriçion do feed non vallida.',
 'site-rss-feed' => 'Feed RSS de $1',
 'site-atom-feed' => 'Feed Atom de $1',
 'page-rss-feed' => 'Feed RSS pe "$1"',
 'page-atom-feed' => 'Feed Atom pe "$1"',
 'red-link-title' => '$1 (ancon da scrîve)',
+'sort-descending' => 'Ordine decrescente',
+'sort-ascending' => 'Ordine crescente',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Pàgina',
 'nstab-user' => 'Utente',
+'nstab-media' => 'File murtimediâ',
 'nstab-special' => 'Pàgina speçiâ',
 'nstab-project' => 'Paggina de servissio',
 'nstab-image' => 'Archivio',
+'nstab-mediawiki' => 'Messaggio',
 'nstab-template' => 'Template',
 'nstab-help' => 'Agiûtto',
 'nstab-category' => 'Categorîa',
 
 # Main script and global functions
-'nosuchactiontext' => "L'URL a no corisponde a 'n comando reconosciûo da-o software MediaWiki",
+'nosuchaction' => 'No se poeu',
+'nosuchactiontext' => "L'açion specificâ inta URL a no l'è vallida.
+O che t'hæ scrito mâ, o che donque l'ea sbaliou o colegamento.
+O magara gh'è 'na cammoa into software doeuviou da {{SITENAME}}.",
+'nosuchspecialpage' => "Sta paggina speciale a no gh'è",
 
 # General errors
 'error' => 'Errô',
 'databaseerror' => 'Errô da a base de i dæti',
 'readonly' => 'Database bloccòu',
+'enterlockreason' => "Scrivi o motivo do blocco, e 'na stimma de quande o saiâ rimosso",
 'missing-article' => "O database o no l'à trovòu o testo di 'na pàgina che ghe saiêiva dovûa êse  co-o nómme de \"\$1\" \$2.
 
 Spésse vòtte questo o sucede quande a vegne riciamâ, da stöia ò dò-u confronto tra revixioìn, in colegaménto a 'na pàgina scancelâ, a in confronto tra revixioìn che no ghe son ciù ò a in confronto tra revixioìn sénsa ciù a stöia.
@@ -372,98 +444,134 @@ Pe favô ti peu segnalâ quello che l'é sucesso a in [[Special:ListUsers/sysop|
 'badarticleerror' => "L'açion che ti te veu fâ a non l'è permissa in sta pagina.",
 'cannotdelete' => 'Non çe peu scassâ a pagina o o papê. (o peu ese za stæto scassoö da quarchedun ätro).',
 'badtitle' => "O tìtolo o no l'è corretto.",
-'badtitletext' => "O tittolo da paggina çercâa o l'è vêuo, sballiòu o con caratteri no accettæ, oppûre o deriva da 'n errô inti collegamenti tra scîti Wiki diversci o verscioîn in léngue diversce do mæximo scîto.",
+'badtitletext' => "O tittolo da paggina çercâ o l'è vêuo, sballiòu o con caratteri no accettæ, oppû o deriva da 'n errô inti collegamenti inter-lengoa o inter-wiki.",
 'viewsource' => 'Veddi a fonte',
 'protectedpagetext' => "'Sta paggina a l'è stæta protezûa pe impedîghe a modiffica.",
 'viewsourcetext' => "O l'è poscibbile vedde e copiâ o còddice sorgente de 'sta paggina:",
+'customjsprotected' => "No ti gh'æ i permessi pe cangiâ sta pagina de JavaScript percose a contegne e impostaçioin personæ de 'n atro utente",
+'ns-specialprotected' => 'No se pœu modificâ e paggine speciali',
+'titleprotected' => "A creaçion de 'na paggina con sto tittolo a l'è stæta bloccâ da [[User:$1|$1]].
+A raxon a l'è: ''$2''.",
+'exception-nologin' => "No t'ê introu",
+'exception-nologin-text' => "Pe sta paggina ò sta açion ti gh'æ da effettuâ l'accesso inte sta wiki.",
+
+# Virus scanner
+'virus-scanfailed' => 'scansion fallia (codice $1)',
+'virus-unknownscanner' => 'antivirus sconosciuo:',
 
 # Login and logout pages
 'yourname' => 'Nomme',
 'yourpassword' => 'Pòula segretta:',
-'yourpasswordagain' => 'Scrivi tórna a pòula segrétta:',
-'remembermypassword' => 'Aregòrda a mæ login in sto navegatô (pe in mascìmo de $1 {{PLURAL:$1|giórno|giórni}})',
+'yourpasswordagain' => 'Riscrivi a pòula segrétta:',
+'remembermypassword' => 'Aregòrda a mæ login in sto navegatô (pe in mascimo de $1 {{PLURAL:$1|giórno|giórni}})',
 'yourdomainname' => 'Indirisso do scito:',
+'password-change-forbidden' => 'No ti peu cangiâ poula segretta in questa wiki.',
 'login' => 'Intra',
 'nav-login-createaccount' => 'Intra / Registrate',
-'loginprompt' => 'Ti devi avéi i cookie abilitæ into teu navigatô pe intrâ in {{SITENAME}}.',
-'userlogin' => 'Intra / Registrate',
+'loginprompt' => "Pe fâ l'accesso inte {{SITENAME}} ti g'hæ da  abilitâ i cookie.",
+'userlogin' => 'Intra / Registrite',
+'userloginnocreate' => 'Intra',
 'logout' => 'Sciorti',
 'userlogout' => 'Sciorti',
-'nologin' => "No ti gh'æ ancon l'aceizo? '''$1'''.",
-'nologinlink' => "Creâ 'n account",
+'notloggedin' => "No t'ê introu",
+'nologin' => "No ti gh'æ ancon in acesso? '''$1'''.",
+'nologinlink' => "Creâ 'n' utensa",
 'createaccount' => "Crea 'n nêuvo account",
-'gotaccount' => "Ti ghe l'æ za 'n conto d'aceizo? '''$1'''.",
+'gotaccount' => "Ti ghe l'æ za 'n' utensa? '''$1'''.",
 'gotaccountlink' => 'Intra',
-'userlogin-resetlink' => "T'æ ascordòu i teu dæti de aceizo?",
+'userlogin-resetlink' => "T'æ ascordòu i teu dæti de acesso?",
+'createaccountreason' => 'Raxon:',
 'badretype' => "E paròlle d'ordine che t'hæ scrîo son despægie.",
-'userexists' => "O nomme d'ûtente inserîo o l'è zà in ûso.<br />
-Pe piaxei prêuva a scellie 'n âtro.",
+'userexists' => "O nomme ûtente inserîo o l'è za doeuviao.<br />
+Çernine 'n âtro.",
 'loginerror' => "Errô inte l'accesso",
+'createaccounterror' => "Imposcibbile creâ l'account: $1",
 'noname' => "O nomme d'ûtente o l'è sballiòu.",
 'loginsuccesstitle' => 'Accesso effettuòu',
 'loginsuccess' => "'''O collegamento a-o server de {{SITENAME}} co-o nomme d'ûtente \"\$1\" o l'è attivo.'''",
 'nosuchuser' => 'No gh\'è nisciûn ûtente con quello nomme "$1". Verificâ o nomme inserîo ò creâ \'n nêuvo accesso.',
 'nosuchusershort' => 'No gh\'è nisciûn ûtente con quello nomme "$1". Verificâ o nomme inserîo.',
 'nouserspecified' => "O se deive inserî 'n nomme d'ûtente.",
+'login-userblocked' => "St'utente o l'è bloccou. Accesso negou.",
 'wrongpassword' => "Ti gh'æ scrîo 'na paròlla d'ordine sbaliâ. Tenta torna.",
 'wrongpasswordempty' => "No ti g'hæ scrîo nisciûnn-a paròlla d'ordine. Tenta torna.",
-'passwordtooshort' => "A paròlla d'ordine che ti gh'æ misso a no serve òu a l'é tròppo cûrta.
-A dêve contegnî mìnimo $1 caratteri e esse diverza da-o teu nómme utente.",
+'passwordtooshort' => 'E password devan aveighe aomanco {{PLURAL:$1|1 carattere|$1 caratteri}}.',
+'password-name-match' => "A password a dev'ese despægia da-o nomme utente.",
+'password-login-forbidden' => "L'utilizzo de sto nomme utente e password o l'è stæto proibio.",
 'mailmypassword' => "Invia 'na nêuva paròlla segrétta a-a mæ e-mail",
 'passwordremindertitle' => "Servissio Password Reminder (nêuva paròlla d'ordine temporannia) de {{SITENAME}}",
-'passwordremindertext' => "Quarchedûn (probabilmente ti, con indirisso IP \$1) o g'ha domandòu l'invîo de 'na nêuva paròlla d'ordine pe l'accesso a {{SITENAME}} (\$4).
-A paròlla d'ordine pe l'ûtente \"\$2\" a l'è stæta impostâa a \"\$3\".
-O se conseggia de fâ l'accesso quanto primma e cangiâ a paròlla d'ordine immediatamente.
-Se no ti Ã¨ stæto ti a fâ 'sta domanda, oppûre se ti g'hæ ritrovòu a têu paròlla d'ordine e no ti vêu cangiâla ciû, ti pêu ignorâ 'sto messaggio e andâ avanti Ã»sando a vegia paròlla d'ordine.",
+'passwordremindertext' => "Quarchedûn (probabilmente ti, con indirisso IP \$1) o l'ha domandòu l'invîo de 'na nêuva paròlla d'ordine pe l'accesso a {{SITENAME}} (\$4).
+A paròlla d'ordine pe l'ûtente \"\$2\" a l'è stæta impostâ a \"\$3\".
+Se conseggia de fâ l'accesso quanto primma e cangiâ a paròlla d'ordine immediatamente.
+Se no ti Ãª stæto ti a fâ 'sta domanda, oppûre se ti t'hæ ritrovòu a têu paròlla d'ordine e no ti vêu cangiâla ciû, ti pêu ignorâ 'sto messaggio e andâ avanti deuviando a vegia paròlla d'ordine.",
 'noemail' => 'No gh\'è nisciûn indirisso e-mail registròu pe l\'ûtente "$1".',
+'noemailcreate' => 'Ti devi dâ un addresso e-mail vallido.',
 'passwordsent' => "Ûnn-a nêuva paròlla d'ordine a l'è stæta inviâa a l'indirisso e-mail registròu pe l'ûtente \"\$1\".
 Pe piaxei, fa 'n accesso appenn-a ti a ghe reçeivi.",
 'blocked-mailpassword' => "O teu indirisso IP o l'è affirmoö, e pe sta razon o non se peu usâ a funscion de remandâ a pòula segretta.",
 'eauthentsent' => "'N messaggio e-mail de confermassion o l'è stæto inviòu a l'indirisso indicòu.
 Pe abilitâ l'invîo de messaggi e-mail pe quest'accesso, o se deive seguî l'istrûssioîn indicæ, coscì ti confermi che ti t'è o legittimo propietâjo de l'indirisso.",
-'acct_creation_throttle_hit' => 'O ne dispiâxe, ma ti hæ zà creòu $1 accesci. No ti pêu creâne de ciû!',
-'emailauthenticated' => "O teu indirisso de posta elettronega o l'è stæto autenticoö o $1.",
+'mailerror' => "Errô inte l'invio do messaggio: $1",
+'acct_creation_throttle_hit' => "Ne dispiâxe, ma t'hæ zà creòu $1 accesci. No ti pêu creâne ciû!",
+'emailauthenticated' => "O teu indirisso de posta elettronica o l'è stæto autenticou o $2 a $3.",
 'emailconfirmlink' => 'Conferma o teu indirisso de posta elettronega',
 'accountcreated' => 'Graçie pe esëte registroö!!!',
 'accountcreatedtext' => "Utente $1, ti te guägno l'açeiso!",
+'createaccount-title' => "Creaçion de 'n conto pe {{SITENAME}}",
+'usernamehasherror' => 'O nomme utente o no poeu contegnî di caratteri hash',
+'login-abort-generic' => "O to accesso o no l'ha avuo successo - Abortio",
 'loginlanguagelabel' => 'Lengoa: $1',
 
 # Change password dialog
-'resetpass' => 'Reverti a pòula segretta',
-'resetpass_header' => 'Reverti a pòula segretta',
+'resetpass' => 'Cangia a pòula segretta',
+'resetpass_announce' => "T'ê introu co in codiçe temporanio de l'e-mail.Pe completâ l'accesso ti devi çerne 'na neuva poula segretta chì:",
+'resetpass_header' => 'Cangia a pòula segretta do conto',
+'oldpassword' => 'Vegia poula segretta',
+'newpassword' => 'Neuva poula segretta',
 'retypenew' => "Ripette a nêuva paròlla d'ordine:",
+'resetpass_submit' => 'Çerni a poula segretta e intra',
 'resetpass_forbidden' => "No l'é poscìbile cangiâ e paròlle segrétte",
 
+# Special:PasswordReset
+'passwordreset-email' => 'Addresso e-mail:',
+'passwordreset-emailtitle' => 'Dettaggi account sciu {{SITENAME}}',
+'passwordreset-emailelement' => 'Nomme utente: $1
+Poula segretta temporannia: $2',
+
+# Special:ChangeEmail
+'changeemail-none' => '(nisciun)',
+'changeemail-cancel' => 'Annulla',
+
 # Edit page toolbar
 'bold_sample' => 'Grascetto',
 'bold_tip' => 'Grascetto',
-'italic_sample' => 'Testo in corsciva',
+'italic_sample' => 'Testo in corscivo',
 'italic_tip' => 'Corscivo',
-'link_sample' => "Nomme de l'inganço",
-'link_tip' => 'Inganço interno',
-'extlink_sample' => "http://www.example.com Nomme de l'inganço",
+'link_sample' => "Nomme de l'ingancio",
+'link_tip' => 'Ingancio interno',
+'extlink_sample' => "http://www.example.com Nomme de l'ingancio",
 'extlink_tip' => 'Colegaménto esterno (inclûdde o prefisso http:// )',
 'headline_sample' => 'Tìtolo',
 'headline_tip' => 'Tìtolo de 2° livello',
 'nowiki_sample' => 'Inserî chì o testo sensa formattaçion',
 'nowiki_tip' => 'Ignorâ a formattassion wiki',
 'image_sample' => 'Exempio.jpg',
-'image_tip' => 'Inmàgine caregâ',
+'image_tip' => 'Incorpora file',
 'media_sample' => 'Exempio.ogg',
-'media_tip' => 'Colegaménto a file moltimediale',
+'media_tip' => 'Colegaménto a file moltimediâ',
 'sig_tip' => 'Firma con data e ôa',
-'hr_tip' => 'Linnia orissontâ',
+'hr_tip' => 'Linnia orizontâ',
 
 # Edit pages
 'summary' => 'Oggetto:',
 'subject' => 'Argomento (tittolo):',
 'minoredit' => 'Cangiamento minô (m)',
-'watchthis' => 'Azzonze a-i osservæ speçiâli',
+'watchthis' => 'Metti sotta oservaçion',
 'savearticle' => 'Sarva a pàgina',
 'preview' => 'Anteprìmma',
 'showpreview' => "Veddi l'anteprimma",
 'showdiff' => 'Veddi i cangiamenti',
-'anoneditwarning' => "'''Attension:''' No ti t'hæ registròu. O têu indirisso IP o sajà misso inta stöja di cangiamenti da paggina.",
+'anoneditwarning' => "'''Attension:''' No t'ê intròu. Inta stoia di cangiamenti da paggina ghe saiâ misso o têu adresso IP.",
 'summary-preview' => 'Anteprimma oggetto:',
 'blockedtitle' => "L'utente o l'é bloccòu",
 'blockedtext' => "''''Sto nomme d'ûtente ou indirisso IP o l'è stæto bloccòu.'''
@@ -497,14 +605,14 @@ O têu blòcco ID o l'è \$5. Pe piaxei metti 'sto ID in tûtte e domande che ti
 'accmailtitle' => 'Pòula segretta spedïa',
 'accmailtext' => 'A pòula segretta pe-o utente "$1" a l\'è stæta spedïa a o indirisso $2.',
 'newarticle' => '(Nêuvo)',
-'newarticletext' => "Sto colegaménto o corisponde a 'na pàgina che ancon a no l'existe.
+'newarticletext' => "Sto colegaménto o corisponde a 'na pàgina ch'a no l'existe ancon.
 
-Se o se vêu creâ a pàgina òua, o se pêu comensâ a scrive o testo into spàçio vêuo chì sotta.
-(fâ riferimento a-e [[{{MediaWiki:Helppage}}|paggine d'agiûtto]] pe ciû informaçioìn).
+Se se vêu creâ a pàgina òua, se pêu comensâ a scrive into spàçio chì sotta.
+(amia e [[{{MediaWiki:Helppage}}|paggine d'agiûtto]] pe ciû informaçioìn).
 
-Se t'ê intròu inte sto colegaménto pe sbàlio, o basta sciaccâ '''Inderê''' into navegatô.",
+Se t'ê intròu chì pe sballio,  sciacca '''Inderê''' into navegatô.",
 'noarticletext' => "Inte sto momento a pagina çercâ a l'è vêua. O l'è poscibbile [[Special:Search/{{PAGENAME}}|çercâ 'sto tittolo]] inte âtre pagine do scîto opû [{{fullurl:{{FULLPAGENAME}}|action=edit}} cangiâ a pagina òua].",
-'noarticletext-nopermission' => "Òua a pàgina çercâ a l'è vêua. O l'è poscìbile [[Special:Search/{{PAGENAME}}|çercâ sto tìtolo]] inte âtre pàgine do scîto opû [{{fullurl:{{FULLPAGENAME}}|action=edit}} cangiâ a pàgina òua].",
+'noarticletext-nopermission' => "Òua a pàgina çercâ a l'è vêua. L'è poscìbile [[Special:Search/{{PAGENAME}}|çercâ sto tìtolo]] inte di âtre pàgine do scîto o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} çercâ inti registri corelæ]</span>, ma no ti gh'hæ i outorizzaçioin pe creâ sta paggina.",
 'previewnote' => "'''Questa chì a l'è solo 'n'anteprimma; i cangiamenti no son ancon stæti sarvæ!'''",
 'editing' => 'Modiffica de $1',
 'editingsection' => 'Càngio de $1 (seçión)',
@@ -514,24 +622,24 @@ Se t'ê intròu inte sto colegaménto pe sbàlio, o basta sciaccâ '''Inderê'''
 Se no ti veu che i testi teu pêuan esse modificæ da quarchedùn sensa limitaçioìn, no mandâli a {{SITENAME}}.<br />
 Inviando o testo ti diciâri, sott'a teu responsabilitæ, ch'o l'é stæto scrîto da ti personalmente oppure ch'o l'é stæto piggiòu da 'na fonte de pùbrico domìnio òu anàlogamente lìbea.<br />
 '''NO INVI MATERIÂLE COVERTO DA DRÎTI D'AUTÔ SENSA OUTORIZAÇION!'''",
-'templatesused' => '{{PLURAL:$1|Template adêuviòu|Template adêuviæ}} in sta pàgina:',
+'templatesused' => '{{PLURAL:$1|Template dêuviòu|Template dêuviæ}} in sta pàgina:',
 'templatesusedpreview' => "Template dêuviæ inte 'st'anteprimma:",
 'template-protected' => '(protezûo)',
 'template-semiprotected' => '(semiprotezûo)',
-'hiddencategories' => "Sta pàgina a l'é de {{PLURAL:$1|1 categoria ascoza|$1 categorie ascoze}}:",
+'hiddencategories' => 'Sta pàgina a fa parte de {{PLURAL:$1|1 categoria ascoza|$1 categorie ascoze}}:',
 'nocreatetext' => "A poscibilitæ de creâ nêuve paggine insce {{SITENAME}} a l'è stæta limitâ solo a-i ûtenti registræ.
 O se pêu tornâ inderê e modificâ 'na paggina escistente, oppûre [[Special:UserLogin|intrâ ò creâ 'n accesso nêuvo]].",
-'permissionserrorstext-withaction' => "No t'æ i permìssi pe $2 pe {{PLURAL:$1|sta raxon|ste raxoìn}}:",
-'recreate-moveddeleted-warn' => "Atençión: o se sta pe ricreâ 'na pàgina zà scancelâ into passòu.'''
+'permissionserrorstext-withaction' => "No ti g'hæ i permìssi pe $2 pe {{PLURAL:$1|sta raxon|ste raxoìn}}:",
+'recreate-moveddeleted-warn' => "Atençión: ti stæ pe ricreâ 'na pàgina zà scancelâ into passòu.'''
 
-O se deive consciderâ se o l'è davéi coretto continoâ  a cangiâ 'sta pàgina.
-E cancellaçioìn e mesciaménti son publicæ chì sotta:",
-'moveddeleted-notice' => "Sta pàgina a l'é stæta cancelâ.
-E scancelaçioìn e mescaménti son riportæ chi pe informaçión.",
+Consciddera se l'è o caxo de continoâ  a cangiâ 'sta pàgina.
+Pe comoditæ e cancellaçioìn e i stramui son pubricæ chì sotta:",
+'moveddeleted-notice' => "Sta pàgina a l'é stæta scancelâ.
+A lista de scancelaçioìn e di stramui son riportæ chi de sotta pe informaçión.",
 
 # Parser/template warnings
-'post-expand-template-inclusion-warning' => "'''Atento:''' a dimensción di template che t'æ misso l'é tròppo grànde.
-Quàrcheùn di teu template no saiâ azónto.",
+'post-expand-template-inclusion-warning' => "'''Atento:''' a dimensción di template che t'æ misso a l'é tròppo grande.
+Quarchedun di teu template o no saiâ incluzo.",
 'post-expand-template-inclusion-category' => "Pàgine con di template che gh'àn a dimensción ciù âta do limite mascimo",
 'post-expand-template-argument-warning' => "'''Atençión:''' sta pàgina a contegne un ò ciù argomenti di template che son tròppo gràndi pe êse espansi. Sti argomenti no saiàn fæti védde.",
 'post-expand-template-argument-category' => 'Pàgine con di template che ghe mancàn di argoménti',
@@ -547,7 +655,7 @@ A razon dæta a l'è ''$2''",
 'currentrev' => 'Verscion attuâle',
 'currentrev-asof' => 'Ùrtima revixón de-e $1',
 'revisionasof' => 'Verscion do $1',
-'revision-info' => 'Verscion do $1, outô: $2',
+'revision-info' => 'Verscion do $1 de $2',
 'previousrevision' => '← Verscion meno recente',
 'nextrevision' => 'Revixon ciù nêuva →',
 'currentrevisionlink' => 'Ûrtima revixon',
@@ -556,9 +664,9 @@ A razon dæta a l'è ''$2''",
 'last' => 'Ûrtima',
 'page_first' => 'primma',
 'page_last' => 'ûrtima',
-'histlegend' => "Confronto tra verscioîn: selessionâ e cascette corispondenti a-e verscioîn descideræ e schissâ Inviâ oppûre o pomello lì sotta.
+'histlegend' => "Confronto tra verscioîn: selession-a e cascette corispondenti a-e verscioîn dexidiæ e schissa Invio oppû o pomello da basso.
 
-Leggenda: (corr) = differense co-a verscion corrente, (prec) = differense co-a verscion preçedente, '''m''' = modiffica minô",
+Legenda: (corr) = differense co-a verscion corrente, (prec) = differense co-a verscion precedente, '''m''' = modiffica minô",
 'history-fieldset-title' => 'Véddi a stöia',
 'history-show-deleted' => 'Sôlo scancelæ',
 'histfirst' => 'Prìmmo',
@@ -583,7 +691,7 @@ Leggenda: (corr) = differense co-a verscion corrente, (prec) = differense co-a v
 'lineno' => 'Linia $1:',
 'compareselectedversions' => 'Confronta e verscioîn selessionæ',
 'editundo' => 'Anùlla',
-'diff-multi' => '({{PLURAL:$1|Inna revixión intermedia|$1 revixioìn intermedie}} de {{PLURAL:$2|un utente|$2 utenti}} no son mostræ)',
+'diff-multi' => '({{PLURAL:$1|Inna revixón intermedia|$1 de revixoìn intermedie}} de {{PLURAL:$2|un utente|$2 utenti}} no son mostræ)',
 
 # Search results
 'searchresults' => 'Resultati da reçerca',
@@ -596,8 +704,8 @@ Leggenda: (corr) = differense co-a verscion corrente, (prec) = differense co-a v
 'nextn-title' => 'Pròscimo $1 {{PLURAL:$1|rezoltato|rezoltati}}',
 'shown-title' => 'Fanni védde {{PLURAL:$1|in rizoltato|$1 rizoltati}} pe pàgina',
 'viewprevnext' => 'Veddi ($1 {{int:pipe-separator}} $2) ($3).',
-'searchmenu-exists' => "'''In sciô scîto l'existe za 'na pàgina co-o nómme \"[[:\$1]]\"'''",
-'searchmenu-new' => 'Crea la pagina "[[:$1]]" su questo sito',
+'searchmenu-exists' => "'''Inte questa wiki gh'è za 'na pàgina co-o nómme \"[[:\$1]]\"'''",
+'searchmenu-new' => 'Crea a pagina "[[:$1]]" insce questo scito',
 'searchhelp-url' => 'Help:Contegnûi',
 'searchprofile-articles' => 'Pàgina di contegnûi',
 'searchprofile-project' => 'Pàgine de agiùtto e relative a-o progetto',
@@ -614,15 +722,15 @@ Leggenda: (corr) = differense co-a verscion corrente, (prec) = differense co-a v
 'search-redirect' => '(redirect $1)',
 'search-section' => '(seçión $1)',
 'search-suggest' => 'Fòscia ti voéivi: $1',
-'searchrelated' => 'relativi',
+'searchrelated' => 'corelæ',
 'searchall' => 'tùtti',
 'showingresultsheader' => "{{PLURAL:$5|Rizoltato '''$1''' di '''$3'''|Rizoltati '''$1 - $2''' de '''$3'''}} pe '''$4'''",
-'search-nonefound' => 'Mi no ò trovòu nìnte',
+'search-nonefound' => "Mi n'ho atrovòu ninte",
 'powersearch' => 'Çerca',
 
 # Preferences page
 'preferences' => 'Preferençe',
-'mypreferences' => 'Mæ preferense',
+'mypreferences' => 'Preferençe',
 'changepassword' => 'Cangiâ a pòula segretta',
 'skin-preview' => 'Anteprimma',
 'prefs-datetime' => 'Data e oùa',
@@ -643,8 +751,8 @@ Leggenda: (corr) = differense co-a verscion corrente, (prec) = differense co-a v
 'badsiglength' => "O nommeaggio o l'é tròppo lóngo; o dêve avéi meno de $1 caratteri.",
 'email' => 'Posta elettronega',
 'prefs-help-realname' => '* Nomme vëo (opsionâ): se o se scellie de scrivilo, o sajà dêuviòu pe ascrivighe a paternitæ di contegnûi inviæ.',
-'prefs-help-email' => "L'emal a no l'é obligatöia, ma a teu peu permette de reçéive a paròlla segrétta se ti t'ascòrdi.",
-'prefs-help-email-others' => 'Ti ti peu ascì scélie de lasciâ che i âtri te contâtino da-e teu pàgine utente ò de discoscioìn sénsa revelâ a teu indentitæ.',
+'prefs-help-email' => "L'email a no l'é obligatöia, ma a te permette de reçéive a paròlla segrétta se ti l'ascòrdi.",
+'prefs-help-email-others' => 'Ti ti peu scélie ascì de lasciâ che i âtri te contattan via e-mail co-in ingancio da-a to pàgina utente ò de discoscion sénsa rivelâ a to e-mail quande i atri utenti te contattan.',
 
 # Groups
 'group-user' => 'Ûtenti',
@@ -663,23 +771,23 @@ Leggenda: (corr) = differense co-a verscion corrente, (prec) = differense co-a v
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|modiffica|modiffiche}}',
 'recentchanges' => 'Ùrtimi cangiamenti',
-'recentchanges-legend' => 'Inpostaçioìn de lìùrtimi cangiaménti',
+'recentchanges-legend' => 'Opçioin di ùrtimi cangiaménti',
 'recentchanges-summary' => "Questa pàgina a g'ha di càngi ciù reçenti a-i contegnûi do scîto.",
 'recentchanges-feed-description' => "Questo feed o g'ha di cangiaménti ciù reçenti a-i contegnûi do scîto.",
 'recentchanges-label-newpage' => "Sto cangiaménto o l'à creòu 'na pàgina nêuva",
 'recentchanges-label-minor' => 'Cangiamento minô (m)',
 'recentchanges-label-bot' => "Sto cangiaménto o l'à fæto in bot",
 'recentchanges-label-unpatrolled' => "Sto cangiaménto o no l'é stæto ancón verificòu",
-'rcnote' => "De segoito {{PLURAL:$1|l'é elencâ o cangiménto ciù reçente|son elencæ e '''$1''' cangiménti ciù reçenti}} a-o scîto {{PLURAL:$2|inte ùrtime 24 ôe|inti ùrtimi '''$2''' giórni}}; i dæti son agiornæ a-e $5 do $4.",
-'rcnotefrom' => "Chì sotta gh'è i cangiamenti fæti comensando da '''$2''' (scinn-a '''$1''').",
-'rclistfrom' => 'Fanni vedde e modiffiche apportæ partendo da $1',
+'rcnote' => "Chì sotta {{PLURAL:$1|l'é elencou o cangiaménto ciù reçente|son elencæ i '''$1''' cangiaménti ciù reçenti}} a-o scîto {{PLURAL:$2|inte ùrtime 24 ôe|inti ùrtimi '''$2''' giorni}}; i dæti son agiornæ a-e $5 do $4.",
+'rcnotefrom' => "Chì sotta gh'è i cangiamenti fæti comensando da '''$2''' (scin a '''$1''').",
+'rclistfrom' => 'Fanni vedde e modiffiche apportæ partindo da $1',
 'rcshowhideminor' => '$1 cangiaménti minoi',
 'rcshowhidebots' => '$1 bot',
 'rcshowhideliu' => '$1 utenti registræ',
 'rcshowhideanons' => '$1 utenti anonnimi',
 'rcshowhidepatr' => '$1 i cangiaménti controllæ',
 'rcshowhidemine' => '$1 i mæ cangiamenti',
-'rclinks' => 'Fâ vedde i $1 cangiménti ciù reçenti fæte inti ùrtimi $2 giorni<br />$3',
+'rclinks' => 'Fanni vedde i $1 cangiaménti ciù reçenti fæti inti ùrtimi $2 giorni<br />$3',
 'diff' => 'diff',
 'hist' => 'stö',
 'hide' => 'Ascondi',
@@ -688,8 +796,8 @@ Leggenda: (corr) = differense co-a verscion corrente, (prec) = differense co-a v
 'newpageletter' => 'N',
 'boteditletter' => 'b',
 'rc_categories_any' => 'Quarsevêuggia',
-'rc-enhanced-expand' => 'Fanni védde detàli (con JavaScript)',
-'rc-enhanced-hide' => 'Ascondi detàli',
+'rc-enhanced-expand' => 'Fanni védde detaggi (serve JavaScript)',
+'rc-enhanced-hide' => 'Ascondi detaggi',
 
 # Recent changes linked
 'recentchangeslinked' => 'Cangiamenti correlæ',
@@ -697,17 +805,17 @@ Leggenda: (corr) = differense co-a verscion corrente, (prec) = differense co-a v
 'recentchangeslinked-toolbox' => 'Cangiaménti corelæ',
 'recentchangeslinked-title' => 'Modiffiche correlæ a "$1"',
 'recentchangeslinked-noresult' => 'Nisciûn cangiamento a-e paggine collegæ into periodo speçificòu.',
-'recentchangeslinked-summary' => "Sta pàgina a fa védde i cangiaménti ciù reçenti a-e pàgine colegæ a quésta.
+'recentchangeslinked-summary' => "Sta pàgina a fa védde i cangiaménti ciù reçenti a-e pàgine colegæ a questa.
 E pàgine che t'æ in oservaçion inti [[Special:Watchlist|oservæ speciâli]] son in '''grascetto'''.",
 'recentchangeslinked-page' => 'Nómme da pàgina:',
 'recentchangeslinked-to' => 'Fanni védde sôlo i cangiaménti a-e pàgine colegæ a-a pàgina specificâ',
 
 # Upload
-'upload' => "Caregâ 'n archivio",
+'upload' => "Carrega 'n file",
 'uploadbtn' => "Carega 'n archivvio",
-'uploadlogpage' => 'Log di archivi caregæ',
+'uploadlogpage' => 'Log di file caregæ',
 'filename' => 'Nomme do papê',
-'filedesc' => 'Detàli',
+'filedesc' => 'Detaggi',
 'filesource' => 'Reixe:',
 'uploadedfiles' => 'Papê caregæ',
 'badfilename' => 'O nomme do papê o l\'è stæto cangioö in "$1".',
@@ -715,7 +823,7 @@ E pàgine che t'æ in oservaçion inti [[Special:Watchlist|oservæ speciâli]] s
 [[$1|thumb]]",
 'fileexists-forbidden' => 'Un papê co sto nomme o existe de zà, pe piaxei vanni in derrê e carega sto papê co un ätro nomme. [[File:$1|thumb|center|$1]]',
 'savefile' => 'Sarva o papê',
-'uploadedimage' => 'O s\'ha caregòu "[[$1]]"',
+'uploadedimage' => 'O l\'ha caregòu "[[$1]]"',
 'uploaddisabledtext' => 'In {{SITENAME}} non se peu caregâ de papê.',
 'uploadvirus' => 'O papê gha un virus!! Dettaggi: $1',
 'sourcefilename' => "Nomme do papê d'origine:",
@@ -734,24 +842,24 @@ E pàgine che t'æ in oservaçion inti [[Special:Watchlist|oservæ speciâli]] s
 'listfiles_date' => 'Dæta',
 
 # File description page
-'file-anchor-link' => 'Archivio',
+'file-anchor-link' => 'file',
 'filehist' => "Stöia de l'archivio",
-'filehist-help' => "Sciacca inscie 'n grûppo data/ôa pe vedde l'archivio comme o se presentâva into momento indicòu.",
-'filehist-revert' => 'Repìggia',
+'filehist-help' => "Sciacca insce data/ôa pe amiâ o file comm'o s'apresentâva into momento indicòu.",
+'filehist-revert' => 'Ripristina',
 'filehist-current' => 'Corrente',
 'filehist-datetime' => 'Dæta/Ôa',
-'filehist-thumb' => 'Miniatora',
-'filehist-thumbtext' => 'Miniatora de versción de $1',
+'filehist-thumb' => 'Miniatua',
+'filehist-thumbtext' => 'Miniatua da versción de $1',
 'filehist-user' => 'Utente',
-'filehist-dimensions' => 'Dimensioîn',
+'filehist-dimensions' => 'Dimenscioin',
 'filehist-filesize' => "Dimension de l'archivvio",
 'filehist-comment' => 'Coménti',
 'imagelinks' => "Ûzo de l'archivio",
 'linkstoimage' => '{{PLURAL:$1|A segoente pàgina a contegne|E segoenti $1 pàgine contegnan}} colegaménti a-o file:',
-'nolinkstoimage' => "No gh'è nisciûnn-a pàgina collegâa con 'st'archivvio.",
+'nolinkstoimage' => "No gh'è nisciûnn-a pàgina collegâ con 'sto file.",
 'sharedupload' => "'St'archivvio o l'è condiviso; sajeiva a dî c'o pêu ese dêuviòu da ciû progetti wiki.",
-'sharedupload-desc-here' => 'Sto file o vegne da $1 e o peu êse adêuviòu inti âtri progetti.
-Chi de segoito ti peu védde a descriçión inta [$2 pàgina de descriçión do file].',
+'sharedupload-desc-here' => 'Sto file o vegne da $1 e o peu êse dêuviòu inti âtri progetti.
+Chì apreuvo ti peu védde a descriçión inta [$2 pàgina de descriçión do file].',
 'uploadnewversion-linktext' => "Carega 'na nêuva verscion de 'st'archivvio chì",
 
 # File deletion
@@ -776,7 +884,7 @@ Chi de segoito ti peu védde a descriçión inta [$2 pàgina de descriçión do
 'statistics' => 'Statistiche',
 
 'disambiguations' => 'Paggine de desambiguassion',
-'disambiguationspage' => 'Template:Dizanbigoa',
+'disambiguationspage' => 'Template:Omonimia',
 
 'doubleredirects' => 'Rindirissamenti doggi',
 
@@ -809,7 +917,7 @@ Chi de segoito ti peu védde a descriçión inta [$2 pàgina de descriçión do
 'mostcategories' => 'Voxi con ciû categorîe',
 'mostimages' => 'Immaggini con ciû collegamenti',
 'mostrevisions' => 'Voxi con ciû revixoîn',
-'prefixindex' => 'Indiçe de voxi pe létie inçiâ',
+'prefixindex' => 'Indiçe arfabetico de voxe',
 'shortpages' => 'Paggine ciû cûrte',
 'longpages' => 'Paggine ciû longhe',
 'deadendpages' => 'Paggine sensa sciortîa',
@@ -825,7 +933,7 @@ Chi de segoito ti peu védde a descriçión inta [$2 pàgina de descriçión do
 'pager-older-n' => '{{PLURAL:$1|1 ciù vêgio|$1 ciù vêgi}}',
 
 # Book sources
-'booksources' => 'Fonti',
+'booksources' => 'Fonte libraie',
 'booksources-search-legend' => 'Çerca e fonti',
 'booksources-isbn' => 'Codice ISBN:',
 'booksources-go' => 'Vànni',
@@ -870,7 +978,7 @@ Ti te peu strinza a vista se ti te çerni un tipo de registro, un nomme de un ut
 # Special:ListGroupRights
 'listgrouprights-members' => '(Elenco di membri)',
 
-# E-mail user
+# Email user
 'emailuser' => "Invia 'na email a st'utente chi",
 'emailpage' => "Mandighe 'na léttia elettronega",
 'defemailsubject' => '{{SITENAME}} posta elettronega',
@@ -885,17 +993,17 @@ Ti te peu strinza a vista se ti te çerni un tipo de registro, un nomme de un ut
 'emailsenttext' => "A teua lettìa elettronega a l'è stæta spèdïa.",
 
 # Watchlist
-'watchlist' => 'A mæ lista in osservassion',
-'mywatchlist' => 'Lista in oservaçion',
+'watchlist' => 'Sotta osservassion',
+'mywatchlist' => 'Sotta oservaçion',
 'watchlistfor2' => 'Pe $1 $2',
 'watchnologin' => "Non ti t'æ entroö",
 'watchnologintext' => 'Devvi [[Special:UserLogin|entrâ]] pe cangiâ a toa lista in osservaçion.',
 'addedwatchtext' => "A paggina \"[[:\$1]]\" a l'è stæta azzonta a-a pròpia [[Special:Watchlist|lista in osservaçion]]. De chì in avanti, i cangiamenti fæti a-a paggina e a-a sêu discûxon sajàn missi in lista lì; o tittolo da paggina o sajà scrîo in '''grascietto''' inta paggina di [[Special:RecentChanges|ûrtimi cangiamenti]] coscì ti o veddi megio. Se ti vêu eliminâla da-a lista in osservaçion ciû târdi, sciacca \"no seguî\" inscia barra de d'âto.",
 'removedwatchtext' => 'A paggina "[[:$1]]" a l\'è stæta scassâa da-a têu lista in osservaçion.',
-'watch' => 'Inta lista in oservaçion',
+'watch' => 'Metti sotta oservaçion',
 'watchthispage' => "Vigilâ 'sta paggina",
-'unwatch' => 'No seguî',
-'watchlist-details' => "A lista d'oservaçión speçiâle a contegne {{PLURAL:$1|inna pàgina (co-a seu pàgina de discusción)|$1 pàgine (co-e lòro pàgine de discusción)}}.",
+'unwatch' => "Leva da sott'oservaçion",
+'watchlist-details' => "A lista d'oservaçión speçiâle a contegne {{PLURAL:$1|ina pàgina (co-a seu pàgina de discusción)|$1 de pàgine (co-e so pàgine de discusción)}}.",
 'watchlistcontains' => "A lista in osservaçion g'ha $1 {{PLURAL:$1|pagine|pagina}}.",
 'wlshowlast' => 'Famme vedde e ûrtime $1 ôe $2 giorni $3',
 'watchlist-options' => 'Inpostaçioìn di oservæ speciâli',
@@ -914,10 +1022,10 @@ Ti te peu strinza a vista se ti te çerni un tipo de registro, un nomme de un ut
 'delete-legend' => 'Scassa',
 'historywarning' => "Attension: A paggina c'a se sta pe scassâ a g'ha 'na cronologîa:",
 'confirmdeletetext' => "Ti stæ pe scassâ pe sempre da-o database 'na paggina ò 'n'immaggine, assemme a tûtta a sêu cronologîa. Pe cortexia, conferma che davvei ti vêu andâ avanti con quella cancellassion, che ti capisci perfettamente e conseguense de 'st'assion e che a s'adatta a-e linnie guidda stabilîe in [[{{MediaWiki:Policy-url}}]].",
-'actioncomplete' => 'Açion finïa',
+'actioncomplete' => 'Açion completâ',
 'actionfailed' => 'Açión falîa',
 'deletedtext' => 'A paggina "$1" a l\'è stæta scassâa. Consûltâ o $2 pe \'na lista de-e paggine scassæ de reçente.',
-'dellogpage' => 'Registro de-e cose scassæ',
+'dellogpage' => 'Registro de cose scassæ',
 'deletecomment' => 'Raxon:',
 'deleteotherreason' => 'Ûn âtro motivo',
 'deletereasonotherlist' => "Ûnn'âtra raxon",
@@ -932,8 +1040,8 @@ L'ûrtimo cangiamento o ghe l'à fæto [[User:$3|$3]] ([[User talk:$3|Ciæti]]).
 'revertpage' => 'E modificaçioin de [[Special:Contributions/$2|$2]] ([[User talk:$2|Ciæti]]) son stæte eliminæ; riportæ a verscion de primma de [[User:$1|$1]]',
 
 # Protect
-'protectlogpage' => 'Protessioîn',
-'protectedarticle' => 'l\'à protetto "[[$1]]"',
+'protectlogpage' => 'Protessioin',
+'protectedarticle' => 'l\'à protetto "[[$1]]"',
 'prot_1movedto2' => '[[$1]] mesciòu a [[$2]]',
 'protect-legend' => 'Confermâ protession',
 'protectcomment' => 'Raxon:',
@@ -982,13 +1090,13 @@ $1',
 'blanknamespace' => '(Prinçipâ)',
 
 # Contributions
-'contributions' => "Contribussioìn de l'utente",
+'contributions' => 'Contribuçioin {{GENDER:$1|utente}}',
 'contributions-title' => 'Contribuçioìn de $1',
-'mycontris' => 'Mæ contribuçioin',
+'mycontris' => 'Contribuçioin',
 'contribsub2' => 'Pe $1 ($2)',
 'uctop' => '(ûrtima pe-a paggina)',
-'month' => 'Partendo da-o méize (e precedénti):',
-'year' => "Partendo da l'anno (e preçedenti):",
+'month' => 'Partindo da-o meize (e precedénti):',
+'year' => "Partindo da l'anno (e precedenti):",
 
 'sp-contributions-newbies' => 'Fanni védde sôlo e contribuçioìn di nêuvi utenti',
 'sp-contributions-newbies-sub' => 'Pe i nêuvi ûtenti',
@@ -998,25 +1106,25 @@ $1',
 'sp-contributions-talk' => 'Ciæti',
 'sp-contributions-search' => 'Riçerca contribuçioìn',
 'sp-contributions-username' => 'Indirìsso IP ò nómme utente:',
-'sp-contributions-toponly' => "Fanni védde sôlo i ùrtimi cangiaménti che son inte l'ùrtime revixioìn da pàgina",
+'sp-contributions-toponly' => "Fanni védde sôlo i cangiaménti ch'en i ùrtime revixoìn da pàgina",
 'sp-contributions-submit' => 'Çerca',
 
 # What links here
-'whatlinkshere' => 'Cöse se colega chì',
+'whatlinkshere' => 'Cöse se colega chì',
 'whatlinkshere-title' => "Pàgine c'apontàn a $1",
 'whatlinkshere-page' => 'Pàgina:',
 'linkshere' => "E pàgine segoenti apontan a '''[[:$1]]''':",
 'nolinkshere' => "Nisciùnn-a pàgina a se collega con '''[[:$1]]'''.",
-'isredirect' => 'redirect',
+'isredirect' => 'Paggina de rindirissamento',
 'istemplate' => 'Incluxon',
 'isimage' => 'Colegamento a file',
-'whatlinkshere-prev' => '{{PLURAL:$1|preçedente|preçedenti $1}}',
+'whatlinkshere-prev' => '{{PLURAL:$1|precedente|precedenti $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|sûccescivo|sûccescivi $1}}',
 'whatlinkshere-links' => '← colegaménti',
-'whatlinkshere-hideredirs' => '$1 redirect',
+'whatlinkshere-hideredirs' => '$1 i rendirissamenti',
 'whatlinkshere-hidetrans' => '$1 Incluxon',
 'whatlinkshere-hidelinks' => '$1 colegaménti',
-'whatlinkshere-hideimages' => '$1 colegaménti da inmàgini',
+'whatlinkshere-hideimages' => '$1 colegaménti di file',
 'whatlinkshere-filters' => 'Filtri',
 
 # Block/unblock
@@ -1031,14 +1139,14 @@ $1',
 'anononlyblock' => 'Non ti tè registroö. Non ti peu fanni de i cangiamenti! (Registräse o non vegne ninte!)',
 'emailblock' => 'posta elettronega affermaä',
 'ipblocklist-empty' => "A lista de e affermaçioin a l'è veua.",
-'blocklink' => 'Afermaçion',
+'blocklink' => 'Blocca',
 'unblocklink' => 'sblòcca',
 'change-blocklink' => 'càngia blòcco',
 'contribslink' => 'Contribuçioìn',
 'autoblocker' => 'Affermoö automaticamente perchè o teu indirisso IP o l\'è stæto usöo da "[[User:$1|$1]]" neuvamente. A razon dæta pe affermâ $1 a l\'è stæta:
 "$2"',
 'blocklogpage' => 'Blòcchi',
-'blocklogentry' => "l'a blocòu [[$1]] pe in periodo de $2 $3",
+'blocklogentry' => 'blocòu [[$1]] pe in periodo de $2 $3',
 'blocklogtext' => "Sta chie a l'è unn-a lista de affermaçioin fæte e levæ.
 I indirissi IP affermæ automaticamente non son  consideræ.
 Veddi a [[Special:BlockList|Lista de i indirissi IP affermæ]] pe e informaçioin neuve.",
@@ -1079,7 +1187,7 @@ Inte 'sti câxi, se o se vêu fâ coscì, o se deive stramûâ ò azzonze manual
 'talkexists' => "'''A paggina a l'è stæta stramûâa correttamente, ma o no l'è stæto poscibbile stramûâ a paggina de discûxon perché ghe n'è zà 'n'âtra co-o nêuvo tittolo. O se deive inserî manualmente i contegnûi de tûtte e doe.'''",
 'movedto' => 'Stramûâa a',
 'movetalk' => 'Stramûâ anche a paggina de discûxon',
-'movelogpage' => 'Lista di remesci',
+'movelogpage' => 'Lista di stramûi',
 'movereason' => 'Raxon',
 'revertmove' => 'Ristorâ',
 'delete_and_move' => 'Scassa e mescia',
@@ -1092,7 +1200,7 @@ Inte 'sti câxi, se o se vêu fâ coscì, o se deive stramûâ ò azzonze manual
 # Namespace 8 related
 'allmessages' => 'Messaggi do scistemma',
 'allmessagesname' => 'Nomme',
-'allmessagesdefault' => 'Testo di default',
+'allmessagesdefault' => 'Testo predefinio',
 'allmessagescurrent' => 'Testo corrente',
 'allmessagestext' => "Sta chie a l'è unn-a lista de messaggi do scistema in ta MediaWiki.",
 'allmessagesnotsupportedDB' => "'''{{ns:special}}:Allmessages''' o non ti te peu vedde, perchè '''\$wgUseDatabaseMessages''' o non l'è attivo.",
@@ -1112,20 +1220,20 @@ Inte 'sti câxi, se o se vêu fâ coscì, o se deive stramûâ ò azzonze manual
 'tooltip-pt-preferences' => 'E mæ preferense',
 'tooltip-pt-watchlist' => 'A lista de-e pagine che ti æ sotta osservaçion',
 'tooltip-pt-mycontris' => 'E mæ contribuçioìn',
-'tooltip-pt-login' => "Consegiêmo a registraçión, scibén a no l'è d'òbligo.",
+'tooltip-pt-login' => "Consegemmo a registraçión, ma a no l'è obrigatoia.",
 'tooltip-pt-logout' => 'Sciortîa (logout)',
-'tooltip-ca-talk' => 'Fanni védde e discuscioìn in sca pagina.',
-'tooltip-ca-edit' => "O se pêu modificâ sta pagina. Pe piaxei scia dêuvie o pommello d'anteprìmma primma de sarvâla.",
-'tooltip-ca-addsection' => "Iniçia 'na nêuva seçión",
+'tooltip-ca-talk' => 'Discuscion riguardo a sta paggina.',
+'tooltip-ca-edit' => "Ti pêu modificâ sta paggina. Pe piaxei dêuvia o pomello d'anteprimma primma de sarvâla.",
+'tooltip-ca-addsection' => "Inça 'na seçión nêuva",
 'tooltip-ca-viewsource' => "'Sta pagina a l'è protetta, ma ti peu védde o sêu còdice sorgente.",
 'tooltip-ca-history' => 'Verscioìn précedenti da pàgina',
-'tooltip-ca-protect' => "Proteze 'sta paggina",
+'tooltip-ca-protect' => "Protezi 'sta paggina",
 'tooltip-ca-delete' => 'Scancella sta pàgina',
-'tooltip-ca-move' => "Sposta 'sta paggina (cangia tittolo)",
+'tooltip-ca-move' => "Mescia 'sta paggina (cangia tittolo)",
 'tooltip-ca-watch' => "Azónzi 'sta pagina a-a teu lista d'oservaçion",
-'tooltip-ca-unwatch' => "Levâ sta pàgina d'inta têu lista d'oservaçion speçiâ",
+'tooltip-ca-unwatch' => "Leva sta pàgina da sott'oservaçion.",
 'tooltip-search' => 'Çerca {{SITENAME}}',
-'tooltip-search-go' => "Vànni inte 'na pàgina co-o sto tìtolo, se a l'existe",
+'tooltip-search-go' => "Vànni inte 'na pàgina con sto tìtolo, s'a l'existe",
 'tooltip-search-fulltext' => 'Çerca sto testo in scie pàgine',
 'tooltip-p-logo' => 'Vìxita a pàgina prinçipâ',
 'tooltip-n-mainpage' => 'Vìxita a pagina prinçipâ',
@@ -1138,8 +1246,8 @@ Inte 'sti câxi, se o se vêu fâ coscì, o se deive stramûâ ò azzonze manual
 'tooltip-t-whatlinkshere' => 'Lista de tùtte e pagine che son colegæ a sta chì.',
 'tooltip-t-recentchangeslinked' => 'Ùrtimi càngi de pàgine colegæ a quésta',
 'tooltip-feed-atom' => 'Feed Atom pe sta pàgina',
-'tooltip-t-contributions' => "Lista de-e contribûssioîn de quest'utente",
-'tooltip-t-emailuser' => "Inviâ 'n messaggio e-mail a quest'utente",
+'tooltip-t-contributions' => "Lista de contribûssioîn de quest'utente",
+'tooltip-t-emailuser' => "Invia 'n messaggio e-mail a quest'utente",
 'tooltip-t-upload' => 'Carega inmàgini ò archivi moltimedia',
 'tooltip-t-specialpages' => 'Lista de tùtte e pagine speçiâli',
 'tooltip-t-print' => 'Versción da stànpa pe sta pàgina',
@@ -1152,15 +1260,15 @@ Inte 'sti câxi, se o se vêu fâ coscì, o se deive stramûâ ò azzonze manual
 'tooltip-ca-nstab-template' => 'Veddi o template',
 'tooltip-ca-nstab-help' => "Veddi a paggina d'agiûtto",
 'tooltip-ca-nstab-category' => 'Veddi a paggina da categorîa',
-'tooltip-minoredit' => 'Segnalâ comme cangiaménto minô',
+'tooltip-minoredit' => 'Marchilo comme cangiaménto minô',
 'tooltip-save' => 'Sarva i cangiaménti',
-'tooltip-preview' => 'Anteprimma de-e modiffiche (conseggiâa, primma de sarvâ!)',
-'tooltip-diff' => "Ammîa e modiffiche che ti ti gh'æ fæto a-o testo.",
+'tooltip-preview' => 'Anteprimma de modiffiche (fannila, primma de sarvâ!)',
+'tooltip-diff' => "Ammîa e modiffiche che t'æ fæto a-o testo.",
 'tooltip-compareselectedversions' => 'Amia e diferense tra e doê verscioìn seleçionæ de sta paggina chì.',
 'tooltip-watch' => "Azónzi sta pàgina a-a têu lista d'osservæ speçiâli",
 'tooltip-rollback' => "\"Rollback\" scancella i cangiaménti de sta pàgina de l'ùrtimo ch'o l'à fæto 'n càngio co-in click do ràtto",
-'tooltip-undo' => '"Anùlla" o pérmette de anulâ sto cangiaménto e arve il modolo de cangiaménto into mòddo anteprìmma. Ti peu ascì métte a raxón inte l\'ògétto do cangiaménto.',
-'tooltip-summary' => "Scrîvi 'na scintezi",
+'tooltip-undo' => '"Anùlla" o permette de anulâ sto cangiaménto e o l\'arve o modolo de cangiaménto into modalitæ anteprìmma. Ti peu ascì métte a raxón inte l\'ogetto do cangiaménto.',
+'tooltip-summary' => "Scrîvi 'na scintexi",
 
 # Stylesheets
 'common.css' => '/** o codiçe css scrïo chie o vegne azzounto in tutte e pagine */',
@@ -1177,8 +1285,8 @@ Inte 'sti câxi, se o se vêu fâ coscì, o se deive stramûâ ò azzonze manual
 'thumbsize' => 'Dimescion da a imàginetta:',
 'file-info-size' => '$1 × $2 pixel, dimenscioîn: $3, tippo MIME: $4',
 'file-nohires' => 'No ghe son verscioìn a rezoluçion ciù âta.',
-'svg-long-desc' => "archivio in formato SVG, dimenscioìn nominâli $1 × $2 pixel, dimenscioìn de l'archivio: $3",
-'show-big-image' => "Verscion d'ærta resolûxon",
+'svg-long-desc' => 'file in formato SVG, dimenscioìn nominâli $1 × $2 pixel, dimenscioin do file: $3',
+'show-big-image' => 'Verscion a ata resolûçion',
 
 # Special:NewFiles
 'newimages' => 'Gallerîa de nêuvi archivvi',
@@ -1188,12 +1296,12 @@ Inte 'sti câxi, se o se vêu fâ coscì, o se deive stramûâ ò azzonze manual
 # Bad image list
 'bad_image_list' => "O formato o l'è coscì:
 Van conscideræ sôlo e righe che comensan co-o càratere *.
-O primmo inganso in sce ògni riga o deiv'ese 'n inganso ch'o no fonçionn-a
-L'ingansi sucescivi, in scia mæxima riga, van conscideræ comme eceçioìn (pagine donde o file o pêu ese reciamòu normalmente).",
+O primmo ingancio in sce ògni riga o dev'ese 'n ingancio ch'o no fonçionn-a
+I inganci sucescivi, in scia mæxima riga, van conscideræ comme eceçioìn (pagine donde o file o pêu ese reciamòu normalmente).",
 
 # Metadata
 'metadata' => 'Metadati',
-'metadata-help' => "St'archivio o contegne informaçioìn in ciù, fòscia missa da-a fotocamera ò dò-u scanner adêuviòu pe creâla ò digitalissâla. Se l'archivio o l'è stæto cangiòu, çerti detàli porieivan no corisponde a-i cangi aportæ.",
+'metadata-help' => "Sto file o contegne de informaçioìn in ciù, fòscia misse da-a fotocamera ò dò-u scansô dêuviòu pe creâla ò digitalizâla. Se o file o l'è stæto cangiòu, çerti detàggi porieivan no corisponde a-i cangi aportæ.",
 'metadata-expand' => 'Fâ vedde dettaggi',
 'metadata-collapse' => 'Asconde dettaggi',
 'metadata-fields' => "I cànpi relativi a-i metadati EXIF elencæ inte 'sto messaggio saiàn in sciâ pàgina de l'inmàgine quande a tabella di metadati a saiâ inta forma cùrta. Cómme predefinîo, i âtri cànpi saiàn ascozi.
@@ -1218,13 +1326,13 @@ L'ingansi sucescivi, in scia mæxima riga, van conscideræ comme eceçioìn (pag
 'exif-filesource' => 'Reixe do papê',
 
 # External editor support
-'edit-externally' => "Càngia st'archivio con 'na applicaçión esterna",
+'edit-externally' => 'Càngia sto file co-in programma esterno',
 'edit-externally-help' => 'Pe avéi ciù informaçioìn amia e [//www.mediawiki.org/wiki/Manual:External_editors istruçioìn] (in ingléize)',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'Tùtti',
 'namespacesall' => 'Tùtti',
-'monthsall' => 'tùtti',
+'monthsall' => 'tutti',
 
 # Multipage image navigation
 'imgmultipageprev' => '← Pagina de primma',
@@ -1257,7 +1365,7 @@ L'ingansi sucescivi, in scia mæxima riga, van conscideræ comme eceçioìn (pag
 'watchlisttools-raw' => 'Modiffica a lista in formato testo',
 
 # Core parser functions
-'duplicate-defaultsort' => 'Atençión: a ciâve de ordinaménto predefinîa "$2" va in çimma a quella de prìmma "$1".',
+'duplicate-defaultsort' => 'Atençión: a ciâve de ordinaménto predefinîa "$2" a sostitoisce quella de primma "$1".',
 
 # Special:Version
 'version' => 'Verscion',
@@ -1266,14 +1374,14 @@ L'ingansi sucescivi, in scia mæxima riga, van conscideræ comme eceçioìn (pag
 'specialpages' => 'Pagine speçiâli',
 
 # External image whitelist
-'external_image_whitelist' => " #Lasciâ sta rîga cómme a l'é<pre>
-#Inserî i pessi de esprescioìn regolari (sôlo a pàrte che va fra //) di segoito
+'external_image_whitelist' => " #Lascia sta riga comm'a l'é<pre>
+#Inseisci i pessi de esprescioìn regolari (sôlo a pàrte ch'a va fra e //) chì sotta
 #Ste chi saiàn misse a confronto co-i indirìssi URL de inmàgini esterne (hotlinked)
-#E corispondense saiàn mostrate cómme inmàgini, âtriménti saiâ mostròu sôlo in colegaménto
-#E righe che iniçian con # son consideræ coménti
-#A diferensa tra maioscole e minoscole a no l'è significatîva
+#E corispondense saiàn mostræ cómme inmàgini, donca saiâ mostròu sôlo in colegaménto
+#E righe che començan con # son conscideræ coménti
+#A diferensa tra maioscole e minoscole a no l'è scignificatîva
 
-#Inserî sovia sta rîga tùtti i frammenti de regex. Lasciâ sta rîga cómme a l'é</pre>",
+#Inseisci sovia sta rîga tùtti i frammenti de regex. Lascia sta rîga ezattamente comm'a l'é</pre>",
 
 # Special:Tags
 'tag-filter' => 'Filtra pe [[Special:Tags|etichetta]]:',
index 6f91fe0..ab46f41 100644 (file)
@@ -213,8 +213,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Rodyti stebinčių naudotojų skaičių',
 'tog-oldsig' => 'Esamo parašo peržiūra:',
 'tog-fancysig' => 'Laikyti parašą vikitekstu (be automatinių nuorodų)',
-'tog-externaleditor' => 'Pagal nutylėjimą naudoti išorinį redaktorių (skirta tik ekspertams, nes reikia atitinkamai paruošti jūsų kompiuterį. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'Pagal nutylėjimą naudoti išorinę skirtumų rodymo programą (tik ekspertams, nes reikia atitinkamai  paruošti jūsų kompiuterį. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
 'tog-showjumplinks' => 'Įjungti „peršokti į“ pasiekiamumo nuorodas',
 'tog-uselivepreview' => 'Naudoti tiesioginę peržiūrą (JavaScript) (Eksperimentinis)',
 'tog-forceeditsummary' => 'Klausti, kai palieku tuščią keitimo komentarą',
@@ -228,6 +226,7 @@ $messages = array(
 'tog-diffonly' => 'Nerodyti puslapio turinio po skirtumais',
 'tog-showhiddencats' => 'Rodyti paslėptas kategorijas',
 'tog-norollbackdiff' => 'Nepaisyti skirtumo atlikus atmetimą',
+'tog-useeditwarning' => 'Perspėti mane, kai palieku redagavimo puslapį, o jame yra neišsaugotų pakeitimų',
 
 'underline-always' => 'Visada',
 'underline-never' => 'Niekada',
@@ -946,6 +945,7 @@ Jis jau egzistuoja.',
 'defaultmessagetext' => 'Numatytasis pranešimo tekstas',
 'invalid-content-data' => 'Neleistinas turinys.',
 'content-not-allowed-here' => 'Turinys "$1" puslapyje [[$2]] nėra leistinas.',
+'editwarning-warning' => 'Palikdamas šį puslapį jūs prarasite visus padarytus pakeitimus.',
 
 # Content models
 'content-model-wikitext' => 'wikitekstas',
@@ -1219,15 +1219,6 @@ Prašome patikrinti sąrašus.',
 'search-external' => 'Išorinė paieška',
 'searchdisabled' => 'Projekto {{SITENAME}} paieška yra uždrausta. Galite pamėginti ieškoti Google paieškos sistemoje. Paieškos sistemoje projekto {{SITENAME}} duomenys gali būti pasenę.',
 
-# Quickbar
-'qbsettings' => 'Greitasis pasirinkimas',
-'qbsettings-none' => 'Nerodyti',
-'qbsettings-fixedleft' => 'Fiksuoti kairėje',
-'qbsettings-fixedright' => 'Fiksuoti dešinėje',
-'qbsettings-floatingleft' => 'Plaukiojantis kairėje',
-'qbsettings-floatingright' => 'Plaukiojantis dešinėje',
-'qbsettings-directionality' => 'Pataisyta, priklausomai nuo jūsų rašybos ir kalbos krypties',
-
 # Preferences page
 'preferences' => 'Nustatymai',
 'mypreferences' => 'Mano nustatymai',
@@ -1755,7 +1746,6 @@ Dėl saugumo, img_auth.php yra išjungtas.',
 'http-read-error' => 'HTTP skaitymo klaida.',
 'http-timed-out' => 'HTTP užklausos laikas baigėsi.',
 'http-curl-error' => 'Klaida siunčiantis URL: $1',
-'http-host-unreachable' => 'Nepavyko pasiekti URL.',
 'http-bad-status' => 'Iškilo problemų vykdant HTTP užklausą: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2950,13 +2940,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ė',
 
index 8f60e6c..af02732 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',
index 441f112..50d4d30 100644 (file)
@@ -1733,6 +1733,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.
@@ -3006,11 +3014,6 @@ Var arī lietot [[Special:EditWatchlist|standarta izmainīšanas lapu]].',
 'version-software-version' => 'Versija',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Failu adreses',
-'filepath-page' => 'Fails:',
-'filepath-submit' => 'Atrast',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Meklēt failu kopijas',
 'fileduplicatesearch-summary' => 'Meklē dublējošos failus, izmantojot uz jaucējfunkcijas vērtības.',
index 833d0ff..3db21e5 100644 (file)
@@ -177,8 +177,6 @@ $messages = array(
 'tog-shownumberswatching' => '放哨有',
 'tog-oldsig' => '覽原署名:',
 'tog-fancysig' => '署以本碼待之(免自連)',
-'tog-externaleditor' => '它器修文(高人用,需設之。[//www.mediawiki.org/wiki/Manual:External_editors 閱。])',
-'tog-externaldiff' => '它器修異(高人用,需設之。[//www.mediawiki.org/wiki/Manual:External_editors 閱。])',
 'tog-showjumplinks' => '鏈往字',
 'tog-uselivepreview' => '即覽嚐鮮(JavaScript)',
 'tog-forceeditsummary' => '漏概醒之',
@@ -490,6 +488,9 @@ $1',
 'formerror' => '有誤:表不可呈',
 'badarticleerror' => '此頁莫為之',
 'cannotdelete' => '頁或檔"$1"刪矣,不復為之。',
+'cannotdelete-title' => '刪「$1」不能也。',
+'delete-hook-aborted' => '鈎纂消矣。
+無解也。',
 'badtitle' => '無此題',
 'badtitletext' => '或別、或缺、或違、或他山謬鏈,此題不存也。',
 'perfcached' => '下為謄本,恐不新也。 A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
@@ -498,6 +499,7 @@ $1',
 函式: $1<br />
 問語: $2',
 'viewsource' => '覽源',
+'viewsource-title' => '查$1之案',
 'actionthrottled' => '無為',
 'actionthrottledtext' => '基反垃圾之量,於短時中限欲,爾之上限已過。數分後再試之。',
 'protectedpagetext' => '該頁被錮無纂也。',
@@ -523,11 +525,25 @@ $2',
 
 子可匿名還覽{{SITENAME}},或<span class='plainlinks'>[$1 復登]</span>同簿、異簿。
 未清謄本,覽器文舊,且慎之。",
+'welcomeuser' => '$1居,惠迎!',
+'welcomecreation-msg' => '子簿建矣。
+
+請更簿註乎[[Special:Preferences|此]]。',
 'yourname' => '名',
+'userlogin-yourname' => '簿名',
+'userlogin-yourname-ph' => '輸簿名',
 'yourpassword' => '符節',
+'userlogin-yourpassword' => '符節',
+'userlogin-yourpassword-ph' => '輸子符節',
+'createacct-yourpassword-ph' => '輸一符節',
 'yourpasswordagain' => '復核節',
+'createacct-yourpasswordagain' => '訂子符節',
+'createacct-yourpasswordagain-ph' => '復輸符節',
 'remembermypassword' => '吾之簿通越(達至$1日)',
+'userlogin-remembermypassword' => '記吾',
+'userlogin-signwithsecure' => '以安全伺服登簿',
 'securelogin-stick-https' => '登後仍以HTTPS通接',
+'password-change-forbidden' => '符節不能改乎此維基也。',
 'externaldberror' => '認庫之錯或禁更爾之外簿。',
 'login' => '登簿',
 'nav-login-createaccount' => '登簿、增簿',
@@ -537,17 +553,22 @@ $2',
 'logout' => '去簿',
 'userlogout' => '去簿',
 'notloggedin' => '尚未登簿',
+'userlogin-noaccount' => '無簿乎?',
+'userlogin-joinproject' => '入{{SITENAME}}',
 'nologin' => '無簿乎?往$1。',
 'nologinlink' => '增簿',
 'createaccount' => '增簿',
 'gotaccount' => '有簿矣哉?往$1。',
 'gotaccountlink' => '登簿',
 'userlogin-resetlink' => '君忘登簿所需爾?',
+'helplogin-url' => 'Help:登簿',
 'createaccountmail' => '同郵',
 'createaccountreason' => '因:',
+'createacct-benefit-body3' => '是月纂者',
 'badretype' => '符節不合也。',
-'userexists' => '簿名存矣,惠更之',
+'userexists' => '簿名存矣,惠更之',
 'loginerror' => '登簿誤然',
+'createacct-error' => '建簿未成',
 'createaccounterror' => '無增簿:$1',
 'nocookiesnew' => '{{SITENAME}}簿增而未登,惠准cookies後再登之。',
 'nocookieslogin' => '登簿{{SITENAME}}須cookies,惠准之後登。',
@@ -556,7 +577,7 @@ $2',
 'noname' => '缺簿名,或不格也。',
 'loginsuccesstitle' => '登簿成矣',
 'loginsuccess' => "'''$1'''登{{SITENAME}}矣",
-'nosuchuser' => '查無此人。',
+'nosuchuser' => '查無此人。惠請更名,或查大小寫。',
 'nosuchusershort' => '查無"$1",惠核之。',
 'nouserspecified' => '簿名須也',
 'login-userblocked' => '此簿已被封。登無簿也。',
@@ -585,6 +606,7 @@ $2',
 'emailconfirmlink' => '惠考郵驛',
 'invalidemailaddress' => '驛址不格,惠正略之。',
 'cannotchangeemail' => '電郵地址不可改于此wiki',
+'emaildisabled' => '是站不可遣函也。',
 'accountcreated' => '簿增矣',
 'accountcreatedtext' => '$1簿增矣',
 'createaccount-title' => '於{{SITENAME}}增簿',
@@ -594,11 +616,13 @@ $2',
 'usernamehasherror' => '簿名無含切細符也',
 'login-throttled' => '爾多試於此簿登中。
 請候再試之。',
+'login-abort-generic' => '登簿未成——棄',
 'loginlanguagelabel' => '語:$1',
 'suspicious-userlogout' => '爾欲無離也,可由壞瀏覽器或快枝代理呈送之。',
 
 # Email sending
 'php-mail-error-unknown' => '於 PHP mail() 參數現錯',
+'user-mail-no-addy' => '遣函豈能無址?',
 
 # Change password dialog
 'resetpass' => '變符',
@@ -1018,9 +1042,6 @@ $1",
 'search-external' => '外尋',
 'searchdisabled' => '{{SITENAME}}因性能而停用之。可Gooogle查之,乃之過時也。',
 
-# Quickbar
-'qbsettings-none' => '無',
-
 # Preferences page
 'preferences' => '簿註',
 'mypreferences' => '簿註',
@@ -1153,7 +1174,7 @@ $1",
 'userrights-no-interwiki' => '爾無權改他山wiki之簿權也。',
 'userrights-nodatabase' => '資料庫$1無存或非本地也。',
 'userrights-nologin' => '爾以有秩乲簿[[Special:UserLogin|登]]後以定簿之權也。',
-'userrights-notallowed' => '之簿無權定簿之權也。',
+'userrights-notallowed' => '之簿無權定簿之權也。',
 'userrights-changeable-col' => '爾所管轄',
 'userrights-unchangeable-col' => '非爾所轄',
 'userrights-irreversible-marker' => '$1*',
@@ -1457,7 +1478,6 @@ $1',
 'http-read-error' => 'HTTP讀錯。',
 'http-timed-out' => 'HTTP求之過時也。',
 'http-curl-error' => '取網址現錯之:$1',
-'http-host-unreachable' => '無達網址之。',
 'http-bad-status' => 'HTTP求時現問:$1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2395,13 +2415,8 @@ $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 用於印之出力也 */',
@@ -2409,13 +2424,8 @@ $1',
 
 # Scripts
 'common.js' => '/* 此之JavaScript將載於全簿之頁。 */',
-'standard.js' => '/* 此之JavaScript將載於用經典面之簿 */',
-'nostalgia.js' => '/* 此之JavaScript將載於用懷古面之簿 */',
 'cologneblue.js' => '/* 此之JavaScript將載於用馨藍面之簿 */',
 'monobook.js' => '/* 此之JavaScript將載於用單書面之簿 */',
-'myskin.js' => '/* 此之JavaScript將載於用吾風面之簿 */',
-'chick.js' => '/* 此之JavaScript將載於用窈窕面之簿 */',
-'simple.js' => '/* 此之JavaScript將載於用簡明面之簿 */',
 'modern.js' => '/* 此之JavaScript將載於用時髦面之簿 */',
 'vector.js' => '/* 此之JavaScript將載於用動力面之簿 */',
 
@@ -2441,13 +2451,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' => '動力',
 
@@ -2751,12 +2756,6 @@ MediaWiki乃為用之發,無擔之責也;亦無售目之默擔也。參GNU
 'version-software-product' => '品',
 'version-software-version' => '版',
 
-# Special:FilePath
-'filepath' => '檔路',
-'filepath-page' => '檔名:',
-'filepath-submit' => '往',
-'filepath-summary' => '此奇頁取一檔之整路。圖以全解像示之,他檔會以有關之程式啟動也。',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => '擇重檔',
 'fileduplicatesearch-summary' => '以重檔之切去查重也。',
index 9169dcb..cea81b7 100644 (file)
@@ -57,8 +57,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ध्यान राखैबला प्रयोक्ताक संख्या',
 'tog-oldsig' => 'अखुनका दस्खत',
 'tog-fancysig' => 'हस्ताक्षरकें विकिटेक्सटक रूपमे देखू (स्वचालित श्रृंखला हीन)',
-'tog-externaleditor' => "↓पूर्वनिर्धारित रूपेँ बाह्य सम्पादक क' उपयोग करू (केवल विशेषज्ञसभक लेल, एकरा लेल संगणक पर विशेष सेटिंग चाही। [//www.mediawiki.org/wiki/Manual:External_editors आओर जानकारी।])",
-'tog-externaldiff' => 'पुरान संस्करणमे अंतर देखेबाक हेतु पूर्वनिविष्ट रूपमे बाहरक परिवर्तनक प्रयोग करू',
 'tog-showjumplinks' => 'करू "तड़पान" भेटैबला लिंक सभ',
 'tog-uselivepreview' => 'करू चल पूर्वावलोकन (जावास्क्रिप्ट चाही) (प्रायोगिक)',
 'tog-forceeditsummary' => 'हमरा सचेत करू जखन हम खाली सम्पादम सारांशमे जाइ',
@@ -1038,15 +1036,6 @@ $3 द्वारा देल कारण अछि ''$2''",
 अहाँक गूगलक माध्यमसँ ऐ बीच ताकि सकै छी।
 मोन राखू जे तकर विवरणी {{अन्तर्जाल}} सामिग्री समयातीत भऽ सकैए।',
 
-# Quickbar
-'qbsettings' => 'त्वरित दृश्य',
-'qbsettings-none' => 'कोनो नै',
-'qbsettings-fixedleft' => 'वाम कात सटल',
-'qbsettings-fixedright' => 'दहिन दिस सटल',
-'qbsettings-floatingleft' => 'वाम कात घुमैत',
-'qbsettings-floatingright' => 'दहिन कात घुमैत',
-'qbsettings-directionality' => 'कीलित, अहाँक भाषाक लिपि दिशा-निर्देशपर आधारित',
-
 # Preferences page
 'preferences' => 'विकल्प',
 'mypreferences' => 'खासमखास',
@@ -1554,7 +1543,6 @@ $1',
 'http-read-error' => 'परिसंविद पठन भ्रम',
 'http-timed-out' => 'परिसंविद आग्रह कालातीत',
 'http-curl-error' => 'भ्रम निकालैबला सार्वत्रिक विभव संकेत:$1',
-'http-host-unreachable' => 'सार्वत्रिक विभव संकेत नै पाबि सकल',
 'http-bad-status' => 'परिसंविद आग्रह काल एकटा समस्या छल: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1860,15 +1848,6 @@ $1',
 'listusers-noresult' => 'कोनो प्रयोक्ता नै',
 'listusers-blocked' => '(प्रतिबन्धित)',
 
-# Special:ActiveUsers
-'activeusers' => 'सक्रिय प्रयोक्ता सभक सूची',
-'activeusers-intro' => 'ई ओहेन प्रयोक्ता सभक सूची अछि जे पछिला $1 {{PLURAL:$1|दिन|दिन}} मे किछु सक्रियता देखेने छथि।',
-'activeusers-count' => '$1 {{PLURAL:$1|सम्पादन|सम्पादन सभ}} paChilaa {{PLURAL:$3|दिन|$3 दिन}}',
-'activeusers-from' => 'प्रयोक्ता प्रदर्शन प्रारम्भ भेल:',
-'activeusers-hidebots' => 'स्वचालन नुकाउ',
-'activeusers-hidesysops' => 'संचालक नुकाउ',
-'activeusers-noresult' => 'कोनो प्रयोक्ता नै भेटल',
-
 # Special:ListGroupRights
 'listgrouprights' => 'प्रयोक्ता संवर्ग अधिकार',
 'listgrouprights-summary' => 'ई सभ प्रयोक्ता संवर्गक एकटा सूची अछि जे ऐ विकीपरपरिभाषित अछि ओकर संसर्गित प्रवेश अधिकारक संग।
@@ -2679,9 +2658,6 @@ $1 एकर प्रतिबन्धक कारण अछि : "$2"',
 'pageinfo-authors' => 'भिन्न लेखक संख्या',
 
 # Skin names
-'skinname-standard' => 'प्राचीन',
-'skinname-nostalgia' => 'गामसँ प्रेम',
-'skinname-simple' => 'साधारण',
 'skinname-modern' => 'आधुनिक',
 'skinname-vector' => 'सदिश',
 
@@ -2770,8 +2746,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',
index f43f755..7d7d374 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',
@@ -373,7 +371,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',
@@ -575,6 +573,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 +608,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''",
@@ -692,7 +697,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.",
@@ -740,21 +746,22 @@ Mety efa nanova tenimiafina na nanontany tenimiafina miserana angamba ianao.',
 
 # 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-text' => 'Fenoy ity fôrmiolera ity mba hamerenana ny tenimiafinao.',
 '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-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 +769,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',
@@ -869,6 +876,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.
@@ -991,6 +1001,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 +1190,7 @@ $3 santiôna{{PLURAL:}} natsonika tamin'ny [[:$2]]",
 'showhideselectedversions' => 'Aseho/asitrika ireo ny santiôna nofidiana',
 'editundo' => 'esory',
 'diff-multi' => "({{PLURAL:$1|Famerenana tokana|Famerenana $1}} nataon'ny {{PLURAL:$2|mpikambana iray|mpikambana $2}} tsy miseho)",
+'diff-multi-manyusers' => "Tsy naseho ny antiôna $1{{PLURAL:}} nataon'ny mpikambana $2.",
 
 # Search results
 'searchresults' => 'Valim-pikarohana',
@@ -1222,7 +1234,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 +1257,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 +1294,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)',
@@ -1339,6 +1343,7 @@ Fenoy araka ny datin'ny solosainan'ny mpitsidika",
 '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 +1384,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 +1588,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
@@ -1781,7 +1789,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>
@@ -2005,6 +2012,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',
@@ -2076,17 +2084,11 @@ Protokoly zaka <code>$1</code> aza ampiana ao amin'ny karokao izy ireo.",
 'listusers-noresult' => 'Tsy nahitana mpikambana.',
 'listusers-blocked' => '(voasakana)',
 
-# 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-from' => 'Aseho ny mpikambana hatry ny :',
-'activeusers-hidebots' => 'Asitriho ny robo',
-'activeusers-hidesysops' => 'Asitriho ny mpandrindra',
-'activeusers-noresult' => 'Tsy nahitana mpikambana.',
-
 # 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 +2109,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 +2140,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 +2148,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',
@@ -2269,6 +2264,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,7 +2277,7 @@ 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.",
@@ -2298,9 +2296,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 +2337,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
@@ -3313,4 +3312,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..2f373d6 100644 (file)
@@ -13,6 +13,7 @@
  * @author Kaganer
  * @author Lifeway
  * @author Сай
+ * @author Санюн Вадик
  */
 
 $fallback = 'ru';
@@ -86,7 +87,7 @@ $messages = array(
 # User preference toggles
 'tog-underline' => 'Кузе кылвер-влакым ӱлычын удыралаш?',
 'tog-justify' => 'Абзацым лопкыт дене тӧрлаш',
-'tog-hideminor' => 'Пытартыш тӧрлатымаш-влак лӱмер гыч изирак тӧрлатымаш-влакым ончыкташ огыл',
+'tog-hideminor' => 'Пытартыш тӧрлатымаш-влак радам гыч изи тӧрлатымаш-влакым кораҥдаш',
 'tog-hidepatrolled' => 'Тергыме тӧрлатымаш-влакым пытартыш тӧрлатымаш лӱмерыште шылташ',
 'tog-newpageshidepatrolled' => 'Тергыме лаштык-влакым у лаштык лӱмерыште шылташ',
 'tog-extendwatchlist' => 'Чыла вашталтышым, а пытартыш гына огылым ончыкташлан эскерыме лӱмерым кугемдаш',
@@ -105,18 +106,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 +175,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 +201,7 @@ $messages = array(
 'qbpageoptions' => 'Тиде лаштык',
 'qbmyoptions' => 'Мыйын лаштык-влак',
 'qbspecialpages' => 'Лӱмын ыштыме лаштык-влак',
+'faq' => 'ЧӱВаЙо (Чӱчкыдын вашлиялтше йодыш-влак)',
 
 # Vector skin
 'vector-action-addsection' => 'У ӱжашым тӱҥалаш',
@@ -203,14 +209,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 +259,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 +273,16 @@ $messages = array(
 'copyright' => 'Лаштыкыште возымо $1 йӧн дене почмо.',
 'copyrightpage' => '{{ns:project}}:Автор кертыж',
 'currentevents' => 'Кызытсе событий',
+'currentevents-url' => 'Project:Мо кызыт лийын',
 'disclaimers' => 'Вуйшиймаш деч кораҥмаш',
 'disclaimerpage' => 'Project:Вуйшиймаш деч кораҥмаш',
-'edithelp' => 'Тӧрлатымаште полыш',
+'edithelp' => 'Тӧрлатымаш полыш',
 'edithelppage' => 'Help:Тӧрлымаш',
 'helppage' => 'Help:Полшык',
 'mainpage' => 'Тӱҥ лаштык',
 'mainpage-description' => 'Тӱҥ лаштык',
 'portal' => 'Тӱшка',
+'portal-url' => 'Project:Пашазе-влакын тӱшкашт',
 'privacy' => 'Конфиденциальность политике',
 'privacypage' => 'Project:Конфиденциальность политике',
 
@@ -282,7 +291,7 @@ $messages = array(
 'ok' => 'Йӧра',
 'retrievedfrom' => 'Налме вер — "$1"',
 'youhavenewmessages' => 'Тендан $1 уло ($2).',
-'newmessageslink' => 'у увертыш-влак',
+'newmessageslink' => 'У серыш',
 'newmessagesdifflink' => 'пытартыш тӧрлатымаш',
 'editsection' => 'тӧрлаташ',
 'editold' => 'тӧрлаташ',
@@ -326,12 +335,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 +351,7 @@ $messages = array(
 'yourname' => 'Пайдаланышын лӱмжӧ:',
 'yourpassword' => 'Шолыпмут:',
 'yourpasswordagain' => 'Шолыпмутым угыч пуртымаш:',
-'remembermypassword' => 'Тиде ÐºÐ¾Ð¼Ð¿Ñ\8cÑ\8eÑ\82еÑ\80Ñ\8bÑ\88Ñ\82о мыйын шолыпмутым шарнаш (эн шуко $1 {{PLURAL:$1|кечылан|кечылан}})',
+'remembermypassword' => 'Тиде Ð±Ñ\80аÑ\83зеÑ\80Ñ\8bÑ\88Ñ\82е мыйын шолыпмутым шарнаш (эн шуко $1 {{PLURAL:$1|кечылан|кечылан}})',
 'yourdomainname' => 'Тендан домен:',
 'login' => 'Шке денет палымым ыште',
 'nav-login-createaccount' => 'Пураш/Регистрацийым эрте',
@@ -355,7 +364,8 @@ $messages = array(
 'createaccount' => 'Регистрацийым эрте',
 'gotaccount' => "Тый регистрацийым эртенат? '''$1'''.",
 'gotaccountlink' => 'Шке денет палымым ыште',
-'createaccountmail' => 'e-mail дене',
+'userlogin-resetlink' => 'Лӱмдам але шолыпмутдам монденда?',
+'createaccountmail' => 'Кӱчык жаплан чокым ыштыме шолыпмутым мылам e-mail дене колташ',
 'nosuchuser' => '"$1" лӱман пайдаланыше уке.
 Пайдаланышын лӱмыштӧ йӱкпале-влакын кугытшо тӱрыс лийшаш.
 Лӱмым чын возымым терге але [[Special:UserLogin/signup|регистрацийым эрте]].',
@@ -369,7 +379,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 +413,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 +425,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 +446,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 +507,7 @@ $messages = array(
 'lineno' => '$1 корно:',
 'compareselectedversions' => 'Ойырымо версий-влакым таҥастараш',
 'editundo' => 'чараш',
+'diff-multi' => '({{PLURAL:$1|не показана $1 промежуточная версия|не показаны $1 промежуточные версии|не показаны $1 промежуточных версий}} {{PLURAL:$2|$2 участника|$2 участников}})',
 
 # Search results
 'searchresults' => 'Кычалын мумо',
@@ -499,29 +519,36 @@ $messages = array(
 'notextmatches' => 'Лаштык-влакыште икгайлык возымо уке',
 'prevn' => 'кодшо {{PLURAL:$1|$1}}',
 'nextn' => 'весе {{PLURAL:$1|$1}}',
+'shown-title' => 'Лаштыкыште $1 {{PLURAL:$1|возымаш|возымашым}} ончыкташ',
 'viewprevnext' => 'Ончал ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-new' => "'''Тиде вики-проектыште «[[:$1]]» лӱман лаштыкым ышташ!'''",
 'searchhelp-url' => 'Help:Вуйлымаш',
 'searchprofile-articles' => 'Возымо лаштык-влак',
-'searchprofile-images' => 'Мультимедиа',
+'searchprofile-project' => 'Полыш да проект лаштык',
+'searchprofile-images' => 'Мультимедий',
 'searchprofile-everything' => 'Чыла',
+'searchprofile-advanced' => 'Кумдарак',
 'searchprofile-articles-tooltip' => 'Кычалмаш $1ште',
 'searchprofile-project-tooltip' => 'Кычалмаш $1ште',
 'searchprofile-images-tooltip' => 'Файл-влакым кычалмаш',
+'searchprofile-everything-tooltip' => 'Чыла лаштык-влакыште кычалаш (каҥашымаш лаштык-влакыштат)',
+'searchprofile-advanced-tooltip' => 'Искать в заданных пространствах имён',
 'search-result-size' => '$1 ({{PLURAL:$2|$2 мут|$2 мут}})',
+'search-result-category-size' => '$1 {{PLURAL:$1|вхождение|вхождения|вхождений}} ($2 {{PLURAL:$2|подкатегория|подкатегории|подкатегорий}}, $3 {{PLURAL:$3|файл|файла|файлов}}).',
 'search-redirect' => '($1 вес вере колтымаш)',
 'search-section' => '(ужаш $1)',
 'search-suggest' => 'Але те $1 возынеда ыле',
 'search-interwiki-caption' => 'Родо проект-влак',
 'search-interwiki-default' => "$1'ште мумо:",
 'search-interwiki-more' => '(эше)',
+'searchrelated' => 'кылдалтше',
 'searchall' => 'чыла',
-'nonefound' => "'''Ð\95Ñ\88аÑ\80Ñ\82Ñ\8bÑ\88''':  Ð\9fоÑ\81на ÐºÐ°Ð»Ð°Ñ\81Ñ\8bме Ð¾Ð³Ñ\8bл Ð´Ñ\8bк, ÐºÑ\8bÑ\87алмаÑ\88 Ñ\8eжо Ð»Ó±Ð¼-влакÑ\8bн ÐºÑ\83мдÑ\8bкÑ\8bÑ\88Ñ\82о Ñ\8dÑ\80Ñ\82а. Ð£Ð»Ð¾ Ð»Ó±Ð¼-влакÑ\8bн ÐºÑ\83мдÑ\8bкÑ\8bÑ\88Ñ\82о ÐºÑ\8bÑ\87алаÑ\88лан(Ñ\87ӱкÑ\82ен ÐºÐ°Ò¥Ð°Ñ\88Ñ\8bмаÑ\88 Ð»Ð°Ñ\88Ñ\82Ñ\8bк-влакÑ\8bм, Ñ\8fмдÑ\8bлÑ\8bк-влакÑ\8bм Ð¸ Ñ\82Ñ\83ге Ð¼Ð¾Ð»Ð°Ñ\82) Ñ\88ке Ð¹Ð¾Ð´Ð¼Ð°Ñ\88Ñ\8bÑ\88Ñ\82еÑ\82 ''all:'' Ð¿Ñ\80еÑ\84икÑ\81Ñ\8bм ÐºÑ\83Ñ\87Ñ\8bлÑ\82, Ð°Ð»Ðµ ÐºÓ±Ð»ÐµÑ\88ан Ð»Ó±Ð¼-влакÑ\8bн ÐºÑ\83мдÑ\8bкÑ\8bм Ð¾Ð½Ñ\87Ñ\8bкÑ\82о.",
-'search-nonefound' => 'ТÑ\8bйÑ\8bн Ð¹Ð¾Ð´Ñ\8bÑ\88лан Ð½Ð¸Ð¼Ð¾Ð¼ ÐºÑ\8bÑ\87ален Ð¼Ñ\83мо Ñ\83ке.',
+'nonefound' => "'''Ð\95Ñ\88аÑ\80Ñ\82Ñ\8bÑ\88''':  Ð\9fоÑ\81на Ð¿Ð°Ð»ÐµÐ¼Ð´Ñ\8bме Ð¾Ð³Ñ\8bл Ð³Ñ\8bн, ÐºÑ\8bÑ\87алмаÑ\88 Ñ\8eжо Ð»Ó±Ð¼-влак ÐºÐ¾ÐºÐ»Ð°Ñ\88Ñ\82е Ð³Ñ\8bна Ñ\8dÑ\80Ñ\82а. Ð§Ñ\8bла Ð»Ð°Ñ\88Ñ\82Ñ\8bк-влак ÐºÐ¾ÐºÐ»Ð°Ñ\88Ñ\82е ÐºÑ\8bÑ\87алаÑ\88лан (каҥаÑ\88Ñ\8bмаÑ\88, Ñ\8fмдÑ\8bлÑ\8bк-влак Ð´Ð° Ñ\82.м.) Ñ\88ке Ð¹Ð¾Ð´Ð¼Ð°Ñ\88Ñ\8bÑ\88Ñ\82еÑ\82 ''all:'' Ð¿Ñ\80еÑ\84икÑ\81Ñ\8bм ÐºÑ\83Ñ\87Ñ\8bлÑ\82, Ð°Ð»Ðµ ÐºÓ±Ð»ÐµÑ\88ан Ð»Ó±Ð¼-влакÑ\8bм Ð¿Ð°Ð»ÐµÐ¼Ð´Ðµ.",
+'search-nonefound' => 'ТÑ\8bйÑ\8bн Ð¹Ð¾Ð´Ñ\8bÑ\88еÑ\82 Ð¿Ð¾Ñ\87еÑ\88 Ð½Ð¸Ð¼Ð¾ Ð¼Ñ\83алÑ\82Ñ\8bн Ð¾Ð³Ñ\8bл',
 'powersearch' => 'Сайынрак кычал',
 'powersearch-legend' => 'Сайынрак кычалаш',
 'powersearch-ns' => 'Кычалаш тиде лӱм-влакын кумдыкышт-влакыште:',
-'powersearch-redir' => 'Вес верек колтымо лаштык-влакым ончыкташ',
+'powersearch-redir' => 'Вес вере колтымо лаштык-влакым ончыкташ',
 'powersearch-field' => 'Кычалаш',
 'powersearch-togglelabel' => 'Сайлаш:',
 'powersearch-toggleall' => 'Чыла',
@@ -539,17 +566,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 +589,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 +604,8 @@ $messages = array(
 'gender-male' => 'Пӧръеҥ',
 'gender-female' => 'Ӱдырамаш',
 'email' => 'Электрон почто',
-'prefs-help-email' => 'Электрон почтын адресшым ончыктыде кертат, адакшым тудо моло ушнышо-влаклан тыйын лаштык гоч тый денет кылым кучаш йӧным ышта, тыгодымак нунылан палыдыме кодеш.',
+'prefs-help-email' => 'Электрон почтын адресым лучо возен кодыза. Трук шолыпмутым мондеда - шолпмутым Википедий электрон адресышкыда колта.',
+'prefs-help-email-others' => 'Моло пайдаланыше-влак тендан дене электрон почто гоч кылым кучен кертыт. Ты годым почтыдан адресше нигӧлан ок кой, лач лаштыкыштыда але каҥашымаш лаштыкыштыда серышым возашлан кылвер пыжыктыме лиеш.',
 'prefs-i18n' => 'Калык коклаште',
 'prefs-signature' => 'Кидпале',
 
@@ -606,16 +634,18 @@ $messages = array(
 'recentchanges-legend' => 'Пытартыш тӧрлатымаш-влакын келыштарымашышт',
 'recentchanges-summary' => 'Тиде лаштыкыште пытартыш тӧрлатымашым шекланаш.',
 'recentchanges-feed-description' => 'Тиде кылыште пытартыш тӧрлатымашым шекланаш.',
-'recentchanges-label-newpage' => 'Тиде тӧрлатымаш дене у лаштыкым ыштеныт',
-'recentchanges-label-minor' => 'Тиде изирак тӧрлатымаш',
+'recentchanges-label-newpage' => 'Тиде тӧрлатымаш дене у лаштык ышталтын',
+'recentchanges-label-minor' => 'Тиде изи тӧрлатымаш',
 'recentchanges-label-bot' => 'Тиде тӧрлатымашым бот ыштен',
-'recentchanges-label-unpatrolled' => 'Тиде тӧрлатымаш эше терген налын огыл',
+'recentchanges-label-unpatrolled' => 'Тиде тӧрлатымашым нигӧ терген огыл',
 'rcnote' => "Ӱлнӧ {{PLURAL:$1|'''1'''|'''$1'''}} вашталтыш пытартыш {{PLURAL:$2||'''$2'''}} кечылан, $5-лан, $4-лан.",
+'rcnotefrom' => "Ниже перечислены изменения с '''$2''' (не более '''$1''').",
 'rclistfrom' => '$1 гыч тӱҥалын у вашталтымашым ончыкташ',
-'rcshowhideminor' => 'Изирак тӧрлымым $1',
+'rcshowhideminor' => 'Изи тӧрлатымашым $1',
 'rcshowhidebots' => 'Бот-влакым $1',
 'rcshowhideliu' => 'Шолып пайдаланыше-влакым $1',
 'rcshowhideanons' => 'Ончыкталтше пайдаланыше-влакым $1',
+'rcshowhidepatr' => '$1 тергыме тӧрлатымаш',
 'rcshowhidemine' => 'Мыйын тӧрлымым $1',
 'rclinks' => 'Пытартыш $2 кечылан $1 вашталтымашым ончыкташ<br />$3',
 'diff' => 'ойырт.',
@@ -625,7 +655,7 @@ $messages = array(
 'minoreditletter' => 'и',
 'newpageletter' => 'У',
 'boteditletter' => 'б',
-'rc-enhanced-expand' => 'ТӱÑ\82кÑ\8bнÑ\80акÑ\8bм Ð¾Ð½Ñ\87Ñ\8bкÑ\82аÑ\88 (JavaScript кӱлеш)',
+'rc-enhanced-expand' => 'Ð\9fоказаÑ\82Ñ\8c Ð´ÐµÑ\82али  (JavaScript кӱлеш)',
 'rc-enhanced-hide' => 'Рашлык-влакым шылташ',
 
 # Recent changes linked
@@ -634,8 +664,8 @@ $messages = array(
 'recentchangeslinked-toolbox' => 'Ваш кылдалтше тӧрлатымаш-влак',
 'recentchangeslinked-title' => '"$1" лаштыклан кылдалтше тӧрлатымаш-влак',
 'recentchangeslinked-noresult' => 'Ончыктымо пагытыште кылдалтше лаштыклаште вашталтыш лийын огыл.',
-'recentchangeslinked-summary' => "Тиде Ñ\88Ñ\83кеÑ\80Ñ\82Ñ\81е Ð¾Ð³Ñ\8bл Ñ\82Ó§Ñ\80лÑ\8bмӧ Ð»Ð°Ñ\88Ñ\82Ñ\8bк-влакÑ\8bн, ÐºÑ\83дÑ\8bжо Ð¿Ð°Ð»ÐµÐ¼Ð´Ñ\8bме Ð»Ð°Ñ\88Ñ\82Ñ\8bк Ð´ÐµÐ½Ðµ ÐºÑ\8bлдалÑ\82Ñ\8bнÑ\8bÑ\82 (ала Ð¿ÐµÐ»ÐµÐ¼Ð´Ñ\8bме ÐºÐ°Ñ\82егоÑ\80ийÑ\8bÑ\88 Ð¿Ñ\83Ñ\80аÑ\82) Ð»Ó±Ð¼ÐµÑ\80же.
-[[Special:Watchlist|Тыйын эскерымаш лӱмерыш]] пурышо лаштык-влакым '''кӱжгӱн''' палемдыме.",
+'recentchangeslinked-summary' => "ЭÑ\82о Ñ\81пиÑ\81ок Ð½ÐµÐ´Ð°Ð²Ð½Ð¸Ñ\85 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ Ð² Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\85, Ð½Ð° ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ñ\81Ñ\81Ñ\8bлаеÑ\82Ñ\81Ñ\8f Ñ\83казаннаÑ\8f Ñ\81Ñ\82Ñ\80аниÑ\86а (или Ð²Ñ\85одÑ\8fÑ\89иÑ\85 Ð² Ñ\83казаннÑ\83Ñ\8e ÐºÐ°Ñ\82егоÑ\80иÑ\8e).
+Страницы, входящие в [[Special:Watchlist|ваш список наблюдения]] '''выделены'''.",
 'recentchangeslinked-page' => 'Лаштыкын лӱмжӧ:',
 'recentchangeslinked-to' => 'Тиде лаштык дене кылдалтше лаштык-влакыште тӧрлатымашым ончыкташ тидын олмеш',
 
@@ -648,6 +678,8 @@ $messages = array(
 'uploadedimage' => '«[[$1]]» пуртыш',
 'watchthisupload' => 'Тиде файлым эскераш',
 
+'license-header' => 'Лицензирований',
+
 # Special:ListFiles
 'imgfile' => 'файл',
 'listfiles_user' => 'Пайдаланыше',
@@ -655,12 +687,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 +711,10 @@ $messages = array(
 'filedelete-reason-otherlist' => 'Вес амал',
 
 # List redirects
-'listredirects' => 'Вес верек колтымаш-влак лӱмер',
+'listredirects' => 'Вес вере колтымаш-влак',
 
 # Random page
-'randompage' => 'Ð\92Ñ\83Ñ\87Ñ\8bдÑ\8bмо лаштык',
+'randompage' => 'ЧокÑ\8bм лаштык',
 
 # Statistics
 'statistics' => 'Иктешлымаш',
@@ -692,9 +725,9 @@ $messages = array(
 'statistics-header-hooks' => 'Тӱрлӧ коклам иктешлымаш',
 'statistics-articles' => 'Возымо лаштык-влак',
 'statistics-pages' => 'Лаштык-влак',
-'statistics-pages-desc' => 'Чыла лаштык-влак, чӱктен каҥашымаш лаштык-влакым, вес верек колтымо лаштык-влакым и туге молат',
+'statistics-pages-desc' => 'Чыла лаштык-влак (каҥашымаш-влак, вес вере колтымаш-влак да тулеч моло)',
 'statistics-files' => 'Пуртымо файл-влак',
-'statistics-edits' => '{{SITENAME}} шындымеке тӧрлымӧ чот',
+'statistics-edits' => '{{SITENAME}} лаштыкым чылажге мыняр гана тӧрлатыме',
 'statistics-edits-average' => 'Ик лаштыкым покшел тӧрлымӧ чот',
 'statistics-views-total' => 'Чылажге ончымо',
 'statistics-views-peredit' => 'Ик тӧрлатымашлан ончымо',
@@ -703,7 +736,7 @@ $messages = array(
 'statistics-users-active-desc' => 'Пытартыш {{PLURAL:$1|кечыште|$1 кечыште}} иктаж-мом ыштыше пайаланыше-влак',
 'statistics-mostpopular' => 'Эн чӱчкыдын ончымо лаштык-влак',
 
-'brokenredirects' => 'Пудыртымо вес верек колтымаш-влак',
+'brokenredirects' => 'Пудыртымо вес вере колтымаш-влак',
 'brokenredirects-edit' => 'тӧрлаташ',
 'brokenredirects-delete' => 'шӧраш',
 
@@ -715,7 +748,7 @@ $messages = array(
 'nviews' => '$1 {{PLURAL:$1|ончымо|ончымо-влак}}',
 'lonelypages' => 'Тулык лаштык-влак',
 'wantedcategories' => 'Ыштыман категорий-влак',
-'wantedpages' => 'Ыштыман лаштык-влак',
+'wantedpages' => 'Ыштышаш лаштык-влак',
 'wantedfiles' => 'Ыштыман файл-влак',
 'wantedtemplates' => 'Ыштыман ямдылык-влак',
 'prefixindex' => 'Чыла лаштык-влак префикс дене',
@@ -761,7 +794,7 @@ $messages = array(
 'listusers-blocked' => '(йӧн петырыме)',
 
 # Special:ActiveUsers
-'activeusers' => 'Чӱчкыдын пайдаланыше-влак лӱмер',
+'activeusers' => 'Чӱчкыдын пайдаланыше-влак',
 'activeusers-count' => 'Пытартыш $3 {{PLURAL:$3|кечыште|кечылаште}} $1 {{PLURAL:$1|тӧрлатымаш|тӧрлатымаш-влак}}',
 'activeusers-hidebots' => 'Бот-влакым шылташ',
 'activeusers-hidesysops' => 'Сайтвиктарыше-влакым шылташ',
@@ -769,12 +802,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 +816,7 @@ $messages = array(
 'watchthispage' => 'Тиде лаштыкым эскераш',
 'unwatch' => 'Эскерыман огыл',
 'unwatchthispage' => 'Эскерымым чарнаш',
-'watchlist-details' => 'ТÑ\8bйÑ\8bн Ñ\8dÑ\81кеÑ\80Ñ\8bмаÑ\88 Ð»Ó±Ð¼ÐµÑ\80Ñ\8bÑ\88Ñ\82е $1 {{PLURAL:$1|лаÑ\88Ñ\82Ñ\8bк|лаÑ\88Ñ\82Ñ\8bк-влак}}, ÐºÐ°Ò¥Ð°Ñ\88Ñ\8bмаÑ\88 Ð»Ð°Ñ\88Ñ\82Ñ\8bк-влакÑ\8bм Ñ\88оÑ\82лÑ\8bде.',
+'watchlist-details' => 'ЭÑ\81кеÑ\80Ñ\8bмаÑ\88 Ð»Ó±Ð¼ÐµÑ\80Ñ\8bÑ\88Ñ\82еÑ\82 $1 {{PLURAL:$1|лаÑ\88Ñ\82Ñ\8bк|лаÑ\88Ñ\82Ñ\8bк}} (каҥаÑ\88Ñ\8bмаÑ\88 Ð»Ð°Ñ\88Ñ\82Ñ\8bк-влакÑ\8bм Ñ\88оÑ\82лÑ\8bде)',
 'watchlistcontains' => 'Тыйын лӱмерыште $1 {{PLURAL:$1|лаштык|лаштык}}.',
 'wlshowlast' => 'Пытартыш $1 шагат $2 кечылан $3 ончыкташ',
 'watchlist-options' => 'Эскерыме лӱмерын келыштарымаш',
@@ -841,7 +875,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 +884,28 @@ $messages = array(
 'mycontris' => 'Мыйын паша',
 'contribsub2' => '$1 лан ($2)',
 'uctop' => '(пытартыш)',
-'month' => 'Могай тылзе гыч тӱҥалаш? (але ондакрак):',
-'year' => 'Могай ий гыч тӱҥалаш? (але ондакрак):',
+'month' => 'Могай тылзе гыч тӱҥалаш?',
+'year' => 'Могай ий гыч тӱҥалаш?',
 
 'sp-contributions-newbies' => 'У пайдалнышын гына пашам ончыкташ',
-'sp-contributions-blocklog' => 'йӧным вашталтыме журнал',
+'sp-contributions-blocklog' => 'блокирований журнал',
+'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 +921,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 +957,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 +972,7 @@ $messages = array(
 
 # Namespace 8 related
 'allmessagesname' => 'Лӱм',
+'allmessagesdefault' => 'Текст по умолчанию',
 'allmessages-filter-all' => 'Чыла',
 
 # Thumbnails
@@ -944,9 +981,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 +995,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 +1025,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 +1036,7 @@ $messages = array(
 Тый тӧрлатымаш амалже нерген возымо верыште  возын кертат.',
 
 # Browsing diffs
-'previousdiff' => '← Ондакрак тӧрлатымаш',
+'previousdiff' => '← Ончычсо тӧрлатымаш-влак',
 'nextdiff' => 'Вес тӧрлатымаш →',
 
 # Media information
@@ -1023,11 +1060,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 +1109,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..71ff1e2 100644 (file)
@@ -27,56 +27,55 @@ $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',
@@ -139,14 +138,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 +153,18 @@ $messages = array(
 
 'about' => 'Perihal',
 'article' => 'Artikel',
-'newwindow' => '(bukak di jandela baru)',
+'newwindow' => '(bukak di jendela baru)',
 'cancel' => 'Batalkan',
 'moredotdotdot' => 'Lainnyo...',
 'morenotlisted' => 'Salabiahnyo...',
 'mypage' => 'Laman',
 'mytalk' => 'Maota',
 'anontalk' => 'Diskusi IP ko',
-'navigation' => 'Pinteh',
+'navigation' => 'Navigasi',
 'and' => '&#32;jo',
 
 # Cologne Blue skin
-'qbfind' => 'Pancarian',
+'qbfind' => 'Cari',
 'qbbrowse' => 'Jalajah',
 'qbedit' => 'Suntiang',
 'qbpageoptions' => 'Laman ko',
@@ -179,9 +178,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 +188,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 +209,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 +225,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 +240,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,12 +253,12 @@ 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',
+'copyright' => 'Isi tasadio dalam $1',
 'copyrightpage' => '{{ns:project}}:Hak cipta',
 'currentevents' => 'Kajadian kini ko',
 'currentevents-url' => 'Project:Kajadian kini ko',
@@ -272,23 +271,23 @@ $1',
 'mainpage-description' => 'Palanta',
 'policy-url' => 'Project:Kabijakan',
 'portal' => 'Portal komunitas',
-'portal-url' => 'Portal:Komunitas',
-'privacy' => 'Kecipehan privasi',
-'privacypage' => 'Project:Kecipehan privasi',
+'portal-url' => 'Project:Portal komunitas',
+'privacy' => 'Kacipehan privasi',
+'privacypage' => 'Project:Kacipehan privasi',
 
 'badaccess' => 'Kasalahan hak akses',
-'badaccess-group0' => 'Sanak indak diizinkan untuak malakukan tindakan nan Sanak nio.',
-'badaccess-groups' => 'Tindakan nan Sanak nio dibatasi untuak pangguno dalam {{PLURAL:$2|kalompok}}: $1.',
+'badaccess-group0' => 'Sanak indak diizinkan untuak malakuan tindakan ko.',
+'badaccess-groups' => 'Tindakan nan Sanak nio babateh untuak pangguno dalam {{PLURAL:$2|kalompok}}: $1.',
 
-'versionrequired' => 'Dibutuahkan MediaWiki versi $1',
-'versionrequiredtext' => 'MediaWiki versi $1 dibutuahkan untuak manggunokan laman ko. Caliak [[Special:Version|versi laman]]',
+'versionrequired' => 'Dibutuahan MediaWiki versi $1',
+'versionrequiredtext' => 'MediaWiki versi $1 dibutuahan untuak manggunoan laman ko. Caliak [[Special:Version|versi laman]]',
 
 'ok' => 'OK',
 'pagetitle' => '$1 - {{SITENAME}} bahaso Minang',
 'pagetitle-view-mainpage' => '{{SITENAME}} bahaso Minang',
 'backlinksubtitle' => '← $1',
 'retrievedfrom' => 'Didapek dari "$1"',
-'youhavenewmessages' => 'Awak punyo $1 ($2).',
+'youhavenewmessages' => 'Sanak punyo $1 ($2).',
 'newmessageslink' => 'pasan baru',
 'newmessagesdifflink' => 'parubahan tarakhia',
 'youhavenewmessagesfromusers' => 'Sanak mandapek $1 dari {{PLURAL:$3|$3 pangguno}} ($2)',
@@ -302,9 +301,9 @@ $1',
 'editlink' => 'suntiang',
 'viewsourcelink' => 'caliak sumber',
 'editsectionhint' => 'Suntiang bagian: $1',
-'toc' => 'Dafta isi',
+'toc' => 'Daftar isi',
 'showtoc' => 'tampilkan',
-'hidetoc' => 'suruakkan',
+'hidetoc' => 'suruakan',
 'collapsible-collapse' => 'Ketekan',
 'collapsible-expand' => 'Kambangan',
 'thisisdeleted' => 'Caliak atau kambalian $1?',
@@ -313,18 +312,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 +334,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}}.',
+'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 tarsabuik',
 'nospecialpagetext' => '<strong>Sanak maminta 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 +376,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 +387,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 +431,94 @@ 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',
+'createacct-helpusername-url' => '{{ns:Project}}:Kabijakan namo pangguno',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(piliahan 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' => 'Masuak log jo 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?',
+'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-captcha-help-url' => '{{ns:Project}}:Mohon buekkan akun',
+'createacct-imgcaptcha-help' => 'Indak dapek mancaliak gambar? [[{{MediaWiki:createacct-captcha-help-url}}|Mohon buekkan akun]]',
+'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' => 'suntiangan',
+'createacct-benefit-body2' => 'laman',
+'createacct-benefit-body3' => 'kontributor 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 +529,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 +544,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 +577,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-text' => 'Isi formulir ko untuak maubah kato sandi.',
 '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-pretext' => '{{PLURAL:$1||Masuakan salah satu data di bawah ko}}',
 '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,9 +704,9 @@ 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.''",
@@ -686,8 +718,9 @@ Sanak dapek [[Special:Search/{{PAGENAME}}|malakukan pancarian untuak judul laman
 
 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 +742,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 +769,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 +787,8 @@ Sanak mungkin paralu manyalin teks suntiangan Sanak ko dan simpankan ka sabuah b
 Panguruih nan mangunci basis data maagiahan panjalehan barikuik: $1",
 'protectedpagewarning' => "'''Paringatan: Laman iko sadang dilinduangi sahinggo hanyo pangguno jo hak akses pangurus nan dapek manyuntiangnyo.'''
 Entri catatan tarakhir disadioan di bawah untuak referensi:",
-'semiprotectedpagewarning' => "'''Paringatan: Laman iko sadang dilinduangi sahinggo hanyo pangguno tadafta nan bisa manyuntiangnyo.'''
-Entri catatan tarakhir disadioan di bawah untuak referensi:",
+'semiprotectedpagewarning' => "'''Catatan:''' Laman ko sadang dilinduangi, jadi hanyo pangguno tadaftar nan dapek manyuntiangnyo.
+Entri log tarakhia disadioan di bawah untuak reperensi:",
 'cascadeprotectedwarning' => "'''Paringatan:''' Laman ko sadang dilinduangi jadi hanyo pangguno jo hak akses panguruih sajo nan dapek manyuntiangnyo karano disaratoan dalam {{PLURAL:$1|laman}} nan alah dilinduangi jo palinduangan batingkek:",
 'titleprotectedwarning' => "'''Paringatan: Laman iko alah dilinduangi sahinggo diparaluan [[Special:ListGroupRights|hak khusus]] untuak mambueknyo.'''
 Entri catatan tarakhir disadioan di bawah untuak referensi:",
@@ -776,9 +809,9 @@ Sanak dapek baliak dan manyuntiang laman nan alah ado, atau [[Special:UserLogin|
 'recreate-moveddeleted-warn' => "'''Ingek: Sanak mambuek ulang suatu laman nan alah dihapuih.'''
 
 Harap ditimbang apo rancak malanjuikan suntiangan Sanak.
-Barikuik ko log panghapuihan jo pamindahan dari laman ko:",
+Barikuik ko log pangapuihan jo pamindahan dari laman ko:",
 'moveddeleted-notice' => 'Laman ko alah dihapuih.
-Sabagai referensi, barikuik adolah log panghapuihan dan pamindahannyo.',
+Sabagai reperensi, barikuik adolah log pangapuihan dan pamindahannyo.',
 'log-fulllog' => 'Liek saluruah log',
 'edit-hook-aborted' => 'Suntiangan dibatalan samo kait parser
 tanpa ado katarangan.',
@@ -792,6 +825,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',
@@ -848,7 +882,7 @@ Alasan nan diagiah jo $3 adolah ''$2''",
 'next' => 'lanjuik',
 'last' => 'sabalun',
 'page_first' => 'awal',
-'page_last' => 'akhir',
+'page_last' => 'akhia',
 'histlegend' => "Bandiangkan pilihan: Tandoi revisi untuak mambandiangkan 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',
@@ -870,30 +904,30 @@ 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',
@@ -952,7 +986,7 @@ Sanak dapek malieknyo; rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/del
 'prevn-title' => '$1 {{PLURAL:$1|hasil}} sabalunnyo',
 'nextn-title' => '$1 {{PLURAL:$1|hasil}} barikuiknyo',
 'shown-title' => 'Tampilkan $1 {{PLURAL:$1|hasil}} per laman',
-'viewprevnext' => 'Caliakkan ($1 {{int:pipe-separator}} $2) ($3)',
+'viewprevnext' => 'Caliak ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-legend' => 'Atua pancarian',
 'searchmenu-exists' => "'''Ado laman nan banamo \"[[:\$1]]\" pado wiki ko.'''",
 'searchmenu-new' => "'''Buek laman \"[[:\$1]]\" di wiki ko!'''",
@@ -979,7 +1013,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 +1025,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 +1035,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 +1045,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 +1069,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 +1087,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 +1100,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 +1116,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 +1167,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.',
@@ -1192,6 +1217,21 @@ Alamaik surel Sanak indakkan tau dek urang nan manghubungi sanak tu.',
 'right-upload' => 'Mamuek berkas',
 'right-reupload' => 'Manimpo berkas lamo',
 'right-reupload-own' => 'Manimpo berkas nan dimuek surang',
+'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',
@@ -1207,6 +1247,8 @@ 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-writeapi' => 'manggunoan panulisan API',
+'action-import' => 'impor laman ko dari wiki lain',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|parubahan}}',
@@ -1220,14 +1262,14 @@ Alamaik surel Sanak indakkan tau dek urang nan manghubungi sanak tu.',
 '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 +1285,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 +1294,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:',
@@ -1300,9 +1351,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 +1361,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 +1426,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 +1463,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 +1504,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|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.',
+'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 +1562,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 +1592,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 +1616,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 +1663,42 @@ 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',
+
 # 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 +1713,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:',
@@ -1630,12 +1775,13 @@ 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',
+'undelete-cleanup-error' => 'Kasalahan sawaktu mangapuih arsip berkas "$1" nan indak digunoan.',
 
 # Namespace form on various pages
 'namespace' => 'Ruangnamo:',
@@ -1652,7 +1798,7 @@ 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',
@@ -1665,13 +1811,13 @@ Awak dapek maubah tingkek perlindungannyo, walaupun indak pangaruah pado perlind
 'sp-contributions-blocked-notice-anon' => 'Alamaik IP ko tangah diblokir.
 Entri log pamblokiran 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]]'''.",
@@ -1695,11 +1841,14 @@ Entri log pamblokiran tabaru ado di bawah ko untuak referensi:',
 '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,8 +1856,9 @@ 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.',
@@ -1717,7 +1867,7 @@ Entri log pamblokiran tabaru ado di bawah ko untuak referensi:',
 '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',
 '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 +1875,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 +1895,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',
@@ -1761,7 +1911,7 @@ Liek [[Special:BlockList|dafta sakek]] buek maninjaunyo.',
 'createaccountblock' => 'mambuek akun dimatian',
 'emailblock' => 'surel diblokir',
 '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',
@@ -1772,6 +1922,9 @@ Liek [[Special:BlockList|dafta sakek]] buek maninjaunyo.',
 Alasan disakek untuak $1 adolah "\'\'$2\'\'"',
 'blocklogpage' => 'Log sakek',
 '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',
@@ -1811,7 +1964,7 @@ Iko dapek maakibaikan parubahan nan indak dipakiroan pado laman nan populer; jad
 Dalam kasus tu, kok amuah Angku dapek mamindahkan ataupun manggabuangkan laman sacaro manual.",
 'movearticle' => 'Pindahkan laman',
 '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).',
@@ -1839,17 +1992,22 @@ Silakan piliah namo lain.',
 'export' => 'Ekspor laman',
 
 # Namespace 8 related
+'allmessages' => 'Pasan sistem',
 'allmessagesname' => 'Namo',
 'allmessagesdefault' => 'Teks pasan default',
+'allmessages-language' => 'Bahaso:',
+'allmessages-filter-submit' => 'Tuju',
 
 # Thumbnails
 'thumbnail-more' => 'Pagadang',
 'thumbnail_error' => 'Gagal mambuek miniatur: $1',
 
 # Special:Import
+'import' => 'Impor laman',
 'importstart' => 'Mangimpor laman...',
 
 # Import log
+'importlogpagetext' => 'Administrasi laman impor jo riwayaik panyuntiangannyo dari wiki lain.',
 'import-logentry-upload' => 'mangimpor [[$1]] malalui pamuekan berkas',
 
 # Tooltip help for the actions
@@ -1858,8 +2016,8 @@ 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-logout' => 'Kalua log',
 'tooltip-ca-talk' => 'Parudiangan tantang isi laman',
@@ -1872,8 +2030,8 @@ Sanak hanyo buliah mancaliak sumbernyo sajo',
 '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-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 +2040,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',
@@ -1909,7 +2067,7 @@ Sanak hanyo buliah mancaliak sumbernyo sajo',
 '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-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',
@@ -1932,26 +2090,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,6 +2150,8 @@ 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',
@@ -1991,6 +2184,7 @@ Sanak hanyo buliah mancaliak sumbernyo sajo',
 'file-info-png-frames' => '$1 {{PLURAL:$1|bingkai}}',
 
 # Special:NewFiles
+'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 +2199,25 @@ 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 detik|$1 detik}}',
+'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 minggu|$1 minggu}}',
+'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',
 
 # 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 +2247,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
@@ -2108,6 +2301,10 @@ Nan lainnyo akan tasuruak sacaro baku.
 'monthsall' => 'sadonyo',
 'limitall' => 'sadonyo',
 
+# Table pager
+'table_pager_limit_label' => 'Item per laman:',
+'table_pager_limit_submit' => 'Tuju',
+
 # Watchlist editor
 'watchlistedit-raw-titles' => 'Judul:',
 'watchlistedit-raw-submit' => 'Pabarui pantauan',
@@ -2117,7 +2314,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
@@ -2147,40 +2344,78 @@ 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',
index f91abd3..a5cdda0 100644 (file)
@@ -465,9 +465,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,7 +476,7 @@ $messages = array(
 
 'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
 
-'about' => 'Ð\98нÑ\84оÑ\80маÑ\86ии Ð·Ð°',
+'about' => 'Ð\97а {{SITENAME}}',
 'article' => 'Статија',
 'newwindow' => '(се отвора во нов прозорец)',
 'cancel' => 'Откажи',
@@ -562,10 +562,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' => 'Прејди на:',
@@ -630,7 +630,7 @@ $1',
 'toc' => 'Содржина',
 'showtoc' => 'прикажи',
 'hidetoc' => 'скриј',
-'collapsible-collapse' => 'скриј',
+'collapsible-collapse' => 'Собери',
 'collapsible-expand' => 'прикажи',
 'thisisdeleted' => 'Да прикажам или вратам $1?',
 'viewdeleted' => 'Да погледате $1?',
@@ -733,9 +733,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 е скриено)',
@@ -769,9 +769,20 @@ $2',
 'welcomecreation-msg' => 'Вашата корисничка сметка е создадена.
 Не заборавајте да ги измените вашите [[Special:Preferences|{{SITENAME}} нагодувања]].',
 'yourname' => 'Корисничко име:',
+'userlogin-yourname' => 'Корисничко име',
+'userlogin-yourname-ph' => 'Внесете корисничко име',
+'createacct-helpusername-url' => '{{ns:Project}}:Правила_за_кориснички_имиња',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(помогни ми да одберам)]]',
 '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 +795,39 @@ $2',
 'logout' => 'Одјава',
 'userlogout' => 'Одјава',
 'notloggedin' => 'Не сте најавени',
+'userlogin-noaccount' => 'Немате сметка?',
+'userlogin-joinproject' => 'Зачленете се на {{SITENAME}}',
 'nologin' => "Немате корисничка сметка? '''$1'''.",
 'nologinlink' => 'Направете нова корисничка сметка',
 'createaccount' => 'Направи сметка',
 'gotaccount' => "Веќе имате корисничка сметка? '''$1'''.",
 'gotaccountlink' => 'Најавете се',
 'userlogin-resetlink' => 'Си ги заборавивте податоците за најава?',
+'helplogin-url' => 'Help:Најава',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Помош со најавата]]',
+'createacct-join' => 'Внесете ваши информации',
+'createacct-emailrequired' => 'Е-пошта',
+'createacct-emailoptional' => 'Е-пошта (незадолжително)',
+'createacct-email-ph' => 'Внесете е-пошта',
 'createaccountmail' => 'Дај привремена произволна лозинка и испрати ја на долунаведената адреса',
+'createacct-realname' => 'Вистинско име (незадолжително)',
 'createaccountreason' => 'Причина:',
+'createacct-reason' => 'Причина',
+'createacct-reason-ph' => 'Зошто правите друга сметка',
+'createacct-captcha' => 'Безбедносна проверка',
+'createacct-captcha-help-url' => '{{ns:Project}}:Барање на сметка',
+'createacct-imgcaptcha-help' => 'Не можете да ја видите сликата? [[{{MediaWiki:createacct-captcha-help-url}}|Побарајте сметка]]',
+'createacct-imgcaptcha-ph' => 'Внесете го гореприкажаниот текст',
+'createacct-submit' => 'Направи ја',
+'createacct-benefit-heading' => '{{SITENAME}} е дело на луѓе како вас.',
+'createacct-benefit-body1' => 'уредувања',
+'createacct-benefit-body2' => 'страници',
+'createacct-benefit-body3' => 'скорешни учесници',
 'badretype' => 'Внесените лозинки не се совпаѓаат.',
 'userexists' => 'Корисничкото име што го внесовте е зафатено.
 Изберете друго име.',
 'loginerror' => 'Грешка при најавувањето',
+'createacct-error' => 'Грешка во создавањето на сметката',
 'createaccounterror' => 'Не можам да ја создадам сметката: $1',
 'nocookiesnew' => 'Корисничката сметка е создадена, но не сте најавени.
 {{SITENAME}} користи колачиња за најавување на корисници.
@@ -888,12 +920,14 @@ $2',
 'resetpass-wrong-oldpass' => 'Погрешна привремена или тековна лозинка.
 Можеби веќе ја имате успешно променето вашата лизинка или сте побарале нова привремена лозинка.',
 'resetpass-temp-password' => 'Привремена лозинка:',
+'resetpass-abort-generic' => 'Смената на лозинката е откажана од додаток.',
 
 # Special:PasswordReset
 'passwordreset' => 'Менување на лозинка',
 'passwordreset-text' => 'Пополнете го образецов за да ја измените лозинката.',
 'passwordreset-legend' => 'Нова лозинка',
 'passwordreset-disabled' => 'На ова вики е оневозможено задавање на нова лозинка.',
+'passwordreset-emaildisabled' => 'Можностите за е-пошта се исклучени на ова вики',
 'passwordreset-pretext' => '{{PLURAL:$1||Подолу внесете еден податок}}',
 'passwordreset-username' => 'Корисничко име:',
 'passwordreset-domain' => 'Домен:',
@@ -924,7 +958,7 @@ $2
 Привремена лозинка: $2',
 'passwordreset-emailsent' => 'Испратено е писмо за измена на лозинката.',
 'passwordreset-emailsent-capture' => 'Испратено е писмо за измена на лозинката (прикажано подолу).',
-'passwordreset-emailerror-capture' => 'Создадено е писмо за измена на лозинката (прикажано подолу), но не успеав да го испратам на корисникот: $1',
+'passwordreset-emailerror-capture' => 'Создадено е писмо за измена на лозинката (прикажано подолу), но не успеав да го испратам на {{GENDER:$2|корисникот}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Смени е-пошта',
@@ -1579,6 +1613,7 @@ $1",
 'userrights-changeable-col' => 'Групи кои може да ги промените',
 'userrights-unchangeable-col' => 'Групи кои не може да ги промените',
 'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => 'Спротиставеност во корисничките права. Применете ги промените повторно.',
 
 # Groups
 'group' => 'Група:',
@@ -1587,7 +1622,7 @@ $1",
 'group-bot' => 'Ботови',
 'group-sysop' => 'Администратори',
 'group-bureaucrat' => 'Бирократи',
-'group-suppress' => 'Ð\9dадгледÑ\83вачи',
+'group-suppress' => 'СкÑ\80ивачи',
 'group-all' => '(сите)',
 
 'group-user-member' => 'корисник',
@@ -1595,14 +1630,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' => 'Читање страници',
@@ -1671,7 +1706,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"
@@ -1858,7 +1893,7 @@ $1",
 'uploaddisabledtext' => 'Подигањето на податотеки е оневозможено.',
 'php-uploaddisabledtext' => 'Подигањето на податотеки е оневозможено во PHP. 
 Проверете го нагодувањето file_uploads.',
-'uploadscripted' => 'Податотеката содржи HTML или скриптен код што може да биде погрешно протолкуван од прелистувач.',
+'uploadscripted' => 'Податотеката содржи HTML-код или сценарио што може погрешно да се протолкува во прелистувачот.',
 'uploadvirus' => 'Оваа податотека содржи вирус! Повеќе подробности: $1',
 'uploadjava' => 'Податотеката е од типот ZIP што содржи податотека со наставка .class за Java.
 Подигањето на податотеки за Java не е дозволено, бидејќи со нив можат да се заобиколуваат безбедносните ограничувања.',
@@ -2152,11 +2187,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' => 'Страници со својство',
@@ -2252,7 +2287,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
@@ -2329,6 +2364,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' => 'Следи список на кориснички групи утврдени на ова вики, заедно со нивните придружни права на пристап.
@@ -2561,7 +2605,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' => 'Заштити страници вклучени во оваа страница (каскадна заштита)',
@@ -3178,7 +3222,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 +3374,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 +3402,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',
@@ -4110,12 +4166,16 @@ $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' => 'Оваа специјална страница го враќа целосниот пат на податотеката.
-Сликите се прикажани во изворна големина, другите типови на податотеки се отвораат со соодветните програми, директно.',
+'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 +4265,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 +4275,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..29ffa1b 100644 (file)
@@ -749,9 +749,20 @@ $2',
 'welcomecreation-msg' => 'താങ്കളുടെ അംഗത്വം സൃഷ്ടിക്കപ്പെട്ടിരിക്കുന്നു.
 താങ്കളുടെ [[Special:Preferences|{{SITENAME}} ക്രമീകരണങ്ങളിൽ]] മാറ്റം വരുത്താൻ മറക്കരുത്.',
 'yourname' => 'ഉപയോക്തൃനാമം:',
+'userlogin-yourname' => 'ഉപയോക്തൃനാമം',
+'userlogin-yourname-ph' => 'താങ്കളുടെ ഉപയോക്തൃനാമം നൽകുക',
+'createacct-helpusername-url' => '{{ns:Project}}:ഉപയോക്തൃനാമനയം',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(തിരഞ്ഞെടുക്കാൻ സഹായിക്കുക)]]',
 '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 +775,39 @@ $2',
 'logout' => 'ലോഗൗട്ട്',
 'userlogout' => 'ലോഗൗട്ട്',
 'notloggedin' => 'പ്രവേശിച്ചിട്ടില്ല',
+'userlogin-noaccount' => 'അംഗത്വമില്ലേ?',
+'userlogin-joinproject' => '{{SITENAME}} സം‌രംഭത്തിൽ ചേരുക',
 'nologin' => "അംഗത്വമില്ലേ? '''$1'''.",
 'nologinlink' => 'ഒരംഗത്വമെടുക്കുക',
 'createaccount' => 'അംഗത്വമെടുക്കുക',
 'gotaccount' => "താങ്കൾക്ക് അംഗത്വമുണ്ടോ? '''$1'''.",
 'gotaccountlink' => 'പ്രവേശിക്കുക',
 'userlogin-resetlink' => 'താങ്കളുടെ ലോഗിൻ വിവരങ്ങൾ മറന്നു പോയോ?',
+'helplogin-url' => 'Help:പ്രവേശനം',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|പ്രവേശന സഹായം]]',
+'createacct-join' => 'താങ്കളെപ്പറ്റിയുള്ള വിവരങ്ങൾ താഴെ നൽകുക.',
+'createacct-emailrequired' => 'ഇമെയിൽ വിലാസം',
+'createacct-emailoptional' => 'ഇമെയിൽ വിലാസം (നിർബന്ധമില്ല)',
+'createacct-email-ph' => 'താങ്കളുടെ ഇമെയിൽ വിലാസം നൽകുക',
 'createaccountmail' => 'താത്കാലികമായ ക്രമരഹിത രഹസ്യവാക്ക് ഉപയോഗിക്കാനനുവാദം നൽകുകയും അത് താഴെ വ്യക്തമാക്കിയിരിക്കുന്ന ഇമെയിൽ വിലാസത്തിലേയ്ക്ക് അയക്കുകയും ചെയ്യുക',
+'createacct-realname' => 'ശരിയായ പേര് (നിർബന്ധമില്ല)',
 'createaccountreason' => 'കാരണം:',
+'createacct-reason' => 'കാരണം',
+'createacct-reason-ph' => 'താങ്കൾ എന്തുകൊണ്ടാണ് മറ്റൊരു അംഗത്വം എടുക്കുന്നത്',
+'createacct-captcha' => 'സുരക്ഷാ പരിശോധന',
+'createacct-captcha-help-url' => '{{ns:Project}}:അംഗത്വമാവശ്യപ്പെടുക',
+'createacct-imgcaptcha-help' => 'ചിത്രം കാണാനാവുന്നില്ലേ? [[{{MediaWiki:createacct-captcha-help-url}}|അംഗത്വമാവശ്യപ്പെടുക]]',
+'createacct-imgcaptcha-ph' => 'മുകളിൽ കാണുന്ന എഴുത്ത് ഇവിടെ നൽകുക',
+'createacct-submit' => 'താങ്കളുടെ അംഗത്വം സൃഷ്ടിക്കുക',
+'createacct-benefit-heading' => 'താങ്കളെപ്പോലെയുള്ളവരാണ്  {{SITENAME}}  പടുത്തുയർത്തിയിരിക്കുന്നത്.',
+'createacct-benefit-body1' => 'തിരുത്തുകൾ',
+'createacct-benefit-body2' => 'താളുകൾ',
+'createacct-benefit-body3' => 'സമീപകാലത്ത് സംഭാവന ചെയ്തവർ',
 'badretype' => 'താങ്കൾ നൽകിയ രഹസ്യവാക്കുകൾ സമമല്ല.',
 'userexists' => 'നൽകിയ ഉപയോക്തൃനാമം മുമ്പേ നിലവിലുണ്ട്.
 ദയവായി മറ്റൊരു ഉപയോക്തൃനാമം തിരഞ്ഞെടുക്കുക.',
 'loginerror' => 'പ്രവേശനം സാധിച്ചില്ല',
+'createacct-error' => 'അംഗത്വസൃഷ്ടിക്കിടെ പിഴവുണ്ടായി',
 'createaccounterror' => 'അംഗത്വമെടുക്കാൻ കഴിഞ്ഞില്ല:$1',
 'nocookiesnew' => 'ഉപയോക്തൃഅംഗത്വം ഉണ്ടാക്കിയിരിക്കുന്നു. പക്ഷെ താങ്കൾ ലോഗിൻ ചെയ്തിട്ടില്ല. {{SITENAME}} സംരംഭത്തിൽ ലോഗിൻ ചെയ്യുവാൻ കുക്കികൾ സജ്ജമാക്കിയിരിക്കണം. താങ്കളുടെ കമ്പ്യൂട്ടറിൽ നിലവിൽ കുക്കികൾ ഡിസേബിൾ ചെയ്തിരിക്കുന്നു. അതു എനേബിൾ ചെയ്തു താങ്കളുടെ ഉപയോക്തൃനാമവും രഹസ്യവാക്കും ഉപയോഗിച്ച് ലോഗിൻ ചെയ്യൂ.',
 'nocookieslogin' => '{{SITENAME}} സംരംഭത്തിൽ ലോഗിൻ ചെയ്യുവാൻ കുക്കികൾ സജ്ജമാക്കിയിരിക്കണം. പക്ഷെ താങ്കൾ കുക്കികൾ സജ്ജമാക്കിയിട്ടില്ല. കുക്കികൾ സജ്ജമാക്കിയതിനു ശേഷം വീണ്ടും ലോഗിൻ ചെയ്യാൻ ശ്രമിക്കൂ.',
@@ -853,12 +885,14 @@ $2',
 'resetpass-wrong-oldpass' => 'താത്കാലികമായി ലഭിച്ച അല്ലെങ്കിൽ നിലവിലുള്ളതായി നൽകിയ രഹസ്യവാക്ക് അസാധുവാണ്.
 താങ്കൾ രഹസ്യവാക്ക് വിജയകരമായി മാറ്റിയിട്ടുണ്ടാകാം അല്ലെങ്കിൽ പുതിയ താത്കാലിക രഹസ്യവാക്ക് അഭ്യർത്ഥിച്ചിട്ടുണ്ടാകാം.',
 'resetpass-temp-password' => 'താത്കാലിക രഹസ്യവാക്ക്:',
+'resetpass-abort-generic' => 'രഹസ്യവാക്ക് മാറ്റുന്നത് ഒരു അനുബന്ധം തടഞ്ഞിരിക്കുന്നു.',
 
 # Special:PasswordReset
 'passwordreset' => 'രഹസ്യവാക്ക് പുനഃക്രമീകരിക്കുക',
 'passwordreset-text' => 'രഹസ്യവാക്ക് പുനർസജ്ജീകരിക്കാനായി ഈ ഫോം പൂരിപ്പിക്കുക.',
 'passwordreset-legend' => 'രഹസ്യവാക്ക് പുനഃക്രമീകരിക്കുക',
 'passwordreset-disabled' => 'ഈ വിക്കിയിൽ രഹസ്യവാക്ക് പുനഃക്രമീകരിക്കലുകൾ പ്രവർത്തരഹിതമാക്കിയിരിക്കുകയാണ്.',
+'passwordreset-emaildisabled' => 'ഈ വിക്കിയിൽ ഇമെയിൽ സൗകര്യങ്ങൾ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു.',
 'passwordreset-pretext' => '{{PLURAL:$1||താഴെ ഒരു വിവരശകലം നൽകുക}}',
 'passwordreset-username' => 'ഉപയോക്തൃനാമം:',
 'passwordreset-domain' => 'ഡൊമൈൻ:',
@@ -884,7 +918,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' => 'ഇമെയിൽ വിലാസത്തിൽ മാറ്റംവരുത്തുക',
@@ -1371,6 +1405,7 @@ $1",
 'powersearch-togglenone' => 'ഒന്നുംവേണ്ട',
 'search-external' => 'ബാഹ്യ അന്വേഷണം',
 'searchdisabled' => '{{SITENAME}} സം‌രംഭത്തിൽ തിരച്ചിൽ ദുർബലപ്പെടുത്തിയിരിക്കുന്നു. താങ്കൾക്ക് ഗൂഗിൾ ഉപയോഗിച്ച് തത്കാലം തിരച്ചിൽ നടത്താവുന്നതാണ്‌. പക്ഷെ ഗൂഗിളിൽ {{SITENAME}} സം‌രംഭത്തിന്റെ സൂചിക കാലഹരണപ്പെട്ടതായിരിക്കാൻ സാദ്ധ്യതയുണ്ട്.',
+'search-error' => 'തിരയുന്നതിനിടെ ഒരു പിഴവുണ്ടായി: $1',
 
 # Preferences page
 'preferences' => 'ക്രമീകരണങ്ങൾ',
@@ -2072,6 +2107,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'disambiguations-text' => "താഴെക്കൊടുത്തിരിക്കുന്ന താളുകളിൽ '''വിവക്ഷിതങ്ങൾ താളിലേയ്ക്ക്''' കുറഞ്ഞത് ഒരു കണ്ണിയുണ്ട്. അവ അനുയോജ്യമായ താളിലേയ്ക്ക് കണ്ണിചേർക്കപ്പെടേണ്ടതാവാം. <br />
 [[MediaWiki:Disambiguationspage]] എന്ന താളിൽ കണ്ണി ചേർത്തിട്ടുള്ള ഫലകം ഉപയോഗിക്കുന്ന താളുകളെ വിവക്ഷിതങ്ങൾ താളായി കണക്കാക്കുന്നു.",
 
+'pageswithprop' => 'താളിന്റെ സവിശേഷതകളുള്ള താളുകൾ',
+'pageswithprop-legend' => 'ഒരു താൾ സവിശേഷതയുള്ള താളുകൾ',
 'pageswithprop-submit' => 'പോകൂ',
 
 'doubleredirects' => 'ഇരട്ട തിരിച്ചുവിടലുകൾ',
@@ -2237,6 +2274,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' => 'ഈ വിക്കിയിൽ നിർവ്വചിക്കപ്പെട്ടിരിക്കുന്ന ഉപയോക്തൃസംഘങ്ങളെയും, ആ സംഘങ്ങൾക്ക് പ്രാപ്തമായിട്ടുള്ള അവകാശങ്ങളേയും താഴെ കുറിച്ചിരിക്കുന്നു.
@@ -2722,6 +2768,7 @@ $1',
 'proxyblocksuccess' => 'ചെയ്തു കഴിഞ്ഞു.',
 'sorbsreason' => '{{SITENAME}} ഉപയോഗിക്കുന്ന DNSBL ൽ താങ്കളുടെ ഐ.പി. വിലാസം ഒരു ഓപ്പൺ പ്രോക്സിയായാണു രേഖപ്പെടുത്തിട്ടുള്ളത്.',
 'sorbs_create_account_reason' => '{{SITENAME}} ഉപയോഗിക്കുന്ന DNSBL ൽ താങ്കളുടെ ഐ.പി. വിലാസം ഒരു ഓപ്പൺ പ്രോക്സിയായാണു രേഖപ്പെടുത്തിട്ടുള്ളത്. താങ്കൾക്ക് അംഗത്വമെടുക്കാൻ സാദ്ധ്യമല്ല.',
+'xffblockreason' => 'എക്സ്-ഫോർവേഡഡ്-ഫോർ ഹെഡറിലെ ഒരു ഐ.പി. വിലാസം, താങ്കളുടേതോ താങ്കൾ ഉപയോഗിക്കുന്ന പ്രോക്സി സെർവറിലേതോ ആകാം, തടയപ്പെട്ടിരിക്കുന്നതാണ്. തടയലിന്റെ കാരണം: $1',
 'cant-block-while-blocked' => 'താങ്കൾ തടയപ്പെട്ടിരിക്കുമ്പോൾ മറ്റുപയോക്താക്കളെ തടയാൻ താങ്കൾക്ക് സാധിക്കില്ല.',
 'cant-see-hidden-user' => 'താങ്കൾ തടയാൻ ശ്രമിക്കുന്ന ഉപയോക്താവ് മുമ്പേ തടയപ്പെടുകയും മറയ്ക്കപ്പെടുകയും ചെയ്യപ്പെട്ടതാണ്. താങ്കൾക്ക് ഉപയോക്താവിനെ മറയ്ക്കാനുള്ള അവകാശം ഇല്ലെങ്കിൽ, ഉപയോക്താവിനെതിരെ ഉള്ള തടയൽ കാണാനോ തിരുത്താനോ കഴിയുന്നതല്ല.',
 'ipbblocked' => 'മറ്റുള്ളവരെ തടയാനോ അവരുടെ തടയൽ നീക്കാനോ താങ്കൾക്ക് കഴിയില്ല. കാരണം താങ്കൾ തന്നെ തടയപ്പെട്ടിരിക്കുകയാണ്',
@@ -3212,11 +3259,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' => 'എഴുത്ത് രീതി താഴെ കൊടുത്തിരിക്കുന്നു:
 
@@ -3836,12 +3897,16 @@ $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' => 'ഈ പ്രത്യേക താൾ ഒരു പ്രമാണത്തിന്റെ പൂർണ്ണ വിലാസം പ്രദർശിപ്പിക്കുന്നു.
-ചിത്രങ്ങൾ പൂർണ്ണ റെസലൂഷനോടു കൂടി പ്രദർശിപ്പിച്ചിരിക്കുന്നു. മറ്റുള്ള പ്രമാണ തരങ്ങൾ അതതു പ്രോഗ്രാമിൽ നേരിട്ടു തുറക്കാവുന്നതാണ്‌.',
+'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 +4000,7 @@ $5
 'htmlform-selectorother-other' => 'മറ്റുള്ളവ',
 'htmlform-no' => 'ഇല്ല',
 'htmlform-yes' => 'ശരി',
+'htmlform-chosen-placeholder' => 'ഒരു ഐച്ഛികം തിരഞ്ഞെടുക്കുക',
 
 # SQLite database support
 'sqlite-has-fts' => 'പൂർണ്ണ-എഴുത്ത് തിരച്ചിൽ പിന്തുണയുള്ള $1',
index 92299dc..d2279e1 100644 (file)
@@ -72,8 +72,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Харж буй хэрэглэгчдийн тоог үзүүлэх',
 'tog-oldsig' => 'Одоогийн гарын үсэг:',
 'tog-fancysig' => 'Түүхий гарын үсэг (автомат холбоосгүй)',
-'tog-externaleditor' => 'Үндсэн горимд нэмэлт засварлах багаж хэрэглэх(экспертүүдэд зориулагдсан, таны компьютерт тусгай тохиргоо шаардлагатай)',
-'tog-externaldiff' => 'Үндсэн горим гадаад харьцуулагч программ ашиглах (экспертүүдэд зориулав, таны компьютерт тусгай тохиргоо шаардлагатай)',
 'tog-showjumplinks' => '"Шууд очих" хялбар линкүүдийг ажиллагаатай болгох',
 'tog-uselivepreview' => 'Шууд байдлаар урьдчилж харах (ЖаваСкрипт) (Туршилт)',
 'tog-forceeditsummary' => 'Товч агуулгын талбарыг хоосон үлдээхэд надад мэдэгдэх',
@@ -1097,15 +1095,6 @@ $1",
 Та одоохондоо Google-г ашиглан хайх боломжтой.
 Анхааруулж хэлэхэд, тэдний {{SITENAME}}-н агуулгын индексүүд хоцрогдсон байж магадгүй.',
 
-# Quickbar
-'qbsettings' => 'Шуурхай тавцан',
-'qbsettings-none' => 'Байхгүй',
-'qbsettings-fixedleft' => 'Зүүн талд бэхжүүлсэн',
-'qbsettings-fixedright' => 'Баруун талд бэхжүүлсэн',
-'qbsettings-floatingleft' => 'Зүүн талд хөвсөн',
-'qbsettings-floatingright' => 'Баруун талд хөвсөн',
-'qbsettings-directionality' => 'Тухай хэлний барилаас хамаарч хэлбэрийг бий болгох',
-
 # Preferences page
 'preferences' => 'Хэрэглэгчийн тохиргоо',
 'mypreferences' => 'Миний тохиргоо',
@@ -1659,7 +1648,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization -г харна уу.',
 'http-read-error' => 'HTTP-г унших алдаа.',
 'http-timed-out' => 'HTTP хүсэлтийн хугацаа дуусав.',
 'http-curl-error' => 'Дараах URL-г авчрахад алдаа гарав: $1',
-'http-host-unreachable' => 'URL-д хүрч чадсангүй.',
 'http-bad-status' => 'HTTP хандалтын үед асуудал үүсэв: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1961,15 +1949,6 @@ 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' => 'Дараах нь энэ вики дээрх хэрэглэгчийн бүлгүүд болон тэдгээрийн эрх, зөвшөөрлүүдийн жагсаалт юм.
index 9507703..53b7bbb 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' => 'कधीच नाही',
@@ -1039,6 +1038,8 @@ $2',
 या नावाचे पान आधीच अस्तित्वात आहे.',
 'defaultmessagetext' => 'कसूर पाठ्य मजकूर',
 'invalid-content-data' => 'अवैध माहिती',
+'editwarning-warning' => "या पानावरुन दुसर्‍या पानावर गेल्यास, तुम्ही येथे केलेले बदल जतन होणार नाहीत.
+ही सूचना घालवण्यासाठी ''माझ्या पसंती'' मधील संपादनपसंतीत बदल करा.",
 
 # Content models
 'content-model-wikitext' => 'विकिमजकूर',
@@ -1314,15 +1315,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' => 'माझ्या पसंती',
index f4093f8..432b562 100644 (file)
@@ -238,11 +238,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',
@@ -323,7 +323,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',
@@ -757,7 +757,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',
@@ -968,8 +968,8 @@ Log penghapusan bagi laman ini dilampirkan di bawah untuk rujukan.',
 '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',
@@ -2128,6 +2128,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.
@@ -3727,13 +3736,6 @@ 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:FileDuplicateSearch
 'fileduplicatesearch' => 'Cari fail serupa',
 'fileduplicatesearch-summary' => 'Anda boleh mencari fail serupa berdasarkan nilai cincangannya.',
index e5cc31b..6bee092 100644 (file)
@@ -302,8 +302,6 @@ $messages = array(
 'tog-shownumberswatching' => "Uri n-numru ta' utenti li qegħdin isegwu din il-paġna",
 'tog-oldsig' => 'Firma attwali:',
 'tog-fancysig' => 'Interpreta l-firma bħala test tal-wiki (mingħajr ħolqa awtomatika)',
-'tog-externaleditor' => 'Uża awtomatikament editur estern (għal utenti esperti biss, hemm bżonn preferenzi speċjali fuq il-komputer tiegħek. [//www.mediawiki.org/wiki/Manual:External_editors Iktar informazzjoni.])',
-'tog-externaldiff' => 'Uża awtomatikament diff estern (għal utenti esperti biss, hemm bżonn preferenzi speċjali fuq il-komputer tiegħek. [//www.mediawiki.org/wiki/Manual:External_editors Iktar informazzjoni.])',
 'tog-showjumplinks' => 'Attiva l-ħoloq aċċessibbli "aqbeż għal"',
 'tog-uselivepreview' => "Attiva l-funzjoni ''Live preview'' (bżonn tal-JavaScript; sperimentali)",
 'tog-forceeditsummary' => 'Nebbaħni meta ndaħħal taqsira tal-modifika vojta',
@@ -317,6 +315,7 @@ $messages = array(
 'tog-diffonly' => 'Turiex kontenut tal-paġni wara li tkun għamilt paragun bejn il-verżjonijiet',
 'tog-showhiddencats' => 'Uri kategoriji moħbija',
 'tog-norollbackdiff' => "Turix il-paragun bejn il-verżjonijiet wara li tkun effettwajt ir-''rollback''",
+'tog-useeditwarning' => "Avżani kull meta nħalli paġna ta' modifika b'modifiki li għadhom ma ġewx salvati",
 
 'underline-always' => 'Dejjem',
 'underline-never' => 'Qatt',
@@ -1012,6 +1011,7 @@ Jidher li din ġiet imħassra.',
 'edit-no-change' => 'Il-modifika li għamilt ġiet injorata, minħabba li ebda bidla ma saret lejn it-test.',
 'edit-already-exists' => 'Ma tistax tinħoloq din il-paġna.
 Din teżisti diġà.',
+'editwarning-warning' => 'Jekk tħalli din il-paġna jista\' jwassal sabiex titlef kwalunkwe tibdil li tkun għamilt. Jekk int tinsab fil-kont tiegħek, tista\' tneħħi dan l-avviż fis-sezzjoni "Modifiki" tal-preferenzi tiegħek.',
 
 # Content models
 'content-model-wikitext' => 'test tal-wiki',
@@ -1282,15 +1282,6 @@ Ipprova għamel prefiss għall-inkjesta tiegħek ma' ''all:'' sabiex tfittex il-
 Sadanittant, tista' tipprova tfittex bil-Google.
 Innota però li l-werreja tal-kontenut ta' {{SITENAME}} f'dawn is-siti, jistgħu ma jkunux aġġornati.",
 
-# Quickbar
-'qbsettings' => "''Quickbar''",
-'qbsettings-none' => 'Xejn',
-'qbsettings-fixedleft' => 'Mehmuż fix-xellug',
-'qbsettings-fixedright' => 'Mehmuż fil-lemin',
-'qbsettings-floatingleft' => "''Floating'' lejn ix-xellug",
-'qbsettings-floatingright' => "''Floating'' lejn il-lemin",
-'qbsettings-directionality' => 'Fiss, skont id-direzzjoni tat-test fil-lingwa tiegħek',
-
 # Preferences page
 'preferences' => 'Preferenzi',
 'mypreferences' => 'Preferenzi',
@@ -1800,7 +1791,6 @@ Għal sigurtà ottimali, img_auth.php hija diżattivata.",
 'http-read-error' => 'Żball fil-qari HTTP.',
 'http-timed-out' => 'Rikjesta HTTP skaduta.',
 'http-curl-error' => 'Żball fil-kisba tal-URL: $1',
-'http-host-unreachable' => 'Il-URL ma setgħetx tintlaħaq.',
 'http-bad-status' => 'Kien hemm problema matul ir-rikjesta HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2116,15 +2106,6 @@ Protokolli aċċettati: <code>$1</code> (jekk ma jiġi speċifikat l-ebda protok
 'listusers-noresult' => 'L-ebda utent ma nstab.',
 'listusers-blocked' => '(imblukkat)',
 
-# Special:ActiveUsers
-'activeusers' => 'Lista tal-utenti attivi',
-'activeusers-intro' => "Din hija lista ta' utenti li kellhom xi tip ta' attività f'dawn l-aħħar $1 {{PLURAL:$1|ġurnata|ġurnata}}.",
-'activeusers-count' => '$1 {{PLURAL:$1|modifika|modifika}} fl-aħħar {{PLURAL:$3|jum|$3 jum}}',
-'activeusers-from' => 'Uri utenti li jibdew minn:',
-'activeusers-hidebots' => 'Aħbi l-bots',
-'activeusers-hidesysops' => 'Aħbi amministraturi',
-'activeusers-noresult' => 'L-ebda utent ma nstab.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Drittijiet tal-grupp tal-utenti',
 'listgrouprights-summary' => "Hawn taħt hawn elenkati l-gruppi tal-utenti għal din il-wiki, bid-drittijiet ta' aċċess rispettiv.
@@ -2891,24 +2872,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 +2945,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
index 0d6fb25..40a33b5 100644 (file)
@@ -346,8 +346,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',
@@ -731,9 +729,15 @@ Merk at noen sider kan vise at du fortsatt er logget inn fram til du tømmer mel
 'welcomecreation-msg' => 'Kontoen din har blitt opprettet.
 Ikke glem å endre [[Special:Preferences|innstillingene dine]] på {{SITENAME}}.',
 'yourname' => 'Brukernavn:',
+'userlogin-yourname' => 'Brukernan',
+'userlogin-yourname-ph' => 'Skriv inn brukernavnet ditt',
 'yourpassword' => 'Passord:',
+'userlogin-yourpassword' => 'Passord',
+'userlogin-yourpassword-ph' => 'Skriv inn passordet ditt',
 'yourpasswordagain' => 'Gjenta passord',
 'remembermypassword' => 'Husk meg på denne datamaskinen (i maks $1 {{PLURAL:$1|dag|dager}})',
+'userlogin-remembermypassword' => 'Husk brukernavn og passord',
+'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,12 +750,16 @@ 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?',
+'helplogin-url' => 'Help:Innlogging',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hjelp med innlogging]]',
 'createaccountmail' => 'Bruk et midlertidig tilfeldig passord, og send det til e-postadressen nedenfor',
 'createaccountreason' => 'Årsak:',
 'badretype' => 'Passordene samsvarte ikke.',
@@ -846,6 +854,7 @@ Du kan ha allerede byttet passordet, eller bedt om et nytt midlertidig passord.'
 'passwordreset-text' => 'Fyll ut dette skjemaet for å tilbakestille passordet ditt.',
 'passwordreset-legend' => 'Nullstill passord',
 'passwordreset-disabled' => 'Nullstilling av passord er deaktivert på denne wikien.',
+'passwordreset-emaildisabled' => 'E-posttjenester er slått av på denne wikien.',
 'passwordreset-pretext' => '{{PLURAL:$1||Skriv inn en av datadelene nedenfor}}',
 'passwordreset-username' => 'Brukernavn:',
 'passwordreset-domain' => 'Domene:',
@@ -877,7 +886,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',
@@ -1095,8 +1104,7 @@ Slette- og flytteloggen vises nedenfor.',
 'content-failed-to-parse' => 'Klarte ikke å tolke innholdet $2 for innholdsmodellen $1: $3',
 'invalid-content-data' => 'Ugyldig innhold',
 'content-not-allowed-here' => 'Innholdsmodellen «$1» er ikke tillatt på siden [[$2]]',
-'editwarning-warning' => 'Ved å forlate siden 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',
@@ -1378,6 +1386,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',
@@ -2252,6 +2261,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.
@@ -3851,13 +3869,6 @@ 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:FileDuplicateSearch
 'fileduplicatesearch' => 'Søk etter duplikatfiler',
 'fileduplicatesearch-summary' => 'Søk etter duplikatfiler basert på dets hash-verdi.',
@@ -3947,6 +3958,8 @@ 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',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 med støtte for fulltekstsøk',
index 031dead..459c73e 100644 (file)
@@ -336,8 +336,6 @@ $messages = array(
 'tog-shownumberswatching' => 't Antal gebrukers bekieken die disse zied volgt',
 'tog-oldsig' => 'Bestaonde haandtekening:',
 'tog-fancysig' => 'Ondertekening zien as wikitekste (zonder automatiese verwiezing)',
-'tog-externaleditor' => 'Standard n externe tekstbewarker gebruken (allinnig veur gevorderden - veur disse funksie bin spesiale instellingen neudig. [//www.mediawiki.org/wiki/Manual:External_editors Meer informasie]).',
-'tog-externaldiff' => 'Standard n extern vergeliekingsprogramma gebruken (allinnig veur gevorderden - veur disse funksie bin spesiale instellingen neudig. [//www.mediawiki.org/wiki/Manual:External_editors Meer informasie]).',
 'tog-showjumplinks' => '"Gao naor"-verwiezingen toelaoten',
 'tog-uselivepreview' => 'Gebruuk "rechtstreeks naokieken" (mu\'j JavaScript veur hebben - experimenteel)',
 'tog-forceeditsummary' => 'Geef n melding bie n lege samenvatting',
@@ -352,10 +350,11 @@ $messages = array(
 'tog-showhiddencats' => 'Laot verbörgen kategorieën zien',
 'tog-noconvertlink' => 'Ziednaamkonversie uutschakelen',
 'tog-norollbackdiff' => 'Wiezigingen vortlaoten nao t weerummedreien',
+'tog-useeditwarning' => "Waorschuw mien a'k n bewörken zied aof wil sluten die nog niet op-esleugen is",
 
 'underline-always' => 'Altied',
 'underline-never' => 'Nooit',
-'underline-default' => 'Standardinstelling',
+'underline-default' => 'Standard in joew vormgeving of webkieker',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Lettertype veur de tekste t bewarkingsveld:',
@@ -440,7 +439,8 @@ $messages = array(
 'newwindow' => '(niej vienster)',
 'cancel' => 'Aofbreken',
 'moredotdotdot' => 'Meer...',
-'mypage' => 'Mien gebrukerszied',
+'morenotlisted' => 'Meer niet in de lieste...',
+'mypage' => 'Gebrukerszied',
 'mytalk' => 'Mien overleg',
 'anontalk' => 'Overlegzied veur dit IP-adres',
 'navigation' => 'Navigasie',
@@ -463,7 +463,7 @@ $messages = array(
 'vector-action-protect' => 'Beveiligen',
 'vector-action-undelete' => 'Weerummeplaotsen',
 'vector-action-unprotect' => 'Beveiliging wiezigen',
-'vector-simplesearch-preference' => 'Verbeterde zeuksuggesties anzetten (allinnig mit Vector-vormgeving)',
+'vector-simplesearch-preference' => 'Vereenvoudigd zeuken anzetten (allinnig mit Vector-vormgeving)',
 'vector-view-create' => 'Anmaken',
 'vector-view-edit' => 'Bewarken',
 'vector-view-history' => 'Geschiedenisse bekieken',
@@ -473,6 +473,7 @@ $messages = array(
 'namespaces' => 'Naamruumtes',
 'variants' => 'Variaanten',
 
+'navigation-heading' => 'Navigasiemenu',
 'errorpagetitle' => 'Foutmelding',
 'returnto' => 'Weerumme naor $1.',
 'tagline' => 'Van {{SITENAME}}',
@@ -680,7 +681,7 @@ Zeukopdrachte: $2',
 'viewsource-title' => 'Bron bekieken van $1',
 'actionthrottled' => 'Haandeling tegenehöllen',
 'actionthrottledtext' => "As maotregel tegen t plaotsen van ongewunste verwiezingen, is t antal keren da'j disse haandeling in n korte tied uutvoeren kunnen beteund. Je hebben de limiet overschrejen. Probeer t over n antal minuten weer.",
-'protectedpagetext' => 'Disse zied is beveiligd um bewarkingen te veurkoemen.',
+'protectedpagetext' => 'Disse zied is beveiligd. Bewarken of aandere haandelingen bin niet meugelik.',
 'viewsourcetext' => 'Je kunnen de brontekste van disse zied bewarken en bekieken:',
 'viewyourtext' => "Je kunnen '''joew bewarkingen''' an de brontekste van disse zied bekieken en kopiëren:",
 'protectedinterface' => "Op disse zied steet tekste die gebruukt wörden veur systeemteksten van disse wiki. Allinnig beheerders kunnen disse zied bewarken.
@@ -713,10 +714,16 @@ De beheerder gaf hierveur de volgende reden: "$3".',
 
 Je kunnen {{SITENAME}} noen anoniem gebruken of je eigen <span class='plainlinks'>[$1 opniej anmelden]</span> onder disse of n aandere gebrukersnaam.
 t Kan ween dat der wat ziejen bin die weeregeven wörden asof je an-emeld bin totda'j t tussengeheugen van joew webkieker leegmaken.",
+'welcomeuser' => 'Welkom, $1!',
 'yourname' => 'Gebrukersnaam',
+'userlogin-yourname' => 'Gebrukersnaam',
+'userlogin-yourname-ph' => 'Geef joew gebrukersnaam op',
 'yourpassword' => 'Wachtwoord',
+'userlogin-yourpassword' => 'Wachtwoord',
+'userlogin-yourpassword-ph' => 'Geef joew wachtwoord op',
 'yourpasswordagain' => 'Opniej invoeren',
 'remembermypassword' => 'Vanzelf anmelden (hooguut $1 {{PLURAL:$1|dag|dagen}})',
+'userlogin-remembermypassword' => 'Vanzelf anmelden',
 'securelogin-stick-https' => "Verbunnen blieven via HTTPS naoda'j an-emeld bin",
 'yourdomainname' => 'Joew domein',
 'password-change-forbidden' => 'Je kunnen joew wachtwoord niet wiezigen op disse wiki.',
@@ -729,13 +736,15 @@ t Kan ween dat der wat ziejen bin die weeregeven wörden asof je an-emeld bin to
 'logout' => 'Aofmelden',
 'userlogout' => 'Aofmelden',
 'notloggedin' => 'Niet an-emeld',
+'userlogin-noaccount' => "He'j nog gien gebrukersnaam?",
+'userlogin-joinproject' => 'Over {{SITENAME}}',
 'nologin' => "He'j nog gien gebrukersnaam? '''$1'''.",
 'nologinlink' => 'Maak n gebrukersprofiel an',
 'createaccount' => 'Niej gebrukersprofiel anmaken',
 'gotaccount' => "Stao'j al in-eschreven? '''$1'''.",
 'gotaccountlink' => 'Anmelden',
 'userlogin-resetlink' => "Bi'j de anmeldgegevens kwiet?",
-'createaccountmail' => 'per netpost',
+'createaccountmail' => 'Gebruuk n tiejelik wachtwoord dat joe netzelde is en stuur t naor t netpostadres dat hieronder steet',
 'createaccountreason' => 'Reden:',
 'badretype' => "De wachtwoorden die'j in-etikt hebben bin niet liek alleens.",
 'userexists' => 'Disse gebrukersnaam is al gebruuk.
@@ -1070,6 +1079,14 @@ t Schient dat t vortedaon is.',
 'edit-already-exists' => 'De zied kon niet an-emaakt wörden.
 t Besteet al.',
 'defaultmessagetext' => 'Standardtekste',
+'editwarning-warning' => "A'j disse zied aofsluten dan kan t ween dat der wieziging die'j emaakt hebben kwiet raken.
+A'j an-emeld bin, dan ku'j disse waorschuwing uutzetten in t tabblad \"Bewarken\" in joew veurkeuren.",
+
+# Content models
+'content-model-wikitext' => 'wikitekste',
+'content-model-text' => 'tekste zonder opmaak',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Waorschuwing: disse zied gebruukt te veule kostbaore parserfunksies.
@@ -1320,7 +1337,7 @@ Waorschienlik ku'j der meer gegevens over vienen in t [{{fullurl:{{#Special:Log}
 'search-interwiki-default' => '$1 resultaoten:',
 'search-interwiki-more' => '(meer)',
 'search-relatedarticle' => 'Verwaant',
-'mwsuggest-disable' => 'Anbevelingen via AJAX uutschakelen',
+'mwsuggest-disable' => 'Zeuksuggesties uutzetten',
 'searcheverything-enable' => 'In alle naamruumten zeuken',
 'searchrelated' => 'verwaant',
 'searchall' => 'alles',
@@ -1340,15 +1357,6 @@ Waorschienlik ku'j der meer gegevens over vienen in t [{{fullurl:{{#Special:Log}
 'search-external' => 'Extern zeuken',
 'searchdisabled' => 'Zeuken in {{SITENAME}} is niet meugelik. Je kunnen gebruukmaken van Google. De gegevens over {{SITENAME}} bin misschien niet bie-ewörken.',
 
-# Quickbar
-'qbsettings' => 'Lieste mit ziejen',
-'qbsettings-none' => 'Gien',
-'qbsettings-fixedleft' => 'Links, vaste',
-'qbsettings-fixedright' => 'Rechts, vaste',
-'qbsettings-floatingleft' => 'Links, zweven',
-'qbsettings-floatingright' => 'Rechts, zweven',
-'qbsettings-directionality' => 'Vaste, aofhankelik van de schriefrichtige van joew taal',
-
 # Preferences page
 'preferences' => 'Veurkeuren',
 'mypreferences' => 'Mien veurkeuren',
@@ -1427,8 +1435,8 @@ Disse haandeling kan niet ongedaonemaakt wörden.',
 'prefs-emailconfirm-label' => 'Netpostbevestiging:',
 'prefs-textboxsize' => 'Aofmetingen bewarkingsscharm',
 'youremail' => 'Netpostadres (niet verplicht) *',
-'username' => 'Gebrukersnaam:',
-'uid' => 'Gebrukersnummer:',
+'username' => '{{GENDER:$1|Gebrukersnaam}}:',
+'uid' => '{{GENDER:$1|Gebrukersnummer}}:',
 'prefs-memberingroups' => 'Lid van {{PLURAL:$1|groep|groepen}}:',
 'prefs-registration' => 'Registrasiedaotum:',
 'yourrealname' => 'Echte naam (niet verplicht)',
@@ -1891,7 +1899,6 @@ Um beveiligingsredens is img_auth.php uutezet.',
 'http-read-error' => 'Fout bie t lezen van HTTP',
 'http-timed-out' => 'Wachttied bie t HTTP verzeuk',
 'http-curl-error' => 'Fout bie t ophaolen van t webadres: $1',
-'http-host-unreachable' => 'Kon webadres niet bereiken.',
 'http-bad-status' => 'Der is n probleem mit t HTTP-verzeuk: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2044,6 +2051,8 @@ Vergeet niet de verwiezingen nao te kieken veurda\'j de mal vortdoon.',
 Feitelik mutten ze rechtstreeks verwiezen naor t juuste onderwarp.<br />
 Ziejen wörden ezien as n deurverwieszied, as de mal gebruukt wörden die vermeld steet op [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop-submit' => 'Zeuk',
+
 'doubleredirects' => 'Dubbele deurverwiezingen',
 'doubleredirectstext' => 'Op disse lieste staon alle ziejen die deurverwiezen naor aandere deurverwiezingen.
 Op elke regel steet de eerste en de tweede deurverwiezing, daorachter steet de doelzied van de tweede deurverwiezing.
@@ -2527,7 +2536,7 @@ $1',
 'blanknamespace' => '(Heufdnaamruumte)',
 
 # Contributions
-'contributions' => 'Biedragen van disse gebruker',
+'contributions' => '{{GENDER:$1|Biedragen van disse gebruker}}',
 'contributions-title' => 'Biedragen van $1',
 'mycontris' => 'Mien biedragen',
 'contribsub2' => 'Veur $1 ($2)',
@@ -3053,15 +3062,15 @@ Meestentieds kömp dit deur n uutgaonde verwiezing die op de zwarte lieste steet
 'pageinfo-magic-words' => '{{PLURAL:$1|Magies woord|Magiese woorden}} ($1)',
 'pageinfo-hidden-categories' => 'Verbörgen {{PLURAL:$1|kategorie|kategorieën}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Gebruukten mal|Gebruukten mallen}} ($1)',
+'pageinfo-toolboxlink' => 'Informasie over disse zied',
+'pageinfo-redirectsto' => 'Verwis deur naor',
+'pageinfo-redirectsto-info' => 'informasie',
+'pageinfo-contentpage' => 'Eteld as zied mit inhoud',
+'pageinfo-contentpage-yes' => 'Ja',
 
 # Skin names
-'skinname-standard' => 'Klassiek',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Keuls blauw',
 'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'MienSkin',
-'skinname-chick' => 'Deftig',
-'skinname-simple' => 'Eenvoudig',
 'skinname-modern' => 'Niejmoeds',
 
 # Patrolling
@@ -3137,6 +3146,7 @@ $1',
 'hours' => '{{PLURAL:$1|$1 ure|$1 uren}}',
 'days' => '{{PLURAL:$1|$1 dag|$1 dagen}}',
 'ago' => '$1 eleen',
+'just-now' => 'onderlest',
 
 # Bad image list
 'bad_image_list' => 'De opmaak is as volgt:
@@ -3751,14 +3761,6 @@ Samen mit dit programma heur je n [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van de
 'version-entrypoints-header-entrypoint' => 'Ingang',
 'version-entrypoints-header-url' => 'Webadres',
 
-# Special:FilePath
-'filepath' => 'Bestaandslokasie',
-'filepath-page' => 'Bestaand:',
-'filepath-submit' => 'Zeuken',
-'filepath-summary' => 'Disse spesiale zied gif t hele pad veur n bestaand. 
-Aofbeeldingen wörden in resolusie helemaole weeregeven. 
-Aandere bestaandstypen wörden gelieke in t mit t MIME-type verbunnen programma opend.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Dubbele bestaanden zeuken',
 'fileduplicatesearch-summary' => 'Dubbele bestaanden zeuken op baosis van de hashweerde.',
@@ -3848,6 +3850,8 @@ Aandere bestaandstypen wörden gelieke in t mit t MIME-type verbunnen programma
 'htmlform-submit' => 'Opslaon',
 'htmlform-reset' => 'Wiezigingen ongedaonmaken',
 'htmlform-selectorother-other' => 'Aanders',
+'htmlform-no' => 'Nee',
+'htmlform-yes' => 'Ja',
 
 # SQLite database support
 'sqlite-has-fts' => 'Versie $1 mit ondersteuning veur "full-text" zeuken',
index d0c1f30..7d9538d 100644 (file)
@@ -10,6 +10,7 @@
  * @author Annabel
  * @author AvatarTeam
  * @author B4bol4t
+ * @author Basvb
  * @author DasRakel
  * @author Effeietsanders
  * @author Erwin
@@ -775,10 +776,15 @@ Vergeet niet uw [[Special:Preferences|voorkeuren voor {{SITENAME}}]] aan te pass
 'yourname' => 'Gebruikersnaam:',
 'userlogin-yourname' => 'Gebruikersnaam',
 'userlogin-yourname-ph' => 'Geef uw gebruikersnaam op',
+'createacct-helpusername-url' => '{{ns:Project}}:Beleid_gebruikersnamen',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(help me kiezen)]]',
 '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',
@@ -804,12 +810,27 @@ Vergeet niet uw [[Special:Preferences|voorkeuren voor {{SITENAME}}]] aan te pass
 'userlogin-resetlink' => 'Bent u uw aanmeldgegevens vergeten?',
 '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-captcha' => 'Veiligheidscontrole',
+'createacct-captcha-help-url' => '{{ns:Project}}:Gebruiker_aanvragen',
+'createacct-imgcaptcha-help' => 'Kunt u de afbeelding niet zien? [[{{MediaWiki:createacct-captcha-help-url}}|Vraag dan een gebruiker aan]]',
+'createacct-imgcaptcha-ph' => 'Geef de tekst in die u hierboven ziet',
+'createacct-benefit-heading' => '{{SITENAME}} wordt gemaakt door mensen zoals u.',
+'createacct-benefit-body1' => 'bewerkingen',
+'createacct-benefit-body2' => "pagina{{PLURAL:$1||'s}}",
+'createacct-benefit-body3' => 'bijdrager{{PLURAL:$1||s}} deze maand',
 '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.
@@ -911,6 +932,7 @@ 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',
@@ -940,7 +962,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',
@@ -2365,6 +2387,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.
@@ -3360,11 +3391,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:
 
@@ -4006,13 +4051,16 @@ 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.',
+'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 +4153,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 ef507f0..1a9acd5 100644 (file)
@@ -342,9 +342,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 +356,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',
@@ -719,9 +717,15 @@ Ver merksam på at nokre sider framleis kan visast fram som om du er innlogga fr
 'welcomecreation-msg' => 'Brukarkontoen din er oppretta.
 Gløym ikkje å endra [[Special:Preferences|innstillingane dine for {{SITENAME}}]].',
 'yourname' => 'Brukarnamn:',
+'userlogin-yourname' => 'Brukarnamn',
+'userlogin-yourname-ph' => 'Skriv inn brukarnamnet ditt',
 'yourpassword' => 'Passord:',
+'userlogin-yourpassword' => 'Passord',
+'userlogin-yourpassword-ph' => 'Skriv inn passordet ditt',
 'yourpasswordagain' => 'Skriv opp att passordet',
 'remembermypassword' => 'Hugs innlogginga mi på denne datamaskinen (høgst {{PLURAL:$1|éin dag|$1 dagar}})',
+'userlogin-remembermypassword' => 'Hugs meg',
+'userlogin-signwithsecure' => 'Logg inn med trygg tenar',
 'securelogin-stick-https' => 'Fortset HTTPS-tilkopling etter innlogging.',
 'yourdomainname' => 'Domenet ditt',
 'password-change-forbidden' => 'Du kan ikkje endra passord på denne wikien.',
@@ -734,12 +738,16 @@ Gløym ikkje å endra [[Special:Preferences|innstillingane dine for {{SITENAME}}
 'logout' => 'Logg ut',
 'userlogout' => 'Logg ut',
 'notloggedin' => 'Ikkje innlogga',
+'userlogin-noaccount' => 'Har du ingen konto?',
+'userlogin-joinproject' => 'Vert med {{SITENAME}}',
 'nologin' => "Har du ingen brukarkonto? '''$1'''.",
 'nologinlink' => 'Registrer deg',
 'createaccount' => 'Opprett ny konto',
 'gotaccount' => "Har du ein brukarkonto? '''$1'''.",
 'gotaccountlink' => 'Logg inn',
 'userlogin-resetlink' => 'Har du gløymd påloggingsopplysingane dine?',
+'helplogin-url' => 'Help:Innlogging',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hjelp med innlogging]]',
 'createaccountmail' => 'Bruk eit mellombels tilfeldig passord og send det til e-postadressa som er oppgjeven under',
 'createaccountreason' => 'Årsak:',
 'badretype' => 'Passorda du skreiv inn er ikkje like.',
@@ -828,6 +836,7 @@ Du kan allereie ha byta passordet, eller ha bede om å få eit nytt mellombels p
 '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-emaildisabled' => 'E-postfunksjonen er slegen av på wikien.',
 'passwordreset-pretext' => '↓{{PLURAL:$1||Tast inn ein av datadelane nedanfor}}',
 'passwordreset-username' => 'Brukarnamn:',
 'passwordreset-domain' => 'Domene:',
@@ -1056,6 +1065,8 @@ Det ser ut til at ho er sletta.',
 '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' => 'Gjennom å navigera vekk frå denne sida vil du mista alle endringane du måtte ha gjort.
+Denne åtvaringa kan slåast av under {{int:prefs-editing}} i instillingane dine.',
 
 # Content models
 'content-model-wikitext' => 'WikiTekst',
@@ -1336,6 +1347,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 +2212,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.',
@@ -2670,6 +2691,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',
@@ -3752,13 +3774,6 @@ Du skal ha motteke [{{SERVER}}{{SCRIPTPATH}}/COPYING ein kopi av GNU General Pub
 'version-entrypoints-header-entrypoint' => 'Inngangspunkt',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Filsti',
-'filepath-page' => 'Fil:',
-'filepath-submit' => 'Gå',
-'filepath-summary' => 'Denne spesialsida svarar med den fullstendige stigen til ei fil.
-Bilete vert viste i full oppløysing, andre filtypar vert starta direkte i dei tilknytte programma sine.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Søk etter duplikatfiler',
 'fileduplicatesearch-summary' => 'Søk etter duplikatfiler basert på hash-verdiane deira.',
@@ -3847,23 +3862,25 @@ Bilete vert viste i full oppløysing, andre filtypar vert starta direkte i dei t
 'htmlform-submit' => 'Lagre',
 'htmlform-reset' => 'Gjer om endringar',
 'htmlform-selectorother-other' => 'Andre',
+'htmlform-no' => 'Nei',
+'htmlform-yes' => 'Ja',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 med støtte for fulltekstsøk',
 'sqlite-no-fts' => '$1 utan støtte for fulltekstsøk',
 
 # New logging system
-'logentry-delete-delete' => '$1 sletta sida $3',
-'logentry-delete-restore' => '$1 attoppretta sida $3',
-'logentry-delete-event' => '$1 endra synlegdomen av {{PLURAL:$5|éi loggoppføring|$5 loggoppføringar}} på $3: $4',
-'logentry-delete-revision' => '$1 endra synlegdomen til {{PLURAL:$5|éin versjon|$5 versjonar}} på sida $3: $4',
-'logentry-delete-event-legacy' => '$1 endra synlegdomen til loggoppføringar på $3',
-'logentry-delete-revision-legacy' => '$1 endra synlegdomen til versjonar på sida $3',
-'logentry-suppress-delete' => '$1 gøymde sida $3',
-'logentry-suppress-event' => '$1 endra i løyndom synlegdomen til {{PLURAL:$5|éi logghending|$5 logghendingar}} på $3: $4',
-'logentry-suppress-revision' => '$1 endra i løyndom synlegdomen til {{PLURAL:$5|éin versjon|$5 versjonar}} på sida $3: $4',
-'logentry-suppress-event-legacy' => '$1 endra i løyndom synlegdomen til logghendingar på $3',
-'logentry-suppress-revision-legacy' => '$1 endra i løyndom synlegdomen til versjonar på sida $3',
+'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 gøymt',
 'revdelete-summary-hid' => 'endringsamandrag gøymt',
 'revdelete-uname-hid' => 'brukarnamn gøymt',
@@ -3872,20 +3889,20 @@ Bilete vert viste i full oppløysing, andre filtypar vert starta direkte i dei t
 '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 +3978,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 ff44208..6de3fa3 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
@@ -271,23 +271,21 @@ $messages = array(
 'tog-editsectiononrightclick' => 'ବିଭାଗ ନାମରେ ଡାହାଣ କ୍ଲିକ କରି ବିଭାଗ ସମ୍ପାଦନାକୁ ସଚଳ କରିବେ (ଜାଭାସ୍କ୍ରିପ୍ଟ ଲୋଡ଼ା)',
 'tog-showtoc' => 'ସୂଚୀପତ୍ର ଦେଖାଇବେ (୩ରୁ ଅଧିକ ମୁଖ୍ୟ ନାମ ଥିଲେ)',
 'tog-rememberpassword' => 'ଏହି ବ୍ରାଉଜରରେ (ସବୁଠୁ ଅଧିକ ହେଲେ $1 {{PLURAL:$1|day|ଦିନ}}) ପାଇଁ ମୋ ଲଗଇନ ମନେ ରଖିଥିବେ',
-'tog-watchcreations' => 'ମà­\8b à¬¤à¬¿à¬\86ରି à¬ªà­\83ଷà­\8dଠାସବà­\81à¬\95à­\81 à¬\8fବà¬\82 à¬®à­\8b à¬\85ପଲà­\8bଡà¬\97à­\81ଡିà¬\95à­\81 à¬®à­\8bର à¬¦à­\87à¬\96ଣାତାଲିà¬\95ାରà­\87 à¬¯à­\8bଡନ୍ତୁ',
-'tog-watchdefault' => 'ମà­\81à¬\81 à¬¬à¬¦à¬³à­\87à¬\87ଥିବା à¬ªà­\83ଷà­\8dଠା à¬\8fବà¬\82 à¬«à¬¾à¬\87ଲà¬\97à­\81ଡିà¬\95à­\81 à¬®à­\8bର à¬¦à­\87à¬\96ଣାତାଲିà¬\95ାରà­\87 à¬¯à­\8bଡନ୍ତୁ',
-'tog-watchmoves' => 'ମà­\81à¬\81 à¬\98à­\81à¬\9eà­\8dà¬\9aାà¬\87ଥିବା à¬ªà­\83ଷà­\8dଠା à¬\8fବà¬\82 à¬«à¬¾à¬\87ଲà¬\97à­\81ଡିà¬\95à­\81 à¬®à­\8bର à¬¦à­\87à¬\96ଣାତାଲିà¬\95ାରà­\87 à¬¯à­\8bଡନ୍ତୁ',
-'tog-watchdeletion' => 'ମà­\81à¬\81 à¬²à¬¿à¬­à¬¾à¬\87ଥିବା à¬ªà­\83ଷà­\8dଠା à¬\8fବà¬\82 à¬«à¬¾à¬\87ଲà¬\97à­\81ଡିà¬\95à­\81 à¬®à­\8bର à¬¦à­\87à¬\96ଣାତାଲିà¬\95ାରà­\87 à¬¯à­\8bଡନ୍ତୁ',
-'tog-minordefault' => 'ସବà­\81ଯାà¬\95 à¬¸à¬®à­\8dପାଦନାà¬\95à­\81 à¬\9bାà¬\8fà¬\81 à¬\9fିà¬\95à­\87 ବଦଳ ଭାବରେ ସୂଚିତ କରିବେ',
+'tog-watchcreations' => 'ମà­\8b à¬¤à¬¿à¬\86ରି à¬ªà­\83ଷà­\8dଠାସବà­\81à¬\95à­\81 à¬\8fବà¬\82 à¬®à­\8b à¬\85ପଲà­\8bଡ଼à¬\97à­\81ଡ଼ିà¬\95à­\81 à¬®à­\8bର à¬¦à­\87à¬\96ଣାତାଲିà¬\95ାରà­\87 à¬¯à­\8bଡ଼ନ୍ତୁ',
+'tog-watchdefault' => 'ମà­\81à¬\81 à¬¬à¬¦à¬³à­\87à¬\87ଥିବା à¬ªà­\83ଷà­\8dଠା à¬\8fବà¬\82 à¬«à¬¾à¬\87ଲà¬\97à­\81ଡ଼ିà¬\95à­\81 à¬®à­\8bର à¬¦à­\87à¬\96ଣାତାଲିà¬\95ାରà­\87 à¬¯à­\8bଡ଼ନ୍ତୁ',
+'tog-watchmoves' => 'ମà­\81à¬\81 à¬\98à­\81à¬\9eà­\8dà¬\9aାà¬\87ଥିବା à¬ªà­\83ଷà­\8dଠା à¬\8fବà¬\82 à¬«à¬¾à¬\87ଲà¬\97à­\81ଡ଼ିà¬\95à­\81 à¬®à­\8bର à¬¦à­\87à¬\96ଣାତାଲିà¬\95ାରà­\87 à¬¯à­\8bଡ଼ନ୍ତୁ',
+'tog-watchdeletion' => 'ମà­\81à¬\81 à¬²à¬¿à¬­à¬¾à¬\87ଥିବା à¬ªà­\83ଷà­\8dଠା à¬\8fବà¬\82 à¬«à¬¾à¬\87ଲà¬\97à­\81ଡ଼ିà¬\95à­\81 à¬®à­\8bର à¬¦à­\87à¬\96ଣାତାଲିà¬\95ାରà­\87 à¬¯à­\8bଡ଼ନ୍ତୁ',
+'tog-minordefault' => 'ସବà­\81ଯାà¬\95 à¬¸à¬®à­\8dପାଦନାà¬\95à­\81 à¬\9bାà¬\8fà¬\81 à¬\9bà­\8bà¬\9f ବଦଳ ଭାବରେ ସୂଚିତ କରିବେ',
 'tog-previewontop' => 'ଏଡ଼ିଟ ବାକ୍ସ ଆଗରୁ ଦେଖଣା ଦେଖାଇବେ',
 'tog-previewonfirst' => 'ପ୍ରଥମ ବଦଳର ଦେଖଣା ଦେଖାଇବେ',
 'tog-nocache' => 'ବ୍ରାଉଜର ପୃଷ୍ଠା ସଂରକ୍ଷଣକୁ ଅଚଳ କରିବେ',
-'tog-enotifwatchlistpages' => 'ମୋ ଦେଖଣାତାଲିକାରେ ଥିବା ପୃଷ୍ଠା ବା ଫାଇଲରେ କିଛି ବଦଳ ହେଲେ ମୋତେ ଇ-ମେଲ କରିବେ',
+'tog-enotifwatchlistpages' => 'ମୋ ଦେଖଣାତାଲିକାରେ ଥିବା ପୃଷ୍ଠା ବା ଫାଇଲରେ କିଛି ବଦଳ ହେଲେ ମୋତେ ଇମେଲ କରିବେ',
 'tog-enotifusertalkpages' => 'ମୋର ଆଲୋଚନା ପୃଷ୍ଠାରେ କିଛି ବଦଳ ହେଲେ ମୋତେ ଇ-ମେଲ କରିବେ',
 'tog-enotifminoredits' => 'ପୃଷ୍ଠାରେ ଏବଂ ଫାଇଲଗୁଡିକରେ ଛୋଟ ଛୋଟ ବଦଳ ହେଲେ ବି ମୋତେ ଇ-ମେଲ କରିବେ',
-'tog-enotifrevealaddr' => 'ସୂଚନା ଇ-ମେଲ ରେ ମୋର ଇ-ମେଲ ଠିକଣା ଦେଖାଇବେ',
+'tog-enotifrevealaddr' => 'ସୂଚନା ଇମେଲ ରେ ମୋର ଇମେଲ ଠିକଣା ଦେଖାଇବେ',
 'tog-shownumberswatching' => 'ଦେଖୁଥିବା ବ୍ୟବହାରକାରୀଙ୍କ ସଂଖ୍ୟା ଦେଖାଇବେ',
 'tog-oldsig' => 'ଏବେ ଥିବା ନାମ:',
 'tog-fancysig' => 'ଦସ୍ତଖତକୁ ଉଇକିଟେକ୍ସଟ ଭାବରେ ଗଣିବେ (ଆପେଆପେ ଥିବା ଲିଙ୍କ ବିନା)',
-'tog-externaleditor' => 'ବାହାର ସମ୍ପାଦକଟି ଆପଣାଛାଏଁ ବ୍ୟବହାର କରିବେ (କେବଳ ପଟୁ ସଭ୍ୟଙ୍କ ପାଇଁ, ଏଥି ନିମନ୍ତେ ଆପଣଙ୍କ କମ୍ପୁଟରରେ ବିଶେଷ ସଜାଣି ଲୋଡ଼ା । [//www.mediawiki.org/wiki/Manual:External_editors ଅଧିକ ସୂଚନା])',
-'tog-externaldiff' => 'ବାହାର ବାଛିବା (external diff) ଆପଣାଛାଏଁ ବ୍ୟବହାର କରିବେ (କେବଳ ପଟୁ ସଭ୍ୟଙ୍କ ପାଇଁ, ଏଥି ନିମନ୍ତେ ଆପଣଙ୍କ କମ୍ପୁଟରରେ ବିଶେଷ ସଜାଣି ଲୋଡ଼ା । [//www.mediawiki.org/wiki/Manual:External_editors ଅଧିକ ସୂଚନା])',
 'tog-showjumplinks' => '"ଡେଇଁଯିବେ" ଲିଙ୍କସବୁକୁ ସଚଳ କରିବେ',
 'tog-uselivepreview' => 'ସାଥେ ସାଥେ ଚାଲିଥିବା ଦେଖଣା ବ୍ୟବହାର କରିବେ (ଜାଭାସ୍କ୍ରିପ୍ଟ ଲୋଡ଼ା)',
 'tog-forceeditsummary' => 'ଖାଲି ସମ୍ପାଦନା ସାରକଥାକୁ ଯିବା ବେଳେ ମୋତେ ଜଣାଇବେ',
@@ -301,6 +299,7 @@ $messages = array(
 'tog-diffonly' => 'ତୁଳନା ତଳେ ପୃଷ୍ଠାର ଭିତର ଭାଗ ଦେଖାନ୍ତୁ ନାହିଁ',
 'tog-showhiddencats' => 'ଲୁଚାଯାଇଥିବା ଶ୍ରେଣୀଗୁଡ଼ିକ ଦେଖାଇବେ',
 'tog-norollbackdiff' => 'ରୋଲବ୍ୟାକ କଲାପରେ ତୁଳନା ଦେଖାନ୍ତୁ ନାହିଁ',
+'tog-useeditwarning' => 'ଯେତେବେଳେ ମୁଁ ଗୋଟିଏ ସାଇତାଯାଇନଥିବା ପୃଷ୍ଠାକୁ ବନ୍ଦ କରିଦିଏ ମୋତେ ଚେତାବନୀ ଦେବେ',
 
 'underline-always' => 'ସବୁବେଳେ',
 'underline-never' => 'କେବେନୁହେଁ',
@@ -470,7 +469,7 @@ $messages = array(
 'viewhelppage' => 'ସହଯୋଗ ପୃଷ୍ଠାଗୁଡ଼ିକ ଦେଖନ୍ତୁ',
 'categorypage' => 'ଶ୍ରେଣୀ ପୃଷ୍ଠାଟିକୁ ଦେଖାଇବେ',
 'viewtalkpage' => 'ଆଲୋଚନାଗୁଡ଼ିକୁ ଦେଖନ୍ତୁ',
-'otherlanguages' => 'ଅଲଗା ଭାଷା',
+'otherlanguages' => 'ଅଲଗା ଭାଷାରେ',
 'redirectedfrom' => '($1 ରୁ ଲେଉଟି ଆସିଛି)',
 'redirectpagesub' => 'ଆଉଥରେ ଫେରିବା ପୃଷ୍ଠା',
 'lastmodifiedat' => 'ଏହି ପୃଷ୍ଠାଟି $1 ତାରିଖ $2 ବେଳେ ବଦଳାଯାଇଥିଲା ।',
@@ -671,6 +670,8 @@ $2',
 ନିଜର [[Special:Preferences|{{SITENAME}} ପସନ୍ଦସବୁକୁ]] ବଦଳାଇବାକୁ ଭୁଲିବେ ନାହିଁ ।',
 'yourname' => 'ବ୍ୟବହାରକାରୀଙ୍କ ନାମ:',
 'yourpassword' => 'ପାସୱାର୍ଡ଼',
+'userlogin-yourpassword' => 'ପାସୱାର୍ଡ଼',
+'userlogin-yourpassword-ph' => 'ଆପଣଙ୍କ ପାସୱାର୍ଡ଼ ନିବେଶ କରନ୍ତୁ',
 'yourpasswordagain' => 'ପାସୱାର୍ଡ଼ ଆଉଥରେ:',
 'remembermypassword' => 'ଏହି ବ୍ରାଉଜରରେ (ସବୁଠୁ ଅଧିକ ହେଲେ $1 {{PLURAL:$1|day|ଦିନ}}) ପାଇଁ ମୋ ଲଗଇନ ମନେ ରଖିଥିବେ',
 'securelogin-stick-https' => 'ଲଗ ଇନ କଲାପରେ HTTPS ସହ ଯୋଡ଼ି ହୋଇ ରହନ୍ତୁ',
@@ -685,6 +686,7 @@ $2',
 'logout' => 'ଲଗଆଉଟ',
 'userlogout' => 'ଲଗ ଆଉଟ',
 'notloggedin' => 'ଲଗ‌‌ ଇନ କରିନାହାନ୍ତି',
+'userlogin-noaccount' => 'ଖାତାଟିଏ ନାହିଁ?',
 'nologin' => 'ଖାତାଟିଏ ନାହିଁ? $1।',
 'nologinlink' => 'ନୂଆ ଖାତାଟିଏ ଖୋଲନ୍ତୁ',
 'createaccount' => 'ନୂଆ ଖାତାଟିଏ ଖୋଲନ୍ତୁ',
@@ -741,8 +743,8 @@ continue using your old password.',
 'blocked-mailpassword' => 'ଆପଣଙ୍କ IP ଠିକଣାଟି ସମ୍ପାଦନାରେ ଭାଗ ନେବାରୁ ଅଟକାଯାଇଛି, ତେଣୁ ପାସୱାର୍ଡ଼ ଫେରନ୍ତା କାମ ବ୍ୟବହାର କରି ଅବ୍ୟବହାରକୁ ରୋକିବା ଅନୁମୋଦିତ ନୁହେଁ ।',
 'eauthentsent' => 'ଆପଣଙ୍କ ବଛା ଇ-ମେଲ ଠିକଣାକୁ ଏକ ଥୟ କରିବା ଇ-ମେଲଟିଏ ପଠାଇଦିଆଗଲା ।
 ଖାତାଟି ଆପଣଙ୍କର ବୋଲି ଥୟ କରିବା ନିମନ୍ତେ ଆଉ କେଉଁ ଇ-ମେଲ ଆପଣଙ୍କ ଖାତାକୁ ପଠାହେବା ଆଗରୁ ଆପଣଙ୍କୁ ସେହି ଇ-ମେଲରେ ଥିବା ସୂଚନା ଅନୁସରଣ କରିବାକୁ ପଡ଼ିବ ।',
-'throttled-mailpassword' => 'à¬\97ତ {{PLURAL:$1|à¬\8fà¬\95 à¬\98ଣà­\8dà¬\9fାରà­\87|$1 à¬\98ଣà­\8dà¬\9fାରà­\87}} à¬\86ପଣà¬\99à­\8dà¬\95à­\81 à¬\8fà¬\95 à¬ªà¬¾à¬¸à­±à¬¾à¬°à­\8dଡ଼ à¬®à¬¨à­\87à¬\95ରିବା à¬¸à­\82à¬\9aନାଟିଏ ପଠାଯାଇଛି ।
-à¬\85ବà­\8dà­\9fବହାରà¬\95à­\81 à¬°à­\8bà¬\95ିବା à¬¨à¬¿à¬®à¬¨à­\8dତà­\87, {{PLURAL:$1|à¬\8fà¬\95 à¬\98ଣà­\8dà¬\9fାରà­\87|$1 à¬\98ଣà­\8dà¬\9fାରà­\87}} à¬\95à­\87ବଳ à¬\97à­\8bà¬\9fିà¬\8f à¬ªà¬¾à¬¸à­±à¬¾à¬°à­\8dଡ଼ ହିଁ ପଠାହେବ ।',
+'throttled-mailpassword' => 'à¬\97ତ {{PLURAL:$1|à¬\8fà¬\95 à¬\98ଣà­\8dà¬\9fାରà­\87|$1 à¬\98ଣà­\8dà¬\9fାରà­\87}} à¬\86ପଣà¬\99à­\8dà¬\95à­\81 à¬\8fà¬\95 à¬ªà­\81ନà¬\83ସà­\8dଥାପନ à¬\87ମà­\87ଲଟିଏ ପଠାଯାଇଛି ।
+à¬\85ବà­\8dà­\9fବହାରà¬\95à­\81 à¬°à­\8bà¬\95ିବା à¬¨à¬¿à¬®à¬¨à­\8dତà­\87, {{PLURAL:$1|à¬\8fà¬\95 à¬\98ଣà­\8dà¬\9fାରà­\87|$1 à¬\98ଣà­\8dà¬\9fାରà­\87}} à¬\95à­\87ବଳ à¬\97à­\8bà¬\9fିà¬\8f à¬\87ମà­\87ଲ ହିଁ ପଠାହେବ ।',
 'mailerror' => 'ମେଲ ପଠାଇବାରେ ଭୁଲ : $1',
 'acct_creation_throttle_hit' => 'ଏହି ଉଇକିର ଦେଖଣାହାରୀ ମାନେ ଆପଣଙ୍କ IP ଠିକଣା ବ୍ୟବହାର କରି ବିଗତ ଦିନରେ {{PLURAL:$1|ଖାତାଟିଏ|$1 ଗୋଟି ଖାତା}} ତିଆରି କରିଛନ୍ତି ଯାହା ସେହି ସମୟସୀମା ଭିତରେ ସବୁଠାରୁ ଅଧିକ ଥିଲା ।
 ତେଣୁ, ଏହି IP ଠିକଣାର ଦେଖଣାହାରୀ ଗଣ ଏବେ ଆଉ ଅଧିକ ଖାତା ଖୋଲିପାରିବେ ନାହିଁ ।',
@@ -795,9 +797,10 @@ continue using your old password.',
 
 # Special:PasswordReset
 'passwordreset' => 'ପାସୱାର୍ଡ଼ ପୁନସ୍ଥାପନ କରନ୍ତୁ',
-'passwordreset-text' => 'ନିà¬\9c à¬\96ାତାର à¬¸à¬¬à¬¿à¬¶à­\87ଷ à¬¬à¬¿à¬¬à¬°à¬£à­\80 à¬\8fà¬\95 à¬\87-ମà­\87ଲରà­\87 à¬ªà¬¾à¬\87ବା ପାଇଁ ଏହି ଆବେଦନ ପତ୍ରଟି ପୂରଣ କରନ୍ତୁ ।',
+'passwordreset-text' => 'ନିà¬\9c à¬ªà¬¾à¬¸à­±à¬¾à¬°à­\8dଡ଼à¬\95à­\81 à¬ªà­\81ନà¬\83ସà­\8dଥାପନ à¬\95ରିବା ପାଇଁ ଏହି ଆବେଦନ ପତ୍ରଟି ପୂରଣ କରନ୍ତୁ ।',
 'passwordreset-legend' => 'ପାସୱାର୍ଡ଼ ପୁନସ୍ଥାପନ କରନ୍ତୁ',
 'passwordreset-disabled' => 'ପାସୱାର୍ଡ଼କୁ ପୁରାପୁରି ମୂଳକୁ ଫେରାଇବା ଏହି ଉଇକିରେ ଅଚଳ କରାଯାଇଅଛି ।',
+'passwordreset-emaildisabled' => 'ଏହି ଉଇକିରେ ଇମେଲ ସୁବିଧା ଅଚଳ କରାଯାଇଅଛି ।',
 'passwordreset-pretext' => '{{PLURAL:$1||ତଳେ ଥିବା ତଥ୍ୟସମୂହରୁ କୌଣସି ଗୋଟିଏ ଦିଅନ୍ତୁ}}',
 'passwordreset-username' => 'ବ୍ୟବହାରକାରୀଙ୍କ ନାମ:',
 'passwordreset-domain' => 'ଡୋମେନ:',
@@ -824,8 +827,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 +1056,8 @@ $1 ଦ୍ଵାରା ପ୍ରତିରୋଧ କରାଯାଇଛି
 'content-failed-to-parse' => '$1 ପ୍ରକାର ପାଇଁ $2 ଲେଖାକୁ ବର୍ଣ୍ଣନା କରିପାରିଲା ନାହିଁ: $3',
 'invalid-content-data' => 'ଅବୈଧ ଆଧାର ତଥ୍ୟ',
 'content-not-allowed-here' => '"$1" ବିଷୟଗୁଡିକ [[$2]]ପୃଷ୍ଠାରେ ରହିପାରିବ ନାହିଁ',
+'editwarning-warning' => 'ଏହି ପୃଷ୍ଠାକୁ ଛାଡ଼ି ଚାଲିଗଲେ ହୁଏ ତ ଆପଣ କରିଥିବା କିଛି ସମ୍ପାଦନା ହରାଇ ପାରନ୍ତି ।
+ଯଦି ଆପଣ ଲଗ ଇନ କରିଥାନ୍ତି ତେବେ ଆପଣଙ୍କ ପସନ୍ଦର "ସମ୍ପାଦନା" ଭାଗରେ ଏହି ଚେତାବନୀଟିକୁ ଅଚଳ କରିପାରିବେ ।',
 
 # Content models
 'content-model-wikitext' => 'ଉଇକିଟେକ୍ସଟ',
@@ -1340,15 +1345,6 @@ $1",
 ଆପଣ ଏହି ଭିତରେ ଗୁଗଲ ଦେଖିପାରନ୍ତି ।
 ଜାଣିରଖନ୍ତୁ ଯେ {{SITENAME}}ର ବିଷୟ ସୂଚି ପୁରାତନ ହୋଇଥାଇପାରେ ।',
 
-# Quickbar
-'qbsettings' => 'ସହଳ ପଟି (Quickbar)',
-'qbsettings-none' => 'କିଛି ନାହିଁ',
-'qbsettings-fixedleft' => 'ବାମକୁ ଥୟ କରାଗଲା',
-'qbsettings-fixedright' => 'ଡାହାଣକୁ ଥୟ କରାଗଲା',
-'qbsettings-floatingleft' => 'ବାମରେ ଭାସନ୍ତା',
-'qbsettings-floatingright' => 'ଡାହାଣରେ ଭାସନ୍ତା',
-'qbsettings-directionality' => 'ଆପଣଙ୍କ ଭାଷାର ବାମ-ଡାହାଣ ଲିଖନ ଶୈଳୀ ଅନୁସାରେ ସଜାଡ଼ି ଦିଆଗଲା',
-
 # Preferences page
 'preferences' => 'ପସନ୍ଦ',
 'mypreferences' => 'ପସନ୍ଦ',
@@ -1903,7 +1899,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 +2057,8 @@ URLଟି ଠିକ ଅଚିକି କି ନାଁ ଓ ସାଇଟଟି ସ
 ସେସବୁ ଅଧିକ ଉପଯୁକ୍ତ ପ୍ରସଙ୍ଗ ସହ ଯୋଡ଼ାହେବା ଉଚିତ  ।<br />
 [[MediaWiki:Disambiguationspage]] ସହ ଯୋଡ଼ାଥିବା ଛାଞ୍ଚ ବ୍ୟବହାର କରୁଥିଲେ ପୃଷ୍ଠାଟିଏକୁ ବହୁବିକଳ୍ପ ପୃଷ୍ଠା ବୋଲି କୁହାଯାଏ",
 
+'pageswithprop-submit' => 'ଯିବା',
+
 'doubleredirects' => 'ଯୋଡ଼ା ପୁନପ୍ରେରଣ',
 'doubleredirectstext' => 'ଏହି ପୃଷ୍ଠା ବାକି ବହୁବିକଳ୍ପ ପୃଷ୍ଠାମାନଙ୍କ ସହ ଯୋଡ଼ିଥାଏ ।
 ପ୍ରତ୍ୟେକ ଧାଡ଼ିରେ ପ୍ରଥମ ଓ ଶେଷ ପୁନପ୍ରେରଣ ସହ ଯୋଡ଼ିବା ଲିଙ୍କ ରହିଥାଏ, ଆହୁରି ମଧ୍ୟ ଏଥିରେ ଦ୍ଵିତୀୟ ପୁନପ୍ରେରଣର ଲକ୍ଷ ସହ ଯୋଡ଼ିବାର ଲିଙ୍କ ଥାଏ , ଯାହାକି ସାଧାରଣତ "ପ୍ରକୃତ" ଲକ୍ଷ ପୃଷ୍ଠା ହୋଇଥାଏ, ଯାହାକୁ ପ୍ରଥମ ପୁନପ୍ରେରଣ ପୃଷ୍ଠା ଯୋଡ଼ିଥାଏ ।
@@ -3190,6 +3187,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' => 'ଗଢ଼ଣଟି ଏମିତି ହେବ:
 
@@ -3905,6 +3907,8 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକ୍ଷରେ ବଣ୍ଟାଯ
 'htmlform-submit' => 'ଦାଖଲକରିବା',
 'htmlform-reset' => 'କରାଯାଇଥିବା ବଦଳ ପଛକୁ ଫେରାଇବେ',
 'htmlform-selectorother-other' => 'ବାକି',
+'htmlform-no' => 'ନାହିଁ',
+'htmlform-yes' => 'ହଁ',
 
 # SQLite database support
 'sqlite-has-fts' => 'ପୁରା ଟେକ୍ସ୍ଟ ଖୋଜା ସହଯୋଗ ସହିତ $1',
index 3a6e545..b079132 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' => 'Архайын æндæр иртасæнæй (æрмæст эксперттæн, домы сæрмагонд æвæрдтытæ компьютерыл. [//www.mediawiki.org/wiki/Manual:External_editors Лæмбынæг.])',
 'tog-showjumplinks' => 'Тагъд æрвитæнтæй пайда кæн',
 'tog-uselivepreview' => 'Архайын тагъд разбакастæй (домы JavaScript) (эксперименталон)',
 'tog-forceeditsummary' => 'Фæдзæхсæд иу мæ, кæд ивды афыст афтид уа',
@@ -1013,13 +1011,6 @@ $2
 'powersearch-field' => 'Агуырд',
 'powersearch-toggleall' => 'Иууылдæр',
 
-# Quickbar
-'qbsettings' => 'Навигацион таг',
-'qbsettings-none' => 'Ма равдис',
-'qbsettings-fixedleft' => 'Галиуырдыгæй',
-'qbsettings-fixedright' => 'Рахизырдыгæй',
-'qbsettings-floatingleft' => 'Рахизырдыгæй ленккæнгæ',
-
 # Preferences page
 'preferences' => 'Уагæвæрдтæ',
 'mypreferences' => 'Уагæвæрдтæ',
@@ -1612,12 +1603,8 @@ $3',
 'spamprotectiontitle' => 'Спамы ныхмæ фильтр',
 
 # Skin names
-'skinname-standard' => 'Стандартон',
-'skinname-nostalgia' => 'Æнкъард',
 'skinname-cologneblue' => 'Кёльны æрхæндæг',
 'skinname-monobook' => 'Моно-чиныг',
-'skinname-myskin' => 'Мæхи',
-'skinname-chick' => 'Карк',
 
 # Browsing diffs
 'previousdiff' => '← Зæронддæр ивд',
index 94ff21a..d755b6a 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ਪਾà¨\93',
-'tog-hidepatrolled' => 'ਹਾਲ â\80\99à¨\9a à¨¹à©\8bà¨\8f à¨¬à¨¦à¨²à¨¾à¨µ à¨µà¨¿à©±à¨\9a à¨\9cਾà¨\82à¨\9aà©\87 à¨¹à©\8bà¨\8f à¨¬à¨¦à¨²à¨¾à¨µ à¨\9bà©\81ਪਾà¨\93',
-'tog-newpageshidepatrolled' => 'ਨਵੀ ਸੁਚੀ ਮੈ ਸੈ ਗਸ਼ਤ ਪਰਚੇ ਕੌ ਛੁਪਾਏ.',
+'tog-underline' => 'ਲਿੰà¨\95 à¨¹à©\87ਠ-ਲਾà¨\88ਨ:',
+'tog-justify' => 'ਪà©\88ਰਾà¨\97ਰਾਫ਼ à¨\87à¨\95ਸਾਰ',
+'tog-hideminor' => 'ਤਾà¨\9c਼ਾ à¨¬à¨¦à¨²à¨¾à¨\85 à¨µà¨¿à©±à¨\9a à¨\9bà©\8bà¨\9fà©\80à¨\86à¨\82 à¨¸à©\8bਧਾà¨\82 à¨\93ਹਲà©\87',
+'tog-hidepatrolled' => 'ਤਾà¨\9c਼ਾ à¨¬à¨¦à¨²à¨¾à¨\85 à¨µà¨¿à©±à¨\9a à¨\9cਾà¨\82à¨\9a à¨\95à©\80ਤà©\80à¨\86à¨\82 à¨¸à©\8bਧਾà¨\82 à¨\93ਹਲà©\87',
+'tog-newpageshidepatrolled' => 'ਨਵੀਂ ਸਫ਼ਾ ਸੂਚੀ ਵਿੱਚੋਂ ਨਿਗਰਾਨੀ ਸਫ਼ੇ ਓਹਲੇ ਕਰੋ',
 'tog-extendwatchlist' => 'ਕੇਵਲ ਹਾਲਿਆ ਹੀ ਨਹੀਂ, ਸਗੋਂ ਸਾਰੇ ਪਰਿਵਰਤਨਾਂ ਨੂੰ ਵਿਖਾਉਣ ਲਈ ਧਿਆਨਸੂਚੀ ਨੂੰ ਵਿਸਥਾਰਿਤ ਕਰੋ',
 'tog-usenewrc' => 'ਹਾਲ ’ਚ ਹੋਏ ਬਦਲਾਵ ਅਤੇ ਧਿਆਨਸੂਚੀ ਵਿੱਚ ਪੰਨੇ ਮੁਤਾਬਕ ਬਦਲਾਵ ਦੇ ਗਰੁੱਪ ਬਣਾਓ (ਜਾਵਾਸਕ੍ਰਿਪਟ ਦੀ ਜਰੂਰਤ ਹੈ)',
 '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 à¨¸à©°à¨ªà¨¾à¨¦à¨¨ à¨¸à¨®à¨°à©±à¨¥à¨¾à¨µà¨¾à¨¨ à¨\95ਰà©\8b',
-'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ਧ] à¨²à¨¿à©°à¨\95 à¨°à¨¾à¨¹à©\80à¨\82 à¨­à¨¾à¨\97 à¨¸à©\8bਧ à¨\95ਰਨਾ à¨\9aਾਲà©\82',
+'tog-editsectiononrightclick' => 'ਭਾà¨\97 ਸਿਰਲੇਖਾਂ ਤੇ ਸੱਜੀ ਕਲਿੱਕ ਦੁਆਰਾ ਸੋਧ ਯੋਗ ਕਰੋ (ਜਾਵਾ ਸਕ੍ਰਿਪਟ ਲੋੜੀਂਦੀ ਹੈ)',
+'tog-showtoc' => 'ਤਤà¨\95ਰਾ à¨µà©\87à¨\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 à¨µà¨¿à©±à¨\9a à¨ªà¨¾à¨\93',
-'tog-watchdefault' => 'ਮà©\87ਰà©\87 à¨µà©±à¨²à©\8bà¨\82 à¨¸à©°à¨ªà¨¾à¨¦à¨¿à¨¤ à¨\97à¨\8f à¨ªà©°à¨¨à©\87 à¨\85ਤà©\87 à¨«à¨¾à¨\88ਲਾà¨\82 à¨®à©\87ਰà©\80 à¨§à¨¿à¨\86ਨਸà©\82à¨\9aà©\80 à¨µà¨¿à©±à¨\9a à¨ªà¨¾à¨\93',
-'tog-watchmoves' => 'ਮà©\87ਰà©\87 à¨µà©±à¨²à©\8bà¨\82 à¨¸à¨¥à¨¾à¨¨à¨¾à¨\82ਤਰਿਤ à¨ªà©°à¨¨à©\87 à¨\85ਤà©\87 à¨«à¨¾à¨\88ਲਾà¨\82 à¨®à©\87ਰà©\80 à¨§à¨¿à¨\86ਨਸà©\82à¨\9aà©\80 à¨µà¨¿à©±à¨\9a à¨ªà¨¾à¨\93',
-'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 à¨¹à©\8bਣ à¨¦à¨¾ à¨¨à¨¿à¨¸à¨¼à¨¾à¨¨ à¨²à¨¾à¨\93',
-'tog-previewontop' => 'à¨\90ਡਿà¨\9f à¨¬à¨\95ਸà©\87 ਤੋਂ ਪਹਿਲਾਂ ਝਲਕ ਵੇਖਾਓ',
-'tog-previewonfirst' => 'ਪਹਿਲà©\87 à¨\90ਡਿà¨\9f ਉੱਤੇ ਝਲਕ ਵੇਖਾਓ',
+'tog-watchcreations' => 'ਮੇਰੇ ਵਲੋਂ ਬਣਾਏ ਗਏ ਪੰਨੇ ਅਤੇ ਅੱਪਲੋਡ ਕੀਤੀਆਂ ਫਾਈਲਾਂ ਮੇਰੀ ਧਿਆਨਸੂਚੀ ਵਿੱਚ ਪਾਓ',
+'tog-watchdefault' => 'ਮੇਰੇ ਵੱਲੋਂ ਸੰਪਾਦਤ ਗਏ ਪੰਨੇ ਅਤੇ ਫਾਈਲਾਂ ਮੇਰੀ ਧਿਆਨਸੂਚੀ ਵਿੱਚ ਪਾਓ',
+'tog-watchmoves' => 'ਮੇਰੇ ਵੱਲੋਂ ਸਥਾਨਾਂਤਰਤ ਪੰਨੇ ਅਤੇ ਫਾਈਲਾਂ ਮੇਰੀ ਧਿਆਨਸੂਚੀ ਵਿੱਚ ਪਾਓ',
+'tog-watchdeletion' => 'ਮà©\87ਰà©\87 à¨µà¨²à©\8bà¨\82 à¨¹à¨\9fਾà¨\8f à¨\97à¨\8f à¨ªà©°à¨¨à©\87 à¨\85ਤà©\87 à¨«à¨¾à¨\88ਲਾà¨\82 à¨®à©\87ਰà©\80 à¨§à¨¿à¨\86ਨਸà©\82à¨\9aà©\80 à¨µà¨¿à©±ਚ ਪਾਓ',
+'tog-minordefault' => 'ਮà©\87ਰà©\87 à¨¸à¨¾à¨°à©\87 à¨¸à©°à¨ªà¨¾à¨¦à¨¨ à¨\9bà©\8bà¨\9fà©\87 à¨¬à¨¦à¨²à¨¾à¨\85 à¨¹à¨¨',
+'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,14 +250,14 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
 'wednesday' => 'ਬੁੱਧਵਾਰ',
 'thursday' => 'ਵੀਰਵਾਰ',
 'friday' => 'ਸ਼ੁੱਕਰਵਾਰ',
-'saturday' => 'ਸ਼ਨà©\80ਵਾਰ',
+'saturday' => 'ਸ਼ਨਿੱà¨\9aਰਵਾਰ',
 'sun' => 'ਐਤ',
 'mon' => 'ਸੋਮ',
 'tue' => 'ਮੰਗਲ',
 'wed' => 'ਬੁੱਧ',
 'thu' => 'ਵੀਰ',
 'fri' => 'ਸ਼ੁੱਕਰ',
-'sat' => 'ਸ਼ਨà©\80',
+'sat' => 'ਸ਼ਨਿੱà¨\9aਰ',
 'january' => 'ਜਨਵਰੀ',
 'february' => 'ਫਰਵਰੀ',
 'march' => 'ਮਾਰਚ',
@@ -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' => 'ਖੋਜ',
+'help' => 'ਮੱਦਦ',
+'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' => 'ਸਫ਼ਾ à¨\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ਧ',
 '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' => 'ਸਾà¨\82à¨\9aਾ à¨ªà©°à¨¨ਾ ਵੇਖੋ',
+'viewhelppage' => 'ਮੱਦਦ à¨¸à¨«à¨¼à¨¾ à¨µà©\87à¨\96à©\8b',
 'categorypage' => 'ਕੈਟੈਗਰੀ ਸਫ਼ਾ ਵੇਖੋ',
 'viewtalkpage' => 'ਚਰਚਾ ਵੇਖੋ',
-'otherlanguages' => 'ਹੋਰ ਭਾਸ਼ਾਵਾਂ',
+'otherlanguages' => 'ਹੋਰ ਭਾਸ਼ਾਵਾਂ ਵਿੱਚ',
 'redirectedfrom' => '($1 ਤੋਂ ਰੀਡਿਰੈਕਟ)',
 'redirectpagesub' => 'ਰੀਡਿਰੈਕਟ ਸਫ਼ਾ',
-'lastmodifiedat' => 'à¨\87ਸ à¨ªà©°à¨¨à¨¾ à¨¦à¨¾ à¨ªà¨¿à©±à¨\9bਲਾ à¨¬à¨¦à¨²à¨¾à¨µ  $1 à¨¨à©\82à©°  $2 à¨µà¨\9cà©\87 à¨¹à©\8bà¨\87à¨\86 à¨¸à©\80।',
+'lastmodifiedat' => 'à¨\87ਹ à¨¸à¨«à¨¼à©\87 à¨µà¨¿à©±à¨\9a à¨\86à¨\96ਰà©\80 à¨¸à©\8bਧ  $1 à¨¨à©\82à©°  $2 à¨µà¨\9cà©\87 à¨¹à©\8bà¨\88।',
 'viewcount' => 'ਇਹ ਸਫ਼ਾ {{PLURAL:$1|ਇੱਕ ਵਾਰ|$1 ਵਾਰ}} ਵੇਖਿਆ ਗਿਆ।',
 'protectedpage' => 'ਸੁਰੱਖਿਅਤ ਪੇਜ',
 'jumpto' => 'ਇਸ ’ਤੇ ਜਾਓ:',
-'jumptonavigation' => 'ਰਹਿਨà©\81ਮਾà¨\88',
-'jumptosearch' => 'ਖੋਜ',
-'view-pool-error' => 'à¨\86ਫ਼ਸà©\8bਸ, à¨¸à¨°à¨µà¨° à¨\87ਸ à¨µà©\87ਲ਼ੇ ਓਵਰਲੋਡ ਹੈ।
+'jumptonavigation' => 'ਨà©\87ਵà©\80à¨\97à©\87ਸ਼ਨ',
+'jumptosearch' => 'ਖੋਜ',
+'view-pool-error' => 'à¨\85ਫ਼ਸà©\8bਸ, à¨¸à¨°à¨µà¨° à¨\87ਸ à¨µà©\87ਲੇ ਓਵਰਲੋਡ ਹੈ।
 ਬਹੁਤ ਸਾਰੇ ਮੈਂਬਰ ਇਸ ਸਫ਼ੇ ਨੂੰ ਵੇਖਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਰਹੇ ਹਨ।
-ਮਿਹਰਬਾਨà©\80 à¨\95ਰà¨\95à©\87 à¨¦à©\81ਬਾਰਾ à¨\95à©\8bਸ਼ਿਸ਼ à¨\95ਰਨ à¨¤à©\8bà¨\82 à¨ªà¨¹à¨¿à¨²à¨¾à¨\82 à¨¥à©\8bà©\9cà©\80 à¨\89ਡà©\80à¨\95 à¨\95ਰà©\8b
+ਫà©\87ਰ à¨\95à©\8bਸ਼ਿਸ਼ à¨\95ਰਨ à¨¤à©\8bà¨\82 à¨ªà¨¹à¨¿à¨²à¨¾à¨\82 à¨¥à©\8bà©\9cà©\80 à¨\89ਡà©\80à¨\95 à¨\95ਰà©\8b à¨\9cà©\80
 $1',
-'pool-timeout' => 'ਲà©\8cਕ ਲਈ ਉਡੀਕ ਦਾ ਵਕਤ ਖ਼ਤਮ ਹੋ ਗਿਆ ਹੈ',
-'pool-queuefull' => 'ਪà©\82ਲ à¨\95ਤਾਰ à¨ªà©\82ਰà©\80 à¨²à©±à¨¦ੀ ਹੈ',
-'pool-errorunknown' => 'à¨\85ਣà¨\9cਾਣ à¨\97਼ਲਤà©\80',
+'pool-timeout' => 'ਲਾਕ ਲਈ ਉਡੀਕ ਦਾ ਵਕਤ ਖ਼ਤਮ ਹੋ ਗਿਆ ਹੈ',
+'pool-queuefull' => 'ਪà©\82ਲ à¨\95ਤਾਰ à¨­à¨°ੀ ਹੈ',
+'pool-errorunknown' => 'ਅਣਜਾਣ ਗਲਤੀ',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => '{{SITENAME}} ਬਾਰੇ',
@@ -433,18 +424,18 @@ $1',
 'copyrightpage' => '{{ns:project}}:ਕਾਪੀਰਾਈਟ',
 'currentevents' => 'ਹਾਲ ਦੀਆਂ ਘਟਨਾਵਾਂ',
 'currentevents-url' => 'Project:ਹਾਲ ਦੀਆਂ ਘਟਨਾਵਾਂ',
-'disclaimers' => 'à¨\87ਨà¨\95ਾਰà©\80 à¨\90ਲਾਨ',
-'disclaimerpage' => 'Project:à¨\86ਮ à¨\87ਨà¨\95ਾਰ',
-'edithelp' => 'ਸੰਪਾਦਨ à¨®ਦਦ',
-'edithelppage' => 'Help:ਸੰਪਾਦਨ',
-'helppage' => 'Help:à¨\9aà©\80à¨\9c਼ਾà¨\82',
-'mainpage' => 'ਮà©\81ੱà¨\96 à¨ªà©°à¨¨ਾ',
-'mainpage-description' => 'ਮà©\81ੱà¨\96 à¨ªà©°à¨¨ਾ',
-'policy-url' => 'Project:ਪਾਲਸੀ',
-'portal' => 'ਸਮਾà¨\9c à¨®à©\81ੱà¨\96 à¨ªà©°à¨¨à¨¾',
-'portal-url' => 'Project:ਸਮਾà¨\9c à¨®à©\81ੱà¨\96 à¨ªà©°à¨¨à¨¾',
-'privacy' => 'ਲà©\81à¨\95ਾà¨\85 ਨੀਤੀ',
-'privacypage' => 'Project:ਲà©\81à¨\95ਾà¨\85 ਨੀਤੀ',
+'disclaimers' => 'ਦਾà¨\85ਵà©\87',
+'disclaimerpage' => 'Project:à¨\86ਮ à¨¦à¨¾à¨\85ਵà©\87',
+'edithelp' => 'ਸà©\8bਧ à¨®à©±ਦਦ',
+'edithelppage' => 'Help:ਸà©\8bਧ',
+'helppage' => 'Help:ਸਮੱà¨\97ਰà©\80',
+'mainpage' => 'ਮà©\81ੱà¨\96 à¨¸à¨«à¨¼ਾ',
+'mainpage-description' => 'ਮà©\81ੱà¨\96 à¨¸à¨«à¨¼ਾ',
+'policy-url' => 'Project:ਨà©\80ਤੀ',
+'portal' => 'ਸਮਾà¨\9c à¨¸à©±à¨¥',
+'portal-url' => 'Project:ਸਮਾà¨\9c à¨¸à©±à¨¥',
+'privacy' => 'ਪਰਾà¨\88ਵà©\87ਸà©\80 ਨੀਤੀ',
+'privacypage' => 'Project:ਪਰਾà¨\88ਵà©\87ਸà©\80 ਨੀਤੀ',
 
 'badaccess' => 'ਅਧਿਕਾਰ ਗਲਤੀ',
 'badaccess-group0' => 'ਤੁਹਾਨੂੰ ਉਹ ਐਕਸ਼ਨ ਕਰਨ ਦੀ ਮਨਜ਼ੂਰੀ ਨਹੀਂ, ਜਿਸ ਦੀ ਤੁਸੀਂ ਮੰਗ ਕੀਤੀ ਹੈ।',
@@ -458,24 +449,24 @@ $1',
 'retrievedfrom' => '"$1" ਤੋਂ ਲਿਆ',
 'youhavenewmessages' => 'ਤੁਹਾਡੇ ਲਈ $1। ($2)',
 'newmessageslink' => 'ਨਵੇਂ ਸੁਨੇਹੇ',
-'newmessagesdifflink' => 'ਪਿੱà¨\9bਲਾ à¨¬à¨¦à¨²à¨¾à¨µ',
+'newmessagesdifflink' => 'à¨\86à¨\96ਰà©\80 à¨¬à¨¦à¨²à¨¾à¨\85',
 'youhavenewmessagesfromusers' => '{{PLURAL:$3|ਇੱਕ ਵਰਤੋਂਕਾਰ|$3 ਵਰਤੋਂਕਾਰਾਂ}} ਵੱਲੋਂ ਤੁਹਾਨੂੰ $1 ($2)।',
-'youhavenewmessagesmanyusers' => 'à¨\95à¨\88 à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰਾà¨\82 ਵੱਲੋਂ ਤੁਹਾਨੂੰ $1 ($2)।',
+'youhavenewmessagesmanyusers' => 'à¨\95à¨\88 à¨¯à©\82à¨\9c਼ਰ ਵੱਲੋਂ ਤੁਹਾਨੂੰ $1 ($2)।',
 'newmessageslinkplural' => '{{PLURAL:$1|ਇੱਕ ਨਵਾਂ ਸੁਨੇਹਾ|ਨਵੇਂ ਸੁਨੇਹੇ}} {{PLURAL:$1|ਹੈ|ਹਨ}}',
 'newmessagesdifflinkplural' => 'ਆਖ਼ਰੀ {{PLURAL:$1|ਤਬਦੀਲੀ|ਤਬਦੀਲੀਆਂ}}',
 'youhavenewmessagesmulti' => '$1 ’ਤੇ ਤੁਹਾਡੇ ਲਈ ਨਵੇਂ ਸੁਨੇਹੇ ਹਨ',
-'editsection' => 'ਸੰਪਾਦਨ',
-'editold' => 'ਸੰਪਾਦਨ',
+'editsection' => 'ਸà©\8bਧ',
+'editold' => 'ਸà©\8bਧ',
 'viewsourceold' => 'ਸਰੋਤ ਵੇਖੋ',
-'editlink' => 'ਸੰਪਾਦਨ',
+'editlink' => 'ਸà©\8bਧ',
 'viewsourcelink' => 'ਸਰੋਤ ਵੇਖੋ',
-'editsectionhint' => 'ਭਾà¨\97 à¨¸à©°à¨ªà¨¾à¨¦à¨¨: $1',
+'editsectionhint' => 'ਭਾà¨\97 à¨¸à©\8bਧ: $1',
 'toc' => 'ਵਿਸ਼ਾ ਸੂਚੀ',
-'showtoc' => 'ਵà©\87à¨\96à©\8b',
+'showtoc' => 'ਵà©\87à¨\96ਾà¨\93',
 'hidetoc' => 'ਓਹਲੇ',
 'collapsible-collapse' => 'ਸਮੇਟੋ',
 'collapsible-expand' => 'ਫੈਲਾਓ',
-'thisisdeleted' => '$1 à¨µà©\87à¨\96à©\8b à¨\9cਾà¨\82 à¨®à©\81à©\9c à¨¬à¨¹à¨¾à¨² ਕਰੋ',
+'thisisdeleted' => '$1 à¨µà©\87à¨\96à©\8b à¨\9cਾà¨\82 à¨®à©\81à©\9c à¨¸à¨\9fà©\8bਰ ਕਰੋ',
 'viewdeleted' => '$1 ਵੇਖਣੀਆਂ ਹਨ?',
 'restorelink' => '{{PLURAL:$1|ਇਕ ਮਿਟਾਈ ਹੋਈ ਸੋਧ|$1 ਮਿਟਾਈਆਂ ਹੋਈਆਂ ਸੋਧਾਂ}}',
 'feedlinks' => 'ਫੀਡ:',
@@ -485,20 +476,20 @@ $1',
 'site-atom-feed' => '$1 ਐਟਮ ਫੀਡ',
 'page-rss-feed' => '"$1" RSS ਫੀਡ',
 'page-atom-feed' => '"$1" ਐਟਮ ਫੀਡ',
-'red-link-title' => '$1 (ਪੰਨਾ ਮੌਜੂਦ ਨਹੀਂ ਹੈ)',
+'red-link-title' => '$1 (ਸਫ਼ਾ ਮੌਜੂਦ ਨਹੀਂ ਹੈ)',
 'sort-descending' => 'ਘੱਟਦਾ ਕ੍ਰਮ',
 'sort-ascending' => 'ਵੱਧਦਾ ਕ੍ਰਮ',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'ਪੰਨਾ',
-'nstab-user' => 'ਵਰਤà©\8bà¨\82à¨\95ਾਰ à¨ªà©°à¨¨à©\87',
-'nstab-media' => 'ਮà©\80ਡà©\80ਆ ਸਫ਼ਾ',
-'nstab-special' => 'ਵਿਸ਼à©\87ਸ਼ à¨ªà©°à¨¨ਾ',
-'nstab-project' => 'ਪਰਿਯà©\8bà¨\9cਨਾ à¨ªà©°à¨¨ਾ',
-'nstab-image' => 'ਫ਼ਾà¨\88ਲ',
+'nstab-main' => 'ਸਫ਼ਾ',
+'nstab-user' => 'ਯà©\82à¨\9c਼ਰ à¨¸à¨«à¨¼à¨¾',
+'nstab-media' => 'ਮà©\80ਡਿਆ ਸਫ਼ਾ',
+'nstab-special' => 'à¨\96ਾਸ à¨¸à¨«à¨¼ਾ',
+'nstab-project' => 'ਪਰà©\8bà¨\9cà©\88à¨\95à¨\9f à¨¸à¨«à¨¼ਾ',
+'nstab-image' => 'ਫਾà¨\87ਲ',
 'nstab-mediawiki' => 'ਸੁਨੇਹਾ',
-'nstab-template' => 'ਸਾà¨\82à¨\9aਾ',
-'nstab-help' => 'ਮੱਦਦ à¨ªà©\87à¨\9c',
+'nstab-template' => 'à¨\9fà©\88ਪਲà©\87à¨\9f',
+'nstab-help' => 'ਮੱਦਦ à¨¸à¨«à¨¼à¨¾',
 'nstab-category' => 'ਸ਼੍ਰੇਣੀ',
 
 # Main script and global functions
@@ -512,7 +503,7 @@ $1',
 
 # General errors
 'error' => 'ਗ਼ਲਤੀ',
-'databaseerror' => 'ਡà©\88à¨\9fਾਬà©\87ਸ à¨\97਼ਲਤੀ',
+'databaseerror' => 'ਡਾà¨\9fਾਬà©\87ਸ à¨\97ਲਤੀ',
 'dberrortext' => 'ਡੈਟਾਬੇਸ ਪੁ੍ਛ ਗਿੱਛ ਵਿਚ ਹਿਦਾਇਤਾਂ ਦੀ ਤਰੁੱਟੀ ਮਿਲੀ ਹੈ।
 ਹੋ ਸਕਦਾ ਹੈ ਇਹ ਤਰੁ੍ੱਟੀ ਸਾਫ਼ਟਵੇਅਰ ਦੀ ਹੋਵੇ।
 ਇਸ ਗਣਿਤਫ਼ਲ "<tt>$2</tt>" ਵਿਚੌਂ ਪਿਛਲੀ ਡੈਟਬਾਸ ਪੁੱਛ ਗਿੱਛ ਸੀ: <blockquote><tt>$1</tt></blockquote.
@@ -528,25 +519,25 @@ $1',
 'missing-article' => "ਡਾਟਾਬੇਸ ਨੂੰ ''$1'' $2 ਨਾਮ ਦਾ ਕੋਈ ਪੰਨਾ ਨਹੀਂ ਮਿਲਿਆ।
 ਆਮ ਤੌਰ ਤੇ ਹਟਾਈ ਜਾ ਚੁੱਕੇ ਪੰਨੇ ਦਾ ਇਤਿਹਾਸ ਕੜੀ ਦੀ ਵਰਤੋਂ ਕਰਨ ਨਾਲ ਇੰਝ ਹੁੰਦਾ ਹੈ।
 ਜੇ ਇਹ ਗੱਲ ਨਹੀਂ ਤਾਂ ਹੋ ਸਕਦਾ ਹੈ ਤੁਹਾਨੂੰ ਸਾਫ਼ਟਵੇਅਰ ਵਿਚ ਖਾਮੀ ਮਿਲ ਗਈ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਪੰਨੇ ਦੇ ਪਤੇ ਸਮੇਤ [[Special:ListUsers/sysop|administrator]] ਨੂੰ ਇਤਲਾਹ ਦਿਓ।",
-'missingarticle-rev' => '(ਬਦਲਾà¨\85#: $1)',
-'missingarticle-diff' => '(ਫ਼ਰà¨\95: $1, $2)',
+'missingarticle-rev' => '(ਰà©\80ਵਿà¨\9c਼ਨ#: $1)',
+'missingarticle-diff' => '(à¨\85ੰਤਰ: $1, $2)',
 'readonly_lag' => 'ਜਦੌਂ ਤਕ ਅਧੀਨ ਡੇਟਾਬੇਸ ਸਰਵਰ ਸੁਤੰਤਰ ਡੈਟਾਬੇਸ ਸਰਵਰ ਦੀ ਪਕੜ ਵਿਚ ਨਹੀਂ ਆ ਜਾਂਦੇ ਡੈਟਾਬੇਸ ਸਵੈ ਜਕੜਿਆ ਗਿਆ ਹੈ।',
 'internalerror' => 'ਅੰਦਰੂਨੀ ਗ਼ਲਤੀ',
 'internalerror_info' => 'ਅੰਦਰੂਨੀ ਗ਼ਲਤੀ: $1',
 'fileappenderrorread' => 'ਅੰਤਕਾ ਜੋੜਨ ਲਗਿਆਂ "$1"ਪੜ੍ਹਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ।',
 'fileappenderror' => "''$1'' ''$2'' ਨਾਲ਼ ਜੋੜਿਆ ਨਹੀ ਜਾ ਸਕਦਾ",
-'filecopyerror' => "'''$1''' ਫ਼ਾਈਲ '''$2''' ਵਿਚ ਨਕਲ ਨਹੀਂ ਹੋ ਸਕੀ।",
-'filerenameerror' => "ਫ਼ਾà¨\88ਲ ''$1'' à¨¦à¨¾ à¨¨à¨¾à¨® à¨¬à¨¦à¨² à¨\95à©\87 ''$2'' à¨¨à¨¹à©\80à¨\82 à¨°à©±à¨\96ਿà¨\86 ਜਾ ਸਕਿਆ।",
-'filedeleteerror' => "ਫ਼ਾਈਲ ''$1'' ਮਿਟਾਈ ਨਹੀਂ ਜਾ ਸਕੀ।",
-'directorycreateerror' => "''$1'' ਬਣਾਈ ਨਹੀਂ ਜਾ ਸਕੀ।",
-'filenotfound' => "ਫ਼ਾà¨\88ਲ ''$1'' ਲੱਭੀ ਨਹੀਂ ਜਾ ਸਕੀ।",
-'fileexistserror' => 'ਮਿਸਲ "$1" à¨¤à©\87 à¨²à¨¿à¨\96 à¨¨à¨¹à©\80à¨\82 à¨¸à¨\95ਦà©\87: à¨®à¨¿à¨¸à¨² à¨¹à©\8cà¨\82ਦ à¨µà¨¿à¨\9a ਹੈ।',
+'filecopyerror' => "ਫਾਇਲ '''$1'' '$2''' ਵਿੱਚ ਕਾਪੀ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ।",
+'filerenameerror' => "ਫਾà¨\87ਲ ''$1'' à¨¦à¨¾ à¨¨à¨¾à¨\82 ''$2'' à¨¬à¨¦à¨²à¨¿à¨\86 à¨¨à¨¹à©\80à¨\82 ਜਾ ਸਕਿਆ।",
+'filedeleteerror' => "''$1'' ਫਾਇਲ ਹਟਾਈ ਨਹੀਂ ਜਾ ਸਕੀ।",
+'directorycreateerror' => "ਡਾਇਰੈਕਟਰੀ ''$1'' ਬਣਾਈ ਨਹੀਂ ਜਾ ਸਕੀ।",
+'filenotfound' => "ਫਾà¨\87ਲ ''$1'' ਲੱਭੀ ਨਹੀਂ ਜਾ ਸਕੀ।",
+'fileexistserror' => 'ਫਾà¨\87ਲ "$1" à¨\89ੱਤà©\87 à¨²à¨¿à¨\96 à¨¨à¨¹à©\80à¨\82 à¨¸à¨\95ਦà©\87: à¨«à¨¾à¨\87ਲ à¨®à©\8cà¨\9cà©\82ਦ ਹੈ।',
 'unexpected' => 'ਅਣਉਮੀਦਿਆ ਮੁੱਲ: "$1"="$2"।',
 'formerror' => 'ਗ਼ਲਤੀ: ਫ਼ਾਰਮ ਪੇਸ਼ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ',
 'badarticleerror' => 'ਇਹ ਕਾਰਵਾਈ ਇਸ ਸਫ਼ੇ ਤੇ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।',
 'cannotdelete' => "ਫ਼ਾਈਲ ਜਾਂ ਸਫ਼ਾ ''$1'' ਨੂੰ ਮਿਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ।
 ਸ਼ਾਇਦ ਕੋਈ ਪਹਿਲਾਂ ਹੀ ਇਸਨੂੰ ਮਿਟਾ ਚੁੱਕਾ ਹੈ।",
-'cannotdelete-title' => "ਸਫ਼ਾ ''$1'' à¨¨à©\82à©° à¨®à¨¿ਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ",
+'cannotdelete-title' => "ਸਫ਼ਾ ''$1'' à¨¨à©\82à©° à¨¹ਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ",
 'delete-hook-aborted' => 'ਹੁੱਕ ਨੇ ਮਿਟਾਉਣਾ ਨਾਕਾਮ ਕੀਤਾ।
 ਇਸਨੇ ਕੋਈ ਕਾਰਨ ਨਹੀਂ ਦੱਸਿਆ।',
 'badtitle' => 'ਗਲਤ ਸਿਰਲੇਖ',
@@ -558,11 +549,11 @@ $1',
  ਪ੍ਰਸ਼ਨ: $2',
 'viewsource' => 'ਸਰੋਤ ਵੇਖੋ',
 'viewsource-title' => '$1 ਲਈ ਸਰੋਤ ਵੇਖੋ',
-'actionthrottled' => 'à¨\95ਾਰà¨\9c à¨¬à©°à¨¦ à¨\95ਰ à¨¦à¨¿à©±à¨¤à¨¾ à¨\97ਿà¨\86 à¨¹à©\88',
+'actionthrottled' => 'à¨\95ਾਰਵਾà¨\88 à¨¬à©°à¨¦ à¨\95à©\80ਤà©\80 à¨\97à¨\88।',
 'actionthrottledtext' => 'ਸਪੈਮ ਦੀ ਰੋਕਥਾਮ ਲਈ, ਇਹ ਕਰੀਆ ਇਨ੍ਹੇ ਘੱਟ ਸਮੇਂ ਵਿੱਚ ਇੱਕ ਸੀਮਾ ਤੋਂ ਜਿਆਦਾ ਵਾਰ ਕਰਨ ਤੋਂ ਮਨਾਹੀ ਹੈ, ਅਤੇ ਤੁਸੀਂ ਇਸ ਸੀਮਾ ਨੂੰ ਪਾਰ ਕਰ ਚੁੱਕੇ ਹੋ।
 ਕਿਰਪਾ ਕਰਕੇ ਕੁਝ ਸਮੇਂ ਬਾਅਦ ਪੁੰਨ: ਜਤਨ ਕਰੋ।',
 'protectedpagetext' => 'ਇਹ ਪੰਨੇ ਸੰਪਾਦਨ ਅਤੇ ਹੋਰ ਕੰਮ ਤੋਂ ਸੁਰੱਖਿਅਤ ਕੀਤਾ ਹੋਇਆ ਹੈ।',
-'viewsourcetext' => 'ਤà©\81ਸà©\80à¨\82 à¨\87ਸ à¨¸à¨«à¨¼à©\87 à¨¦à¨¾ à¨¸à¨°à©\8bਤ à¨µà©\87à¨\96 à¨\85ਤà©\87 à¨¨à¨\95ਲ ਕਰ ਸਕਦੇ ਹੋ:',
+'viewsourcetext' => 'ਤà©\81ਸà©\80à¨\82 à¨\87ਸ à¨¸à¨«à¨¼à©\87 à¨¦à¨¾ à¨¸à¨°à©\8bਤ à¨µà©\87à¨\96 à¨\85ਤà©\87 à¨\95ਾਪà©\80 ਕਰ ਸਕਦੇ ਹੋ:',
 'viewyourtext' => 'ਤੁਸੀਂ ਇਸ ਸਫ਼ੇ ’ਤੇ ਕੀਤੀਆਂ "ਆਪਣੀਆਂ ਸੋਧਾਂ" ਦਾ ਸਰੋਤ ਵੇਖ ਅਤੇ ਨਕਲ ਕਰ ਸਕਦੇ ਹੋ:',
 'protectedinterface' => 'ਇਹ ਪੰਨਾ ਸਾਫ਼ਟਵੇਅਰ ਇੰਟਰਫ਼ੇਸ ਦਾ ਮੂਲ ਪਾਠ ਹੈ ,ਅਤੇ ਦੁਰਵਰਤੌਂ ਤੌਂ ਬਚਾਅ ਲਈ ਰਾਖਵਾਂ ਕੀਤਾ ਗਿਆ ਹੈ।',
 'editinginterface' => "'''ਚਿਤਾਵਨੀ''' ਤੁਸੀਂ ਐਸੇ ਪੰਨੇ ਨੂੰ ਬਦਲ ਰਹੇ ਹੋ ਜੋ ਸਾਫ਼ਟਵੇਅਰ ਇੰਟਰਫ਼ੇਸ ਦੇ ਮੂਲ ਪਾਠ ਲਈ ਵਰਤਿਆ ਗਿਆ ਹੈ।
@@ -580,6 +571,7 @@ $2',
 'exception-nologin-text' => 'ਇਹ ਸਫ਼ਾ ਜਾਂ ਕਾਰਵਾਈ ਤੁਹਾਡਾ ਇਸ ਵਿਕੀ ’ਤੇ ਲਾਗਇਨ ਕੀਤਾ ਹੋਣਾ ਲੋੜਦੀ ਹੈ।',
 
 # Virus scanner
+'virus-scanfailed' => 'ਸਕੈਨ ਫੇਲ੍ਹ ਹੈ (ਕੋਡ $1)',
 'virus-unknownscanner' => 'ਅਣਪਛਾਤਾ ਐਂਟੀਵਾਇਰਸ:',
 
 # Login and logout pages
@@ -587,12 +579,22 @@ $2',
 
 You can continue to use {{SITENAME}} anonymously, or you can log in again as the same or as a different user.
 Note that some pages may continue to be displayed as if you were still logged in, until you clear your browser cache.",
-'welcomeuser' => 'ਸੁਆਗਤ, $1!',
-'welcomecreation-msg' => 'ਤੁਹਾਡਾ ਖਾਤਾ ਬਣ ਚੁੱਕਾ ਹੈ। ਆਪਣੀਆਂ [[Special:Preferences|{{SITENAME}} ਪਸੰਦਾਂ]] ਬਦਲਣੀਆਂ ਨਾ ਭੁੱਲੋ।',
-'yourname' => 'ਵਰਤੋਂਕਾਰ ਨਾਮ:',
+'welcomeuser' => '$1 ਜੀ ਆਇਆਂ ਨੂੰ!',
+'welcomecreation-msg' => 'ਤੁਹਾਡਾ ਖਾਤਾ ਬਣ ਚੁੱਕਾ ਹੈ। ਆਪਣੀਆਂ [[Special:Preferences|{{SITENAME}} ਪਸੰਦ]] ਬਦਲਣੀ ਨਾ ਭੁੱਲੋ।',
+'yourname' => 'ਯੂਜ਼ਰ-ਨਾਂ:',
+'userlogin-yourname' => 'ਯੂਜ਼ਰ ਨਾਂ',
+'userlogin-yourname-ph' => 'ਆਪਣਾ ਯੂਜਰ-ਨਾਂ ਦਿਉ',
 'yourpassword' => 'ਪਾਸਵਰਡ:',
-'yourpasswordagain' => 'ਪਾਸਵਰਡ ਦੁਬਾਰਾ ਲਿਖੋ:',
+'userlogin-yourpassword' => 'ਪਾਸਵਰਡ',
+'userlogin-yourpassword-ph' => 'ਆਪਣਾ ਪਾਸਵਰਡ ਦਿਉ',
+'createacct-yourpassword-ph' => 'ਪਾਸਵਰਡ ਦਿਉ',
+'yourpasswordagain' => 'ਪਾਸਵਰਡ ਮੁੜ ਲਿਖੋ:',
+'createacct-yourpasswordagain' => 'ਪਾਸਵਰਡ ਪੁਸ਼ਟੀ',
+'createacct-yourpasswordagain-ph' => 'ਪਾਸਵਰਡ ਫੇਰ ਦਿਉ',
 'remembermypassword' => 'ਇਸ ਕੰਪਿਊਟਰ ’ਤੇ ਮੇਰਾ ਲਾਗਇਨ ਯਾਦ ਰੱਖੋ (ਵੱਧ ਤੋਂ ਵੱਧ $1 {{PLURAL:$1|ਦਿਨ|ਦਿਨਾਂ}} ਲਈ)',
+'userlogin-remembermypassword' => 'ਮੈਨੂੰ ਯਾਦ ਰੱਖੋ',
+'userlogin-signwithsecure' => 'ਸੁਰੱਖਿਅਤ ਸਰਵਰ ਨਾਲ ਸਾਇਨ ਕਰੋ',
+'securelogin-stick-https' => 'ਲਾਗਇਨ ਕਰਨ ਦੇ ਬਾਅਦ HTTPS ਨਾਲ ਕੁਨੈਕਟ ਰਹੋ',
 'yourdomainname' => 'ਤੁਹਾਡੀ ਡੋਮੇਨ:',
 'password-change-forbidden' => 'ਇਸ ਵਿਕੀ ਤੇ ਤੁਸੀਂ ਪਾਸਵਰਡ ਨਹੀਂ ਬਦਲ ਸਕਦੇ।',
 'login' => 'ਲਾਗ ਇਨ',
@@ -603,33 +605,50 @@ 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-captcha-help-url' => '{{ns:Project}}:ਖਾਤੇ ਲਈ ਮੰਗ ਕਰੋ',
+'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 +672,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 +687,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 +711,14 @@ Note that some pages may continue to be displayed as if you were still logged in
 'resetpass-temp-password' => 'ਆਰਜ਼ੀ ਪਾਸਵਰਡ:',
 
 # Special:PasswordReset
-'passwordreset' => 'ਪਾਸਵਰਡ à¨°à©\80ਸੈੱਟ ਕਰੋ',
-'passwordreset-text' => 'à¨\86ਪਣà©\87 à¨\96ਾਤà©\87 à¨¦à©\80 à¨¤à¨«à¨¼à¨¸à©\80ਲ à¨¦à©\80 à¨\88-ਮà©\87ਲ à¨¹à¨¾à¨¸à¨² à¨\95ਰਨ à¨²à¨\88 à¨\87ਹ à¨«à¨¼à¨¾à¨°à¨® à¨®à©\81à¨\95ੰਮਲ ਕਰੋ।',
-'passwordreset-legend' => 'ਪਾਸਵਰਡ à¨°à©\80ਸੈੱਟ ਕਰੋ',
+'passwordreset' => 'ਪਾਸਵਰਡ à¨®à©\81à©\9c-ਸੈੱਟ ਕਰੋ',
+'passwordreset-text' => 'à¨\86ਪਣਾ à¨ªà¨¾à¨¸à¨µà¨°à¨¡ à¨®à©\81à©\9c-ਸà©\88ੱà¨\9f à¨\95ਰਨ à¨²à¨\88 à¨\87ਹ à¨«à¨¾à¨°à¨® à¨ªà©\82ਰਾ ਕਰੋ।',
+'passwordreset-legend' => 'ਪਾਸਵਰਡ à¨®à©\81à©\9c-ਸੈੱਟ ਕਰੋ',
 '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 +728,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ਨ à¨°à©±à¨\96à©\8b',
-'savearticle' => 'ਪੰਨਾ à¨¸à¨¾à¨\82ਭੋ',
+'minoredit' => 'à¨\87ਹ à¨\87ੱà¨\95 à¨\9bà©\8bà¨\9fà©\80 à¨¸à©\8bਧ ਹੈ',
+'watchthis' => 'à¨\87ਹ à¨¸à¨«à¨¼à©\87 à¨¦à©\80 à¨¨à¨¿à¨\97ਰਾਨà©\80',
+'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 +821,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}}\" ਬਟਨ ਵਰਤੋ।",
@@ -817,13 +837,13 @@ sysop}}|administrator]] ਨਾਲ ਰਾਬਤਾ ਕਰ ਸਕਦੇ ਹੋ।
 'updated' => '(ਅੱਪਡੇਟ)',
 'note' => "'''ਨੋਟ:'''",
 'previewnote' => "'''ਯਾਦ ਰੱਖੋ, ਇਹ ਕੇਵਲ ਇੱਕ ਝਲਕ ਹੈ।'''
-ਤà©\81ਹਾਡà©\87 à¨¬à¨¦à¨²à¨¾à¨µ à¨¹à©\81ਣà©\87 à¨¤à©±à¨\95 à¨¸à¨¾à¨\82ਭà©\87 à¨¨à¨¹à©\80à¨\82 à¨\97à¨\8f à¨¹à¨¨!",
-'continue-editing' => 'ਸੰਪਾਦਨ à¨\9cਾਰà©\80 à¨°à©±à¨\96à©\8b',
+ਤà©\81ਹਾਡà©\87 à¨¬à¨¦à¨²à¨¾à¨\85 à¨¹à¨¾à¨²à©\87 à¨¸à©°à¨­à¨¾à¨²à©\87 à¨¨à¨¹à©\80à¨\82 à¨\97à¨\8f à¨¹à¨¨à¥¤",
+'continue-editing' => 'ਸà©\8bਧ à¨\96à©\87ਤਰ à¨¨à©\82à©° à¨\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 +872,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' => 'ਤà©\81ਹਾਨà©\82à©°  $2 à¨²à¨\88 à¨\85ਧਿà¨\95ਾਰ à¨¨à¨¹à©\80à¨\82 à¨¹à¨¨, à¨\85ੱà¨\97à©\87 à¨¦à¨¿à©±à¨¤à©\87 {{PLURAL:$1|à¨\95ਾਰਨ|à¨\95ਾਰਨਾà¨\82}} à¨\95ਰà¨\95à©\87:',
 'recreate-moveddeleted-warn' => "'''ਚਿਤਾਵਣੀ:
 ਤੁਸੀਂ ਐਸਾ ਪੰਨਾ ਬਣਾ ਰਹੇ ਹੋ ਜੋ ਪਹਿਲਾਂ ਹਟਾਇਆ ਜਾ ਚੁੱਕਾ ਹੈ।'''
 
@@ -860,13 +880,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 +908,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 +925,18 @@ $3 ਨੇ ਕਾਰਨ ਇਹ ਦੱਸਿਆ ਹੈ, ''$2''",
 'currentrevisionlink' => 'ਸਭ ਤੋ ਨਵਾਂ ਰੀਵਿਜਨ',
 'cur' => 'ਮੌਜੂਦਾ',
 'next' => 'ਅੱਗੇ',
-'last' => 'ਪਿੱà¨\9bਲਾ',
+'last' => 'ਪਿੱà¨\9bà©\87',
 'page_first' => 'ਪਹਿਲਾਂ',
 'page_last' => 'ਆਖਰੀ',
 'histlegend' => "ਅੰਤਰ ਵੇਖੋ:
 ਮੁਕਾਬਲਾ ਕਰਨ ਲਈ ਰੀਵਿਜਨਾਂ ਦੇ ਰੇਡੀਓ ਬਟਨਾਂ ਵਿੱਚ ਨਿਸ਼ਾਨ ਲਾਓ ਅਤੇ ਜਾਓ ਜਾਂ ਸਭ ਤੋਂ ਥੱਲੇ ਵਾਲੇ ਬਟਨ ਤੇ ਕਲਿੱਕ ਕਰੋ। <br />
 ਲੈਜਅੰਡ:
 '''({{int:cur}})''' = ਨਵੇਂ ਰੀਵਿਜਨ ਨਾਲੋਂ ਅੰਤਰ, '''({{int:last}})''' = ਪਿੱਛਲੀ ਰੀਵਿਜਨ ਨਾਲੋਂ ਅੰਤਰ, '''({{int:minoreditletter}})''' = ਛੋਟਾ ਬਦਲਾਵ।",
-'history-fieldset-title' => 'à¨\87ਤਿਹਾਸ à¨¨à©\82à©° à¨¬à©\8dਰਾà¨\8aà¨\9c਼ à¨\95ਰà©\8b',
+'history-fieldset-title' => 'ਬਰਾà¨\8aà¨\9c਼ਰ à¨\85ਤà©\80ਤ',
 'history-show-deleted' => 'ਕੇਵਲ ਹਟਾਏ ਗਏ',
 'histfirst' => 'ਸਭ ਤੋਂ ਪਹਿਲਾਂ ਦੇ',
 'histlast' => 'ਸਭ ਤੋਂ ਨਵਾਂ',
-'historysize' => '($1 ਬਾਈਟ)',
+'historysize' => '({{PLURAL:$1|1 ਬਾਈਟ|$1 ਬਾਈਟ}})',
 'historyempty' => '(ਖਾਲੀ)',
 
 # Revision feed
@@ -922,9 +948,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 +970,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 +997,7 @@ page={{FULLPAGENAMEE}}}} ਜ਼ਬਤੀ ਦੇ ਚਿੱਠੇ] ਵਿਚ ਵ
 'revdel-restore' => 'ਦਿੱਖ ਬਦਲੋ',
 'revdel-restore-deleted' => 'ਹਟਾਏ ਗਏ ਰੀਵੀਜਨ',
 'revdel-restore-visible' => 'ਦਿਸਣਯੋਗ ਰੀਵੀਜਨ',
-'pagehist' => 'ਪà©\87à¨\9c à¨¦ਾ ਅਤੀਤ',
+'pagehist' => 'ਸਫ਼ਾ ਅਤੀਤ',
 'deletedhist' => 'ਹਟਾਇਆ ਗਿਆ ਅਤੀਤ',
 'revdelete-hide-current' => 'ਤਾਰੀਖ &2, $1 ਦੀ ਚੀਜ਼ ਲੁਕਾਉਣ ਵਿਚ ਗਲਤੀ: ਇਹ ਮੌਜੂਦਾ ਰੀਵਿਜ਼ਨ ਹੈ।
 ਇਹ ਲੁਕਾਈ ਨਹੀਂ ਜਾ ਸਕਦੀ।',
@@ -1001,14 +1027,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 +1045,27 @@ page={{FULLPAGENAMEE}}}} ਜ਼ਬਤੀ ਦੇ ਚਿੱਠੇ] ਵਿਚ ਵ
 'searchsubtitleinvalid' => "ਤੁਸੀਂ'''$1''' ਲਈ ਖੋਜ ਕੀਤੀ।",
 'titlematches' => 'ਆਰਟੀਕਲ ਟੈਕਸਟ ਮਿਲਦਾ',
 'notitlematches' => 'ਕੋਈ ਪੇਜ ਟਾਇਟਲ ਨਹੀਂ ਮਿਲਦਾ',
-'textmatches' => 'ਪà©\87à¨\9c ਟੈਕਸਟ ਮਿਲਦਾ',
+'textmatches' => 'ਸਫ਼ਾ ਟੈਕਸਟ ਮਿਲਦਾ',
 'notextmatches' => 'ਕੋਈ ਪੇਜ ਟੈਕਸਟ ਨਹੀਂ ਮਿਲਦਾ',
-'prevn' => 'ਪਿà¨\9bਲੇ {{PLURAL:$1|$1}}',
-'nextn' => 'à¨\85à¨\97ਲੇ {{PLURAL:$1|$1}}',
+'prevn' => 'ਪਿੱà¨\9bੇ {{PLURAL:$1|$1}}',
+'nextn' => 'à¨\85ੱà¨\97ੇ {{PLURAL:$1|$1}}',
 'prevn-title' => 'ਪਿਛਲੇ $1 {{PLURAL:$1|ਨਤੀਜਾ|ਨਤੀਜੇ}}',
 'nextn-title' => 'ਅਗਲੇ $1 {{PLURAL:$1|ਨਤੀਜਾ|ਨਤੀਜੇ}}',
 'shown-title' => 'ਪ੍ਰਤੀ ਪੰਨਾ $1 {{PLURAL:$1|ਨਤੀਜਾ|ਨਤੀਜੇ}} ਵਖਾਓ',
 'viewprevnext' => 'ਵੇਖੋ ($1 {{int:pipe-separator}} $2) ($3)',
-'searchmenu-legend' => 'à¨\96à©\8bà¨\9c à¨\87à¨\96਼ਤਿà¨\86ਰ',
-'searchmenu-exists' => "'''à¨\87ਸ à¨µà¨¿à¨\95à©\80 â\80\99ਤà©\87 \"[[:\$1]]\" à¨¨à¨¾à¨® à¨¦à¨¾ à¨ªà©°à¨¨ਾ ਹੈ।'''",
+'searchmenu-legend' => 'à¨\96à©\8bà¨\9c à¨\9aà©\8bਣਾà¨\82',
+'searchmenu-exists' => "'''à¨\87ਸ à¨µà¨¿à¨\95à©\80 â\80\99ਤà©\87 \"[[:\$1]]\" à¨¨à¨¾à¨® à¨¦à¨¾ à¨¸à¨«ਾ ਹੈ।'''",
 'searchmenu-new' => "'''ਇਸ ਵਿਕੀ ’ਤੇ \"[[:\$1]]\" ਪੰਨਾ ਬਣਾਓ!'''",
 'searchhelp-url' => 'Help:ਸਮੱਗਰੀ',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ਇਸ ਅਗੇਤਰ ਵਾਲ਼ੇ ਸਫ਼ੇ ਵੇਖੋ]]',
 'searchprofile-articles' => 'ਸਮੱਗਰੀ ਪੰਨੇ',
-'searchprofile-project' => 'ਮਦਦ à¨\85ਤà©\87 à¨ªà¨°à¨¿à¨¯à©\8bà¨\9cਨਾ à¨ªà©°à¨¨ੇ',
+'searchprofile-project' => 'ਮੱਦਦ à¨¤à©\87 à¨ªà¨°à©\8bà¨\9cà©\88à¨\95à¨\9f à¨¸à¨«à¨¼ੇ',
 'searchprofile-images' => 'ਮਲਟੀਮੀਡੀਆ',
 'searchprofile-everything' => 'ਸਭ ਕੁਝ',
-'searchprofile-advanced' => 'à¨\86ਧà©\81ਨਿà¨\95',
-'searchprofile-articles-tooltip' => '$1 ਵਿੱਚ ਖੋਜ',
-'searchprofile-project-tooltip' => '$1 ਵਿੱਚ ਖੋਜ',
-'searchprofile-images-tooltip' => 'ਫ਼ਾà¨\88ਲਾà¨\82 à¨\96à©\8bà¨\9cà©\8b',
+'searchprofile-advanced' => 'ਤà¨\95ਨà©\80à¨\95à©\80',
+'searchprofile-articles-tooltip' => '$1 ਵਿੱਚ ਖੋਜ',
+'searchprofile-project-tooltip' => '$1 ਵਿੱਚ ਖੋਜ',
+'searchprofile-images-tooltip' => 'ਫਾà¨\87ਲ à¨¦à©\80 à¨\96à©\8bà¨\9c',
 'searchprofile-everything-tooltip' => 'ਸਭ ਚੀਜ਼ਾਂ ਖੋਜੋ (ਚਰਚਾ ਪੰਨਿਆਂ ਸਮੇਤ)',
 'searchprofile-advanced-tooltip' => 'ਆਪਣੇ ਬਣਾਏ ਨਾਮ-ਥਾਂਵਾਂ ਵਿੱਚ ਖੋਜੋ',
 'search-result-size' => '$1 ({{PLURAL:$2|1 ਸ਼ਬਦ|$2 ਸ਼ਬਦ}})',
@@ -1062,7 +1088,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 +1100,7 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 
 # Preferences page
 'preferences' => 'ਮੇਰੀ ਪਸੰਦ',
-'mypreferences' => 'ਪਸੰਦਾਂ',
+'mypreferences' => 'ਪਸੰਦ',
 'prefs-edits' => 'ਸੋਧਾਂ ਦੀ ਗਿਣਤੀ:',
 'prefsnologin' => 'ਲਾਗਇਨ ਨਹੀਂ',
 'prefsnologintext' => 'ਵਰਤੋਂਕਾਰ ਪਸੰਦਾਂ ਸੈੱਟ ਕਰਨ ਲਈ ਤੁਹਾਨੂੰ <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} ਲਾਗਇਨ]</span> ਕਰਨਾ ਪਵੇਗਾ।',
@@ -1082,11 +1108,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 +1128,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 +1151,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' => 'ਨਵਾà¨\82 à¨¦à¨¸à¨¤à¨\96ਤ:',
 'prefs-help-signature' => 'ਗੱਲ-ਬਾਤ ਸਫ਼ਿਆਂ ਉੱਤੇ ਟਿੱਪਣੀਆਂ ਦੇ ਆਖ਼ਰ ਵਿਚ "<nowiki>~~~~</nowiki>" ਲਾਓ ਜੋ ਤੁਹਾਡੇ ਦਸਤਖ਼ਤ ਅਤੇ ਵਕਤ ਦੀ ਮੋਹਰ ਵਿਚ ਤਬਦੀਲ ਹੋ ਜਾਵੇਗਾ।',
 'badsiglength' => 'ਦਸਤਖ਼ਤ ਬਹੁਤ ਲੰਬਾ ਹੋ ਗਿਆ ਹੈ। ਇਹ {{PLURAL:$1|ਅੱਖਰ|ਅੱਖਰਾਂ}} ਤੋਂ ਲੰਬਾ ਨਹੀਂ ਹੋਣਾ ਚਾਹੀਦਾ।',
 'yourgender' => 'ਲਿੰਗ:',
@@ -1157,7 +1187,7 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'prefs-info' => 'ਮੁੱਢਲੀ ਜਾਣਕਾਰੀ',
 'prefs-i18n' => 'ਅੰਤਰਰਾਸ਼ਟਰੀਕਰਨ',
 'prefs-signature' => 'ਦਸਤਖ਼ਤ',
-'prefs-dateformat' => 'ਤਾਰà©\80à¨\96਼ à¨\85ੰਦਾà¨\9c਼',
+'prefs-dateformat' => 'ਮਿਤà©\80 à¨¸à¨¼à©\88ਲà©\80',
 'prefs-advancedediting' => 'ਤਕਨੀਕੀ ਚੋਣਾਂ',
 'prefs-advancedrc' => 'ਤਕਨੀਕੀ ਚੋਣਾਂ',
 'prefs-advancedrendering' => 'ਤਕਨੀਕੀ ਚੋਣਾਂ',
@@ -1173,7 +1203,7 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'email-address-validity-invalid' => 'ਸਹੀ ਈ-ਮੇਲ ਪਤਾ ਦਾਖ਼ਲ ਕਰੋ',
 
 # User rights
-'userrights' => 'ਮà©\88à¨\82ਬਰ à¨¦à©\87 à¨¹à©±à¨\95ਾà¨\82 à¨¦à¨¾ à¨°à©±à¨\96-ਰà¨\96ਾà¨\93',
+'userrights' => 'ਯà©\82à¨\9c਼ਰ à¨¹à©±à¨\95 à¨ªà¨°à¨¬à©°à¨§',
 'userrights-lookup-user' => 'ਯੂਜ਼ਰ ਗਰੁੱਪ ਦੇਖਭਾਲ',
 'userrights-user-editname' => 'ਇੱਕ ਯੂਜ਼ਰ ਨਾਂ ਦਿਓ:',
 'editusergroup' => 'ਯੂਜ਼ਰ ਗਰੁੱਪ ਸੋਧ',
@@ -1188,16 +1218,16 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 
 # Groups
 'group' => 'ਗਰੁੱਪ:',
-'group-user' => 'ਮà©\88à¨\82ਬਰ',
+'group-user' => 'ਯà©\82à¨\9c਼ਰ',
 '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 +1237,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' => 'ਵੱਡà©\87 à¨\85ਤà©\80ਤਾà¨\82 à¨µà¨¾à¨²à¨¼à©\87 à¨¸à¨«à¨¼à©\87 à¨®à¨¿ਟਾਉਣੇ',
-'right-browsearchive' => 'ਮਿà¨\9fਾà¨\8f à¨\97à¨\8f à¨¸à¨«à¨¼ੇ ਖੋਜਣਾ',
+'right-bigdelete' => 'ਵੱਡà©\87 à¨\87ਤਿਹਾਸ à¨µà¨¾à¨²à©\87 à¨ªà©°à¨¨à©\87 à¨¹ਟਾਉਣੇ',
+'right-browsearchive' => 'ਹà¨\9fਾà¨\8f à¨\97à¨\8f à¨ªà©°à¨¨ੇ ਖੋਜਣਾ',
 'right-undelete' => 'ਸਫ਼ੇ ਨੂੰ ਅਣ-ਮਿਟਾਇਆ ਕਰਨਾ',
 'right-suppressionlog' => 'ਪ੍ਰਾਈਵੇਟ ਚਿੱਠੇ ਵੇਖਣਾ',
 'right-block' => 'ਦੂਜੇ ਮੈਂਬਰਾਂ ਦੇ ਸੋਧ ਕਰਨ ਤੇ ਪਾਬੰਦੀ ਲਾਉਣੀ',
@@ -1225,6 +1255,7 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'right-userrights-interwiki' => 'ਦੂਜੇ ਵਿਕੀਆਂ ਤੇ ਮੈਂਬਰਾਂ ਦੇ ਮੈਂਬਰ ਹੱਕਾਂ ਵਿਚ ਸੋਧ ਕਰਨਾ',
 'right-siteadmin' => 'ਡੈਟਾਬੇਸ ਨੂੰ ਤਾਲਾ ਲਾਉਣਾ ਤੇ ਖੋਲ੍ਹਣਾ',
 'right-sendemail' => 'ਦੂਜੇ ਮੈਂਬਰਾਂ ਨੂੰ ਈ-ਮੇਲ ਭੇਜਣਾ',
+'right-passwordreset' => 'ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ ਈਮੇਲ ਵੇਖੋ',
 
 # Special:Log/newusers
 'newuserlogpage' => 'ਬਣਾਏ ਖਾਤਿਆਂ ਦਾ ਚਿੱਠਾ',
@@ -1235,61 +1266,76 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'rightslogtext' => 'ਇਹ ਮੈਂਬਰ ਹੱਕਾਂ ਵਿਚ ਹੋਈਆਂ ਤਬਦੀਲੀਆਂ ਦਾ ਚਿੱਠਾ ਹੈ।',
 
 # Associated actions - in the sentence "You do not have permission to X"
-'action-read' => 'à¨\87ਹ à¨¸à¨«à¨¼ਾ ਪੜ੍ਹਨ',
+'action-read' => 'à¨\87ਹ à¨ªà©°à¨¨ਾ ਪੜ੍ਹਨ',
 'action-edit' => 'ਇਹ ਪੰਨੇ ਨੂੰ ਸੰਪਾਦਿਤ ਕਰਨ',
-'action-createpage' => 'ਸਫ਼ੇ ਬਣਾਉਣ',
+'action-createpage' => 'ਪੰਨੇ ਬਣਾਉਣ',
 '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 à¨¬à¨¦à¨²à¨¾à¨µ',
+'nchanges' => '$1 {{PLURAL:$1|ਬਦਲਾà¨\85}}',
+'recentchanges' => 'ਹਾਲ â\80\99à¨\9a à¨¹à©\8bà¨\8f à¨¬à¨¦à¨²à¨¾à¨\85',
 'recentchanges-legend' => 'ਹਾਲ ਦੇ ਪਰਿਵਰਤਨ ਸਬੰਧੀ ਵਿਕਲਪ',
 'recentchanges-summary' => 'ਇਸ ਵਿਕੀ ’ਤੇ ਹੋਈਆਂ ਸਭ ਤੋਂ ਨਵੀਆਂ ਤਬਦੀਲੀਆਂ ਇਸ ਸਫ਼ੇ ’ਤੇ ਵੇਖੋ।',
 'recentchanges-feed-description' => 'ਇਸ ਵਿਕੀ ’ਤੇ ਹਾਲ ‘ਚ ਹੋਏ ਬਦਲਾਵ ਇਸ ਫ਼ੀਡ ’ਚ ਵੇਖੀਆਂ ਜਾ ਸਕਦੀਆਂ ਹਨ।',
-'recentchanges-label-newpage' => 'à¨\87ਹ à¨¸à©°à¨ªà¨¾à¨¦à¨¨ à¨¨à©\87 à¨¨à¨µà¨¾à¨\82 à¨ªà©°à¨¨à¨¾ à¨¬à¨£à¨¾à¨\87à¨\86 à¨¹à©\88',
+'recentchanges-label-newpage' => 'à¨\87ਹ à¨¸à©°à¨ªà¨¾à¨¦à¨¨ à¨¨à¨¾à¨² à¨¨à¨µà¨¾à¨\82 à¨ªà©°à¨¨à¨¾ à¨¬à¨£à¨¾à¨\87à¨\86 à¨\97ਿà¨\86',
 'recentchanges-label-minor' => 'ਇਹ ਇੱਕ ਛੋਟਾ ਸੰਪਾਦਨ ਹੈ',
-'recentchanges-label-bot' => 'à¨\87ਹ à¨¸à©°à¨ªà¨¾à¨¦à¨¨ à¨¬à©\8bà¨\9f à¨µà¨²à©\8bà¨\82 à¨\95à©\80ਤà©\80 à¨\97à¨\88 à¨¹à©\88',
+'recentchanges-label-bot' => 'à¨\87ਹ à¨¸à©°à¨ªà¨¾à¨¦à¨¨ à¨\87ੱà¨\95 à¨¬à©\8bà¨\9fਾ à¨¦à©\81à¨\86ਰਾ à¨\95à©\80ਤਾ à¨\97ਿà¨\86 à¨¸à©\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 à¨¬à¨¦à¨²à¨¾à¨µ ਵੇਖਾਓ',
-'rcshowhideminor' => '$1 à¨\9bà©\8bà¨\9fà©\87 à¨¬à¨¦à¨²à¨¾à¨µ',
+'rclistfrom' => '$1 à¨¤à©\8bà¨\82 à¨¸à¨¼à©\81ਰà©\82 à¨\95ਰà¨\95à©\87 à¨¨à¨µà©\87à¨\82 à¨¬à¨¦à¨²à¨¾à¨\85 ਵੇਖਾਓ',
+'rcshowhideminor' => '$1 à¨\9bà©\8bà¨\9fà©\87 à¨¬à¨¦à¨²à¨¾à¨\85',
 'rcshowhidebots' => '$1 ਬੋਟ',
 'rcshowhideliu' => '$1 ਲਾਗਇਨ ਹੋਏ ਵਰਤੋਂਕਾਰਾਂ',
-'rcshowhideanons' => '$1 à¨\97à©\81ਮਨਾਮ à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ',
+'rcshowhideanons' => '$1 à¨\86à¨\88॰ਪà©\80 à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰਾà¨\82 à¨¦à©\87 à¨¬à¨¦à¨²à¨¾à¨\85',
 'rcshowhidepatr' => 'ਜਾਂਚੇ ਹੋਏ ਸੰਪਾਦਨ $1',
-'rcshowhidemine' => 'ਮà©\87ਰà©\87 à¨¬à¨¦à¨²à¨¾à¨µ $1',
-'rclinks' => 'ਪਿà¨\9bਲà©\87 $2 à¨¦à¨¿à¨¨à¨¾à¨\82 à¨µà¨¿à©±à¨\9a à¨¹à©\8bà¨\8f $1 à¨¬à¨¦à¨²à¨¾à¨µ ਵੇਖਾਓ<br /> $3',
+'rcshowhidemine' => 'ਮà©\87ਰà©\87 à¨¬à¨¦à¨²à¨¾à¨\85 $1',
+'rclinks' => 'ਪਿੱà¨\9bਲà©\87 $2 à¨¦à¨¿à¨¨à¨¾à¨\82 à¨µà¨¿à©±à¨\9a à¨¹à©\8bà¨\8f $1 à¨¬à¨¦à¨²à¨¾à¨\85 ਵੇਖਾਓ<br /> $3',
 'diff' => 'ਅੰਤਰ',
 'hist' => 'ਇਤਿਹਾਸ',
 'hide' => 'ਛੁਪਾਓ',
-'show' => 'ਵਿਖਾਓ',
+'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-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 +1343,7 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'recentchangeslinked-to' => 'ਇਸਦੇ ਬਦਲੇ ਇਸ ਪੰਨੇ ਨਾਲ ਜੁੜੇ ਪੰਨਿਆਂ ਵਿੱਚ ਹੋਏ ਬਦਲਾਅ ਵਿਖਾਓ',
 
 # Upload
-'upload' => 'ਫ਼ਾà¨\88ਲ à¨\85ੱਪਲੋਡ ਕਰੋ',
+'upload' => 'ਫਾà¨\88ਲ à¨\85ਪਲੋਡ ਕਰੋ',
 'uploadbtn' => 'ਫਾਇਲ ਅੱਪਲੋਡ ਕਰੋ',
 'reuploaddesc' => 'ਅੱਪਲੋਡ ਫਾਰਮ ਉੱਤੇ ਜਾਓ।',
 'uploadnologin' => 'ਲਾਗਇਨ ਨਹੀਂ ਹੋ',
@@ -1307,10 +1353,11 @@ to upload files.',
 'upload-recreate-warning' => "'''ਖ਼ਬਰਦਾਰ: ਇਸ ਨਾਮ ਦੀ ਫ਼ਾਈਲ ਮਿਟਾਈ ਜਾਂ ਹੋਰ ਨਾਮ ਤੇ ਭੇਜੀ ਜਾ ਚੁੱਕੀ ਹੈ।'''
 ਮਿਟਾਉਣ ਅਤੇ ਭੇਜੇ ਜਾਣ ਦਾ ਚਿੱਠਾ ਸਹੂਲਤ ਲਈ ਇੱਥੇ ਦਿੱਤਾ ਗਿਆ ਹੈ:",
 'uploadlog' => 'ਅੱਪਲੋਡ ਲਾਗ',
-'uploadlogpage' => 'à¨\85ੱਪਲà©\8bਡਾà¨\82 à¨¦à¨¾ à¨\9aਿੱਠਾ',
+'uploadlogpage' => 'ਅਪਲੋਡਾਂ ਦਾ ਚਿੱਠਾ',
 'filename' => 'ਫਾਇਲ ਨਾਂ',
 'filedesc' => 'ਸਾਰ',
 'fileuploadsummary' => 'ਸੰਖੇਪ:',
+'filereuploadsummary' => 'ਫਾਇਲ ਬਦਲਾਅ',
 'filestatus' => 'ਕਾਪੀਰਾਈਟ ਹਾਲਤ:',
 'filesource' => 'ਸੋਰਸ:',
 'uploadedfiles' => 'ਅੱਪਲੋਡ ਕੀਤੀਆਂ ਫਾਇਲਾਂ',
@@ -1319,9 +1366,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 +1391,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' => 'ਠੀਕ ਤਰ੍ਹਾਂ ਅੱਪਲੋਡ',
@@ -1358,7 +1411,7 @@ to upload files.',
 'backend-fail-store' => 'ਫ਼ਾਈਲ "$1", "$2" ਵਿਚ ਸਾਂਭੀ ਨਹੀਂ ਜਾ ਸਕੀ।',
 'backend-fail-copy' => 'ਫ਼ਾਈਲ "$1", "$2" ਵਿਚ ਨਕਲ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ।',
 'backend-fail-move' => 'ਫ਼ਾਈਲ "$1", "$2" ਤੇ ਭੇਜੀ ਨਹੀਂ ਜਾ ਸਕੀ।',
-'backend-fail-opentemp' => 'à¨\86ਰà¨\9c਼à©\80 à¨«à¨¼ਾਈਲ ਖੋਲ੍ਹੀ ਨਹੀਂ ਜਾ ਸਕੀ।',
+'backend-fail-opentemp' => 'à¨\85ਸਥਾà¨\88 à¨«ਾਈਲ ਖੋਲ੍ਹੀ ਨਹੀਂ ਜਾ ਸਕੀ।',
 
 # Special:UploadStash
 'uploadstash-refresh' => 'ਫ਼ਾਈਲਾਂ ਦੀ ਲਿਸਟ ਨੂੰ ਤਾਜ਼ਾ ਕਰੋ',
@@ -1372,8 +1425,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 +1444,14 @@ to upload files.',
 'listfiles_count' => 'ਵਰਜਨ',
 
 # File description page
-'file-anchor-link' => 'ਫ਼ਾà¨\88ਲ',
-'filehist' => 'ਫ਼ਾà¨\88ਲ à¨¦à¨¾ à¨\87ਤਿਹਾਸ',
+'file-anchor-link' => 'ਫਾਈਲ',
+'filehist' => 'ਫਾਈਲ ਦਾ ਇਤਿਹਾਸ',
 '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 +1459,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 +1480,7 @@ to upload files.',
 # File reversion
 'filerevert' => '$1 ਰੀਵਰਟ',
 'filerevert-legend' => 'ਫਾਇਲ ਰੀਵਰਟ',
-'filerevert-comment' => 'à¨\9fਿੱਪਣà©\80:',
+'filerevert-comment' => 'à¨\95ਾਰਨ:',
 'filerevert-submit' => 'ਰੀਵਰਟ',
 
 # File deletion
@@ -1473,15 +1526,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à©\80à¨\95ਰਿਤ [[Special:ListUsers|ਵਰਤà©\8bà¨\82à¨\95ਾਰਾà¨\82]]',
+'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 +1550,7 @@ to upload files.',
 'withoutinterwiki' => 'ਬਿਨਾਂ ਬੋਲੀ ਲਿੰਕਾਂ ਦੇ ਸਫ਼ੇ',
 'withoutinterwiki-summary' => 'ਇਹ ਸਫ਼ੇ ਹੋਰ ਬੋਲੀਆਂ ਵਾਲ਼ੇ ਵਰਜਨਾਂ ਨਾਲ਼ ਨਹੀਂ ਜੁੜਦੇ।',
 'withoutinterwiki-legend' => 'ਅਗੇਤਰ',
-'withoutinterwiki-submit' => 'ਵਖਾਓ',
+'withoutinterwiki-submit' => 'ਵà©\87à¨\96ਾà¨\93',
 
 'fewestrevisions' => 'ਸਭ ਤੋਂ ਘੱਟ ਰੀਵਿਜ਼ਨਾਂ ਵਾਲ਼ੇ ਸਫ਼ੇ',
 
@@ -1506,7 +1560,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 +1571,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' => 'ਸਥਾਨਾà¨\82ਤਰਨ',
+'movethispage' => 'à¨\87ਹ à¨¸à¨«à¨¼à¨¾ ਭੇਜੋ',
 'unusedcategoriestext' => 'ਇਹ ਕੈਟੇਗਰੀ ਸਫ਼ੇ ਮੌਜੂਦ ਹਨ ਹਾਲਾਂਕਿ ਕਿਸੇ ਵੀ ਸਫ਼ੇ ਜਾਂ ਕੈਟੇਗਰੀ ਨੇ ਇਹਨਾਂ ਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕੀਤੀ।',
 'notargettitle' => 'ਟਾਰਗੇਟ ਨਹੀਂ',
 'pager-newer-n' => '{{PLURAL:$1|1 ਨਵਾਂ|$1 ਨਵੇਂ}}',
@@ -1553,13 +1607,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 +1638,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 +1670,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 +1682,7 @@ to upload files.',
 'nowikiemailtext' => 'ਇਸ ਮੈਂਬਰ ਨੇ ਦੂਜੇ ਮੈਂਬਰਾਂ ਤੋਂ ਈ-ਮੇਲ ਨਾ ਪ੍ਰਾਪਤ ਕਰਨਾ ਚੁਣ ਰੱਖਿਆ ਹੈ।',
 'emailnotarget' => 'ਪ੍ਰਾਪਤ ਕਰਤਾ ਦਾ ਨਾ-ਮੌਜੂਦ ਜਾਂ ਗ਼ਲਤ ਮੈਂਬਰ-ਨਾਂ।',
 'emailtarget' => 'ਪ੍ਰਾਪਤ ਕਰਤਾ ਦਾ ਮੈਂਬਰ-ਨਾਂ ਦਾਖ਼ਲ ਕਰੋ',
-'emailusername' => 'ਮà©\88à¨\82ਬਰ-ਨਾਂ:',
+'emailusername' => 'ਯà©\82à¨\9c਼ਰ-ਨਾਂ:',
 'emailusernamesubmit' => 'ਭੇਜੋ',
 'email-legend' => 'ਕਿਸੇ ਦੂਜੇ {{SITENAME}} ਮੈਂਬਰ ਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ',
 'emailfrom' => 'ਵਲੋਂ:',
@@ -1633,7 +1698,7 @@ to upload files.',
 
 # Watchlist
 'watchlist' => 'ਨਿਗਰਾਨ-ਸੂਚੀ',
-'mywatchlist' => 'ਧਿà¨\86ਨਸੂਚੀ',
+'mywatchlist' => 'ਨਿà¨\97ਰਾਨ-ਸੂਚੀ',
 'watchlistfor2' => '$1 $2 ਲਈ',
 'nowatchlist' => 'ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਕੋਈ ਚੀਜ਼ ਨਹੀਂ ਹੈ।',
 'watchlistanontext' => 'ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚਲੀਆਂ ਚੀਜ਼ਾਂ ਵੇਖਣ ਜਾਂ ਸੋਧਣ ਲਈ ਮਿਹਰਬਾਨੀ ਕਰਕੇ $1।',
@@ -1656,7 +1721,7 @@ to upload files.',
 'wlnote' => "$3, $4 ਮੁਤਾਬਕ ਆਖ਼ਰੀ {{PLURAL:$2|ਘੰਟੇ|'''$2''' ਘੰਟਿਆਂ}} ਵਿਚ {{PLURAL:
 $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆਂ}}, ਹੇਠਾਂ ਵੇਖੋ।",
 'wlshowlast' => 'ਪਿੱਛਲੇ $1 ਘੰਟੇ $2 ਦਿਨ $3 ਵੇਖੋ',
-'watchlist-options' => 'ਧਿà¨\86ਨਸà©\82à¨\9aà©\80 à¨¦à©\87 à¨\87à¨\96ਤਿà¨\86ਰ',
+'watchlist-options' => 'ਨਿà¨\97ਰਾਨ-ਸà©\82à¨\9aà©\80 à¨\9aà©\8bਣਾà¨\82',
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'ਨਿਗ੍ਹਾ (ਵਾਚ) ਰੱਖੀ ਜਾ ਰਹੀ ਹੈ...',
@@ -1670,7 +1735,7 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 'changed' => 'ਬਦਲਿਆ',
 
 # Delete
-'deletepage' => 'ਪà©\87à¨\9c ਹਟਾਓ',
+'deletepage' => 'ਸਫ਼ਾ ਹਟਾਓ',
 'confirm' => 'ਪੁਸ਼ਟੀ',
 'excontent' => "ਸਮੱਗਰੀ ਸੀ: '$1'",
 'exbeforeblank' => 'ਖ਼ਾਲੀ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਸਮੱਗਰੀ ਸੀ: "$1"',
@@ -1713,7 +1778,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 +1791,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 +1801,7 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 'restriction-type' => 'ਅਧਿਕਾਰ:',
 'restriction-level' => 'ਪਾਬੰਦੀ ਪੱਧਰ:',
 'minimum-size' => 'ਘੱਟੋ-ਘੱਟ ਆਕਾਰ',
-'maximum-size' => 'ਵੱਧੋ-ਵੱਧ ਆਕਾਰ',
+'maximum-size' => 'ਵੱਧੋ-ਵੱਧ ਆਕਾਰ:',
 'pagesize' => '(ਬਾਈਟ)',
 
 # Restrictions (nouns)
@@ -1756,16 +1821,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 +1848,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 +1860,7 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'sp-contributions-search' => 'ਯੋਗਦਾਨ ਖੋਜੋ',
 'sp-contributions-username' => 'IP ਪਤਾ ਜਾਂ ਵਰਤੋਂਕਾਰਨਾਮ:',
 'sp-contributions-toponly' => 'ਕੇਵਲ ਉਨ੍ਹਾਂ ਸੰਪਾਦਨਾਂ ਨੂੰ ਵਖਾਓ ਜੋ ਨਵੀਨਤਮ ਸੰਸ਼ੋਧਨ ਹਨ',
-'sp-contributions-submit' => 'ਖੋਜ',
+'sp-contributions-submit' => 'ਖੋਜ',
 
 # What links here
 'whatlinkshere' => 'ਕਿਹੜੇ (ਪੰਨੇ) ਇੱਥੇ ਜੋੜਦੇ ਹਨ',
@@ -1805,18 +1870,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-hideimages' => 'ਫ਼ਾà¨\88ਲ à¨²à¨¿à©°à¨\95 $1',
-'whatlinkshere-filters' => 'à¨\9bਾਨਣà©\80à¨\86à¨\82',
+'whatlinkshere-hidelinks' => '$1 à¨²à¨¿à©°à¨\95',
+'whatlinkshere-hideimages' => 'ਫਾਈਲ ਲਿੰਕ $1',
+'whatlinkshere-filters' => 'ਫਿਲà¨\9fਰ',
 
 # Block/unblock
-'blockip' => 'ਯà©\82à¨\9c਼ਰ à¨¬à¨²à¨¾à¨\95 ਕਰੋ',
+'blockip' => 'à¨\85ਵਰà©\8bਧਤ ਕਰੋ',
 'ipadressorusername' => 'IP ਐਡਰੈਸ ਜਾਂ ਯੂਜ਼ਰ ਨਾਂ:',
 'ipbexpiry' => 'ਮਿਆਦ:',
 'ipbreason' => 'ਕਾਰਨ:',
@@ -1831,7 +1896,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 +1954,7 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'lockdb' => 'ਡਾਟਾਬੇਸ ਲਾਕ',
 
 # Move page
-'move-page-legend' => 'ਪà©\87à¨\9c à¨®à©\82ਵ à¨\95ਰੋ',
+'move-page-legend' => 'ਸਫ਼ਾ à¨­à©\87à¨\9cੋ',
 'movearticle' => 'ਸਫ਼ਾ ਭੇਜੋ:',
 'movenologin' => 'ਲਾਗਇਨ ਨਹੀਂ ਹੋ',
 'movenologintext' => 'ਇਕ ਸਫ਼ੇ ਦਾ ਸਿਰਲੇਖ ਬਦਲਣ ਲਈ ਤੁਸੀਂ ਰਜਿਸਟਰਡ ਮੈਂਬਰ ਹੋਣੇ ਚਾਹੀਦੇ ਹੋ ਅਤੇ [[Special:UserLogin|ਲਾਗਇਨ]] ਕੀਤਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।',
@@ -1901,11 +1966,11 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'movepage-moved-redirect' => 'ਇੱਕ ਰੀਡਿਰੈਕਟ ਬਣਾ ਦਿੱਤਾ ਗਿਆ।',
 'articleexists' => 'ਇਸ ਨਾਮ ਦਾ ਸਫ਼ਾ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ ਜਾਂ ਤੁਹਾਡਾ ਚੁਣਿਆ ਹੋਇਆ ਨਾਮ ਸਹੀ ਨਹੀਂ ਹੈ।
 ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਕੋਈ ਹੋਰ ਨਾਮ ਚੁਣੋ।',
-'movedto' => 'ਮà©\82ਵ à¨\95à©\80ਤਾ',
+'movedto' => 'ਭà©\87à¨\9cਿà¨\86',
 'movepage-page-moved' => 'ਸਫ਼ਾ $1 ਨੂੰ $2 ’ਤੇ ਭੇਜਿਆ ਜਾ ਚੁੱਕਾ ਹੈ।',
 'movelogpage' => 'ਸਥਾਨਾਂਤਰਣ ਦਾ ਚਿੱਠਾ',
 'movereason' => 'ਕਾਰਨ:',
-'revertmove' => 'ਰੱਦ à¨\95ਰà©\8b',
+'revertmove' => 'à¨\89ਲà¨\9fਾà¨\93',
 'delete_and_move' => 'ਹਟਾਓ ਅਤੇ ਮੂਵ ਕਰੋ',
 'delete_and_move_confirm' => 'ਹਾਂ, ਸਫ਼ਾ ਮਿਟਾ ਦੇਵੋ',
 'move-leave-redirect' => 'ਪਿੱਛੇ ਇਕ ਰੀਡਿਰੈਕਟ ਛੱਡੋ',
@@ -1924,7 +1989,7 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'allmessagesname' => 'ਨਾਮ',
 'allmessagesdefault' => 'ਡਿਫਾਲਟ ਪਾਠ',
 'allmessagescurrent' => 'ਮੌਜੂਦਾ ਟੈਕਸਟ',
-'allmessages-filter-legend' => 'à¨\9bਾਨਣਾ',
+'allmessages-filter-legend' => 'ਫਿਲà¨\9fਰ',
 'allmessages-filter-all' => 'ਸਭ',
 'allmessages-language' => 'ਭਾਸ਼ਾ:',
 'allmessages-filter-submit' => 'ਜਾਓ',
@@ -1976,7 +2041,7 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'tooltip-p-logo' => 'ਮੁੱਖ ਪੰਨੇ ’ਤੇ ਜਾਓ',
 'tooltip-n-mainpage' => 'ਮੁੱਖ ਪੰਨੇ ’ਤੇ ਜਾਓ',
 'tooltip-n-mainpage-description' => 'ਮੁੱਖ ਪੰਨੇ ’ਤੇ ਜਾਓ',
-'tooltip-n-portal' => 'ਪਰਿਯà©\8bà¨\9cਨਾ à¨¬à¨¾à¨°à©\87, à¨¤à©\81ਸà©\80à¨\82 à¨\95à©\80 à¨\95ਰ à¨¸à¨\95ਦà©\87 à¨¹à©\8b, à¨\95ਿੱਥà©\87 à¨\95à©\81à¨\9d à¨²à©±à¨­à¨£à¨¾ à¨¹à©\88',
+'tooltip-n-portal' => 'ਪਰਯੋਜਨਾ ਬਾਰੇ, ਤੁਸੀਂ ਕੀ ਕਰ ਸਕਦੇ ਹੋ, ਕਿੱਥੇ ਕੁਝ ਲੱਭਣਾ ਹੈ',
 'tooltip-n-currentevents' => 'ਮੌਜੂਦਾ ਸਮਾਗਮ ਬਾਰੇ ਪਿਛਲੀ ਜਾਣਕਾਰੀ ਲੱਭੋ',
 'tooltip-n-recentchanges' => 'ਵਿਕੀ ਵਿੱਚ ਹਾਲ ’ਚ ਹੋਈਆਂ ਬਦਲੀਆਂ ਦੀ ਸੂਚੀ',
 'tooltip-n-randompage' => 'ਇੱਕ ਰਲਵਾਂ ਪੰਨਾ ਲੋਡ ਕਰੋ',
@@ -1986,7 +2051,7 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'tooltip-feed-atom' => 'ਇਸ ਪੰਨੇ ਦੀ ਐਟਮ ਫ਼ੀਡ',
 'tooltip-t-contributions' => 'ਇਸ ਵਰਤੋਂਕਾਰ ਦੇ ਯੋਗਦਾਨ ਦੀ ਸੂਚੀ',
 'tooltip-t-emailuser' => 'ਇਸ ਵਰਤੋਂਕਾਰ ਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ',
-'tooltip-t-upload' => 'à¨\9aਿੱਤਰ à¨\9cਾà¨\82 à¨®à©\80ਡà©\80à¨\86 à¨«à¨¾à¨\88ਲਾà¨\82 à¨\85ੱਪਲà©\8bਡ à¨\95ਰà©\8b',
+'tooltip-t-upload' => 'ਚਿੱਤਰ ਜਾਂ ਮੀਡੀਆ ਫਾਈਲਾਂ ਅਪਲੋਡ ਕਰੋ',
 'tooltip-t-specialpages' => 'ਸਾਰੇ ਵਿਸ਼ੇਸ਼ ਪੰਨਿਆਂ ਦੀ ਸੂਚੀ',
 'tooltip-t-print' => 'ਇਹ ਪੰਨੇ ਦਾ ਛਪਣਯੋਗ ਵਰਜਨ',
 'tooltip-t-permalink' => 'ਪੰਨੇ ਦੇ ਇਸ ਰੀਵਿਜਨ ਲਈ ਪੱਕਾ ਲਿੰਕ',
@@ -1994,11 +2059,11 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'tooltip-ca-nstab-user' => 'ਵਰਤੋਂਕਾਰ ਪੰਨਾ ਵੇਖੋ',
 'tooltip-ca-nstab-media' => 'ਮੀਡਿਆ ਪੇਜ ਵੇਖੋ',
 'tooltip-ca-nstab-special' => 'ਇਹ ਵਿਸ਼ੇਸ਼ ਪੰਨਾ ਹੈ, ਤੁਸੀਂ ਇਸ ਪੰਨੇ ਨੂੰ ਬਦਲ ਨਹੀਂ ਸਕਦੇ।',
-'tooltip-ca-nstab-project' => 'ਪਰਿਯà©\8bà¨\9cਨਾ à¨ªà©°à¨¨à¨¾ à¨µà©\87à¨\96à©\8b',
-'tooltip-ca-nstab-image' => 'ਫ਼ਾà¨\88ਲ à¨ªà©°à¨¨à¨¾ à¨µà©\87à¨\96à©\8b',
+'tooltip-ca-nstab-project' => 'ਪਰਯੋਜਨਾ ਪੰਨਾ ਵੇਖੋ',
+'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 +2072,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' => 'ਧਿà¨\86ਨਸà©\82à¨\9aà©\80 à¨\85ਪਡà©\87à¨\9f ਕਰੋ',
+'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,7 +2099,7 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'skinname-monobook' => 'ਮੋਨੋਬੁੱਕ',
 
 # Browsing diffs
-'previousdiff' => 'â\86\90 à¨\87ਸ à¨¤à©\8bà¨\82 à¨ªà©\81ਰਾਣਾ à¨¬à¨¦à¨²à¨¾à¨µ',
+'previousdiff' => 'â\86\90 à¨\87ਸ à¨¤à©\8bà¨\82 à¨ªà©\81ਰਾਣਾ à¨¬à¨¦à¨²à¨¾à¨\85',
 'nextdiff' => 'ਤਾਜਾ ਸੰਪਾਦਨ →',
 
 # Media information
@@ -2102,14 +2167,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' => 'ਬਾਹਰੀ ਐਪਲੀਕੇਸ਼ਨ ਵਰਤਦੇ ਹੋਏ ਇਸ ਫਾਈਲ ਨੂੰ ਸੰਪਾਦਨ ਕਰੋ।',
+'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' => 'ਸਭ',
@@ -2135,16 +2200,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,8 +2220,8 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'autosumm-new' => '"$1" ਨਾਲ਼ ਸਫ਼ਾ ਬਣਾਇਆ',
 
 # Live preview
-'livepreview-loading' => 'ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…',
-'livepreview-ready' => 'ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...ਤਿਆਰ!',
+'livepreview-loading' => '…ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ',
+'livepreview-ready' => '…ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ। ਤਿਆਰ!',
 
 # Watchlist editor
 'watchlistedit-normal-title' => 'ਧਿਆਨਸੂਚੀ ਬਦਲੋ',
@@ -2166,7 +2231,7 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'watchlistedit-raw-removed' => '{{PLURAL:$1|1 title was|$1 titles were}} ਹਟਾਓ:',
 
 # Watchlist editing tools
-'watchlisttools-view' => 'à¨\86ਧਾਰਿਤ à¨¬à¨¦à¨²à¨¾à¨µ ਵੇਖੋ',
+'watchlisttools-view' => 'à¨\86ਧਾਰਿਤ à¨¬à¨¦à¨²à¨¾à¨\85 ਵੇਖੋ',
 'watchlisttools-edit' => 'ਧਿਆਨਸੂਚੀ ਵੇਖੋ ’ਤੇ ਸੰਪਾਦਨ ਕਰੋ',
 'watchlisttools-raw' => 'ਕੱਚੀ ਧਿਆਨਸੂਚੀ ਸੰਪਾਦਨ ਕਰੋ',
 
@@ -2177,10 +2242,6 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'version' => 'ਵਰਜਨ',
 'version-other' => 'ਹੋਰ',
 
-# Special:FilePath
-'filepath-page' => 'ਫਾਈਲ:',
-'filepath-submit' => 'ਜਾਓ',
-
 # Special:SpecialPages
 'specialpages' => 'ਵਿਸ਼ੇਸ਼ ਪੰਨੇ',
 'specialpages-group-login' => 'ਲਾਗਇਨ / ਖਾਤਾ ਬਣਾਓ',
@@ -2200,7 +2261,7 @@ 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' => 'ਸੰਪਾਦਨ',
 
@@ -2225,14 +2286,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 60a8a21..06d0fe1 100644 (file)
@@ -398,9 +398,6 @@ Erklärung: '''({{int:cur}})''' = Unnerschied zu jetzert,
 'powersearch-field' => 'Suche noch',
 'powersearch-togglenone' => 'Kään',
 
-# Quickbar
-'qbsettings-none' => 'Kään',
-
 # Preferences page
 'preferences' => 'Optione',
 'mypreferences' => 'Oistellunge',
@@ -551,7 +548,7 @@ Saide uff [[Special:Watchlist|Dainer Beowachdungslischt]] sin '''fett'''.",
 # Special:ListGroupRights
 'listgrouprights-members' => '(Midgliederlischd)',
 
-# E-mail user
+# Email user
 'emailuser' => 'E-Mail on de Benutzer',
 'emailsend' => 'Abschigge',
 
@@ -798,7 +795,7 @@ Du kannschd e Grund in dr Zammfassung aagewwe",
 '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',
+'show-big-image' => 'Volli Uflesung',
 
 # Special:NewFiles
 'showhidebots' => '(Bots $1)',
index cf9148b..1abd3ec 100644 (file)
@@ -53,6 +53,7 @@
  * @author Timpul
  * @author ToSter
  * @author Tsca
+ * @author Ty221
  * @author WTM
  * @author Woytecr
  * @author Wpedzich
@@ -323,7 +324,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 +365,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',
@@ -476,7 +477,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',
@@ -714,9 +715,15 @@ 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',
 'yourpasswordagain' => 'Powtórz hasło',
 'remembermypassword' => 'Zapamiętaj moje hasło na tym komputerze (maksymalnie przez $1 {{PLURAL:$1|dzień|dni}})',
+'userlogin-remembermypassword' => 'Zapamiętaj mnie',
+'userlogin-signwithsecure' => 'Zaloguj się na bezpiecznym serwerze',
 '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 +736,26 @@ Nie zapomnij dostosować [[Special:Preferences|preferencji]].',
 'logout' => 'Wyloguj',
 'userlogout' => 'Wyloguj',
 'notloggedin' => 'Nie jesteś zalogowany',
+'userlogin-noaccount' => 'Nie masz konta?',
+'userlogin-joinproject' => 'Dołącz do {{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ę?',
+'helplogin-url' => 'Help:Logowanie',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoc z logowaniem]]',
+'createacct-emailrequired' => 'Adres e‐mail',
+'createacct-emailoptional' => 'Adres e-mail (opcjonalnie)',
 'createaccountmail' => 'Użyj tymczasowego hasła wygenerowanego losowo i wyślij je na podany poniżej adres e-mail',
 'createaccountreason' => 'Powód',
+'createacct-reason' => 'Powód',
 '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ę.
@@ -839,6 +854,7 @@ Być może właśnie zmienił{{GENDER:|eś|aś|eś(‐aś)}} swoje hasło lub po
 'passwordreset-text' => 'Wypełnij formularz, aby zresetować swoje hasło.',
 'passwordreset-legend' => 'Zresetuj hasło',
 'passwordreset-disabled' => 'Na tej wiki wyłączono możliwość resetowania haseł.',
+'passwordreset-emaildisabled' => 'Wysyłanie emaili zostało wyłączone na tej wiki',
 'passwordreset-pretext' => '{{PLURAL:$1||Wprowadź jedną z danych poniżej}}',
 'passwordreset-username' => 'Nazwa użytkownika:',
 'passwordreset-domain' => 'Domena',
@@ -969,7 +985,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',
@@ -1368,6 +1384,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',
@@ -1638,7 +1655,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',
@@ -2254,6 +2271,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ń.
@@ -2436,8 +2462,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',
@@ -2972,7 +2998,7 @@ 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-detail' => '$1 {{PLURAL:$1|wersja|wersje|wersji}} z $2',
@@ -3108,7 +3134,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 +3259,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:
 
@@ -3792,7 +3832,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',
@@ -3915,13 +3955,6 @@ 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:FileDuplicateSearch
 'fileduplicatesearch' => 'Szukaj duplikatów pliku',
 'fileduplicatesearch-summary' => 'Szukaj duplikatów pliku na podstawie wartości funkcji skrótu.',
@@ -4010,6 +4043,8 @@ 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',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 z obsługą pełnotekstowego wyszukiwania',
@@ -4052,8 +4087,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ś {{GENDER:|gotów|gotowa}} szczegółowo opisać problem techniczny, proszę [$1 zgłoś błąd].
+W przeciwnym wypadku można użyć prostego formularza poniżej. Komentarz zostanie dodany do strony "[$3  $2]", wraz z nazwą użytkownika.',
 'feedback-subject' => 'Temat',
 'feedback-message' => 'Wiadomość:',
 'feedback-cancel' => 'Anuluj',
index 5252bc8..af15f97 100644 (file)
@@ -74,62 +74,62 @@ $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',
+'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' => 'Aost',
@@ -174,7 +174,7 @@ $messages = array(
 'newwindow' => '(as deurb ant na fnestra neuva)',
 'cancel' => 'Scancela',
 'moredotdotdot' => 'Dë pì...',
-'morenotlisted' => 'Autr pa listà...',
+'morenotlisted' => "A-i é ëdcò d'àutre nen ant la lista...",
 'mypage' => 'Pàgina',
 'mytalk' => 'Ciaciarade',
 'anontalk' => "Ciaciarade për st'adrëssa IP-sì",
@@ -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',
@@ -1974,6 +1974,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à.
@@ -2181,8 +2190,8 @@ Ch'a varda la [[Special:ProtectedPages|Lista dle pàgine protegiùe]] për la li
 'prot_1movedto2' => '[[$1]] tramudà a [[$2]]',
 'protect-badnamespace-title' => 'Spassi nominal pa protegìbil',
 'protect-badnamespace-text' => 'Le pàgine an cost ëspassi nominal-sì a peulo pa esse protegiùe.',
-'protect-norestrictiontypes-text' => 'Sta pagina a peul pa esse protegiùa përchè a-i son gnun-e sòrt ëd restrission disponìbij.',
-'protect-norestrictiontypes-title' => 'Pagina pa protegìbila',
+'protect-norestrictiontypes-text' => 'Sta pàgina a peul pa esse protegiùa përchè a-i son gnun-e sòrt ëd restrission disponìbij.',
+'protect-norestrictiontypes-title' => 'Pàgina nen protegìbil',
 'protect-legend' => 'Che an conferma la protession',
 'protectcomment' => 'Rason:',
 'protectexpiry' => 'Scadensa:',
@@ -2845,7 +2854,7 @@ Sòn a l'é motobin belfé che a sia rivà përchè a-i era n'anliura a un sit e
 'pageinfo-magic-words' => '{{PLURAL:$1|Paròla màgica|Paròle màgiche}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Categorìa|Categorìe}} stërmà ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|stamp contnù|stamp contnù}} ($1)',
-'pageinfo-transclusions' => '{{PLURAL:$1|Pagina|Pagine}} transcludùe dzor ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Pàgina|Pàgine}} transcludùe dzor ($1)',
 'pageinfo-toolboxlink' => 'Anformassion an sla pàgina',
 'pageinfo-redirectsto' => 'Ridiression-a a',
 'pageinfo-redirectsto-info' => 'anformassion',
@@ -2854,9 +2863,9 @@ Sòn a l'é motobin belfé che a sia rivà përchè a-i era n'anliura a un sit e
 'pageinfo-protect-cascading' => 'Le protession a son a cascada da sì',
 'pageinfo-protect-cascading-yes' => 'É!',
 'pageinfo-protect-cascading-from' => 'Le protession a son a cascada da',
-'pageinfo-category-info' => 'Anformassion ëd categorìa',
+'pageinfo-category-info' => 'Anformassion an sla categorìa',
 'pageinfo-category-pages' => 'Nùmer ëd pàgine',
-'pageinfo-category-subcats' => 'Nùmer ëd sotcategorìe',
+'pageinfo-category-subcats' => 'Nùmer ëd sot-categorìe',
 'pageinfo-category-files' => "Nùmer d'archivi",
 
 # Patrolling
@@ -3589,13 +3598,6 @@ A dovrìa avèj arseivù [{{SERVER}}{{SCRIPTPATH}}/COPYING na còpia dla Licensa
 'version-entrypoints-header-url' => "Adrëssa an sl'aragnà",
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Senté d\'artìcol]',
 
-# Special:FilePath
-'filepath' => "Përcors d'archivi",
-'filepath-page' => 'Archivi:',
-'filepath-submit' => 'Përcors',
-'filepath-summary' => "Sta pàgina special-sì a la smon ël përcors complet për n'archivi.
-Le figure a së smon-o a amzura pijn-a, j'àotre sòrt d'archivi a ven-o fàite parte diretament da sò programa a pòsta.",
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => "Arsërca dj'archivi dobi",
 'fileduplicatesearch-summary' => "Arsërca dj'archivi dobi a parte dal valor d'ordinament.",
index 28ae908..ea4d727 100644 (file)
@@ -51,9 +51,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ویکھن آلے لوکاں دی گنتی وکھاؤ۔',
 'tog-oldsig' => 'ہن والے دسخط:',
 'tog-fancysig' => 'دستخط نوں وکی ٹیکسڈ ونگوں؎ ورتو(without an automatic link)',
-'tog-externaleditor' => 'ہمیشہ بارلا لکھن والا ورتو (ماہر لوکاں واسطے، اس واسطے تواڑے کمپیوٹر تے خاص تبدیلیاں چائیدیاں نیں۔ [//www.mediawiki.org/wiki/Manual:External_editors مزید معلومات.])',
-'tog-externaldiff' => '
-ہمیشہ بارلا تبدیلی کرن والا ورتو (ماہر لوکاں واسطے، اس واسطے تواڑے کمپیوٹر تے خاص تبدیلیاں چائیدیاں نیں۔ [//www.mediawiki.org/wiki/Manual:External_editors مزید معلومات۔])',
 'tog-showjumplinks' => '"ایدر چلو" نوں رلن والے جوڑان نال جوڑو',
 'tog-uselivepreview' => 'لائیو پریویو ورتو',
 'tog-forceeditsummary' => 'مینون اوسے ویلے دسو جدوں خالی سمری تے آؤ۔',
@@ -67,6 +64,7 @@ $messages = array(
 'tog-diffonly' => 'تبدیلی توں علاوہ صفحہ نا وکھاؤ',
 'tog-showhiddencats' => 'لکیاں کیٹاگریاں وکھاؤ',
 'tog-norollbackdiff' => 'صفحے دی واپسی تے تبدیلی کڈ دو',
+'tog-useeditwarning' => 'جدوں میں کوئی صفحہ تبدیلی کر کے بچاۓ بغیر چھڈن لگاں تے منوں دس دیو',
 
 'underline-always' => 'ہمیشہ',
 'underline-never' => 'کدی وی نئیں',
@@ -757,6 +755,8 @@ Custom .css تے .js pages use a lowercase title, e.g. {{ns:user}}:Foo/vector.cs
 'edit-no-change' => 'تواڈی تبدیلی ول کوئی توجہ نئیں، کیوں جے لکھت چ کوئی تبدیلی نئیں۔',
 'edit-already-exists' => 'نواں صفہ نئیں بن سکدا۔
 ایہ پہلے ای ہیگا اے۔',
+'editwarning-warning' => 'اے صفے توں جان تے ہو سکدا اوہ ساریاں تبدیلیاں مک جان جیہڑیاں تساں بناياں نیں۔
+اگر تسیں لاکان او، تسیں ایڈیٹنگ سیکشن چ  اپنی پسنداں چ ایس خبرداری نوں پعلے ناں۔',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''خبردار:''' ایس صفے تے چوکھیاں ساریاں پارسر کلز نیں۔
@@ -1021,15 +1021,6 @@ $1",
 تسیں گوگل تے کھوج کرو۔
 اے گل یاد رکھنا جے انڈیکس {{SITENAME}} دے پرانے ہون۔',
 
-# Quickbar
-'qbsettings' => 'کوئکبار',
-'qbsettings-none' => 'کوئی نئیں',
-'qbsettings-fixedleft' => 'فکسڈ کھبے',
-'qbsettings-fixedright' => 'فکسڈ سجے',
-'qbsettings-floatingleft' => 'ہلدا کھبے',
-'qbsettings-floatingright' => 'ہلدا سجے',
-'qbsettings-directionality' => '!!!!فکسڈ، تھاڈی بولی تے لپی نال',
-
 # Preferences page
 'preferences' => 'تانگاں',
 'mypreferences' => 'میریاں تانگاں',
@@ -1573,7 +1564,6 @@ $1",
 'http-read-error' => 'ایچ ٹی ٹی پی  غلطی پڑھدی اے۔',
 'http-timed-out' => 'ایچ ٹی ٹی پی  دی مانگ ویلیوں بار۔',
 'http-curl-error' => 'ایچ ٹی ٹی پی  : $1 لیان چ غلطی۔',
-'http-host-unreachable' => 'ایچ ٹی ٹی پی  تک ناں پونچ سکیا۔',
 'http-bad-status' => 'ایچ ٹی ٹی پی : $1 $2 دی مانگ ویلے رپھڑ',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1881,15 +1871,6 @@ $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' => 'تھلے اک لسٹ اے ورتن ٹولیاں دی ای وکی تے، اپنے رلدے حقاں نال۔ 
index bdacefc..4b3c9f3 100644 (file)
@@ -200,6 +200,8 @@ $messages = array(
 'tog-ccmeonemails' => 'هغه برېښليکونه چې زه يې نورو ته لېږم، د هغو يوه کاپي دې ماته هم راشي',
 'tog-diffonly' => 'د توپيرونو نه لاندې د مخ مېنځپانګه پټول',
 'tog-showhiddencats' => 'پټې وېشنيزې ښکاره کول',
+'tog-norollbackdiff' => 'پرشاتمبولو وروسته توپيرونه نه ښودل',
+'tog-useeditwarning' => 'کله چې يو سمون مخ څخه د بدلونونو د خوندي کولو پرته وځم خبر دې شم',
 
 'underline-always' => 'تل',
 'underline-never' => 'هېڅکله',
@@ -311,6 +313,7 @@ $messages = array(
 'vector-action-protect' => 'ژغورل',
 'vector-action-undelete' => 'ناړنګول',
 'vector-action-unprotect' => 'ژغورنه بدلول',
+'vector-simplesearch-preference' => 'د پلټنې ساده پټه چارنول (يوازې په وېکټور پوښۍ کار کوي)',
 'vector-view-create' => 'جوړول',
 'vector-view-edit' => 'سمول',
 'vector-view-history' => 'پېښليک کتل',
@@ -535,9 +538,14 @@ $1',
 دا په پام کې وساتۍ چې تر څو تاسې د خپل کتنمل حافظه نه وي سپينه کړې، نو ځينې مخونو کې به لا تر اوسه پورې په غونډال کې ننوتي ښکارۍ.",
 'welcomeuser' => '$1، ښه راغلې!',
 'yourname' => 'کارن-نوم:',
+'userlogin-yourname' => 'کارن-نوم',
+'userlogin-yourname-ph' => 'کارن-نوم مو وليکۍ',
 'yourpassword' => 'پټنوم:',
+'userlogin-yourpassword' => 'پټنوم',
+'userlogin-yourpassword-ph' => 'پټنوم مو وليکۍ',
 'yourpasswordagain' => 'پټنوم بيا وليکه',
 'remembermypassword' => 'زما پټنوم په دې کمپيوټر (تر $1 {{PLURAL:$1|ورځې|ورځو}}) په ياد وساته!',
+'userlogin-remembermypassword' => 'ما په ياد لره',
 'securelogin-stick-https' => 'وروسته د ننوتلو HTTPS سره تړلی پاتې کېدل',
 'yourdomainname' => 'ستاسې شپول:',
 'login' => 'ننوتل',
@@ -548,6 +556,8 @@ $1',
 'logout' => 'وتل',
 'userlogout' => 'وتل',
 'notloggedin' => 'غونډال کې نه ياست ننوتي',
+'userlogin-noaccount' => 'ګڼون نه لرې؟',
+'userlogin-joinproject' => 'د {{SITENAME}} سره يوځای شه',
 'nologin' => 'کارن-نوم نه لرې؟ $1.',
 'nologinlink' => 'يو ګڼون جوړول',
 'createaccount' => 'ګڼون جوړول',
@@ -643,7 +653,7 @@ $1',
 
 # Special:PasswordReset
 'passwordreset' => 'پټنوم بياپرځايول',
-'passwordreset-text' => 'د Ø¯Û\90 Ù\84پارÙ\87 Ú\86Û\90 Ø³ØªØ§Ø³Û\90 Ø¯ Ú«Ú¼Ù\88Ù\86 Ø¨Ø´Ù¾Ú\93Û\90 Ú\85رګÙ\86دÙ\86Û\90 Ø¯Ø±Ø¨Ø±Û\90Ú\9aÙ\84Ù\8aÚ© Ø´Ù\8a Ù\86Ù\88 دا فورمه ډکه کړۍ.',
+'passwordreset-text' => 'د Ø¨Ø±Û\90Ú\9aÙ\84Ù\8aÚ© Ø¯  Ø¨Ù\8aاپرÚ\81اÛ\8c Ú©Û\90دÙ\86Û\90 Ù\84پارÙ\87 دا فورمه ډکه کړۍ.',
 'passwordreset-legend' => 'پټنوم بياپرځايول',
 'passwordreset-disabled' => 'په دې ويکي پټنوم بياپرځای کولو کړنه ناچارنه شوې.',
 'passwordreset-pretext' => '{{PLURAL:$1||د لاندې اومتوک يوه برخه مالومات وليکۍ}}',
@@ -655,7 +665,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' => 'برېښليک پته بدلول',
@@ -823,6 +833,7 @@ $1',
 'content-model-wikitext' => 'ويکي متن',
 'content-model-text' => 'ساده متن',
 'content-model-javascript' => 'جاواسکرېپټ',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'post-expand-template-inclusion-warning' => "'''ګواښنه:''' دا کينډۍ د خپل ټاکلي بريد نه ډېره لويه ده.
@@ -999,6 +1010,7 @@ $1',
 'prefs-beta' => 'د آزمېښتي بڼې ځانګړنې',
 'prefs-datetime' => 'نېټه او وخت',
 'prefs-labs' => 'د آزمېنتون ځانګړنې',
+'prefs-user-pages' => 'کارن مخونه',
 'prefs-personal' => 'د کارن پېژنليک',
 'prefs-rc' => 'وروستي بدلونونه',
 'prefs-watchlist' => 'کتنلړ',
@@ -1185,9 +1197,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 +1235,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 +1255,8 @@ $1',
 # Upload
 'upload' => 'دوتنه پورته کول',
 'uploadbtn' => 'دوتنه پورته کول',
+'reuploaddesc' => 'پورته کېدنه ناګارل او بېرته د پورته کېدنې فورمې ته ورګرځېدل',
+'upload-tryagain' => 'د بدلون موندلې دوتنې څرګندونې سپارل',
 'uploadnologin' => 'غونډال کې نه ياست ننوتي',
 'uploadnologintext' => 'ددې لپاره چې دوتنې پورته کړای شۍ، نو لومړی غونډال کې [[Special:UserLogin|ورننوځۍ]].',
 'uploaderror' => 'د پورته کولو ستونزه',
@@ -1302,6 +1322,7 @@ $1',
 'upload-failure-subj' => 'د پورته کېدو ستونزه',
 'upload-warning-subj' => 'د پورته کولو ګواښ',
 
+'upload-proto-error' => 'ناسم پروتوکول',
 'upload-file-error' => 'کورنۍ ستونزه',
 'upload-unknown-size' => 'ناڅرګنده کچه',
 'upload-http-error' => 'د HTTP يوه ستونزه رامېنځ ته شوې: $1',
@@ -1428,6 +1449,7 @@ $1',
 'statistics-header-hooks' => 'بل شمار',
 'statistics-articles' => 'مېنځپانګيز مخونه',
 'statistics-pages' => 'مخونه',
+'statistics-pages-desc' => 'د ويکي ټول مخونه، د خبرو اترو، مخ ګرځېدنو، او لا نورو مخونو په ګډون.',
 'statistics-files' => 'پورته شوې دوتنې',
 'statistics-edits' => 'د {{SITENAME}} د جوړېدو راهيسې د مخونو سمون',
 'statistics-edits-average' => 'پر يوه مخ د سمون منځوۍ کچه',
@@ -1441,6 +1463,8 @@ $1',
 'disambiguations' => 'د مبهمو مخونو سره تړلي مخونه',
 'disambiguationspage' => 'Template:ناجوت',
 
+'pageswithprop-submit' => 'ورځه',
+
 'doubleredirects' => 'دوه ځلي ورګرځېدنې',
 
 'brokenredirects' => 'ماتې ورګرځېدنې',
@@ -1570,6 +1594,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' => 'ډله',
@@ -1744,8 +1777,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',
@@ -2565,10 +2598,6 @@ $5
 'version-software-product' => 'اېبره',
 'version-software-version' => 'بڼه',
 
-# Special:FilePath
-'filepath-page' => 'دوتنه:',
-'filepath-submit' => 'ورځه',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'د دوه ګونو دوتنو پلټنه',
 'fileduplicatesearch-legend' => 'د دوه ګونو دوتنو پلټنه',
@@ -2643,17 +2672,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
index c51fe22..e816614 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
@@ -342,8 +344,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 +358,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',
@@ -491,7 +492,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',
@@ -520,7 +521,7 @@ $messages = array(
 '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',
@@ -727,9 +728,20 @@ 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)',
+'createacct-helpusername-url' => '{{ns:Project}}:Política_de_nome_de_utilizador(a)',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(ajude-me a escolher)]]',
 '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' => 'Memorizar neste computador',
+'userlogin-signwithsecure' => 'Inicie sessão com servidor seguro',
 '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,14 +754,25 @@ Não se esqueça de personalizar as suas [[Special:Preferences|preferências]].'
 'logout' => 'Sair',
 'userlogout' => 'Sair',
 'notloggedin' => 'Não autenticado',
+'userlogin-noaccount' => 'Não tem uma conta?',
+'userlogin-joinproject' => 'Junte {{SITENAME}}',
 'nologin' => 'Não possui uma conta? $1.',
 'nologinlink' => 'Criar uma conta',
 'createaccount' => 'Criar conta',
 'gotaccount' => "Já possui uma conta? '''$1'''.",
 'gotaccountlink' => 'Autentique-se',
 'userlogin-resetlink' => 'Esqueceu-se do seu nome de utilizador ou da palavra-chave?',
+'helplogin-url' => 'Ajuda:login',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajuda a fazer login]]',
+'createacct-join' => 'Insira a sua informação abaixo.',
+'createacct-emailrequired' => 'Endereço de email',
+'createacct-emailoptional' => 'Endereço de email (opcional)',
+'createacct-email-ph' => 'Digite seu endereço de email',
 'createaccountmail' => 'Usar uma palavra passe aleatória e temporária e enviar para o endereço de e-mail especificado abaixo',
+'createacct-realname' => 'Nome verdadeiro (opcional)',
 'createaccountreason' => 'Motivo:',
+'createacct-reason' => 'Razão',
+'createacct-captcha' => 'Verificar segurança',
 '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.',
@@ -1006,7 +1029,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!",
@@ -1087,7 +1110,7 @@ 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.',
@@ -1095,6 +1118,8 @@ Ela parece ter sido eliminada.',
 Ela já existia.',
 'defaultmessagetext' => 'Texto da mensagem padrão',
 'content-not-allowed-here' => 'Conteúdo do tipo "$1" não é permitido na página [[$2]]',
+'editwarning-warning' => 'Sair desta página fará com que você perca todas as alterações feitas por você.
+Se você fez login, pode desabilitar este aviso na seção "{{int:prefs-editing}}" das suas preferências.',
 
 # Content models
 'content-model-wikitext' => 'wikitexto',
@@ -1140,13 +1165,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',
@@ -1386,15 +1411,6 @@ Tente usar o prefixo ''all:'' para pesquisar todo o conteúdo (incluindo página
 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',
-
 # Preferences page
 'preferences' => 'Preferências',
 'mypreferences' => 'Preferências',
@@ -1433,7 +1449,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:',
@@ -1958,7 +1974,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 +2011,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",
@@ -2277,6 +2292,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.
@@ -2552,10 +2576,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 +2606,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',
@@ -2902,7 +2926,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.",
@@ -3044,7 +3068,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',
@@ -3068,13 +3092,8 @@ 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 */',
@@ -3082,13 +3101,8 @@ Permite colocar uma justificação no resumo da edição.',
 
 # 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 */',
 
@@ -3158,13 +3172,8 @@ Este bloqueio foi provavelmente causado por um link para um site externo que con
 'pageinfo-category-files' => 'Número de ficheiros',
 
 # Skin names
-'skinname-standard' => 'Clássico',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Azul colonial',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chique',
-'skinname-simple' => 'Simples',
 'skinname-modern' => 'Moderno',
 'skinname-vector' => 'Vector',
 
@@ -3823,7 +3832,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}}:',
@@ -3872,13 +3881,6 @@ Em conjunto com este programa deve ter recebido [{{SERVER}}{{SCRIPTPATH}}/COPYIN
 'version-entrypoints-header-entrypoint' => 'Ponto de entrada',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Endereço de ficheiro',
-'filepath-page' => 'Ficheiro:',
-'filepath-submit' => 'Ir',
-'filepath-summary' => 'Esta página especial retorna o endereço completo de um ficheiro.
-Imagens serão apresentadas pelo browser na resolução máxima; ficheiros de outro tipo serão abertos pelo browser directamente no programa que lhes está associado no seu computador.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Ficheiros duplicados',
 'fileduplicatesearch-summary' => "Procure ficheiros duplicados tendo por base o seu resumo criptográfico ''(hash value)''.",
@@ -3950,7 +3952,7 @@ Imagens serão apresentadas pelo browser na resolução máxima; ficheiros de ou
 # Database error messages
 'dberr-header' => 'Esta wiki tem um problema',
 'dberr-problems' => 'Desculpe! Este site está com dificuldades técnicas.',
-'dberr-again' => 'Experimente esperar uns minutos e actualizar.',
+'dberr-again' => 'Experimente esperar alguns minutos e atualizar.',
 'dberr-info' => '(Não foi possível contactar o servidor da base de dados: $1)',
 'dberr-usegoogle' => 'Pode tentar pesquisar no Google entretanto.',
 'dberr-outofdate' => 'Note que os seus índices relativos ao nosso conteúdo podem estar desactualizados.',
index 3dbe7a2..881df1d 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 Opraco
  * @author Pedroca cerebral
  * @author Ppena
@@ -53,6 +56,7 @@
  * @author Teles
  * @author TheGabrielZaum
  * @author Urhixidur
+ * @author Vivaelcelta
  * @author Vuln
  * @author Waldir
  * @author Yves Marques Junqueira
@@ -322,8 +326,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 +335,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 +371,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',
@@ -433,12 +437,12 @@ $messages = array(
 'category-empty' => "''No momento esta categoria não possui nenhuma página ou arquivo multimídia.''",
 'hidden-categories' => '{{PLURAL:$1|Categoria oculta|Categorias ocultas}}',
 'hidden-category-category' => 'Categorias ocultas',
-'category-subcat-count' => '{{PLURAL:$2|Esta categoria possui apenas a subcategoria a seguir.|Há, nesta categoria {{PLURAL:$1|uma subcategoria|$1 subcategorias}} (dentre um total de $2).}}',
+'category-subcat-count' => '{{PLURAL:$2|Esta categoria possui apenas a seguinte subcategoria.|Esta categoria possui {{PLURAL:$1|uma subcategoria|$1 subcategorias}}, de um total de $2.}}',
 'category-subcat-count-limited' => 'Esta categoria possui {{PLURAL:$1|a seguinte sub-categoria|as $1 sub-categorias a seguir}}.',
-'category-article-count' => '{{PLURAL:$2|Esta categoria possui apenas a página a seguir.|Há, nesta categoria, {{PLURAL:$1|a página a seguir|as $1 páginas a seguir}} (dentre um total de $2).}}',
-'category-article-count-limited' => 'Há, nesta categoria, {{PLURAL:$1|a página a seguir|as $1 páginas a seguir}}.',
-'category-file-count' => '{{PLURAL:$2|Esta categoria possui apenas o arquivo a seguir.|Há, nesta categoria, {{PLURAL:$1|o arquivo a seguir|os $1 seguintes arquivos}} (dentre um total de $2.)}}',
-'category-file-count-limited' => 'Nesta categoria há {{PLURAL:$1|um arquivo|$1 arquivos}}.',
+'category-article-count' => '{{PLURAL:$2|Esta categoria possui apenas a seguinte página.|Esta categoria possui {{PLURAL:$1|a seguinte página|as $1 páginas a seguir}}, de um total de $2.}}',
+'category-article-count-limited' => 'Esta categoria possui {{PLURAL:$1|a seguinte página|as $1 páginas a seguir}}.',
+'category-file-count' => '{{PLURAL:$2|Esta categoria possui apenas o seguinte arquivo.|Esta categoria possui {{PLURAL:$1|o seguinte arquivo|os $1 arquivos a seguir}}, de um total de $2.}}',
+'category-file-count-limited' => 'Esta categoria possui {{PLURAL:$1|um arquivo|$1 arquivos}}.',
 'listingcontinuesabbrev' => 'cont.',
 'index-category' => 'Páginas indexadas',
 'noindex-category' => 'Páginas não indexadas',
@@ -671,7 +675,7 @@ Anote a URL e reporte o ocorrido a um [[Special:ListUsers/sysop|administrador]].
 'filedeleteerror' => 'Não foi possível eliminar o arquivo "$1".',
 'directorycreateerror' => 'Não foi possível criar o diretório "$1".',
 'filenotfound' => 'Não foi possível encontrar o arquivo "$1".',
-'fileexistserror' => 'Não foi possível gravar no arquivo "$1": ele já existe',
+'fileexistserror' => 'Não foi possível escrever no arquivo "$1": ele já existe',
 'unexpected' => 'Valor não esperado: "$1"="$2".',
 'formerror' => 'Erro: Não foi possível enviar o formulário',
 'badarticleerror' => 'Esta ação não pode ser realizada nesta página.',
@@ -734,9 +738,20 @@ 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',
+'createacct-helpusername-url' => '{{ns:Project}}:Política_de_nomes_de_usuário',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(ajude-me a escolher)]]',
 'yourpassword' => 'Senha:',
+'userlogin-yourpassword' => 'Senha',
+'userlogin-yourpassword-ph' => 'Digite sua senha',
+'createacct-yourpassword-ph' => 'Digite uma senha',
 'yourpasswordagain' => 'Redigite sua senha',
+'createacct-yourpasswordagain' => 'Confirmar senha',
+'createacct-yourpasswordagain-ph' => 'Digite a senha novamente',
 'remembermypassword' => 'Lembrar meu login neste navegador (por no máximo $1 {{PLURAL:$1|dia|dias}})',
+'userlogin-remembermypassword' => 'Mantenha-me conectado',
+'userlogin-signwithsecure' => 'Entrar com um servidor seguro',
 'securelogin-stick-https' => 'Permanecer conectado ao HTTPS após a autenticação',
 'yourdomainname' => 'Seu domínio:',
 'password-change-forbidden' => 'Você não pode alterar senhas nessa wiki.',
@@ -749,18 +764,39 @@ Não se esqueça de personalizar as suas [[Special:Preferences|preferências no
 'logout' => 'Sair',
 'userlogout' => 'Sair',
 'notloggedin' => 'Não autenticado',
+'userlogin-noaccount' => 'Não possui uma conta?',
+'userlogin-joinproject' => 'Sobre {{SITENAME}}',
 'nologin' => 'Não possui uma conta? $1.',
 'nologinlink' => 'Criar uma conta',
 'createaccount' => 'Criar conta',
 'gotaccount' => "Já possui uma conta? '''$1'''.",
 'gotaccountlink' => 'Autenticar-se',
 'userlogin-resetlink' => 'Esqueceu-se do seu nome de usuário ou da senha?',
+'helplogin-url' => 'Help:Iniciar sessão',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajuda para iniciar sessão]]',
+'createacct-join' => 'Insira suas informações abaixo.',
+'createacct-emailrequired' => 'Endereço de e-mail',
+'createacct-emailoptional' => 'Endereço de e-mail (opcional)',
+'createacct-email-ph' => 'Confirme seu endereço de e-mail',
 'createaccountmail' => 'Usar uma senha aleatória e temporária que será enviada ao endereço de e-mail especificado a seguir',
+'createacct-realname' => 'Nome real (opcional)',
 'createaccountreason' => 'Razão:',
+'createacct-reason' => 'Motivo',
+'createacct-reason-ph' => 'Por que você está criando outra conta',
+'createacct-captcha' => 'Verificação de segurança',
+'createacct-captcha-help-url' => '{{ns:Project}}:Solicitar uma conta',
+'createacct-imgcaptcha-help' => 'Não consegue ver a imagem? [[{{MediaWiki:createacct-captcha-help-url}}|Solicitar uma conta]]',
+'createacct-imgcaptcha-ph' => 'Digite o texto acima',
+'createacct-submit' => 'Crie sua conta',
+'createacct-benefit-heading' => '{{SITENAME}} é feita por pessoas como você.',
+'createacct-benefit-body1' => 'edições',
+'createacct-benefit-body2' => 'páginas',
+'createacct-benefit-body3' => 'contribuidores recentes',
 'badretype' => 'As senhas que você digitou não são iguais.',
 'userexists' => 'O nome de usuário fornecido já está em uso.
 Escolha um nome diferente.',
 'loginerror' => 'Erro de autenticação',
+'createacct-error' => 'Erro ao criar a conta',
 'createaccounterror' => 'Não foi possível criar a conta: $1',
 'nocookiesnew' => "A conta do usuário foi criada, mas você não foi autenticado.
 {{SITENAME}} utiliza ''cookies'' para autenticar os usuários.
@@ -845,12 +881,14 @@ Por favor aguarde antes de tentar novamente.',
 'resetpass-wrong-oldpass' => 'Senha temporária ou atual inválida.
 Você pode já ter alterado com sucesso a sua senha, ou solicitado uma nova senha temporária.',
 'resetpass-temp-password' => 'Senha temporária:',
+'resetpass-abort-generic' => 'Uma extensão cancelou a alteração da senha.',
 
 # Special:PasswordReset
 'passwordreset' => 'Redefinir senha',
 'passwordreset-text' => 'Preencha este formulário para recuperar os dados da sua conta pelo e-mail.',
 'passwordreset-legend' => 'Reiniciar a senha',
 'passwordreset-disabled' => 'Redefinições de senha foram desabilitadas nesta wiki.',
+'passwordreset-emaildisabled' => 'Os recursos de e-mail foram desativados nesta wiki.',
 'passwordreset-pretext' => '{{PLURAL:$1||Introduza um dos dados abaixo}}',
 'passwordreset-username' => 'Nome de usuário:',
 'passwordreset-domain' => 'Domínio:',
@@ -878,7 +916,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',
@@ -1150,7 +1188,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',
@@ -1383,6 +1421,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 +1565,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:',
@@ -2274,6 +2314,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.
@@ -2562,7 +2611,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 +2810,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',
@@ -3232,11 +3282,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:
 
@@ -3862,12 +3926,16 @@ 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.',
+'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 +4025,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 +4037,14 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
 'logentry-delete-delete' => '$1 apagou a página $3',
 'logentry-delete-restore' => '$1 restaurou a página $3',
 'logentry-delete-event' => '$1 alterou a visibilidade {{PLURAL:$5|de uma entrada|de $5 entradas}} do registro $3: $4',
-'logentry-delete-revision' => '$1 alterou a visibilidade de {{PLURAL:$5|uma revisão|$5 revisões}} em $3: $4',
-'logentry-delete-event-legacy' => '$1 alterou a visibilidade de uma entrada em $3',
-'logentry-delete-revision-legacy' => '$1 alterou a visibilidade de uma revisão em $3',
+'logentry-delete-revision' => '$1 alterou a visibilidade de {{PLURAL:$5|uma revisão|$5 revisões}} na página $3: $4',
+'logentry-delete-event-legacy' => '$1 alterou a visibilidade de eventos de log em $3',
+'logentry-delete-revision-legacy' => '$1 alterou a visibilidade de revisões na página $3',
 'logentry-suppress-delete' => '$1 suprimiu a página $3',
 'logentry-suppress-event' => '$1 alterou secretamente a visibilidade {{PLURAL:$5|de uma entrada|das $5 entradas}} em $3: $4',
 'logentry-suppress-revision' => '$1 alterou secretamente a visibilidade {{PLURAL:$5|de uma revisão|das $5 revisões}} em $3: $4',
 'logentry-suppress-event-legacy' => '$1 alterou secretamente a visibilidade das entradas em $3',
-'logentry-suppress-revision-legacy' => '$1 alterou secretamente a visibilidade das revisões em $3',
+'logentry-suppress-revision-legacy' => '$1 alterou secretamente a visibilidade de revisões na página $3',
 'revdelete-content-hid' => 'conteúdo oculto',
 'revdelete-summary-hid' => 'sumário de edição oculto',
 'revdelete-uname-hid' => 'nome de usuário oculto',
@@ -3992,10 +4063,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 +4142,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..ba508e6 100644 (file)
@@ -79,6 +79,7 @@
  * @author Mido
  * @author Mihai
  * @author Minh Nguyen
+ * @author Moha
  * @author Mormegil
  * @author Mpradeep
  * @author Murma174
  * @author Yyy
  * @author Žekřil71pl
  * @author פוילישער
+ * @author គីមស៊្រុន
  * @author 아라
  */
 
@@ -508,8 +510,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,7 +520,7 @@ 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}}',
 '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.',
@@ -531,7 +533,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
 
@@ -540,10 +542,10 @@ See also:
 * {{msg-mw|Accesskey-ca-unprotect}}
 * {{msg-mw|Tooltip-ca-unprotect}}
 {{Identical|Unprotect}}',
-'unprotectthispage' => 'In the skins Classic/Standard, Cologne Blue and Nostalgia this is the anchor text for the link to unprotect the page in admin view.
+'unprotectthispage' => 'In this Cologne Blue skin this is the anchor text for the link to unprotect the page in admin view, at the bottom of the page.
 {{Identical|Unprotect this page}}',
 'newpage' => '{{Identical|New page}}',
-'talkpage' => 'In the skins Classic/Standard, Cologne Blue and Nostalgia this is the text for link to discuss the page.',
+'talkpage' => 'In the Cologne Blue skin this is the text for link to discuss the page, at the bottom of the page.',
 'talkpagelinktext' => 'Used as name of links going to talk page in some places, like in [[Special:RecentChanges]], [[Special:Allmessages]], [[Special:Logs]], and [[Special:Watchlist/edit]].
 
 {{Identical|Talk}}',
@@ -552,7 +554,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]].
@@ -1042,20 +1044,46 @@ Parameters:
 In user preferences.
 {{Identical|Username}}",
 'userlogin-yourname' => 'In new vertical user login & create account forms, label for username field.
+
+See examples: [{{canonicalurl:Special:UserLogin|useNew=1}} Special:UserLogin?useNew=1] and [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]
 {{Identical|Username}}',
-'userlogin-yourname-ph' => 'Placeholder text in new userlogin/create account form field.',
+'userlogin-yourname-ph' => 'Placeholder text in new userlogin/create account form field.
+
+See example: [{{canonicalurl:Special:UserLogin|useNew=1}} Special:UserLogin?useNew=1] and [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
+'createacct-helpusername-url' => 'The URL of a page providing username guidance for the wiki.
+Used as a link in the {{msg-mw|Createacct-helpusername}} on WMF wikis.',
+'createacct-helpusername-link' => 'Message in new create account form providing guidance for username.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
 'yourpassword' => 'In user preferences
 
 {{Identical|Password}}',
 'userlogin-yourpassword' => 'In new vertical user login & create account forms, label for password field.
+
+See examples: [{{canonicalurl:Special:UserLogin|useNew=1}} Special:UserLogin?useNew=1] and [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]
 {{Identical|Password}}',
-'userlogin-yourpassword-ph' => 'Placeholder text in new userlogin form for password field.',
+'userlogin-yourpassword-ph' => 'Placeholder text in new userlogin form for password field.
+
+See examples: [{{canonicalurl:Special:UserLogin|useNew=1}} Special:UserLogin?useNew=1] and [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]
+{{Identical|Enter password}}',
+'createacct-yourpassword-ph' => 'Placeholder text in new create account form for password field.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]
+{{Identical|Enter password}}',
 'yourpasswordagain' => 'In user preferences',
+'createacct-yourpasswordagain' => 'In new create account form, label for field to re-enter password
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]
+{{Identical|Confirm password}}',
+'createacct-yourpasswordagain-ph' => 'Placeholder text in new create account form for re-enter password field.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
 'remembermypassword' => 'A check box in [[Special:UserLogin]]
 
 {{Identical|Remember my login on this computer}}',
 'userlogin-remembermypassword' => 'The text for a check box in the new-style [[Special:UserLogin]].
-{{Identical|Remember me}}',
+
+See example: [{{canonicalurl:Special:UserLogin|useNew=1}} Special:UserLogin?useNew=1]',
 'userlogin-signwithsecure' => 'Text of link to HTTPS login form',
 'securelogin-stick-https' => 'Used as label for checkbox.',
 'yourdomainname' => 'Used as label for listbox.',
@@ -1090,8 +1118,12 @@ See also:
 
 {{Identical|Not logged in}}',
 'userlogin-noaccount' => 'In the new-style [[Special:Userlogin]] form, this is the text prior to button inviting user to join project.
+
+See example: [{{canonicalurl:Special:UserLogin|useNew=1}} Special:UserLogin?useNew=1]
 {{Identical|Do not have an account}}',
-'userlogin-joinproject' => 'Text of button inviting user to create an account',
+'userlogin-joinproject' => 'Text of button inviting user to create an account.
+
+See example: [{{canonicalurl:Special:UserLogin|useNew=1}} Special:UserLogin?useNew=1]',
 'nologin' => 'A message shown in the log in form. Parameters:
 * $1 - a link to the account creation form, and the text of it is {{msg-mw|Nologinlink}}
 {{Identical|Do not have an account}}',
@@ -1109,17 +1141,80 @@ It is also used on the top of the page for logged out users, where it appears ne
 'gotaccountlink' => 'Text of the link to the log in form. Before that link, the message {{msg-mw|Gotaccount}} appears.
 {{Identical|Log in}}',
 'userlogin-resetlink' => 'Used on the login page.',
-'helplogin-url' => 'Page that provides information about logging into the wiki.
+'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 in the message {{msg-mw|Userlogin-helplink}}.',
+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.',
+Wikitext linking to login help.
+
+See example: [{{canonicalurl:Special:UserLogin|useNew=1}} Special:UserLogin?useNew=1]
+
+See also:
+* {{msg-mw|Helplogin-url}}',
+'createacct-join' => 'Subheading of vertical-layout create account form encouraging user to join the wiki.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
+'createacct-emailrequired' => 'Label in vertical-layout create account form for email field when it is required.
+
+See also:
+* {{msg-mw|Createacct-emailoptional}}
+{{Identical|E-mail address}}',
+'createacct-emailoptional' => 'Label in vertical-layout create account form for email field when it is optional.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]
+
+See also:
+* {{msg-mw|Createacct-emailrequired}}',
+'createacct-email-ph' => 'Placeholder in vertical-layout create account form for email field.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
+'createaccountmail' => 'Used as label for the checkbox for creating a new account and sending the new password to the specified e-mail address directly, as used on [[Special:UserLogin/signup]] if creating accounts by e-mail is allowed.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
+'createacct-realname' => 'In vertical-layout create account form, label for field to enter optional real name.',
 'createaccountreason' => '{{Identical|Reason}}',
+'createacct-reason' => 'In vertical-layout create account form, label for field to enter reason to create an account when already logged-in.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]
+{{Identical|Reason}}',
+'createacct-reason-ph' => 'Placeholder in vertical-layout create account form for reason field.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
+'createacct-captcha' => 'Label in vertical-layout create account form for CAPTCHA input field when repositioned by JavaScript.',
+'createacct-captcha-help-url' => 'The URL of a page providing CAPTCHA assistance for the wiki.
+
+Used as a link in {{msg-mw|Createacct-imgcaptcha-help}}.',
+'createacct-imgcaptcha-help' => 'Help text in vertical-layout create account form for image CAPTCHA input field when repositioned by JavaScript.',
+'createacct-imgcaptcha-ph' => 'Placehodler text in vertical-layout create account form for image CAPTCHA input field when repositioned by JavaScript.',
+'createacct-submit' => 'Submit button on vertical-layout create account form.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
+'createacct-benefit-heading' => 'In vertical-layout create account form, the heading for the section describing the benefits of creating an account.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
+'createacct-benefit-body1' => 'In vertical-layout create account form, the text for the first benefit.
+
+Preceded by the message {{msg-mw|Createacct-benefit-head1}} (number of edits).
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]
+{{Identical|Edit}}',
+'createacct-benefit-body2' => 'In vertical-layout create account form, the text for the second benefit.
+
+Preceded by the message {{msg-mw|Createacct-benefit-head2}} (number of pages).
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]
+{{Identical|Page}}',
+'createacct-benefit-body3' => 'In vertical-layout create account form, the text for the third benefit.
+
+Preceded by the message {{msg-mw|Createacct-benefit-head3}} (number of contributors).
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
 'badretype' => 'Used as error message when the new password and its retype do not match.',
 'userexists' => 'Used as error message in creating a user account.',
 'loginerror' => 'Used as title of error message.
 {{Identical|Login error}}',
+'createacct-error' => 'Used as heading for the error message.',
 'createaccounterror' => 'Parameters:
 * $1 is an error message',
 'nocookiesnew' => "This message is displayed when a new account was successfully created, but the browser doesn't accept cookies.",
@@ -1165,7 +1260,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,6 +1333,7 @@ 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]].
@@ -1282,8 +1378,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}}',
@@ -2253,7 +2350,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:
@@ -2420,7 +2518,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 +2558,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.
@@ -2630,6 +2730,7 @@ Parameters:
 Parameters:
 * $1 - optional, for PLURAL use, the number of items in the column following the message. Avoid PLURAL, if your language allows that.',
 'userrights-irreversible-marker' => '{{optional}}',
+'userrights-conflict' => "Shown on [[Special:UserRights]] if the target's rights have been changed since the form was loaded.",
 
 # Groups
 'group' => '{{Identical|Group}}',
@@ -3803,7 +3904,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 +3998,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]]',
@@ -4195,6 +4297,36 @@ You can apparently use 'URL' instead of 'hostname'.",
 'listusers-blocked' => 'Used on [[Special:ActiveUsers]] when a user has been blocked.
 * $1 is a user name for use with GENDER (optional)',
 
+# 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]].',
 'listgrouprights-summary' => 'The description used on [[Special:ListGroupRights]].',
@@ -4915,7 +5047,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) (top)
+{{Identical|Top}}',
 'month' => 'Used in [[Special:Contributions]] and history pages ([{{fullurl:Sandbox|action=history}} example]), as label for a dropdown box to select a specific month to view the edits made in that month, and the earlier months. See also {{msg-mw|year}}.',
 'year' => 'Used in [[Special:Contributions]] and history pages ([{{fullurl:Sandbox|action=history}} example]), as label for an input box to select a specific year to view the edits made in that year, and the earlier years.
 
@@ -7013,12 +7146,17 @@ See also {{msg-mw|Days-abbrev}}
 
 Part of variable $1 in {{msg-mw|Ago}}
 {{Identical|Day}}',
+'weeks' => 'Full word for "weeks".
+
+Used as <code>$1</code> in {{msg-mw|Ago}}. Parameters:
+* $1 - the number of weeks',
 '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.
+'years' => 'Full word for "years".
 
-Part of variable $1 in {{msg-mw|Ago}}',
+Used as <code>$1</code> in {{msg-mw|Ago}}. Parameters:
+* $1 - the number of years',
 'ago' => 'Phrase for indicating how long ago something happened. $1 is something like "3 days 10 hours", taken from these messages:
 *{{msg-mw|Seconds}}
 *{{msg-mw|Minutes}}
@@ -7028,13 +7166,24 @@ Part of variable $1 in {{msg-mw|Ago}}',
 *{{msg-mw|Years}}',
 'just-now' => 'Phrase for indicating something happened just now.',
 
+# Human-readable timestamps
+'hours-ago' => 'Phrase for indicating that something occurred a certain number of hours ago',
+'minutes-ago' => 'Phrase for indicating that something occurred a certain number of minutes ago',
+'seconds-ago' => 'Phrase for indicating that something occurred a certain number of seconds ago',
+'monday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Monday. $1 is the time.',
+'tuesday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Tuesday. $1 is the time.',
+'wednesday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Wednesday. $1 is the time.',
+'thursday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Thursday. $1 is the time.',
+'friday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Friday. $1 is the time.',
+'saturday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Saturday. $1 is the time.',
+'sunday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Sunday. $1 is the time.',
+'yesterday-at' => 'Phrase for indicating that something occurred at a particular time yesterday. $1 is the time.',
+
 # Bad image list
 'bad_image_list' => 'This message only appears to guide administrators to add links with the right format. This will not appear anywhere else in MediaWiki.',
 
 /*
 Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
 'variantname-zh-hans' => '{{Optional}}
@@ -7231,7 +7380,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 +7644,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.
@@ -8460,14 +8610,28 @@ 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]].
+'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 +8818,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..5cdd684 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",
@@ -819,7 +818,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',
@@ -1018,6 +1017,8 @@ Kachkañam.",
 'defaultmessagetext' => 'Ñawpaq qillqa',
 'invalid-content-data' => 'Samiqmanta willaykunaqa manam allinchu',
 'content-not-allowed-here' => '"$1" nisqa samiqqa [[$2]] sutiyuq p\'anqapi manam saqillasqachu',
+'editwarning-warning' => "Kay p'anqata saqispaykiqa lliw rurarqusqayki hukchasqakunatachá chinkachiykiman.
+Yaykusqa kaspaykiqa, kay yuyampayta hark'ayta atinki allinkachinaykikunapi \"Llamk'apusqa\" rakipi.",
 
 # Content models
 'content-model-wikitext' => 'wiki qillqa',
@@ -1298,15 +1299,6 @@ Imaymanata [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} qulluy ha
 'search-external' => 'Hawapi maskay',
 'searchdisabled' => "{{SITENAME}} nisqapi maskaymanqa ama nisqam. Hinachkaptinqa, maskariy google nisqawan icha huk hawa maskanakunawan, ichataq yuyariy, {{SITENAME}}manta hallch'asqankunaqa manañachá musuqllachu.",
 
-# Quickbar
-'qbsettings' => 'Utqaytawna ("Quickbar") allinkachinakuna',
-'qbsettings-none' => 'Mana imapas',
-'qbsettings-fixedleft' => "Lluq'iman watay",
-'qbsettings-fixedright' => 'Pañaman watay',
-'qbsettings-floatingleft' => "Lluq'iman tuytuy",
-'qbsettings-floatingright' => 'Pañaman tuytuy',
-'qbsettings-directionality' => 'Watasqa, rimayniykip qillqa puririyninmanta wachariq',
-
 # Preferences page
 'preferences' => 'Allinkachinakuna',
 'mypreferences' => 'Allinkachinaykuna',
@@ -1834,7 +1826,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>
@@ -2927,26 +2918,16 @@ 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
@@ -3703,13 +3684,6 @@ MediaWikitaqa mast'ariyku runakunata yanapanapaqmi, ichataq MANAM FIYAKUYTA ATIY
 'version-entrypoints-header-entrypoint' => "Yaykuna t'uksi",
 'version-entrypoints-header-url' => 'URL tiyay',
 
-# Special:FilePath
-'filepath' => 'Willañiqi ñan',
-'filepath-page' => 'Willañiqi:',
-'filepath-submit' => 'Riy',
-'filepath-summary' => "Kay sapaq p'anqaqa willañiqipaq tukuy ñannintam kutichin.
-Rikchakunatataq hunt'a ch'irkukupim rikunki. Huk willañiqi llayakunaqa tantapusqa wakichiwanmi chiqalla kicharikun.",
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Iskaychasqa willañiqikunata maskay',
 'fileduplicatesearch-summary' => "Iskaychasqa willañiqikunata maskay ''hash'' chaninpi tiksispa.",
index 8890581..ac3368a 100644 (file)
@@ -72,8 +72,6 @@ $messages = array(
 'tog-shownumberswatching' => "Mussar il dumber d'utilisaders che obervan questa pagina",
 'tog-oldsig' => 'Signatura actuala:',
 'tog-fancysig' => "Suttascripziun senza link automatic tar la pagina da l'utilisader.",
-'tog-externaleditor' => 'Utilisar sco standard in editur extern (be per experts, basegna ina configuraziun speziala da des computer. [//www.mediawiki.org/wiki/Manual:External_editors Dapli infurmaziuns.])',
-'tog-externaldiff' => 'Utilisar sco standard in program extern per visualisar differenzas tranter versiuns (be per experts, basegna ina configuraziun speziala da des computer. [//www.mediawiki.org/wiki/Manual:External_editors Dapli infurmaziuns.])',
 'tog-showjumplinks' => 'Activar las colliaziuns "seglir a"',
 'tog-uselivepreview' => 'Utilisar la prevista dinamica (basegna JavaScript) (experiment!)',
 'tog-forceeditsummary' => 'Avertir durant memoriar sche la resumaziun manca',
@@ -1113,15 +1111,6 @@ Scriva il prefix ''all:'' avant il term che ti vuls tschertgar, per tschertgar e
 Ti pos tschertgar en il fratemp cun Google. 
 Considerescha che lur index da {{SITENAME}} po cuntegnair datas ch'èn betg pli actualas.",
 
-# Quickbar
-'qbsettings' => 'Glista laterala',
-'qbsettings-none' => 'Nagins',
-'qbsettings-fixedleft' => 'Sanester, fixà',
-'qbsettings-fixedright' => 'Dretg, fixà',
-'qbsettings-floatingleft' => 'Sanester, flottand',
-'qbsettings-floatingright' => 'Dretg, flottand',
-'qbsettings-directionality' => 'Fixà, dependent da la direcziun da scriver da tia lingua',
-
 # Preferences page
 'preferences' => 'Preferenzas',
 'mypreferences' => 'Preferenzas',
@@ -1672,7 +1661,6 @@ Per cuntanscher segirezza opgimala è img_auth.php deactivà.",
 'http-read-error' => 'Sbagl da leger HTTP.',
 'http-timed-out' => 'Surpassà il temp durant la dumonda HTTP.',
 'http-curl-error' => "Errur cun recuperar l'URL: $1",
-'http-host-unreachable' => "Impussibel da cuntanscher l'URL.",
 'http-bad-status' => 'Durant la dumonda HTTP è ina errur capitada: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2332,7 +2320,7 @@ $1',
 'blanknamespace' => '(principal)',
 
 # Contributions
-'contributions' => "Contribuziuns {{GENDER:$1|dautilisader|da l'utilisadra}}",
+'contributions' => "Contribuziuns {{GENDER:$1|da l'utilisader|da l'utilisadra}}",
 'contributions-title' => "Contribuziuns d'utilisader da $1",
 'mycontris' => 'Contribuziuns',
 'contribsub2' => 'Per $1 ($2)',
@@ -3592,15 +3580,6 @@ Ti duessas avair retschavì [{{SERVER}}{{SCRIPTPATH}}/COPYING ina copia da la GN
 'version-entrypoints-header-entrypoint' => "Punct d'entrada",
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Percurs da la datoteca',
-'filepath-page' => 'Datoteca:',
-'filepath-submit' => 'Dai',
-'filepath-summary' => 'Questa pagina speciala inditgescha l\'adressa cumpletta per ina datoteca. 
-Maletgs vegnan mussads en resoluziun cumpletta, auters tips da datoteca vegnan averts directamain cun lur program assozià. 
-
-Endatescha il num da datoteca senza il prefix "{{ns:file}}:".',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Tschertgar datotecas dublas',
 'fileduplicatesearch-summary' => 'Tschertgar datotecas dublas a basa da valurs da hash.',
index d00cf6c..e5a7571 100644 (file)
@@ -718,12 +718,17 @@ Nu uitați să vă modificați [[Special:Preferences|preferințele]] pentru {{SI
 'yourname' => 'Nume de utilizator:',
 'userlogin-yourname' => 'Nume de utilizator',
 'userlogin-yourname-ph' => 'Introduceți numele de utilizator',
+'createacct-helpusername-url' => '{{ns:Project}}:Politica_numelui_de_utilizator',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(ajută-mă să aleg)]]',
 '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-remembermypassword' => 'Păstrează-mă autentificat',
 'userlogin-signwithsecure' => 'Autentificare prin serverul securizat',
 'securelogin-stick-https' => 'Rămâi conectat la HTTPS după autentificare',
 'yourdomainname' => 'Domeniul dumneavoastră:',
@@ -747,12 +752,29 @@ Nu uitați să vă modificați [[Special:Preferences|preferințele]] pentru {{SI
 'userlogin-resetlink' => 'Ați uitat datele de autentificare?',
 '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-captcha-help-url' => '{{ns:Project}}:Solicitare cont',
+'createacct-imgcaptcha-help' => 'Nu puteți vedea imaginea? [[{{MediaWiki:createacct-captcha-help-url}}|Solicitați un cont]]',
+'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' => 'modificări',
+'createacct-benefit-body2' => 'pagini',
+'createacct-benefit-body3' => '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.',
@@ -819,10 +841,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,6 +857,7 @@ 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ă',
@@ -869,7 +892,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',
@@ -1296,7 +1319,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)',
@@ -1381,7 +1404,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 +1541,7 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
 'userrights-notallowed' => 'Contul dumneavoastră nu are permisiunea de a acorda sau elimina drepturi utilizatorilor.',
 'userrights-changeable-col' => 'Grupuri pe care le puteți schimba',
 'userrights-unchangeable-col' => 'Grupuri pe care nu le puteți schimba',
+'userrights-conflict' => 'Conflict al drepturilor de utilizator! Aplicați din nou modificările dumneavoastră.',
 
 # Groups
 'group' => 'Grup:',
@@ -2072,7 +2096,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 +2280,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.
@@ -3221,11 +3254,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:
 
@@ -3841,12 +3888,16 @@ 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.',
+'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 +3990,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..10c401a 100644 (file)
@@ -453,10 +453,15 @@ No te sce scurdanne de cangià le [[Special:Preferences|{{SITENAME}} preferenze
 'yourname' => 'Nome utende:',
 'userlogin-yourname' => 'Nome utende',
 'userlogin-yourname-ph' => "Mitte 'u nome utende tune",
+'createacct-helpusername-url' => '{{ns:Project}}:Regole_pu_nome_utende',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(aiujtame a scacchià)]]',
 '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",
@@ -482,12 +487,29 @@ No te sce scurdanne de cangià le [[Special:Preferences|{{SITENAME}} preferenze
 'userlogin-resetlink' => "T'è scurdate le dettaglie pe trasè?",
 '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-captcha-help-url' => "{{ns:Project}}:Cirche 'nu cunde",
+'createacct-imgcaptcha-help' => "Non ge puè 'ndrucà l'immaggine? [[{{MediaWiki:createacct-captcha-help-url}}|Cirche 'nu cunde]]",
+'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' => 'cangiaminde',
+'createacct-benefit-body2' => 'pàggene',
+'createacct-benefit-body3' => '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}}.
 
@@ -584,6 +606,7 @@ 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",
@@ -615,7 +638,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",
@@ -1282,6 +1305,7 @@ Ce tu 'u mitte, a fatje ca è fatte t'avène ricanusciute.",
 'userrights-changeable-col' => 'Gruppe ca tu puè cangià',
 'userrights-unchangeable-col' => 'Gruppe ca tu non ge puè cangià',
 'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => 'Conflitte sus a le deritte utende! Pe piacere appliche le cangiaminde tune arrete.',
 
 # Groups
 'group' => 'Gruppe:',
@@ -2035,6 +2059,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.
@@ -3045,11 +3078,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 +3106,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',
@@ -3864,12 +3909,16 @@ 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.",
+'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 +4011,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..f4954d4 100644 (file)
@@ -47,6 +47,7 @@
  * @author Ignatus
  * @author Illusion
  * @author Iltever
+ * @author Iluvatar
  * @author Incnis Mrsi
  * @author Iniquity
  * @author Innv
@@ -819,9 +820,19 @@ $2',
 'welcomecreation-msg' => 'Ваша учётная запись создана.
 Не забудьте провести [[Special:Preferences|персональную настройку]] сайта {{SITENAME}}.',
 'yourname' => 'Имя учётной записи:',
+'userlogin-yourname' => 'Имя учётной записи',
+'userlogin-yourname-ph' => 'Введите имя вашей учётной записи',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(помогите мне выбрать)]]',
 '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 +845,34 @@ $2',
 'logout' => 'Завершение сеанса',
 'userlogout' => 'Завершение сеанса',
 'notloggedin' => 'Вы не представились системе',
+'userlogin-noaccount' => 'Нет аккаунта?',
+'userlogin-joinproject' => 'Присоединиться к {{grammar:genitive|{{SITENAME}}}}',
 'nologin' => 'Нет учётной записи? $1.',
 'nologinlink' => 'Создать учётную запись',
 'createaccount' => 'Создать учётную запись',
 'gotaccount' => "Вы уже зарегистрированы? '''$1'''.",
 'gotaccountlink' => 'Представьтесь',
 'userlogin-resetlink' => 'Забыли данные для входа?',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Помощь со входом в систему]]',
+'createacct-join' => 'Введите свои данные ниже.',
+'createacct-emailrequired' => 'Адрес электронной почты',
+'createacct-emailoptional' => 'Адрес электронной почты (необязательно)',
+'createacct-email-ph' => 'Введите свой адрес электронной почты',
 'createaccountmail' => 'Использовать сгенерированный случайным образом временный пароль и выслать мне его на указанный ниже адрес электронной почты:',
+'createacct-realname' => 'Настоящее имя (необязательно)',
 'createaccountreason' => 'Причина:',
+'createacct-reason' => 'Причина',
+'createacct-captcha' => 'Проверка безопасности',
+'createacct-imgcaptcha-ph' => 'Введите текст, который вы видите выше',
+'createacct-benefit-heading' => '{{SITENAME}} сделана такими же людьми, как вы.',
+'createacct-benefit-body1' => 'правок',
+'createacct-benefit-body2' => 'страниц',
+'createacct-benefit-body3' => 'участников в последнее время',
 'badretype' => 'Введённые вами пароли не совпадают.',
 'userexists' => 'Введённое имя участника уже используется.
 Пожалуйста, выберите другое имя.',
 'loginerror' => 'Ошибка опознавания участника',
+'createacct-error' => 'Ошибка создания учетной записи',
 'createaccounterror' => 'Невозможно создать учётную запись: $1',
 'nocookiesnew' => 'Участник зарегистрирован, но не представлен. {{SITENAME}} использует «cookies» для представления участников. У вас «cookies» запрещены. Пожалуйста, разрешите их, а затем представьтесь со своиим новым именем участника и паролем.',
 'nocookieslogin' => '{{SITENAME}} использует «cookies» для представления участников. Вы их отключили. Пожалуйста, включите их и попробуйте снова.',
@@ -940,6 +967,7 @@ $2',
 'passwordreset-text' => 'Чтобы сбросить свой пароль, заполните эту форму.',
 'passwordreset-legend' => 'Сбросить пароль',
 'passwordreset-disabled' => 'Сбросы пароля отключены на этой вики.',
+'passwordreset-emaildisabled' => 'Функции электронной почты отключены в этой вики.',
 'passwordreset-pretext' => '{{PLURAL:$1||Введите одну из частей данных, показанных ниже}}',
 'passwordreset-username' => 'Имя участника:',
 'passwordreset-domain' => 'Домен:',
@@ -2353,6 +2381,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' => 'Ниже представлен список определённых в этой вики групп участников, указаны соответствующие им права доступа.
@@ -4045,13 +4082,6 @@ 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:FileDuplicateSearch
 'fileduplicatesearch' => 'Поиск одинаковых файлов',
 'fileduplicatesearch-summary' => 'Поиск одинаковых файлов по хэш-коду.',
index 10337e8..0c25f6c 100644 (file)
@@ -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' => 'कदापि न',
@@ -1039,6 +1038,8 @@ $2
 'defaultmessagetext' => 'सन्देशपाठं स्थिरयतु ।',
 'invalid-content-data' => 'अमान्यः सामग्रीदत्तांशः',
 'content-not-allowed-here' => '[[$2]] इति पृष्ठे "$1" सामग्री अनुमता नास्ति।',
+'editwarning-warning' => 'अस्मात् पृष्ठात् गमनेन अत्र भवता कृतानि परिवर्तनानि निष्फलानि भवेयुः ।
+भवता यदि प्रविष्टं तर्हि मम इष्टतमानि इत्यत्र अस्मिन् विभागे सम्पादनेन एषः प्रबोधः यथा न आगच्छेत् तथा कर्तुं शक्यते ।',
 
 # Content models
 'content-model-wikitext' => 'विकिपाठः',
@@ -1306,15 +1307,6 @@ You can still [$1 view this revision]",
 अश्मिन् समये भवान् गूगल माध्यमेन अन्वेषणं कर्तुं शक्नोति
 स्मरयतु यत् {{SITENAME}} इति स्थलस्य क्रमाङ्का नैव अद्यातना  इति सोच्यते।',
 
-# Quickbar
-'qbsettings' => 'शीघ्रपट',
-'qbsettings-none' => 'नास्ति',
-'qbsettings-fixedleft' => 'बामे स्थापितः',
-'qbsettings-fixedright' => 'दक्षिणे स्थापितः',
-'qbsettings-floatingleft' => 'वामप्लवनम् ।',
-'qbsettings-floatingright' => 'दक्षिणे प्लवनम् ।',
-'qbsettings-directionality' => 'निश्चितम् । ते भाषालिप्याः दिशात्मकतानुसारं भवति ।',
-
 # Preferences page
 'preferences' => 'इष्टतमानि',
 'mypreferences' => 'मम इष्टतमानि',
index b465a21..9b2ed7e 100644 (file)
@@ -73,8 +73,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 +86,7 @@ $messages = array(
 'tog-diffonly' => 'Икки барылы тэҥнииргэ сирэй иһин көрдөрүмэ',
 'tog-showhiddencats' => 'Кистэммит категориялары көрдөр',
 'tog-norollbackdiff' => 'Төннөрүү кэнниттэн барыллар уратыларын көрдөрүмэ',
+'tog-useeditwarning' => 'Эрэдээксийэлиир сирэйтэн уларытыыларбын бигэргэппэккэ тахсаары гыннахпына сэрэтээр',
 
 'underline-always' => 'Куруук',
 'underline-never' => 'Аннынан тардыма',
@@ -455,9 +454,15 @@ $2',
 'welcomecreation-msg' => 'Аатыҥ бэлиэтэннэ.
 {{SITENAME}} ситим-сиргэ үлэлииргэ табыгастаах буоллун диэн [[Special:Preferences|тус туруорууларгын]] уларытыаххын сөп.',
 'yourname' => 'Кыттааччы аатыҥ:',
+'userlogin-yourname' => 'Бэлиэ-аат',
+'userlogin-yourname-ph' => 'Бэлиэ-ааккын киллэр',
 'yourpassword' => 'Киирии тыла:',
+'userlogin-yourpassword' => 'Киирии тыл',
+'userlogin-yourpassword-ph' => 'Киирии тылгын суруй',
 'yourpasswordagain' => 'Киирии тылгын хатылаа:',
 'remembermypassword' => 'Миигин бу көмпүүтэргэ сигээ ($1 {{PLURAL:$1|күн|күнтэн ордуга суох}})',
+'userlogin-remembermypassword' => 'Долоҕойгор хатаа',
+'userlogin-signwithsecure' => 'Бигэ сиэрбэри туһанан киирии',
 'securelogin-stick-https' => 'Киирэн баран HTTPS нөҥүө холбонууну салгыырга',
 'yourdomainname' => 'Эн дөмүөнүҥ:',
 'password-change-forbidden' => 'Бу биикигэ киирии тылы уоарытар табыллыбат.',
@@ -470,12 +475,16 @@ $2',
 'logout' => 'Тахсыы',
 'userlogout' => 'Тахсыы',
 'notloggedin' => 'Ааккын эппэтиҥ',
+'userlogin-noaccount' => 'Бэлиэтэнэ иликкин дуо?',
+'userlogin-joinproject' => '{{SITENAME}} ситим-сиргэ киирии',
 'nologin' => "Бэлиэтэнэ иликкин дуо? '''$1'''.",
 'nologinlink' => 'Бэлиэтэнии',
 'createaccount' => 'Бэлиэтэнии',
 'gotaccount' => "Бэлиэтэммитиҥ дуо? '''$1'''.",
 'gotaccountlink' => 'Аатыҥ',
 'userlogin-resetlink' => 'Киирэр тылгын умнубуккун дуо?',
+'helplogin-url' => 'Help:Бэлиэ-ааты киллэрии',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Бэлиэтэниигэ көмө]]',
 'createaccountmail' => 'Быстах киирии тылы туһаныы уонна ону email-ынан ыытыы',
 'createaccountreason' => 'Төрүөтэ:',
 'badretype' => 'Киирии тылларыҥ сөп түбэспэтилэр.',
@@ -520,8 +529,8 @@ $2',
 онон киирии тылы өйдөтөр кыах эмиэ суох.',
 'eauthentsent' => 'Быстах кэмҥэ туттуллар киирии тыл саҥа кыттааччы эл. почтатыгар ыытылынна.
 Бу аадырыс эйиэнэ буоларын бигэргэтэргэ өссө тугу гыныахтааҕыҥ туһунан сурукка кэпсэниллэр.',
-'throttled-mailpassword' => 'Ð\9aииÑ\80ии Ñ\82Ñ\8bлÑ\8b Ó©Ð¹Ð´Ó©Ñ\82Ó©Ñ\80 Ñ\81иÑ\81Ñ\82иÑ\8dма бүтэһик {{PLURAL:$1|чаас|$1 чаас}} иһигэр туттулла сылдьыбыт.
-Киирии тылы {{PLURAL:$1|чааска|$1 чааска}} биирдэ эрэ ыйытыахха сөп.',
+'throttled-mailpassword' => 'Ð\9aииÑ\80ии Ñ\82Ñ\8bлÑ\8b Ó©Ð¹Ð´Ó©Ñ\82Ó©Ñ\80 Ñ\82Ñ\8dÑ\80ил бүтэһик {{PLURAL:$1|чаас|$1 чаас}} иһигэр туттулла сылдьыбыт.
өмүскэнэр соруктан сылтаан киирии тылы {{PLURAL:$1|чааска|$1 чааска}} биирдэ эрэ ыйытыахха сөп.',
 'mailerror' => 'Сурук ыытарга алҕас таҕыста: $1',
 'acct_creation_throttle_hit' => 'Эн IP-гыттан бүгүн {{PLURAL:$1|1 аат оҥоһуллубут|$1 аат бэлиэтэммит}} буолан бүгүҥҥү күннээҕи нуорма туолбут.
 Бу IP-тан киирэр дьон саҥа ааты билигин бэлиэтиир кыахтара суох.',
@@ -573,7 +582,7 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Киирии тылы саҥаттан',
-'passwordreset-text' => 'Ð\91Ñ\83 Ñ\84оÑ\80манÑ\8b Ñ\82олоÑ\80он Ð°ÐºÐºÐ°Ð°Ñ\83нÑ\83Ò¥ Ñ\82Ñ\83Ò»Ñ\83нан Ñ\81Ñ\83Ñ\80Ñ\83к Ñ\82Ñ\83Ñ\82Ñ\83оÑ\85Ñ\85Ñ\83н Ñ\81өп.',
+'passwordreset-text' => 'УÑ\80Ñ\83ккÑ\83 ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bлÑ\8b Ñ\83лаÑ\80Ñ\8bÑ\82аÑ\80га Ð±Ñ\83 Ñ\84оÑ\80манÑ\8b Ñ\82олоÑ\80.',
 'passwordreset-legend' => 'Киирии тылы саҥаттан',
 'passwordreset-disabled' => 'Бу биикигэ киирии тылы саҥардыы бобуллубут.',
 'passwordreset-pretext' => '{{PLURAL:$1||Аллара көстөр дааннайдартан биирин талан суруй}}',
@@ -583,17 +592,17 @@ $2',
 '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 +610,13 @@ $2
 Бу быстах кэмҥэ аналлаах {{PLURAL:$3|киирии тыл|кирии тыллар}} {{PLURAL:$5|биир күн үлэлиэҕэ|$5 күн үлэлиэхтэрэ}}.
 Эн тиһиликкэ ааккын этэн саҥа киирии тылы киллэриэхтээххин.
 Өскө бу ыйытыгы ыыппатах буоллаххына, эбэтэр урукку киирии тылгын өйдөөн кэлбит буоллаххына 
-бу биллэриини аахайыа суоххун сөп.
+бу биллэриини ааххайыа суоххун сөп.
 Оччоҕо урукку киирии тылыҥ оннунан хаалыа.',
 'passwordreset-emailelement' => 'Кыттааччы: $1
 Быстах киирии тыл: $2',
-'passwordreset-emailsent' => 'СанаÑ\82Ñ\8bÑ\8b Ñ\8bÑ\8bÑ\82Ñ\8bлÑ\8bнна.',
-'passwordreset-emailsent-capture' => 'Ð\9cанна Ñ\8bÑ\8bÑ\82Ñ\8bллÑ\8bбÑ\8bÑ\82 Ñ\81анаÑ\82аÑ\80 Ñ\81Ñ\83Ñ\80Ñ\83к көрдөрүлүннэ.',
-'passwordreset-emailerror-capture' => 'Манна санатар сурук көрдөрүлүннэ, бу төрүөттэн сатаан барбата: $1',
+'passwordreset-emailsent' => 'Ð\9aииÑ\80ии Ñ\82Ñ\8bлÑ\8b Ñ\83лаÑ\80Ñ\8bÑ\82аÑ\80 Ñ\82Ñ\83Ò»Ñ\83нан Ñ\81Ñ\83Ñ\80Ñ\83к Ð±Ð°Ñ\80да.',
+'passwordreset-emailsent-capture' => 'Ð\9aииÑ\80ии Ñ\82Ñ\8bлÑ\8b Ñ\83лаÑ\80Ñ\8bÑ\82аÑ\80 Ñ\82Ñ\83Ò»Ñ\83нан Ñ\81Ñ\83Ñ\80Ñ\83к Ð°Ð»Ð»Ð°Ñ\80а Ñ\8dмиÑ\8d көрдөрүлүннэ.',
+'passwordreset-emailerror-capture' => 'Манна киирии тылы уларытар туһунан сурук көрдөрүлүннэ. Ол эрэн сурук бу төрүөттэн сатаан барбата: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Ааадырыһын уларыт',
@@ -823,6 +832,8 @@ IP-аадырыһа эрэ көстөр.
 'content-failed-to-parse' => '$2 иһинээҕитэ $1 көрүҥэр сөп түбэспэт: $3.',
 'invalid-content-data' => 'Алҕастаах дааннайдар',
 'content-not-allowed-here' => '[[$2]] сирэйгэ "$1" туттуллуо суохтаах',
+'editwarning-warning' => 'Атын сирэйгэ көстөххүнэ билигин оҥорбут уларытыыларыҥ барыта сүтэн хаалыахтара.
+Бэлиэтэммит буоллаҕына, бу сэрэтиини туруорууларыҥ «{{int:prefs-editing}}» сирэйигэр араарыаххын сөп.',
 
 # Content models
 'content-model-wikitext' => 'биики-тиэкис',
@@ -1087,7 +1098,7 @@ $1",
 'search-interwiki-default' => '$1 түмүгэ:',
 'search-interwiki-more' => '(өссө)',
 'search-relatedarticle' => 'Сигэнэр',
-'mwsuggest-disable' => 'AJAX этэн биэриилэрин араар',
+'mwsuggest-disable' => 'Көрдөөһүн этэн биэриилэрин араар',
 'searcheverything-enable' => 'Туох баар аат далларыгар көрдөөһүн',
 'searchrelated' => 'сибээстэммит',
 'searchall' => 'бары',
@@ -1107,15 +1118,6 @@ $1",
 'search-external' => 'Тастан көрдөөһүн',
 'searchdisabled' => '{{SITENAME}} көрдүүр тэрилэ араарыллыбыт. Атын көрдүүр системаларынан наадыйар сирэйдэргитин көрдөтүөххүтүн сөп. Ол гынан баран поисковик кээһигэр баар торум эргэрбит буолуон сөп.',
 
-# Quickbar
-'qbsettings' => 'Навигация панела',
-'qbsettings-none' => 'Көрдөрүмэ',
-'qbsettings-fixedleft' => 'Хаҥас өттө хамсаабат',
-'qbsettings-fixedright' => 'Уҥа өттө хамсаабат',
-'qbsettings-floatingleft' => 'Хаҥас өттө устаҥныыр',
-'qbsettings-floatingright' => 'Уҥа өттө устаҥныыр',
-'qbsettings-directionality' => 'Туттарыллыбыт, тылыҥ суругун-бичигин хайысхатыттан тутулуктаах',
-
 # Preferences page
 'preferences' => 'Уларытыылар',
 'mypreferences' => 'Туруоруулар',
@@ -1669,7 +1671,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>
@@ -2510,8 +2511,8 @@ $1',
 Ол аата эн сирэй аатын сыыһа уларыппыт буоллаххына төттөрү урукку аатыгар төннөрүөххүн сөп, ол гынан баран баар сирэйи алҕас сотор кыаҕыҥ суох.
 
 '''Сэрэтии!'''
-Сирэй аатын уларытыы бөдөҥ уонна эрдэттэн өйдөммөтөх содуллаах буолуон сөп.
-Онон, бука диэн салгыаҥ иннинэ үчүгэйдик толкуйдаа.",
+''Элбэхтик туһаныллар'' сирэй аатын уларытыы бөдөҥ уонна эрдэттэн өйдөммөтөх содуллаах буолуон сөп.
+Онон, бука диэн, салгыаҥ иннинэ үчүгэйдик толкуйдаа.",
 'movepagetext-noredirectfixer' => "Манна баар форманы туһанан сирэй аатын уларытыаххын сөп.
 Бу түбэлтэҕэ уларытыы сурунаала саҥа сиргэ көһөр.
 Урукку аат саҥа сирэйгэ утаарар сирэйгэ кубулуйар.
@@ -2852,11 +2853,6 @@ $1',
 'pageinfo-protect-cascading-from' => 'Каскадынан көмүскэл мантан',
 
 # Skin names
-'skinname-standard' => 'Классика',
-'skinname-nostalgia' => 'Мунчаарыы',
-'skinname-myskin' => 'Миэнэ',
-'skinname-chick' => 'Чуппууска',
-'skinname-simple' => 'Судургу',
 'skinname-modern' => 'Билиҥҥи',
 
 # Patrolling
@@ -3551,13 +3547,6 @@ MediaWiki туһалаах буоллун диэн тарҕатыллар, ол
 'version-entrypoints-header-entrypoint' => 'Киирии сирэ',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Билэ суола',
-'filepath-page' => 'Билэ:',
-'filepath-submit' => 'Көс',
-'filepath-summary' => 'Бу аналлаах сирэй билэ ханна сытарын толору көрдөрөр.
-Ойуулар толору көрдөрүллэллэр, атын билэлэр ситимнээх бырагырааммаларыгар тута арыллаллар.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Хос билэлэри көрдөөһүн',
 'fileduplicatesearch-summary' => 'Тэҥ билэлэри хэш-куодтарынан көрдөөһүн.',
@@ -3654,7 +3643,7 @@ MediaWiki туһалаах буоллун диэн тарҕатыллар, ол
 
 # New logging system
 'logentry-delete-delete' => '$3 сирэйи $1 соппут',
-'logentry-delete-restore' => '$3 Ñ\81иÑ\80Ñ\8dйи $1 Ñ\82өннөÑ\80бүт',
+'logentry-delete-restore' => '$3 Ñ\81иÑ\80Ñ\8dйи $1 Ñ\81Ó©Ñ\80гүппүт',
 'logentry-delete-event' => 'Сурунаал {{PLURAL:$5|суругун|$5 суруктарын}} көстүүтүн манна $3: $4 $1 уларыппыт',
 'logentry-delete-revision' => 'Сурунаал {{PLURAL:$5|суругун|$5 суруктарын}} көстүүтүн бу сирэйгэ $3: $4 $1 уларыппыт',
 'logentry-delete-event-legacy' => '$3 сурунаал суруктарын көстүүтүн $1 уларыппыт',
@@ -3673,15 +3662,15 @@ MediaWiki туһалаах буоллун диэн тарҕатыллар, ол
 'revdelete-restricted' => 'хааччахтааһын администраатардарга сыһыаннаах',
 'revdelete-unrestricted' => 'хааччахтааһын админстраатардартан уһулунна',
 'logentry-move-move' => '$1 $3 сирэй аатын маннык $4 уларыппыт',
-'logentry-move-move-noredirect' => '$1 $3 сирэй аатын маннык $4 уларыппыт, утаарыы-сирэй оҥорботох',
+'logentry-move-move-noredirect' => '$3 сирэй аатын $1 маннык $4 уларыппыт, утаарыы-сирэй хаалларбатах',
 'logentry-move-move_redir' => '$3 сирэйи $1 диэн кыттааччы манныкка $4  уларыппыт (утаарыы үрдүнэн)',
-'logentry-move-move_redir-noredirect' => '$1 $3 сирэй аатын утаарыы үрдүнэн маннык $4 уларыппыт, утаарыы-сирэй оҥорботох',
-'logentry-patrol-patrol' => '$1 $3 сирэй $4 барылын ботуруулламмыт курдук бэлиэтээбит',
-'logentry-patrol-patrol-auto' => '$1 $3 сирэй $4 барылын аптамаатынан ботуруулламмыт курдук бэлиэтээбит',
-'logentry-newusers-newusers' => '$1 диэн кыттааччы бэлиэтэннэ',
+'logentry-move-move_redir-noredirect' => '$1 $3 сирэй аатын утаарыы үрдүнэн маннык $4 уларыппыт, утаарыы-сирэй хаалларбатах',
+'logentry-patrol-patrol' => '$3 сирэй $4 барылын $1 ботурууллаабыт',
+'logentry-patrol-patrol-auto' => '$3 сирэй $4 барылын $1 аптамаатынан ботурууллаабыт',
+'logentry-newusers-newusers' => 'Кыттааччы $1 диэн ааты бэлиэтээтэ',
 'logentry-newusers-create' => '$1 диэн кыттааччы бэлиэтэннэ',
-'logentry-newusers-create2' => '$3 кыттааччы аатын $1 бэлиэтээбит',
-'logentry-newusers-autocreate' => 'Ð\9cаннÑ\8bк Ð°Ð°Ñ\82 $1 Ð°Ð¿Ñ\82амааÑ\82Ñ\8bнан Ð±Ñ\8dлиÑ\8dÑ\82Ñ\8dнилиннÑ\8d',
+'logentry-newusers-create2' => '$3 кыттааччы аатын $1 бэлиэтээтэ',
+'logentry-newusers-autocreate' => 'Маннык аат $1 аптамаатынан бэлиэтэннэ',
 'rightsnone' => '(суох)',
 
 # Feedback
index 7060b13..f22b6e8 100644 (file)
@@ -49,8 +49,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ńelok laṛcaṛkoaḱ songkha uduḱme',
 'tog-oldsig' => 'Menaḱ signạtar',
 'tog-fancysig' => 'Signạcar do wikiṭesk hisạbte moneyemẽ (jahan acte hoyoḱ joṛao bạgikate)',
-'tog-externaleditor' => 'Etohoṕre bahre reaḱ sompadonićaḱ beohar hoyoḱma (khali sẽṛa beoharić lạgit́te, kompeuṭare asokae seṭing jạruṛa. [//www.mediawiki.org/wiki/manual:External_editors More information.])',
-'tog-externaldiff' => 'Etohoṕre bahre reaḱ sompadonićaḱ beohar hoyoḱma (khali sẽṛa beoharić lạgit́te, kompeuṭare asokae seṭing jạruṛa. [//www.mediawiki.org/wiki/manual:External_editors More information.])',
 'tog-showjumplinks' => '"Calaḱmẽ" beohar joṛao ehop hoyoḱma',
 'tog-uselivepreview' => 'Jewet́ ńeloḱ beoharme (JavaScript jaruṛ menaḱa)',
 'tog-forceeditsummary' => 'Khạli sompadon guṭkatha em oktere iń baḍae ocoyiń hoyoḱma',
@@ -737,9 +735,6 @@ Unuduḱ: '''({{int:cur}})''' = nahaḱ nãwã aroeko saõte tulạo, '''({{int:
 'powersearch-toggleall' => 'Sanamaḱ',
 'powersearch-togglenone' => 'Okaṭaḱ hõ baṅ',
 
-# Quickbar
-'qbsettings-none' => 'Okaṭaḱ hõ baṅ',
-
 # Preferences page
 'preferences' => 'Pạsindko',
 'mypreferences' => 'Iñaḱ pạsindko',
index 94ec90a..c6ddce6 100644 (file)
@@ -182,8 +182,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ammustra lu nùmmiru di utenti ca sèquinu la pàggina',
 'tog-oldsig' => 'Firma attuali:',
 'tog-fancysig' => 'Interpitra li cumanna wiki nâ firma (senza liami automaticu)',
-'tog-externaleditor' => 'Usa di default nu editor esternu (sulu pi li esperti, abbisognanu mpustazzioni particulari pô tò computer. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => "Usa di default un prugramma di diff sternu (sulu pi utilizzatura sperti, addumanna l'usu di mpustazzioni particulari supra lu sò computer. [//www.mediawiki.org/wiki/Manual:External_editors Pi cchiossai nfurmazzioni.])",
 'tog-showjumplinks' => "Attiva li culligamenti accissìbbili 'và a'",
 'tog-uselivepreview' => "Attiva la funzioni ''Live preview'' (richiedi JavaScript; spirimintali)",
 'tog-forceeditsummary' => "Chiedi cunferma siddu l'uggettu dû canciamentu è vacanti",
@@ -1033,14 +1031,6 @@ S'havi accirtari ca la cuntinuità storica di la pàggina nun veni altirata.",
 'search-external' => 'Ricerca sterna',
 'searchdisabled' => 'La circata nterna di {{SITENAME}} hà statu disabbilitata. Nta stu mentri, poi usari la circata supra Google o supra àutri muturi di circata. Accura ca li sò ìnnici dê cuntinuti di {{SITENAME}} ponnu nun èssiri aggiurnati.',
 
-# Quickbar
-'qbsettings' => 'Pusizzioni QuickBar',
-'qbsettings-none' => 'Nuddu',
-'qbsettings-fixedleft' => 'Fissu a manu manca',
-'qbsettings-fixedright' => 'Fissu a manu dritta',
-'qbsettings-floatingleft' => 'Fluttuanti a manu manca',
-'qbsettings-floatingright' => 'Fluttuanti a manu dritta',
-
 # Preferences page
 'preferences' => 'prifirenzi',
 'mypreferences' => 'Li mè prifirenzi',
@@ -1727,14 +1717,6 @@ Protucolli suppurtati: <code>$1</code>',
 'listusers-noresult' => "Nuddu utenti attruvatu. Virificari l'usu di caràttiri maiùsculi/minùsculi.",
 'listusers-blocked' => '(bloccatu)',
 
-# Special:ActiveUsers
-'activeusers' => 'Lista dî utenti attivi',
-'activeusers-count' => "$1 {{PLURAL:$1|canciamentu|canciamenti}} nti {{PLURAL:$3|l'ùrtimu jornu| nti l'ùrtimi $3 jorna}}",
-'activeusers-from' => 'Ammustra li utenti a pàrtiri da:',
-'activeusers-hidebots' => 'Bot ammucciati',
-'activeusers-hidesysops' => 'Amministratura ammucciati',
-'activeusers-noresult' => 'Nussun utenti truvatu.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Diritti dô gruppu utenti',
 'listgrouprights-summary' => "Ccà sutta sunnu elincati li gruppi utenti difiniti pi sta wiki, cu li dritti d'accessu assuciati a iddi. Pi sapìrinni chiossai supra li dritti, lèggiti [[{{MediaWiki:Listgrouprights-helppage}}|sta pàggina]].",
@@ -2016,7 +1998,7 @@ $1',
 'sp-contributions-userrights' => 'gistioni dî dritti utenti',
 'sp-contributions-search' => 'Ricerca cuntribbuti',
 'sp-contributions-username' => 'Nnirizzu IP o nomu utenti:',
-'sp-contributions-toponly' => "Ammuscia sulu li cuntribbuti ca sunnu l'ùrtimi rivisioni pâ pàggina",
+'sp-contributions-toponly' => "Ammuccia sulu li cuntribbuta ca sunnu l'ùrtimi rivisioni pâ pàggina",
 'sp-contributions-submit' => 'Risciduta',
 
 # What links here
@@ -2411,13 +2393,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
index ffd9dc3..5f8c725 100644 (file)
@@ -237,8 +237,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',
@@ -1286,15 +1284,6 @@ Pokušajte u svoju pretragu staviti ''all:'' da se pretražuje cjelokupan sadrž
 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',
-
 # Preferences page
 'preferences' => 'Postavke',
 'mypreferences' => 'Postavke',
@@ -1844,7 +1833,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>
@@ -2167,15 +2155,6 @@ Podržani {{PLURAL:$2|protokol|protokoli}}: <code>$1</code> (default je http://
 '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' => '{{PLURAL:$1|$1 izmjena|$1 izmjene|$1 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.
index c7480d1..817bb8a 100644 (file)
@@ -222,8 +222,6 @@ $messages = array(
 'tog-shownumberswatching' => 'මුර කරනු ලබන පරිශීලකයන් සංඛ්‍යාව පෙන්වන්න',
 'tog-oldsig' => 'පවතින අත්සන:',
 'tog-fancysig' => 'අත්සන විකිපෙළ (ස්වයංක්‍රීය සබැඳියක් විරහිතව) ලෙසින් සලකන්න',
-'tog-externaleditor' => 'බාහිර සම්පාදකයක් භාවිත කරන්න (ප්‍රවීණයන් සඳහා පමණි, ඔබගේ පරිගණකයේ විශේෂිත වූ සැකසුම් අවශ්‍ය වේ. [//www.mediawiki.org/wiki/Manual:External_editors තවත් තොරතුරු.])',
-'tog-externaldiff' => 'බාහිර ප්‍රභේදයක් භාවිත කරන්න (ප්‍රවීණයන් සඳහා පමණි, ඔබගේ පරිගණකයේ විශේෂිත වූ සැකසුම් අවශ්‍ය වේ. [//www.mediawiki.org/wiki/Manual:External_editors තවත් තොරතුරු.])',
 'tog-showjumplinks' => '"වෙත පනින්න"  යන ප්‍රවේශතා සබැඳියන් සක්‍රීය කරන්න',
 'tog-uselivepreview' => 'තත්කාල පෙර-දසුන භාවිතා කරන්න (ජාවාස්ක්‍රිප්ට්) (පරීක්ෂණාත්මක)',
 'tog-forceeditsummary' => 'හිස් සංස්කරණ සාරාංශයකට මා ඇතුළු වන විට මාහට ඉඟි කරන්න',
@@ -238,6 +236,7 @@ $messages = array(
 'tog-showhiddencats' => 'සැඟවුනු ප්‍රවර්ග පෙන්වන්න',
 'tog-noconvertlink' => 'සබැඳියන්ගේ ශීර්ෂ පෙරැළීම අක්‍රීය කරන්න',
 'tog-norollbackdiff' => 'පුනරාවර්තනයක් කිරීමෙන් පසු වෙනස්වීම් අත්හරින්න',
+'tog-useeditwarning' => 'මා සංස්කරණ පිටුවක් සුරකිනු නොලැබූ වෙනස්කිරීම් සමඟ අතහැර යන විට අවවාද කරන්න',
 
 'underline-always' => 'සැමවිටම කරන්න',
 'underline-never' => 'කිසිවිටෙක නොකරන්න',
@@ -967,6 +966,8 @@ $2
 එය දැනටමත් පවතියි.',
 'defaultmessagetext' => 'සාමාන්‍ය පණිවුඩ පෙළ',
 'invalid-content-data' => 'වලංගු නොවන අන්තර්ගත දත්ත',
+'editwarning-warning' => 'අවධානයට: මෙම පිටුවෙන් නික්ම යාම ඔබ සිදු කළ වෙනස්කම් නැතිවී යෑමට හේතු විය හැක.
+ඔබ ප්‍රවිෂ්ටවී ඇත්නම්, ඔබගේ වරණයන්වල "සංසකරණය කිරීම්" කොටසේ ඇති මෙම අනතුරු ඇඟවීම අක්‍රීය කළ හැක.',
 
 # Content models
 'content-model-wikitext' => 'විකිපෙළ',
@@ -3054,8 +3055,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',
index 8fe62a8..a688622 100644 (file)
@@ -311,8 +311,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 +325,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 +414,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 +448,7 @@ $messages = array(
 'namespaces' => 'Menné priestory',
 'variants' => 'Varianty',
 
+'navigation-heading' => 'Navigačné menu',
 'errorpagetitle' => 'Chyba',
 'returnto' => 'Späť na $1.',
 'tagline' => 'Z {{GRAMMAR:genitív|{{SITENAME}}}}',
@@ -690,10 +691,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 +716,17 @@ Uvedomte si, že niektoré stránky sa môžu naďalej zobrazovať ako keby ste
 'logout' => 'Odhlásiť',
 'userlogout' => 'Odhlásiť',
 'notloggedin' => 'Neprihlásený/á',
+'userlogin-noaccount' => 'Nemáte ešte účet?',
+'userlogin-joinproject' => 'Pridajte sa k {{GRAMMAR:lokál|{{SITENAME}}}}',
 'nologin' => "Nemáte ešte účet? '''$1'''.",
 'nologinlink' => 'Vytvoriť nový účet',
 'createaccount' => 'Vytvoriť nový účet',
 'gotaccount' => "Máte už vytvorený účet? '''$1'''.",
 'gotaccountlink' => 'Prihlásiť',
 'userlogin-resetlink' => 'Zabudli ste svoje prihlasovacie údaje?',
-'createaccountmail' => 'e-mailom',
+'helplogin-url' => 'Pomoc:Prihlasovanie',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoc s prihlásením]]',
+'createaccountmail' => 'Použiť dočasné náhodné heslo a poslať ho na nižšie uvedenú emailovú adresu',
 'createaccountreason' => 'Dôvod:',
 'badretype' => 'Zadané heslá nie sú rovnaké.',
 'userexists' => 'Zadané používateľské meno sa už používa.
@@ -755,8 +769,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 +798,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,9 +820,10 @@ 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-text' => 'Vyplnením tohto formulára si vytvoríte nové heslo.',
 'passwordreset-legend' => 'Obnoviť heslo',
 'passwordreset-disabled' => 'Obnovenie hesla bolo na tejto wiki zakázané.',
+'passwordreset-emaildisabled' => 'E-mailové funkcie boli na tejto wiki vypnuté.',
 'passwordreset-pretext' => '{{PLURAL:$1|Zadajte nižšie uvedený údaj|Zadajte jeden z nižšie uvedených údajov}}',
 'passwordreset-username' => 'Používateľské meno:',
 'passwordreset-domain' => 'Doména:',
@@ -815,8 +831,7 @@ Je možné, že sa vám už podarilo úspešne zmeniť svoje heslo alebo ste si
 '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 +840,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 +851,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 +863,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 +1030,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 +1072,8 @@ Už existuje.',
 'content-failed-to-parse' => 'Nepodarilo sa spracovať obsah $2 pre model $1: $3',
 'invalid-content-data' => 'Neplatné dáta obsahu',
 'content-not-allowed-here' => 'Obsah „$1“ nie je povolený na stránke [[$2]]',
+'editwarning-warning' => 'Ak opustíte túto stránku, môžete tým stratiť všetky vykonané zmeny.
+Ak ste prihlásený, toto upozornenie môžete vypnúť v sekcii „{{int:prefs-editing}}“ svojich nastavení.',
 
 # Content models
 'content-model-wikitext' => 'wikitext',
@@ -1319,7 +1336,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 +1355,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 +1436,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 +1831,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 +1909,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 +2060,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 +2218,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 +2303,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ť',
@@ -2317,21 +2333,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 +2437,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 +2454,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,13 +3041,8 @@ 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 */',
@@ -3034,13 +3055,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 +3130,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 +3180,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 +3210,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ý:
 
@@ -3828,13 +3855,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 +3881,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 +3944,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 +3974,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 +4039,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 +4060,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..301a75e 100644 (file)
@@ -605,10 +605,15 @@ Ne pozabite si prilagoditi vaših [[Special:Preferences|nastavitev {{GRAMMAR:rod
 'yourname' => 'Uporabniško ime:',
 'userlogin-yourname' => 'Uporabniško ime',
 'userlogin-yourname-ph' => 'Vnesite svoje uporabniško ime',
+'createacct-helpusername-url' => '{{ns:Project}}:Pravilnik o uporabniških imenih',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(pomagaj mi izbrati)]]',
 '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',
@@ -634,12 +639,27 @@ Ne pozabite si prilagoditi vaših [[Special:Preferences|nastavitev {{GRAMMAR:rod
 'userlogin-resetlink' => 'Ste pozabili svoje prijavne podatke?',
 '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-captcha' => 'Varnostno preverjanje',
+'createacct-captcha-help-url' => '{{ns:Project}}:Prošnja za račun',
+'createacct-imgcaptcha-help' => 'Ne morete videti slike? [[{{MediaWiki:createacct-captcha-help-url}}|Zaprosite za račun]]',
+'createacct-imgcaptcha-ph' => 'Vnesite zgornje besedilo',
+'createacct-benefit-heading' => '{{GRAMMAR:tožilnik|{{SITENAME}}}} ustvarjajo ljudje, kot ste vi.',
+'createacct-benefit-body1' => 'urejanj',
+'createacct-benefit-body2' => 'strani',
+'createacct-benefit-body3' => 'nedavni sodelavci',
 '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.
@@ -734,6 +754,7 @@ 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',
@@ -755,7 +776,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 +794,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',
@@ -2170,6 +2191,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.
@@ -3135,11 +3165,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:
 
@@ -3770,14 +3814,14 @@ 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}}:«.',
+'redirect-legend' => 'Preusmeritev na datoteko ali stran',
+'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 +3915,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 +3942,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 72743f9..043ae87 100644 (file)
@@ -44,8 +44,6 @@ $messages = array(
 'tog-shownumberswatching' => "I'tus tirada isticmaalayaasha wax waardiyeynaayo",
 'tog-oldsig' => 'Saxiixa jiro:',
 'tog-fancysig' => "u isticmaal saxiixa sida qoraalada wiki  (ayada oo linki auomaatik la'aan)",
-'tog-externaleditor' => "Isticmaal qoraal wax ka bedelyaal ka madaxbanaan (La'iskuogyahay)",
-'tog-externaldiff' => "Isticmaal qoraal wax ka bedelyaal ka madaxbanaan oo (La'iskuogyahay)",
 'tog-showjumplinks' => 'Shid "ku bood" links-ka la geli karo',
 'tog-uselivepreview' => 'Isticmaal horfiirinta tooska ah (JavaScript) (Wuxuu ku jiraa tijaabo)',
 'tog-forceeditsummary' => "I'xasuusi markii uusan qoraalkeyga raacsiisnay faahfaahin gaaban",
@@ -249,7 +247,7 @@ $1',
 'copyright' => 'Qoraalka wuxuu ku salaysanyahay $1.',
 'copyrightpage' => '{{ns:project}}: Ogolaashada koobiga',
 'currentevents' => 'Dhacdooyinka cusub',
-'currentevents-url' => 'Project:Maxaa cusub',
+'currentevents-url' => 'Project:Dhacdooyinka Hadda',
 'disclaimers' => "Masuul la'aan",
 'disclaimerpage' => "Project:Masuul la'aan guud",
 'edithelp' => 'Caawinaada wax ka bedelka',
@@ -776,9 +774,6 @@ sababteeda neh waxaa laga heli kartaa  [{{fullurl:{{#Special:Log}}/delete|page={
 'powersearch-toggleall' => 'Dhamaan',
 'powersearch-togglenone' => 'Waxna',
 
-# Quickbar
-'qbsettings-none' => 'Waxna',
-
 # Preferences page
 'preferences' => 'Dooqyada',
 'mypreferences' => 'Dooqyadeyda',
@@ -1126,12 +1121,12 @@ $PAGEINTRO $NEWPAGE
 
 Qaybta wax laga bedelay: $PAGESUMMARY $PAGEMINOREDIT
 
-La xariirka Tafaftiraha:
+La xariirka Tifaftiraha:
 mail: $PAGEEDITOR_EMAIL
 wiki: $PAGEEDITOR_WIKI
 
 Lama soo diri doono ogeysiin dambe hadii isbedel kale lagu sii sameeyo ilaa aad ka soo booqato bogga.
-Waxaad awoodaa inaad ka saarto liiska waardiyeha booga.
+Waxaad awoodaa inaad ka saarto liiska waardiyeha bogga.
 
                         Nidaamka war gelinta {{SITENAME}} ee E-mailka
 
@@ -1456,10 +1451,6 @@ waxaad awoodaa [[Special:EditWatchlist/raw|Liiska wax ka bedel]].',
 # Special:Version
 'version-poweredby-others' => 'kuwa kale',
 
-# Special:FilePath
-'filepath-page' => 'Fayl:',
-'filepath-submit' => 'Soco',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-legend' => 'Raadi mid tusaale ah',
 'fileduplicatesearch-submit' => 'Raadi',
index 84a2763..58e90d8 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',
@@ -982,6 +981,8 @@ Duket se është grisur.',
 'edit-already-exists' => 'Faqja nuk mundej të hapet.
 Ajo tanimë ekziston.',
 'defaultmessagetext' => 'Teksti i porosisë së parazgjedhur',
+'editwarning-warning' => 'Lënia e kësaj faqeje mund t\'ju shkaktojë humbjen e çdo ndryshimi që keni bërë.
+Nëse keni hyrë brenda, ju mund ta hiqni këtë paralajmërim në seksionin "Redaktimi" tek preferencat tuaja.',
 
 # Content models
 'content-model-text' => 'tekst i thejshtë',
@@ -1249,15 +1250,6 @@ Kini kujdes se përdorimi i lidhjeve të shfletimit do të ndryshojë përzgjedh
 'search-external' => 'Kërkim i jashtëm',
 'searchdisabled' => '<p>Kërkimi me tekst të plotë është bllokuar tani për tani ngaqë shërbyesi është shumë i ngarkuar; shpresojmë ta nxjerrim prapë në gjendje normale pas disa punimeve. Deri atëherë mund të përdorni Google-in për kërkime:</p>',
 
-# Quickbar
-'qbsettings' => 'Vendime të shpejta',
-'qbsettings-none' => 'Asnjë',
-'qbsettings-fixedleft' => 'Lidhur majtas',
-'qbsettings-fixedright' => 'Lidhur djathtas',
-'qbsettings-floatingleft' => 'Pezull majtas',
-'qbsettings-floatingright' => 'Pezull djathtas',
-'qbsettings-directionality' => 'Fikse, në varësi të skriptës së drejtuar në gjuhën tuaj',
-
 # Preferences page
 'preferences' => 'Parapëlqimet',
 'mypreferences' => 'Parapëlqimet',
index 8058926..031bb29 100644 (file)
@@ -15,6 +15,7 @@
  * @author Kaganer
  * @author Kale
  * @author Meno25
+ * @author Milicevic01
  * @author Millosh
  * @author Nikola Smolenski
  * @author Rancher
@@ -24,6 +25,7 @@
  * @author Slaven Kosanovic
  * @author Јованвб
  * @author Жељко Тодоровић
+ * @author Милан Јелисавчић
  * @author Михајло Анђелковић
  * @author לערי ריינהארט
  */
@@ -399,12 +401,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 +420,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 +433,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' => 'никад не подвлачи',
@@ -525,7 +526,7 @@ $messages = array(
 
 'about' => 'О нама',
 'article' => 'Страница са садржајем',
-'newwindow' => '(отвара у новом прозору)',
+'newwindow' => '(оÑ\82ваÑ\80а Ñ\81е Ñ\83 Ð½Ð¾Ð²Ð¾Ð¼ Ð¿Ñ\80озоÑ\80Ñ\83)',
 'cancel' => 'Откажи',
 'moredotdotdot' => 'Више…',
 'mypage' => 'Страница',
@@ -817,9 +818,13 @@ $2',
 'welcomecreation-msg' => 'Ваш налог је отворен.
 Не заборавите да промените своја [[Special:Preferences|подешавања]].',
 'yourname' => 'Корисничко име:',
+'userlogin-yourname' => 'Корисничко име',
 'yourpassword' => 'Лозинка:',
+'userlogin-yourpassword' => 'Лозинка',
+'userlogin-yourpassword-ph' => 'Унесите лозинку',
 'yourpasswordagain' => 'Потврда лозинке:',
 'remembermypassword' => 'Запамти ме на овом прегледачу (најдуже $1 {{PLURAL:$1|дан|дана|дана}})',
+'userlogin-remembermypassword' => 'Запамти ме',
 'securelogin-stick-https' => 'Останите повезани са HTTPS након пријаве',
 'yourdomainname' => 'Домен:',
 'password-change-forbidden' => 'Не можете да промените лозинку на овом викију.',
@@ -1190,6 +1195,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' => 'викитекст',
@@ -1478,15 +1485,6 @@ $1",
 У међувремену можете тражити преко Гугла.
 Упамтите да његови пописи овог викија могу бити застарели.',
 
-# Quickbar
-'qbsettings' => 'Бочна палета',
-'qbsettings-none' => 'Ништа',
-'qbsettings-fixedleft' => 'Причвршћена лево',
-'qbsettings-fixedright' => 'Причвршћена десно',
-'qbsettings-floatingleft' => 'Плутајућа лево',
-'qbsettings-floatingright' => 'Плутајућа десно',
-'qbsettings-directionality' => 'Фиксно, у зависности од смера писања вашег језика',
-
 # Preferences page
 'preferences' => 'Подешавања',
 'mypreferences' => 'Подешавања',
@@ -1700,7 +1698,7 @@ $1",
 'right-unblockself' => 'деблокирање самог себе',
 'right-protect' => 'мењање заштићених страница и степена заштите',
 'right-editprotected' => 'уређивање заштићених страница (с преносивом заштитом)',
-'right-editinterface' => 'уређивање корисничког сучеља',
+'right-editinterface' => 'уређивање корисничког окружења',
 'right-editusercssjs' => 'уређивање туђих CSS и јаваскрипт датотека',
 'right-editusercss' => 'уређивање туђих CSS датотека',
 'right-edituserjs' => 'уређивање туђих јаваскрипт датотека',
@@ -2059,7 +2057,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>
@@ -2385,6 +2382,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' => 'Следи списак корисничких група на овом викију, заједно с правима приступа.
@@ -3208,13 +3214,8 @@ $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 постављен овде ће утицати на издање за штампу */',
@@ -3227,13 +3228,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' => '/* Јаваскрипт постављен овде ће се учитати за самопотврђене кориснике */',
@@ -3307,13 +3303,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' => 'Векторско',
 
@@ -3408,8 +3399,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',
@@ -4193,13 +4182,6 @@ $5
 'version-entrypoints-header-entrypoint' => 'Улазна тачка',
 'version-entrypoints-header-url' => 'Адреса',
 
-# Special:FilePath
-'filepath' => 'Путања датотеке',
-'filepath-page' => 'Датотека:',
-'filepath-submit' => 'Иди',
-'filepath-summary' => 'Ова посебна страница приказује потпуну путању датотеке.
-Слике су приказане у пуној величини, а друге врсте датотека се покрећу помоћу њима придруженим програмима.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Претрага дупликата',
 'fileduplicatesearch-summary' => 'Претрага дуплираних датотека према вредностима дисперзије.',
@@ -4289,6 +4271,8 @@ $5
 'htmlform-submit' => 'Пошаљи',
 'htmlform-reset' => 'Врати измене',
 'htmlform-selectorother-other' => 'Друго',
+'htmlform-no' => 'Не',
+'htmlform-yes' => 'Да',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 с подршком претраге целог текста',
index ea2bc20..b11795d 100644 (file)
@@ -332,8 +332,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 +346,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',
@@ -1095,6 +1094,8 @@ Izgleda da ona već postoji.',
 'content-failed-to-parse' => 'Ne mogu da raščlanim sadržaj tipa $2 za model $1: $3',
 'invalid-content-data' => 'Neispravni podaci sadržaja',
 'content-not-allowed-here' => 'Sadržaj modela „$1“ nije dozvoljen na stranici [[$2]]',
+'editwarning-warning' => 'Ako napustite ovu stranicu, izgubićete sve izmene koje ste napravili.
+Ako ste prijavljeni, možete onemogućiti ovo upozorenje u svojim podešavanjima, u odeljku „Uređivanje“.',
 
 # Content models
 'content-model-wikitext' => 'vikitekst',
@@ -1383,15 +1384,6 @@ Ako želite sve da pretražite, dodajte prefiks '''all:''' ispred traženog sadr
 U međuvremenu možete tražiti preko Gugla.
 Upamtite da njegovi popisi ovog vikija mogu biti zastareli.',
 
-# Quickbar
-'qbsettings' => 'Bočna paleta',
-'qbsettings-none' => 'Ništa',
-'qbsettings-fixedleft' => 'Pričvršćena levo',
-'qbsettings-fixedright' => 'Pričvršćena desno',
-'qbsettings-floatingleft' => 'Plutajuća levo',
-'qbsettings-floatingright' => 'Plutajuća desno',
-'qbsettings-directionality' => 'Fiksno, u zavisnosti od smera pisanja vašeg jezika',
-
 # Preferences page
 'preferences' => 'Podešavanja',
 'mypreferences' => 'Podešavanja',
@@ -1963,7 +1955,6 @@ Radi sigurnosti, img_auth.php je onemogućen.',
 'http-read-error' => 'HTTP greška pri čitanju.',
 'http-timed-out' => 'Zahtev HTTP je istekao.',
 'http-curl-error' => 'Greška pri otvaranju adrese: $1',
-'http-host-unreachable' => 'Ne mogu da pristupim adresi.',
 'http-bad-status' => 'Došlo je do problema tokom zahteva HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2289,15 +2280,6 @@ Podržani protokoli: <code>$1</code> (zadaje http:// ako ne navedete protokol).'
 'listusers-noresult' => 'Korisnik nije pronađen.',
 'listusers-blocked' => '({{GENDER:$1|blokiran|blokirana|blokiran}})',
 
-# Special:ActiveUsers
-'activeusers' => 'Spisak aktivnih korisnika',
-'activeusers-intro' => 'Ovo je spisak korisnika koji su bili aktivni {{PLURAL:$1|prethodni dan|u poslednja $1 dana|u poslednjih $1 dana}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|izmena|izmene|izmena}} {{PLURAL:$3|prethodni dan|u poslednja $3 dana|u poslednjih $3 dana}}',
-'activeusers-from' => 'Prikaži korisnike počev od:',
-'activeusers-hidebots' => 'Sakrij botove',
-'activeusers-hidesysops' => 'Sakrij administratore',
-'activeusers-noresult' => 'Korisnik nije pronađen.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Prava korisničkih grupa',
 'listgrouprights-summary' => 'Sledi spisak korisničkih grupa na ovom vikiju, zajedno s pravima pristupa.
@@ -3111,13 +3093,8 @@ 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 */',
@@ -3130,13 +3107,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 */',
@@ -3210,13 +3182,8 @@ Ovo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnoj li
 'pageinfo-protect-cascading-from' => 'Stranice sa prenosivom zaštitom od',
 
 # Skin names
-'skinname-standard' => 'Klasično',
-'skinname-nostalgia' => 'Nostalgija',
 'skinname-cologneblue' => 'Kelnsko plava',
 'skinname-monobook' => 'Monobuk',
-'skinname-myskin' => 'Moja tema',
-'skinname-chick' => 'Šik',
-'skinname-simple' => 'Prosto',
 'skinname-modern' => 'Savremeno',
 'skinname-vector' => 'Vektorsko',
 
@@ -3311,8 +3278,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',
index f101bf6..ba8beb8 100644 (file)
@@ -733,9 +733,20 @@ 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',
+'createacct-helpusername-url' => '{{ns:Project}}:Användarnamnspolicy',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(hjälp mig att välja)]]',
 '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' => 'Logga in med säker server',
 '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 +759,39 @@ Glöm inte att justera dina [[Special:Preferences|{{SITENAME}}-inställningar]].
 'logout' => 'Logga ut',
 'userlogout' => 'Logga ut',
 'notloggedin' => 'Inte inloggad',
+'userlogin-noaccount' => 'Har du inget konto?',
+'userlogin-joinproject' => 'Gå med i {{SITENAME}}',
 'nologin' => "Har du inget användarkonto? '''$1'''.",
 'nologinlink' => 'Skapa ett användarkonto',
 'createaccount' => 'Skapa ett konto',
 'gotaccount' => "Har du redan ett användarkonto? '''$1'''.",
 'gotaccountlink' => 'Logga in',
 'userlogin-resetlink' => 'Har du glömt dina inloggningsuppgifter?',
+'helplogin-url' => 'Help:Logging 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ällig slumpartat lösenord och skicka den 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-captcha-help-url' => '{{ns:Project}}:Begär ett konto',
+'createacct-imgcaptcha-help' => 'Kan du inte se bilden? [[{{MediaWiki:createacct-captcha-help-url}}|Begär ett konto]]',
+'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' => 'redigeringar',
+'createacct-benefit-body2' => 'sidor',
+'createacct-benefit-body3' => 'nyliga 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.
@@ -843,6 +875,7 @@ 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',
@@ -873,7 +906,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',
@@ -1522,6 +1555,7 @@ Om du väljer att ange ditt riktiga namn, kommer det att användas för att till
 'userrights-notallowed' => 'Ditt konto har inte behörighet till att lägga till eller ta bort användarrättigheter.',
 'userrights-changeable-col' => 'Grupper du kan ändra',
 'userrights-unchangeable-col' => 'Grupper du inte kan ändra',
+'userrights-conflict' => 'Användarrättighetskonflikt! Var god tillämpa dina ändringar igen.',
 
 # Groups
 'group' => 'Grupp:',
@@ -2257,6 +2291,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.
@@ -2375,7 +2418,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
@@ -3234,11 +3277,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:
 
@@ -3858,16 +3915,20 @@ 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.',
+'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 +4021,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..6348b22 100644 (file)
@@ -154,8 +154,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 +168,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',
@@ -530,7 +529,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 +548,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',
@@ -884,6 +889,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 +998,7 @@ Wakabidhi wengine wa {{SITENAME}} bado wataweza kuliona lile lililofichwa pamoja
 'revdelete-hide-restricted' => 'Wakabidhi (vilevile wengine) wasiweze kuona data',
 'revdelete-radio-same' => '(isibadilishwe)',
 'revdelete-radio-set' => 'Ndiyo',
-'revdelete-radio-unset' => 'Siyo',
+'revdelete-radio-unset' => 'Hapana',
 'revdelete-suppress' => 'Wakabidhi (vilevile wengine) wasiweze kuona data',
 'revdelete-unsuppress' => 'Uzuio wa kuona mapitio uondolewe, mapitio yanaporudishwa',
 'revdelete-log' => 'Sababu:',
@@ -1122,14 +1129,6 @@ Ukitaka kutafuta kwenye maeneo yote (pamoja na kurasa za majadiliano, vigezo, nk
 Unaweza kutafuta kwa kutumia Google punde si punde.
 Ujue lakini kwamba kumbukumbu za {{SITENAME}} kule Google labda zilipitwa na wakati.',
 
-# Quickbar
-'qbsettings' => 'Mwambaa pembe',
-'qbsettings-none' => 'Hakuna',
-'qbsettings-fixedleft' => 'Kushoto tuli',
-'qbsettings-fixedright' => 'Kulia tuli',
-'qbsettings-floatingleft' => 'Kushoto geugeu',
-'qbsettings-floatingright' => 'Kulia geugeu',
-
 # Preferences page
 'preferences' => 'Mapendekezo',
 'mypreferences' => 'Mapendekezo',
@@ -1609,7 +1608,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>
@@ -3123,6 +3121,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',
index 03d6c19..9414568 100644 (file)
@@ -94,8 +94,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Pokoż, wjela sprowjorzy dowo pozůr',
 'tog-oldsig' => 'Teroźni wyglůnd Twojygo szrajbowańo',
 'tog-fancysig' => 'Szrajbńij s kodůma wiki (bez autůmatycznygo linka)',
-'tog-externaleditor' => 'Sztandardowo używej zewnyntrzny edytor (jyno do ekspertůw, trza mjyć ekstra sztalowańy we systymje)',
-'tog-externaldiff' => 'Sztandardowo używej zewnyntrzny program do filowańo we pomjyńańach (jyno do ekspertůw, trza mjyć ekstra sztalowańy we systymje)',
 'tog-showjumplinks' => 'Zapńij cajchnůndzki "przyńdź do"',
 'tog-uselivepreview' => 'Używej dynamiczne uobźyrańy (JavaScript) (eksperymentalny)',
 'tog-forceeditsummary' => 'Pedź, kejbych ńic ńy naszkryfloł we uopiśe pomjyńań',
@@ -983,14 +981,6 @@ $1',
 'search-external' => 'Šnupańy zewnyntřne',
 'searchdisabled' => 'Šnupańy we {{GRAMMAR:MS.lp|{{SITENAME}}}} zostouo zawarte. Zańim go zouůnčům, možeš sprůbować šnupańo bez Google. Ino zauwaž, co informacyje uo treśći {{GRAMMAR:MS.lp|{{SITENAME}}}} můgům być we Google ńyakuratne.',
 
-# Quickbar
-'qbsettings' => 'Gurt šybkigo dostympu',
-'qbsettings-none' => 'Brak',
-'qbsettings-fixedleft' => 'Stouy, s lewyj',
-'qbsettings-fixedright' => 'Stouy, s prawyj',
-'qbsettings-floatingleft' => 'Unošůncy śe, s lewyj',
-'qbsettings-floatingright' => 'Unošůncy śe, s prawyj',
-
 # Preferences page
 'preferences' => 'Preferyncyje',
 'mypreferences' => 'Moje preferyncyje',
@@ -1624,11 +1614,6 @@ Uobsůgiwane protokoły: <code>$1</code>',
 'listusers-submit' => 'Pokož',
 'listusers-noresult' => 'Ńy znejdźůno žodnygo užytkowńika.',
 
-# Special:ActiveUsers
-'activeusers-hidebots' => 'Schrůń boty',
-'activeusers-hidesysops' => 'Schrůń adminy',
-'activeusers-noresult' => 'Ńy sům używacze.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Uprawńyńo grup użytkowńikůw',
 'listgrouprights-summary' => 'Půńiży znojdowo śe spis grup użytkowńikůw zdefińjowanych na tyj wiki, s wyszczygůlńyńym przidźelůnych im prow dostympu.
index 05f81b7..410d700 100644 (file)
@@ -174,8 +174,6 @@ $messages = array(
 'tog-shownumberswatching' => 'వీక్షకుల సంఖ్యను చూపించు',
 'tog-oldsig' => 'ప్రస్తుత సంతకం:',
 'tog-fancysig' => 'సంతకాన్ని వికీపాఠ్యంగా తీసుకో (ఆటోమెటిక్‌ లింకు లేకుండా)',
-'tog-externaleditor' => 'మామూలుగా బయటి ఎడిటరును వాడు (నిపుణులకు మాత్రమే. మీ కంప్యూటర్లో ప్రత్యేక అమరికలు అవసరమవుతాయి. [//www.mediawiki.org/wiki/Manual:External_editors మరింత సమాచారం.])',
-'tog-externaldiff' => 'మార్పులను చూడటానికి బయటి సాఫ్టువేరును వాడు (నిపుణులకు మాత్రమే, మీ కంప్యూటర్లో ప్రత్యేక అమరికలు అవసరమవుతాయి. [//www.mediawiki.org/wiki/Manual:External_editors మరింత సమాచారం.])',
 'tog-showjumplinks' => '"ఇక్కడికి గెంతు" లింకులను చూపించు',
 'tog-uselivepreview' => 'రాస్తున్నదానిని ఎప్పటికప్పుడు సరిచూడండి (జావాస్క్రిప్టు) (పరీక్షాదశలో ఉంది)',
 'tog-forceeditsummary' => 'దిద్దుబాటు సారాంశం ఖాళీగా ఉంటే ఆ విషయాన్ని నాకు సూచించు',
@@ -189,6 +187,7 @@ $messages = array(
 'tog-diffonly' => 'తేడాలను చూపిస్తున్నపుడు, కింద చూపించే పేజీలోని సమాచారాన్ని చూపించొద్దు',
 'tog-showhiddencats' => 'దాచిన వర్గాలను చూపించు',
 'tog-norollbackdiff' => 'రద్దు చేసాక తేడాలు చూపించవద్దు',
+'tog-useeditwarning' => 'ఏదైనా పేజీని నేను వదిలివెళ్తున్నప్పుడు దానిలో భద్రపరచని మార్పులు ఉంటే నన్ను హెచ్చరించు',
 
 'underline-always' => 'ఎల్లప్పుడూ',
 'underline-never' => 'ఎప్పటికీ వద్దు',
@@ -342,7 +341,7 @@ $messages = array(
 'talkpage' => 'ఈ పేజీని చర్చించండి',
 'talkpagelinktext' => 'చర్చ',
 'specialpage' => 'ప్రత్యేక పేజీ',
-'personaltools' => 'తన పనిముట్లు',
+'personaltools' => 'à°µà±\8dà°¯à°\95à±\8dతిà°\97à°¤ పనిముట్లు',
 'postcomment' => 'కొత్త విభాగం',
 'articlepage' => 'విషయపు పేజీని చూడండి',
 'talk' => 'చర్చ',
@@ -405,7 +404,7 @@ $1',
 'retrievedfrom' => '"$1" నుండి వెలికితీశారు',
 'youhavenewmessages' => 'మీకు $1 ఉన్నాయి ($2).',
 'newmessageslink' => 'కొత్త సందేశాలు',
-'newmessagesdifflink' => 'à°\95à±\8dà°°à°¿à°¤à°\82 à°¸à°\82à°\9aà°¿à°\95à°¤à±\8b à°\97à°² à°¤à±\87డాలు',
+'newmessagesdifflink' => 'à°\9aివరి à°®à°¾à°°à±\8dà°ªు',
 'youhavenewmessagesfromusers' => 'మీకు {{PLURAL:$3|మరో వాడుకరి|$3 వాడుకరుల}} నుండి $1 ($2).',
 'youhavenewmessagesmanyusers' => 'మీకు చాలా వాడుకరుల నుండి $1 ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|ఒక కొత్త సందేశం వచ్చింది|కొత్త సందేశాలు ఉన్నాయి}}',
@@ -552,9 +551,14 @@ $2',
 *వికీని త్వరగా అర్థం చేసుకునేందుకు [[వికీపీడియా:5 నిమిషాల్లో వికీ|5 నిమిషాల్లో వికీ]] పేజీని చూడండి.
 *తెలుగులో రాసేందుకు ఇంగ్లీషు అక్షరాల ఉచ్ఛారణతో తెలుగు టైపు చేసే [[వికీపీడియా:టైపింగు సహాయం| టైపింగ్  సహాయం]] వాడవచ్చు. మరిన్ని ఉపకరణాల కొరకు [[కీ బోర్డు]] మరియు   తెరపై తెలుగు సరిగా లేకపోతే[[వికీపీడియా:Setting up your browser for Indic scripts|ఈ పేజీ]]  చూడండి.',
 'yourname' => 'వాడుకరి పేరు:',
+'userlogin-yourname' => 'వాడుకరి పేరు',
+'userlogin-yourname-ph' => 'మీ వాడుకరి పేరును ఇవ్వండి',
 'yourpassword' => 'సంకేతపదం:',
+'userlogin-yourpassword' => 'సంకేతపదం',
+'userlogin-yourpassword-ph' => 'మీ సంకేతపదాన్ని ఇవ్వండి',
 'yourpasswordagain' => 'సంకేతపదాన్ని మళ్ళీ ఇవ్వండి:',
 'remembermypassword' => 'ఈ కంప్యూటరులో నా ప్రవేశాన్ని గుర్తుంచుకో (గరిష్ఠంగా $1 {{PLURAL:$1|రోజు|రోజుల}}కి)',
+'userlogin-remembermypassword' => 'నన్ను గుర్తుంచుకో',
 'securelogin-stick-https' => 'ప్రవేశం తర్వాత కూడా HTTPSకి అనుసంధానమై ఉండు',
 'yourdomainname' => 'మీ డోమైను',
 'password-change-forbidden' => 'ఈ వికీలో మీరు సంకేతపదాలను మార్చలేరు.',
@@ -567,10 +571,12 @@ $2',
 'logout' => 'నిష్క్రమించు',
 'userlogout' => 'నిష్క్రమించు',
 'notloggedin' => 'లోనికి ప్రవేశించి లేరు',
-'nologin' => "ఖాతా లేదా? '''$1'''.",
+'userlogin-noaccount' => 'మీకు ఖాతా లేదా?',
+'userlogin-joinproject' => '{{SITENAME}}లో చేరండి',
+'nologin' => 'ఖాతా లేదా? $1.',
 'nologinlink' => 'ఖాతాని సృష్టించుకోండి',
 'createaccount' => 'ఖాతాని సృష్టించు',
-'gotaccount' => "ఇప్పటికే మీకు ఖాతా ఉందా? '''$1'''.",
+'gotaccount' => 'ఇప్పటికే మీకు ఖాతా ఉందా? $1.',
 'gotaccountlink' => 'ప్రవేశించండి',
 'userlogin-resetlink' => 'మీ ప్రవేశ వివరాలను మరచిపోయారా?',
 'createaccountmail' => 'ఈ-మెయిలు ద్వారా',
@@ -580,10 +586,10 @@ $2',
 వేరే పేరును ఎంచుకోండి.',
 'loginerror' => 'ప్రవేశంలో పొరపాటు',
 'createaccounterror' => 'ఖాతాని సృష్టించలేకపోయాం: $1',
-'nocookiesnew' => 'ఖాతాని సృష్టించాం, కానీ ఇంకా లోనికి ప్రవేశించలేదు.
+'nocookiesnew' => 'à°\96ాతాని à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aà°¾à°\82, à°\95ానà±\80 à°®à±\80à°°à±\81 à°\87à°\82à°\95à°¾ à°²à±\8bనిà°\95à°¿ à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aà°²à±\87à°¦à±\81.
 వాడుకరుల ప్రవేశానికి {{SITENAME}} కూకీలను వాడుతుంది.
 మీరు కూకీలని అచేతనం చేసివున్నారు.
-దయà°\9aà±\87సి à°µà°¾à°\9fిని à°\9aà±\87తనà°\82à°\9aà±\87సి, à°\85à°ªà±\8dà°ªà±\81à°¡à±\81 à°®à±\80 à°\95à±\8aà°¤à±\8dà°¤ à°µà°¾à°¡à±\81à°\95à°°à°¿పేరు మరియు సంకేతపదాలతో లోనికి ప్రవేశించండి.',
+దయà°\9aà±\87సి à°µà°¾à°\9fిని à°\9aà±\87తనà°\82à°\9aà±\87సి, à°®à±\80 à°\95à±\8aà°¤à±\8dà°¤ à°µà°¾à°¡à±\81à°\95à°°à°¿ పేరు మరియు సంకేతపదాలతో లోనికి ప్రవేశించండి.',
 'nocookieslogin' => 'వాడుకరుల ప్రవేశానికై {{SITENAME}} కూకీలను వాడుతుంది.
 మీరు కుకీలని అచేతనం చేసివున్నారు.
 వాటిని చేతనంచేసి ప్రయత్నించండి.',
@@ -701,6 +707,7 @@ $2
 'changeemail-oldemail' => 'ప్రస్తుత ఈ-మెయిలు చిరునామా:',
 'changeemail-newemail' => 'కొత్త ఈ-మెయిలు చిరునామా:',
 'changeemail-none' => '(ఏమీలేదు)',
+'changeemail-password' => 'మీ {{SITENAME}} సంకేతపదం:',
 'changeemail-submit' => 'ఈ-మెయిల్ మార్చు',
 'changeemail-cancel' => 'రద్దుచేయి',
 
@@ -719,7 +726,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 +749,19 @@ $2
 'summary-preview' => 'మీరు రాసిన సారాంశం:',
 'subject-preview' => 'విషయం/శీర్షిక మునుజూపు:',
 'blockedtitle' => 'సభ్యునిపై నిరోధం అమలయింది',
-'blockedtext' => '\'\'\'మీ వాడుకరి పేరుని లేదా ఐ.పీ. చిరునామాని నిరోధించారు.\'\'\'
+'blockedtext' => "'''మీ వాడుకరి పేరుని లేదా ఐ.పీ. చిరునామాని నిరోధించారు.'''
 
 నిరోధించినది $1.
-అందుకు ఇచ్చిన కారణం: \'\'$2\'\'
+అందుకు ఇచ్చిన కారణం: ''$2''
 
 * నిరోధం మొదలైన సమయం: $8
 * నిరోధించిన కాలం: $6
 * నిరోధానికి గురైనవారు: $7
 
-ఈ నిరోధంపై చర్చించేందుకు $1ను గాని, మరెవరైనా [[{{MediaWiki:Grouppage-sysop}}|నిర్వాహకులను]] గాని సంప్రదించండి.
-à°®à±\80 [[Special:Preferences|à°\96ాతా à°\85à°­à°¿à°°à±\81à°\9aà±\81లలà±\8b]] à°¸à°°à±\88à°¨ à°\88-à°®à±\86యిలà±\81 à°\9aà°¿à°°à±\81నామా à°\87à°\9aà±\8dà°\9aà°¿à°µà±\81à°\82à°\9fà±\87 à°¤à°ªà±\8dà°ª, "à°\88 à°¸à°­à±\8dà°¯à±\81నిà°\95à°¿ à°\88-à°®à±\86యిలà±\81 à°ªà°\82à°ªà±\81" à°\85à°¨à±\87 à°\85à°\82శానà±\8dని à°µà°¾à°¡à±\81à°\95à±\8bà°²à±\87రని à°\97మనిà°\82à°\9aà°\82à°¡à°¿. à°\86 à°\85à°\82శానà±\8dని à°µà°¾à°¡à±\81à°\95à±\8bవడà°\82à°²à±\8b à°®à±\80à°ªà±\88 à°¨à°¿à°°à±\8bà°§à°\82 à°²à±\87à°¦ు.
-మీ ప్రస్తుత ఐ.పీ. చిరునామా $3, మరియు నిరోధపు ID $5.
-మీ సంప్రదింపులన్నిటిలోనూ వీటిని పేర్కొనండి.',
+ఈ నిరోధంపై చర్చించేందుకు మీరు $1ను గాని, మరెవరైనా [[{{MediaWiki:Grouppage-sysop}}|నిర్వాహకులను]] గాని సంప్రదించవచ్చు.
+à°®à±\80 [[Special:Preferences|à°\96ాతా à°\85à°­à°¿à°°à±\81à°\9aà±\81లలà±\8b]] à°¸à°°à±\88à°¨ à°\88-à°®à±\86యిలà±\81 à°\9aà°¿à°°à±\81నామా à°\87à°\9aà±\8dà°\9aà°¿à°µà±\81à°\82à°¡à°\95à°ªà±\8bయినా à°²à±\87దా à°®à°¿à°®à±\8dమలà±\8dని  'à°\88 à°µà°¾à°¡à±\81à°\95à°°à°¿à°\95à°¿ à°\88-à°®à±\86యిలà±\81 à°ªà°\82à°ªà±\81' à°¸à±\8cలభà±\8dయానà±\8dని à°µà°¾à°¡à±\81à°\95à±\8bవడà°\82 à°¨à±\81à°\82à°¡à°¿ à°¨à°¿à°°à±\8bధిà°\82à°\9aà°¿à°µà±\81à°¨à±\8dనా à°®à±\80à°°à±\81 à°\88à°®à±\86యిలà±\81 à°¦à±\8dవారా à°¸à°\82à°ªà±\8dరదిà°\82à°\9aà°²à±\87à°°ు.
+మీ ప్రస్తుత ఐ.పీ. చిరునామా $3, మరియు నిరోధపు ID #$5.
+మీ సంప్రదింపులన్నిటిలోనూ వీటిని పేర్కొనండి.",
 'autoblockedtext' => 'మీ ఐపీ చిరునామా ఆటోమాటిగ్గా నిరోధించబడింది. ఎందుకంటే ఇదే ఐపీ చిరునామాని ఓ నిరోధిత వాడుకరి ఉపయోగించారు. ఆ వాడుకరిని $1 నిరోధించారు.
 అందుకు ఇచ్చిన కారణం ఇదీ:
 
@@ -887,6 +894,8 @@ $2
 అది ఇప్పటికే ఉంది.',
 'defaultmessagetext' => 'అప్రమేయ సందేశపు పాఠ్యం',
 'invalid-content-data' => 'తప్పుడు విషయం',
+'editwarning-warning' => 'ఈ పేజీని వదిలివెళ్ళడం వల్ల మీరు చేసిన మార్పులను కోల్పోయే అవకాశం ఉంది.
+మీరు ప్రవేశించివుంటే, ఈ హెచ్చరికని మీ అభిరుచులలో "మరపులు" అనే విభాగంలో అచేతనం చేసుకోవచ్చు.',
 
 # Content models
 'content-model-wikitext' => 'వికీపాఠ్యం',
@@ -1157,15 +1166,6 @@ $1",
 'search-external' => 'బయటి అన్వేషణ',
 'searchdisabled' => '{{SITENAME}} అన్వేషణ తాత్కాలికంగా పని చెయ్యడం లేదు. ఈలోగా మీరు గూగుల్‌ ఉపయోగించి అన్వేషించవచ్చు. ఒక గమనిక: గూగుల్‌ ద్వారా కాలదోషం పట్టిన ఫలితాలు రావడానికి అవకాశం ఉంది.',
 
-# Quickbar
-'qbsettings' => 'క్విక్‌బార్',
-'qbsettings-none' => 'ఏదీకాదు',
-'qbsettings-fixedleft' => 'స్థిర ఎడమ',
-'qbsettings-fixedright' => 'స్థిర కుడి',
-'qbsettings-floatingleft' => 'ఎడమకు ఒదిగి',
-'qbsettings-floatingright' => 'కుడికి ఒదిగి',
-'qbsettings-directionality' => 'స్థిరం, మీ లిపి మరియు భాషల యొక్క దిశ ఆధారంగా',
-
 # Preferences page
 'preferences' => 'అభిరుచులు',
 'mypreferences' => 'అభిరుచులు',
@@ -1246,7 +1246,7 @@ $1",
 'uid' => 'వాడుకరి ID:',
 'prefs-memberingroups' => 'సభ్యులుగా ఉన్న {{PLURAL:$1|గుంపు|గుంపులు}}:',
 'prefs-registration' => 'నమోదైన సమయం:',
-'yourrealname' => 'అసలు పేరు*',
+'yourrealname' => 'అసలు పేరు:',
 'yourlanguage' => 'భాష:',
 'yourvariant' => 'విషయపు భాషా వైవిధ్యం:',
 'prefs-help-variant' => 'ఈ వికీ లోని విషయపు పేజీలను చూపించడానికి మీ అభిమత వైవిధ్యం లేదా ఆర్ధోగ్రఫీ.',
@@ -1775,7 +1775,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'unusedtemplateswlh' => 'ఇతర లింకులు',
 
 # Random page
-'randompage' => 'యాధృచ్ఛిక పేజీ',
+'randompage' => 'యాదృచ్ఛిక పేజీ',
 'randompage-nopages' => 'ఈ క్రింది {{PLURAL:$2|పెరుబరిలో|పెరుబరులలో}} పేజీలు ఏమి లేవు:$1',
 
 # Random redirect
@@ -1963,6 +1963,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' => 'కింది జాబితాలో ఈ వికీలో నిర్వచించిన వాడుకరి గుంపులు, వాటికి సంబంధించిన హక్కులు ఉన్నాయి.
@@ -2296,7 +2305,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 +2327,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 +2356,7 @@ $UNWATCHURL కి వెళ్ళండి.
 'ipb-blockingself' => 'మిమ్మల్ని మీరే నిరోధించుకోబోతున్నారు! అదే మీ నిశ్చయమా?',
 'ipb-edit-dropdown' => 'నిరోధపు కారణాలను మార్చండి',
 'ipb-unblock-addr' => '$1 పై ఉన్న నిరోధాన్ని తొలగించండి',
-'ipb-unblock' => 'వాడుకరిపేరు లేక ఐపీ అడ్రసుపై ఉన్న నిరోధాన్ని తొలగించండి',
+'ipb-unblock' => 'వాడుకరి పేరుపై లేదా ఐపీ చిరునామాపై ఉన్న నిరోధాన్ని తొలగించండి',
 'ipb-blocklist' => 'అమల్లో ఉన్న నిరోధాలను చూపించు',
 'ipb-blocklist-contribs' => '$1 యొక్క మార్పులు-చేర్పులు',
 'unblockip' => 'సభ్యునిపై నిరోధాన్ని తొలగించు',
@@ -3355,8 +3364,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,14 +3407,6 @@ $5
 'version-entrypoints-header-entrypoint' => 'ప్రవేశ బిందువు',
 'version-entrypoints-header-url' => 'చిరునామా',
 
-# Special:FilePath
-'filepath' => 'పూర్తి చిరునామా',
-'filepath-page' => '{{ns:file}}:',
-'filepath-submit' => 'వెళ్ళు',
-'filepath-summary' => 'ఈ ప్రత్యేక పేజీలో ఫైళ్ల పేర్లు ఇస్తే వాటి పూర్తి చిరునామలు వస్తాయి. బొమ్మలైతే వాటి పూర్తి సైజుతో తెరుచుకుంటాయి, బొమ్మలు కాని ఇతర ఫైళ్లు వాటి అనుబంధ ప్రోగ్రాములతో తెరుచుకుంటాయి.
-
-పేరుకు ముందు "{{ns:file}}:" అని చేర్చవద్దు.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ఫైళ్ల మారుప్రతుల కోసం వెతుకు',
 'fileduplicatesearch-summary' => 'మారుప్రతుల కోసం ఫైళ్ల హాష్ విలువ ఆధారంగా వెతుకు.',
index 60926e3..b67ec27 100644 (file)
@@ -377,7 +377,7 @@ Ita-nia mudansa la armazenadu seidauk!",
 'currentrevisionlink' => 'Versaun atuál',
 'cur' => 'atuál',
 'next' => 'oinmai',
-'last' => 'ikus',
+'last' => 'molok',
 'page_first' => 'uluk',
 'page_last' => 'ikus',
 'histfirst' => 'sedu liu hotu',
@@ -407,12 +407,14 @@ Ita-nia mudansa la armazenadu seidauk!",
 'nextn' => 'oinmai {{PLURAL:$1|$1}}',
 'shown-title' => 'Hatudu {{PLURAL:$1|rezultadu|rezultadu}} $1 kada pájina',
 'viewprevnext' => 'Haree ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => "'''Iha pájina ho naran \"[[:\$1]]\".'''",
 'searchmenu-new' => "'''Kria pájina \"[[:\$1]]\" iha wiki ne'e!'''",
 'searchprofile-everything' => 'Hotu',
 'searchprofile-articles-tooltip' => 'Buka iha $1',
 'searchprofile-project-tooltip' => 'Buka iha $1',
 'search-result-size' => '$1 ({{PLURAL:$2|liafuan ida|liafuan $2}})',
 'search-section' => '(seksaun $1)',
+'search-suggest' => 'Parese Ita buka: $1',
 'search-interwiki-caption' => 'Projetu seluseluk sira',
 'searchall' => 'hotu',
 'powersearch' => 'Buka',
@@ -643,7 +645,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 +669,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 +716,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)',
@@ -849,10 +852,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',
index 8e619ae..5181192 100644 (file)
@@ -608,9 +608,15 @@ $1',
 'welcomecreation-msg' => 'บัญชีของคุณถูกสร้างขึ้นแล้ว
 อย่าลืมเปลี่ยนแปลง[[Special:Preferences|การตั้งค่าใน {{SITENAME}}]] ของคุณ',
 'yourname' => 'ชื่อผู้ใช้',
+'userlogin-yourname' => 'ชื่อผู้ใช้',
+'userlogin-yourname-ph' => 'กรอกชื่อผู้ใช้',
 'yourpassword' => 'รหัสผ่าน',
+'userlogin-yourpassword' => 'รหัสผ่าน',
+'userlogin-yourpassword-ph' => 'กรอกรหัสผ่าน',
 'yourpasswordagain' => 'พิมพ์รหัสผ่านอีกครั้ง:',
 'remembermypassword' => 'จำการล็อกอินของฉันบนเบราเซอร์นี้ (นานสุด $1 วัน)',
+'userlogin-remembermypassword' => 'จำฉัน',
+'userlogin-signwithsecure' => 'ล็อกอินในเซิร์ฟเวอร์ปลอดภัย',
 'securelogin-stick-https' => 'ยังคงเชื่อมต่อกับ HTTPS หลังจากล็อกอิน',
 'yourdomainname' => 'โดเมนของคุณ:',
 'password-change-forbidden' => 'คุณไม่สามารถเปลี่ยนรหัสผ่านบนวิกินี้',
@@ -623,12 +629,16 @@ $1',
 'logout' => 'ล็อกเอาต์',
 'userlogout' => 'ล็อกเอาต์',
 'notloggedin' => 'ไม่ได้ล็อกอิน',
+'userlogin-noaccount' => 'ไม่มีบัญชีหรือ',
+'userlogin-joinproject' => 'เข้าร่วม {{SITENAME}}',
 'nologin' => 'ไม่มีบัญชีหรือ $1',
 'nologinlink' => 'สร้างบัญชี',
 'createaccount' => 'สร้างบัญชี',
 'gotaccount' => "มีบัญชีแล้วใช่ไหม '''$1'''",
 'gotaccountlink' => 'ล็อกอิน',
 'userlogin-resetlink' => 'ลืมรายละเอียดล็อกอินของคุณหรือ',
+'helplogin-url' => 'Help:การล็อกอิน',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|คำอธิบายเรื่องการล็อกอิน]]',
 'createaccountmail' => 'ใช้รหัสผ่านสุ่มชั่วคราวและส่งไปยังที่อยู่อีเมลที่ระบุด้านล่าง',
 'createaccountreason' => 'เหตุผล:',
 'badretype' => 'รหัสผ่านที่ใส่ไม่ตรงกัน',
@@ -718,8 +728,11 @@ $1',
 'passwordreset-text' => 'กรอกแบบฟอร์มนี้เพื่อตั้งรหัสผ่านใหม่',
 'passwordreset-legend' => 'เปลี่ยนรหัสผ่าน',
 'passwordreset-disabled' => 'การตั้งรหัสผ่านใหม่ปิดใช้งานบนวิกินี้',
+'passwordreset-emaildisabled' => 'คุณลักษณะอีเมลถูกปิดใช้งานบนวิกินี้',
 'passwordreset-username' => 'ชื่อผู้ใช้:',
 'passwordreset-domain' => 'โดเมน:',
+'passwordreset-capture' => 'ดูอีเมลที่ได้หรือไม่',
+'passwordreset-capture-help' => 'หากคุณเลือกกล่องนี้ อีเมลดังกล่าว (พร้อมรหัสผ่านชั่วคราว) จะแสดงแก่คุณ เช่นเดียวกับส่งไปยังผู้ใช้',
 'passwordreset-email' => 'ที่อยู่อีเมล:',
 'passwordreset-emailtitle' => 'รายละเอียดบัญชีบน {{SITENAME}}',
 'passwordreset-emailtext-ip' => 'ใครบางคน (ซึ่งอาจเป็นคุณ ที่ใช้เลขที่อยู่ไอพี $1) ขอตัวเตือนรายละเอียดบัญชีของคุณบน {{SITENAME}} ($4) บัญชีผู้ใช้ดังกล่าวเกี่ยวข้องกับที่อยู่อีเมลนี้:
@@ -736,9 +749,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' => 'เปลี่ยนที่อยู่อีเมล',
@@ -948,6 +961,8 @@ $2
 'edit-already-exists' => 'ไม่สามารถสร้างหน้าใหม่ได้
 เพราะมีหน้านี้แล้ว',
 'defaultmessagetext' => 'ข้อความสารโดยปริยาย',
+'invalid-content-data' => 'ข้อมูลเนื้อหาไม่ถูกต้อง',
+'content-not-allowed-here' => 'เนื้อหา "$1" ไม่อนุญาตในหน้า [[$2]]',
 'editwarning-warning' => 'การออกจากหน้านี้อาจทำให้ความเปลี่ยนแปลงที่คุณกระทำสูญหาย
 ถ้าคุณล็อกอินแล้ว คุณสามารถปิดคำเตือนนี้ได้ที่ส่วน "การแก้ไข" ในการตั้งค่าของคุณ',
 
@@ -2052,6 +2067,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' => 'ด้านล่างเป็นรายการกลุ่มผู้ใช้ที่นิยามบนวิกินี้ และสิทธิการเข้าถึงที่เกี่ยวข้อง
@@ -2743,6 +2767,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 +2781,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' => 'หน้าผู้ใช้ของคุณ',
@@ -2929,6 +2960,8 @@ $1',
 'markedaspatrollederror' => 'ไม่สามารถทำเครื่องหมายว่าตรวจสอบแล้ว',
 'markedaspatrollederrortext' => 'คุณจำเป็นต้องระบุรุ่นการแก้ไขที่กำหนดว่าตรวจสอบแล้ว',
 'markedaspatrollederror-noautopatrol' => 'คุณไม่สามารถทำเครื่องหมายการแก้ไขของคุณเองว่าตรวจสอบแล้ว',
+'markedaspatrollednotify' => 'การเปลี่ยนแปลงไปยัง $1 ถูกทำเครื่องหมายว่าตรวจสอบแล้ว',
+'markedaspatrollederrornotify' => 'การทำเครื่องหมายว่าตรวจสอบแล้วล้มเหลว',
 
 # Patrol log
 'patrol-log-page' => 'ปูมการตรวจสอบ',
@@ -3137,6 +3170,7 @@ $1',
 'exif-gpsareainformation' => 'ชื่อของพื้นที่จีพีเอส',
 'exif-gpsdatestamp' => 'วันที่จีพีเอส',
 'exif-gpsdifferential' => 'การปรับแค่ข้อแตกต่างจีพีเอส',
+'exif-jpegfilecomment' => 'ความเห็นไฟล์ JPEG',
 'exif-keywords' => 'คำสำคัญ',
 'exif-objectname' => 'ชื่อเรื่องสั้น',
 'exif-headline' => 'พาดหัวข่าว',
@@ -3528,15 +3562,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 +3650,8 @@ $5
 'htmlform-submit' => 'ส่งข้อมูล',
 'htmlform-reset' => 'ยกเลิกการเปลื่ยนแปลง',
 'htmlform-selectorother-other' => 'อื่น ๆ',
+'htmlform-no' => 'ไม่',
+'htmlform-yes' => 'ใช่',
 
 # SQLite database support
 'sqlite-has-fts' => 'รุ่น $1 พร้อมการสนับสนุนการค้นหาข้อความแบบเต็ม',
@@ -3663,23 +3690,31 @@ $5
 'rightsnone' => '(ไม่มี)',
 
 # Feedback
+'feedback-bugornote' => 'หากคุณได้อธิบายปัญหาทางเทคนิคในรายละเอียดแล้ว โปรด[$1 รายงานจุดบกพร่อง]
+มิฉะนั้น คุณสามารถแบบอย่างง่ายด้านล่าง ความเห็นของคุณจะถูกเพิ่มเข้าสู่ "[$3 $2]" ร่วมกับชื่อผู้ใช้ของคุณ',
+'feedback-subject' => 'เรื่อง:',
 'feedback-message' => 'ข้อความ:',
 'feedback-cancel' => 'ยกเลิก',
 'feedback-submit' => 'ส่งคำติชม',
 'feedback-adding' => 'เพิ่มคำติชมเข้าไปที่หน้า...',
+'feedback-thanks' => 'ขอบคุณ! ผลป้อนกลับของคุณถูกโพสต์ไปยังหน้า "[$2 $1]" แล้ว',
 'feedback-close' => 'เสร็จสิ้น',
+'feedback-bugcheck' => 'ยอดเยี่ยม! เพียงตรวจสอบว่าจุดบกพร่องนั้นมิใช่หนึ่งใน[$1 จุดบกพร่องที่ทราบแล้ว]',
+'feedback-bugnew' => 'ฉันตรวจสอบแล้ว รายงานจุดบกพร่องใหม่',
 
 # Search suggestions
 'searchsuggest-search' => 'ค้นหา',
 'searchsuggest-containing' => 'ประกอบไปด้วย...',
 
 # API errors
+'api-error-badaccess-groups' => 'คุณไม่ได้รับอนุญาตให้อัปโหลดไฟล์มายังวิกินี้',
 'api-error-empty-file' => 'ไฟล์ที่คุณส่งมานั้นว่าง',
 'api-error-emptypage' => 'ไม่อนุญาตให้สร้างหน้าใหม่ที่ว่าง',
 'api-error-file-too-large' => 'ไฟล์ที่คุณส่งมาใหญ่เกินไป',
 'api-error-filename-tooshort' => 'ชื่อไฟล์สั้นเกินไป',
 'api-error-filetype-banned' => 'ไฟล์ประเภทนี้ถูกห้าม',
 'api-error-mustbeloggedin' => 'กรุณาลงชื่อเข้าใช้เพื่ออัปโหลดไฟล์',
+'api-error-uploaddisabled' => 'การอัปโหลดถูกปิดใช้งานบนวิกินี้',
 
 # Durations
 'duration-seconds' => '$1 วินาที',
index f8c609a..4957e48 100644 (file)
@@ -176,8 +176,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ipakita ang bilang ng mga nagbabantay na tagagamit',
 'tog-oldsig' => 'Umiiral na lagda:',
 'tog-fancysig' => 'Ituring ang lagda bilang teksto ng wiki (walang automatikong pagkawing)',
-'tog-externaleditor' => 'Gumamit ng nakatakdang panlabas na pampatnugot ayon sa likas na pagkakatakda (para sa mga dalubhasa lamang, kailangan ng natatanging mga pagtatakda sa iyong kompyuter. [//www.mediawiki.org/wiki/Manual:External_editors Marami pang kabatiran.])',
-'tog-externaldiff' => 'Gumamit ng likas na nakatakdang panlabas na pagkakaiba (para sa mga dalubhasa lamang, kailangan ng natatanging mga pagtatakda sa iyong kompyuter. [//www.mediawiki.org/wiki/Manual:External_editors Mas marami pang kabatiran.])',
 'tog-showjumplinks' => 'Payagan ang mga "tumalon sa" na kawing pampagamit',
 'tog-uselivepreview' => 'Gamitin ang buhay na paunang tingin (JavaScript) (Eksperimental)',
 'tog-forceeditsummary' => 'Pagsabihan ako kapag nagpapasok ng walang-lamang buod ng pagbabago',
@@ -192,6 +190,7 @@ $messages = array(
 'tog-showhiddencats' => 'Ipakita ang mga nakatagong kategorya',
 'tog-noconvertlink' => 'Huwag paganahin ang pagpapalit ng pamagat na pangkawing',
 'tog-norollbackdiff' => 'Alisin ang mga pagkakaiba pagkatapos isagawa ang pagpapagulong na pabalik sa dati',
+'tog-useeditwarning' => 'Magbabala sa akin kapag umalis ako sa isang pahina ng pampatnugot na hindi pa nasasagip ang mga pagbabago',
 
 'underline-always' => 'Palagi',
 'underline-never' => 'Hindi magpakailanman',
@@ -950,6 +949,8 @@ Tila binura na ito.',
 'edit-already-exists' => 'Hindi makalikha ng isang bagong pahina.
 Umiiral na ito.',
 'defaultmessagetext' => 'Nakatakdang teksto ng mensahe',
+'editwarning-warning' => 'Ang paglisan mula sa pahinang ito ay maaaring makasanhi sa iyo ng pagkawala ng anumang mga pagbabagong ginawa mo.
+Kung nakalagda ka, maaari mong huwag paganahin ang babalang ito sa loob ng seksyong "May binabago" ng mga nais mo.',
 
 # Content models
 'content-model-wikitext' => 'wikiteksto',
@@ -1231,15 +1232,6 @@ Subuking lagyan ng unlapi/paunang ''all:'' upang hanapin ang lahat ng mga nialal
 'search-external' => 'Panlabas na paghahanap',
 'searchdisabled' => 'Nakapatay ang paghahanap sa {{SITENAME}}. Maaari kang pansamantalang maghanap sa pamamagitan ng Google. Tandaan na maaaring luma na ang kanilang mga indeks sa nilalaman ng {{SITENAME}}.',
 
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Wala',
-'qbsettings-fixedleft' => 'Inayos ang kaliwa',
-'qbsettings-fixedright' => 'Inayos ang kanan',
-'qbsettings-floatingleft' => 'Kaliwa lumulutang',
-'qbsettings-floatingright' => 'Kanan lumulutang',
-'qbsettings-directionality' => 'Naayos na, ayon sa kapupuntahan ng panitik ng wika mo',
-
 # Preferences page
 'preferences' => 'Mga kagustuhan',
 'mypreferences' => 'Mga nais',
@@ -1797,7 +1789,6 @@ Para sa pinakamatatag na kaligtasan, hindi pinagana ang img_auth.php.',
 'http-read-error' => 'Kamalian sa pagbasa ng HTTP.',
 'http-timed-out' => 'Huminto ang kahilingang HTTP.',
 'http-curl-error' => 'Kamalian sa pagsalok ng URL: $1',
-'http-host-unreachable' => 'Hindi marating ang URL.',
 'http-bad-status' => 'Nagkaroon ng suliranin habang hinihiling ang HTTP na: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2119,15 +2110,6 @@ Sinusuportahang mga protokolo: <code>$1</code> (huwag idagdag ang anuman sa mga
 'listusers-noresult' => 'Walang nahanap na tagagamit.',
 'listusers-blocked' => '(hinarang)',
 
-# Special:ActiveUsers
-'activeusers' => 'Tala ng mga aktibong tagagamit',
-'activeusers-intro' => 'Isa itong talaan ng mga tagagamit na nagkaroon ng ilang uri ng galaw sa loob ng huling $1 {{PLURAL:$1|araw|mga araw}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|pagbabago|mga pagbabago}} sa loob ng huling {{PLURAL:$3|araw|$3 mga araw}}',
-'activeusers-from' => 'Ipakita ang mga tagagamit simula sa:',
-'activeusers-hidebots' => 'Itago ang mga bots',
-'activeusers-hidesysops' => 'Itago ang mga tagapangasiwa',
-'activeusers-noresult' => 'Walang natagpuang mga tagagamit.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Mga uri ng tagagamit',
 'listgrouprights-summary' => 'Ang sumusunod ay isang talaan ng mga pangkat ng tagagamit na binigyang kahulugang sa wiking ito, kasama ang kanilang mga kaugnay na mga karapatan.
@@ -2924,13 +2906,8 @@ 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 */',
@@ -2943,13 +2920,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 +2987,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 +3081,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',
index 78b8008..5d5a996 100644 (file)
@@ -377,8 +377,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 +391,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',
@@ -457,6 +456,16 @@ $messages = array(
 'nov' => 'Kas',
 'dec' => 'Ara',
 
+'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ü',
+'today-at' => '$1',
+'yesterday-at' => '$1 dün itibariyle',
+
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategori|Kategoriler}}',
 'category_header' => '"$1" kategorisindeki sayfalar',
@@ -1103,6 +1112,8 @@ Sayfa zaten mevcut.',
 'defaultmessagetext' => 'Varsayılan mesaj metni',
 'invalid-content-data' => 'Geçersiz içerik verisi',
 'content-not-allowed-here' => '"$1" içeriğine, [[$2]] sayfasında izin verilmemekte.',
+'editwarning-warning' => 'Bu sayfadan ayrılmak yaptığınız herhangi bir değişikliği kaybetmenize sebep olabilir.
+Eğer giriş yaptıysanız, bu uyarıyı, tercihlerinizin "{{int:prefs-editing}}" bölümünde devre dışı bırakabilirsiniz.',
 
 # Content models
 'content-model-wikitext' => 'vikimetin',
@@ -1381,15 +1392,6 @@ Aramanızın başına '''all:''' önekini ekleyerek tüm içeriği aramayı (tar
 'search-external' => 'Dış arama',
 'searchdisabled' => '{{SITENAME}} sitesinde arama yapma geçici olarak durdurulmuştur. Bu arada Google kullanarak {{SITENAME}} içinde arama yapabilirsiniz. Arama sitelerinde dizinlerin biraz eski kalmış olabileceğini göz önünde bulundurunuz.',
 
-# Quickbar
-'qbsettings' => 'Hızlı erişim sütun ayarları',
-'qbsettings-none' => 'Hiçbiri',
-'qbsettings-fixedleft' => 'Sola sabitlendi',
-'qbsettings-fixedright' => 'Sağa sabitlendi',
-'qbsettings-floatingleft' => 'Sola yaslanıyor',
-'qbsettings-floatingright' => 'Sağa yaslanıyor',
-'qbsettings-directionality' => 'Sabit, dilinizin komut dosyasının yönüne bağlı',
-
 # Preferences page
 'preferences' => 'Tercihler',
 'mypreferences' => 'Tercihler',
@@ -1912,7 +1914,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>
@@ -2221,15 +2222,6 @@ Desteklenen {{PLURAL:$2|iletişim kuralı|iletişim kuralları}}: <code>$1</code
 'listusers-noresult' => 'Kullanıcı bulunamadı.',
 'listusers-blocked' => '(engellenmiş)',
 
-# Special:ActiveUsers
-'activeusers' => 'Aktif kullanıcı listesi',
-'activeusers-intro' => 'Bu, son $1 {{PLURAL:$1|günde|günde}} bir çeşit etkinlik göstermiş kullanıcıların listesidir.',
-'activeusers-count' => 'Son {{PLURAL:$3|günde|$3 günde}} $1 {{PLURAL:$1|eylem|eylem}}',
-'activeusers-from' => 'Şununla başlayan kullanıcıları görüntüle:',
-'activeusers-hidebots' => 'Botları gizle',
-'activeusers-hidesysops' => 'Yöneticileri gizle',
-'activeusers-noresult' => 'Kullanıcı bulunamadı.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Kullanıcı grubu hakları',
 'listgrouprights-summary' => 'Aşağıdaki bu vikide tanımlanan kullanıcı gruplarının, ilgili erişim haklarıyla birlikte listesidir.
@@ -3078,10 +3070,6 @@ Geçici dosya kayıp.',
 'pageinfo-category-files' => 'Dosya sayısı',
 
 # Skin names
-'skinname-standard' => 'Klasik',
-'skinname-nostalgia' => 'Nostaljik',
-'skinname-chick' => 'Şık',
-'skinname-simple' => 'Basit',
 'skinname-modern' => 'Modern',
 
 # Patrolling
@@ -3985,4 +3973,8 @@ Resimler tam çözünürlükte görüntülenir, diğer dosya tipleri ilgili prog
 'duration-centuries' => '$1 {{PLURAL:$1|yüzyıl|yüzyıl}}',
 'duration-millennia' => '$1 {{PLURAL:$1|bin yıl|bin yıl}}',
 
+# Unknown messages
+'hours-ago' => '$1 {{PLURAL:$1|saat|saat}} önce',
+'minutes-ago' => '$1 {{PLURAL:$1|dakika|dakika}} önce',
+'seconds-ago' => '$1 {{PLURAL:$1|saniye|saniye}} önce',
 );
index e308178..53cd450 100644 (file)
@@ -13,6 +13,7 @@
  * @author Haqmar
  * @author Himiq Dzyu
  * @author KhayR
+ * @author MF-Warburg
  * @author Marat Vildanov
  * @author Reedy
  * @author Rinatus
@@ -239,8 +240,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Битне күзәтү исемлекләренә өстәгән кулланучылар санын күрсәтелсен',
 'tog-oldsig' => 'Хәзерге имза:',
 'tog-fancysig' => 'Имзаның шәхси вики-билгеләмәсе (автоматик сылтамасыз)',
-'tog-externaleditor' => 'Тышкы редактор куллану (бары тик белгечләргә генә һәм санак махсус көйләнгән булу зарур; [//www.mediawiki.org/wiki/Manual:External_editors тулырак...])',
-'tog-externaldiff' => 'Тышкы версия чагыштыру программасын куллану (бары тик белгечләр өчен һшм санак махсус көйләнгән булу зарур; [//www.mediawiki.org/wiki/Manual:External_editors тулырак...])',
 'tog-showjumplinks' => '«Күчү» ярдәмче сылтамалары ялгансын',
 'tog-uselivepreview' => 'Тиз карап алу кулланылсын (JavaScript, эксперименталь)',
 'tog-forceeditsummary' => 'Үзгәртүләрне тасвирлау юлы тутырылмаган булса, кисәтү',
@@ -254,6 +253,7 @@ $messages = array(
 'tog-diffonly' => 'Юрама чагыштыру астында бит эчтәлеге күрсәтелмәсен',
 'tog-showhiddencats' => 'Яшерен төркемнәр күрсәтелсен',
 'tog-norollbackdiff' => 'Кире кайтару ясагач юрамалар аермасы күрсәтелмәсен',
+'tog-useeditwarning' => 'Битне сакламыйча китү вакытында мине кисәтергә',
 
 'underline-always' => 'Һәрвакыт',
 'underline-never' => 'Бервакытта да',
@@ -952,6 +952,8 @@ $2
 'edit-no-change' => 'Текстта үзгәешләр ясалмау сәбәпле, сезнең үзгәртү кире кагыла.',
 'edit-already-exists' => 'Яңа бит төзеп булмый.
 Ул инде бар.',
+'editwarning-warning' => 'Башка биткә күчү вакытында бу мәкаләгә керткән үзгәрешләр югалырга мөмкин.
+Әгәрдә сез теркәлгән булсагыз, бу искәрмәне сез «Көйләнмәләрем» өлешендә үзгәртә аласыз.',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Игътибар:''' бу биттә хәтерне еш кулланучы функцияләр артык күп.
@@ -1169,14 +1171,6 @@ $1",
 'powersearch-togglenone' => 'Бирни дә юк',
 'search-external' => 'Тышкы эзләү',
 
-# Quickbar
-'qbsettings' => 'Күчешләр аслыгы',
-'qbsettings-none' => 'Күрсәтмәү',
-'qbsettings-fixedleft' => 'Сулда күчерелмәс',
-'qbsettings-fixedright' => 'Уңда күчерелмәс',
-'qbsettings-floatingleft' => 'Сулда йөзмә',
-'qbsettings-floatingright' => 'Уңда йөзмә',
-
 # Preferences page
 'preferences' => 'Көйләнмәләр',
 'mypreferences' => 'Көйләнмәләр',
@@ -1703,12 +1697,6 @@ PICT # төрле
 'listusers-noresult' => 'Кулланучыларны табылмады.',
 'listusers-blocked' => '(тыелган)',
 
-# Special:ActiveUsers
-'activeusers' => 'Актив кулланучылар исемлеге',
-'activeusers-hidebots' => 'Ботларны яшер',
-'activeusers-hidesysops' => 'Идарәчеләрне яшер',
-'activeusers-noresult' => 'Кулланучылар табылмады.',
-
 # Special:ListGroupRights
 'listgrouprights' => 'Кулланучы төркемнәренең хокуклары',
 'listgrouprights-group' => 'Төркем',
@@ -1911,7 +1899,7 @@ $1',
 'blanknamespace' => '(Төп)',
 
 # Contributions
-'contributions' => '{{GENDER:$1|Кулланучының} кертеме',
+'contributions' => '{{GENDER:$1|Кулланучының}} кертеме',
 'contributions-title' => '$1 исемле кулланучының кертеме',
 'mycontris' => 'Кертем',
 'contribsub2' => '$1 ($2) өчен',
@@ -2161,14 +2149,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' => 'Сызымлы',
 
index ec55bcb..eefdd5f 100644 (file)
@@ -66,9 +66,6 @@ $messages = array(
 'tog-shownumberswatching' => 'بۇ بەتنى كۆزىتىۋاتقان ئىشلەتكۈچى سانىنى كۆرسەت',
 'tog-oldsig' => 'نۆۋەتتىكى ئىمزا:',
 'tog-fancysig' => 'ئىمزاغا wiki تېكستى سۈپىتىدە مۇئامىلە قىل (ئۆزلۈكىدىن ئۇلانما ھاسىل بولمايدۇ)',
-'tog-externaleditor' => 'كۆڭۈلدىكى ئەھۋالدا سىرتقى تەھرىرلىگۈچ ئىشلىتىدۇ (ئالىي ئىشلەتكۈچىگە تەمىنلىنىدۇ، كومپيۇتېرىڭىزدا بىر قىسىم ئالاھىدە تەڭشەش ئېلىپ بېرىشىڭىز لازىم
-[//www.mediawiki.org/wiki/Manual:External_editors تېخىمۇ كۆپ ئۇچۇر.])',
-'tog-externaldiff' => 'كۆڭۈلدىكى ئەھۋالدا سىرتقى پەرق تەھلىلى ئىشلىتىدۇ (ئالىي ئىشلەتكۈچىگە تەمىنلىنىدۇ، كومپيۇتېرىڭىزدا بىر قىسىم ئالاھىدە تەڭشەش ئېلىپ بېرىشىڭىز لازىم. [//www.mediawiki.org/wiki/Manual:External_editors تېخىمۇ كۆپ ئۇچۇر.])',
 'tog-showjumplinks' => '"ئاتلا" زىيارەت ئۇلانمىسىنى قوزغات',
 'tog-uselivepreview' => 'رىئال ۋاقىتلىق ئالدىن كۆزىتىشنى ئىشلەت (JavaScript زۆرۈر) (سىناق)',
 'tog-forceeditsummary' => 'ئۈزۈندە كىرگۈزمىگەندە مېنى ئەسكەرت',
@@ -1156,15 +1153,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 +1714,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>
@@ -2049,15 +2036,6 @@ 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' => 'تۆۋەندىكىسى بۇ wiki دا ئېنىقلىما بېرىلگەن ئىشلەتكۈچى ھوقۇق چېكى تىزىملىكى ۋە ئۇلارنىڭ زىيارەت ھوقۇق چېكى.
@@ -2886,13 +2864,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 +2877,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 +2958,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 +3058,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',
index 905fffb..cb22aef 100644 (file)
@@ -36,6 +36,7 @@
  * @author RLuts
  * @author Riwnodennyk
  * @author Sodmy
+ * @author Ua2004
  * @author Urhixidur
  * @author VolodymyrF
  * @author Vox
@@ -772,9 +773,20 @@ $1',
 'welcomecreation-msg' => 'Ваш акаунт було створено.
 Не забудьте змінити свої [[Special:Preferences|налаштування у {{GRAMMAR:genitive|{{SITENAME}}}}]].',
 'yourname' => "Ім'я користувача:",
+'userlogin-yourname' => "Ім'я користувача",
+'userlogin-yourname-ph' => "Введіть ім'я користувача",
+'createacct-helpusername-url' => '{{ns:Project}}:Імена_користувачів',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(допоможіть мені вибрати)]]',
 '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 +799,37 @@ $1',
 'logout' => 'Вихід із системи',
 'userlogout' => 'Вихід із системи',
 'notloggedin' => 'Ви не ввійшли до системи',
+'userlogin-noaccount' => 'Немає облікового запису?',
+'userlogin-joinproject' => 'Приєднатися до {{SITENAME}}',
 'nologin' => "Ви ще не зареєструвались? '''$1'''.",
 'nologinlink' => 'Створіть обліковий запис',
 'createaccount' => 'Зареєструватися',
 'gotaccount' => "Ви вже зареєстровані? '''$1'''.",
 'gotaccountlink' => 'Увійдіть',
 'userlogin-resetlink' => 'Забули дані, потрібні для входу?',
+'helplogin-url' => 'Help:Вхід до системи',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Допомога в реєстрації]]',
+'createacct-join' => 'Введіть вашу інформацію нижче.',
+'createacct-emailrequired' => 'Адреса електронної пошти',
+'createacct-emailoptional' => "Адреса електронної пошти (не обов'язково)",
+'createacct-email-ph' => 'Введіть Вашу адресу електронної пошти',
 'createaccountmail' => 'Використати тимчасовий випадковий пароль і надіслати його на адресу електронної пошти, вказану нижче',
+'createacct-realname' => "Справжнє ім'я (не обов'язково)",
 'createaccountreason' => 'Причина:',
+'createacct-reason' => 'Причина',
+'createacct-captcha' => 'Перевірка безпеки',
+'createacct-captcha-help-url' => '{{ns:Project}}:Запити на облікові записи',
+'createacct-imgcaptcha-help' => 'Не бачите зображення? [[{{MediaWiki:createacct-captcha-help-url}}|Зробіть запит на обліковий запис]]',
+'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}} використовує куки для входу до системи.
@@ -843,8 +874,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-адреси не можуть на цей момент створювати нових облікових записів.',
@@ -897,6 +928,7 @@ $1',
 'passwordreset-text' => 'Заповніть цю форму для відновлення пароля.',
 'passwordreset-legend' => 'Перевстановити пароль',
 'passwordreset-disabled' => 'У цій вікі вимкнена можливість скидання пароля.',
+'passwordreset-emaildisabled' => 'Функції електронної пошти вимкнуто в цій вікі.',
 'passwordreset-pretext' => '{{PLURAL:$1||Введіть одну з частин даних}}',
 'passwordreset-username' => "Ім'я користувача:",
 'passwordreset-domain' => 'Домен:',
@@ -908,7 +940,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 +952,7 @@ $2
 Тимчасовий пароль: $2",
 'passwordreset-emailsent' => 'Електронний лист для відновлення пароля відправлений.',
 'passwordreset-emailsent-capture' => 'Електронний лист скидання паролю було надіслано, як показано нижче.',
-'passwordreset-emailerror-capture' => 'Електронний лист для відновлення пароля мав бути надісланий, як показано нижче, але його надсилання користувачеві $1 не вдалося.',
+'passwordreset-emailerror-capture' => 'Електронний лист для відновлення пароля мав бути надісланий, як показано нижче, але його надсилання {{GENDER:$2|користувачеві|користувачці}} $1 не вдалося.',
 
 # Special:ChangeEmail
 'changeemail' => 'Змінити адресу електронної пошти',
@@ -1430,6 +1462,7 @@ $1",
 'powersearch-togglenone' => 'Жодний',
 'search-external' => 'Зовнішній пошук',
 'searchdisabled' => '<p>Вибачте, повнотекстовий пошук тимчасово недоступний через перевантаження сервера; передбачається, що ця функція буде знову включена після установки нового обладнання. Поки що ми пропонуємо вам скористатися Google чи Yahoo!:</p>',
+'search-error' => 'Сталася помилка під час пошуку:$1',
 
 # Preferences page
 'preferences' => 'Налаштування',
@@ -2325,6 +2358,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 +2438,7 @@ $1',
 'addedwatchtext' => "Сторінку «[[:$1]]» додано до вашого [[Special:Watchlist|списку спостереження]].
 Подальші редагування цієї сторінки (та пов'язаної з нею сторінки обговорення) відображатимуться в цьому списку.",
 'removewatch' => 'Видалити зі списку спостереження',
-'removedwatchtext' => 'Сторінка «[[:$1]]» вилучена з вашого [[Special:Watchlist|списку спостереження]].',
+'removedwatchtext' => 'Сторінку «[[:$1]]» вилучено з вашого [[Special:Watchlist|списку спостереження]].',
 'watch' => 'Спостерігати',
 'watchthispage' => 'Спостерігати за цією сторінкою',
 'unwatch' => 'Скас. спостереження',
@@ -2814,6 +2856,7 @@ $1',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'Ваша IP-адреса числиться як відкритий проксі в DNSBL.',
 'sorbs_create_account_reason' => 'Ваша IP-адреса числиться як відкритий проксі в DNSBL. Ви не можете створити обліковий запис.',
+'xffblockreason' => 'IP-адреса в X-Forwarded-For полі заголовка, або ваша, або проксі сервера, що використовується вами, заблокована. Початкова причина блокування була:$1',
 'cant-block-while-blocked' => 'Ви не можете блокувати інших користувачів, поки ви самі заблоковані.',
 'cant-see-hidden-user' => 'Користувача, якого ви хочете заблокувати, вже заблоковано та приховано. Оскільки у вас немає прав щодо приховання користувачів, ви не можете переглянути або змінити дане блокування.',
 'ipbblocked' => 'Ви не можете блокувати чи розблоковувати інших користувачів, оскільки самі заблоковані',
@@ -3315,11 +3358,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 +3386,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',
@@ -4108,13 +4163,6 @@ 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:FileDuplicateSearch
 'fileduplicatesearch' => 'Пошук файлів-дублікатів',
 'fileduplicatesearch-summary' => 'Пошук дублікатів файлів на основі хеш-значень.',
@@ -4204,6 +4252,8 @@ MediaWiki поширюється в надії, що вона буде кори
 'htmlform-submit' => 'Відправити',
 'htmlform-reset' => 'Відкотити зміни',
 'htmlform-selectorother-other' => 'Інше',
+'htmlform-no' => 'Ні',
+'htmlform-yes' => 'Так',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 з підтримкою повнотекстового пошуку',
@@ -4235,11 +4285,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-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..b98bf29 100644 (file)
@@ -11,6 +11,7 @@
  * @author Istabani
  * @author Meno25
  * @author Muhammad Shuaib
+ * @author Noor2020
  * @author O.bangash
  * @author Rachitrali
  * @author Reedy
@@ -186,9 +187,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 +199,7 @@ $messages = array(
 'tog-ccmeonemails' => 'دیگر صارفین کو ارسال کردہ برقی خطوط کی نقول مجھے ارسال کریں۔',
 'tog-diffonly' => 'مختلفات کے نیچے صفحے کی مشمولات مت دکھاؤ',
 'tog-showhiddencats' => 'پوشیدہ زمرہ جات دکھاؤ',
+'tog-useeditwarning' => 'خبردار مجھے جب میں غیر محفوظ کردہ تبدیلیوں کے ساتھ ایک ترمیم کے صفحے کو چھوڑ دو',
 
 'underline-always' => 'ہمیشہ',
 'underline-never' => 'کبھی نہیں',
@@ -538,8 +537,13 @@ Warning: Page may not contain recent updates.',
 
 آپ گمنام طور پر {{SITENAME}}  کا استعمال جاری رکھ سکتے ہیں، یا دوبارہ اسی نام یا مختلف نام سے <span class='plainlinks'>[$1 دوبارہ داخلِ نوشتہ]</span> بھی ہو سکتے ہیں۔  یہ یاد آوری کرلیجیۓ کہ کچھ صفحات ایسے نظر آتے رہیں گے کہ جیسے ابھی آپ خارج نہیں ہوئے ، جب تک آپ اپنے متصفح کا ابطن صاف نہ کردیں۔",
 'yourname' => 'اسمِ رکنیت',
+'createacct-helpusername-url' => '{{ns:Project}}: Username_policy',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(بنانے میں مدد کریں)]]',
 'yourpassword' => 'کلمۂ شناخت',
+'createacct-yourpassword-ph' => 'ایک پاس ورڈ داخل کریں',
 'yourpasswordagain' => 'کلمۂ شناخت دوبارہ لکھیں',
+'createacct-yourpasswordagain' => 'کلمۂ اجازت تصدیق کریں',
+'createacct-yourpasswordagain-ph' => 'پاس ورڈ پھر داخل کریں',
 'remembermypassword' => 'اِس متصفح پر میرے داخلِ نوشتگی معلومات یاد رکھو (زیادہ سے زیادہ $1 {{PLURAL:$1|دِن|ایام}} کیلئے)',
 'yourdomainname' => 'آپکا ڈومین',
 'password-change-forbidden' => 'آپ اس ویکی پر پارلفظ (پاس روڈ) تبدیل نہیں کر سکتے',
@@ -558,12 +562,28 @@ 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-captcha-help-url' => '{{ns:Project}}: ایک اکاؤنٹ کی درخواست کریں',
+'createacct-imgcaptcha-help' => 'یہ تصویر نہیں دیکھ سکتے؟
+[[{{MediaWiki:createacct-captcha-help-url}}|اکاؤنٹ بنانے کے لیے درخواست کریں]]',
+'createacct-imgcaptcha-ph' => 'آپ اوپر دیکھ متن داخل کریں',
+'createacct-benefit-heading' => '{{SITENAME}} آپ جیسے لوگوں کی طرف سے بنایا گیا ہے ۔',
+'createacct-benefit-body1' => 'ترمیم',
+'createacct-benefit-body2' => 'صفحات',
+'createacct-benefit-body3' => 'شرکت کرنے والے اس ماہ کے',
 'badretype' => 'درج شدہ کلمۂ شناخت اصل سے مطابقت نہیں رکھتا۔',
 'userexists' => 'داخل کردہ اسم صارف پہلے سے مستعمل ہے۔
 براہِ کرم! کوئی دوسرا اسم منتخب کیجئے۔',
 'loginerror' => 'داخلے میں غلطی',
+'createacct-error' => 'تخلیق کھاتہ میں نقص',
 'createaccounterror' => 'کھاتہ $1 بنایا نہیں جاسکا',
 'nocookiesnew' => 'کھاتۂ صارف بنادیا گیا ہے، لیکن آپ کا داخلہ نہیں ہوا.
 صارفین کے داخلہ کیلئے {{SITENAME}} کوکیز استعمال کرتا ہے.
@@ -944,10 +964,6 @@ $1",
 آپ فی الحال گوگل کے ذریعے تلاش کرسکتے ہیں.
 یاد رکھئے کہ اُن کے {{SITENAME}} اشاریے ممکناً پرانے ہوسکتے ہیں.',
 
-# Quickbar
-'qbsettings' => 'فوری‌بار',
-'qbsettings-none' => 'ہیچ',
-
 # Preferences page
 'preferences' => 'ترجیحات',
 'mypreferences' => 'میری ترجیہات',
@@ -1567,6 +1583,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..3070cee 100644 (file)
@@ -113,7 +113,7 @@ $messages = array(
 'tog-usenewrc' => 'Yangi oʻzgarishlar va kuzatuv roʻyxatidagi sahifalarni guruhlarga boʻlish (JavaScript orqali)',
 'tog-numberheadings' => 'Sarlavhalarni avtomatik raqamlash',
 'tog-showtoolbar' => 'Tahrirlash asboblari joylashgan yoʻlakchani koʻrsatish (JavaScript orqali)',
-'tog-editondblclick' => 'Sichqoncha tugmasini ikki martagina bosib tahrirlashni boshlash',
+'tog-editondblclick' => 'Sichqoncha tugmasini ikki marta bosish orqali tahrirlashni boshlash',
 'tog-editsection' => '[tahrir] havolasini har bir boʻlim boshida koʻrsatish',
 'tog-editsectiononrightclick' => 'Boʻlim sarlavhasiga sichqonchaning oʻng tugmasi bilan bosib tahrirlashni boshlash',
 'tog-showtoc' => 'Mundarijani koʻrsatish (3 tadan koʻproq sarlavha bor sahifalarda)',
@@ -126,14 +126,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 +142,12 @@ $messages = array(
 'tog-watchlisthideliu' => 'Tizimga kirgan foydalanuvchilar tahrirlari kuzatuv roʻyxatimda koʻrsatilmasin',
 'tog-watchlisthideanons' => 'Anonim foydalanuvchilar tahrirlari kuzatuv roʻyxatimda koʻrsatilmasin',
 'tog-watchlisthidepatrolled' => 'Tekshirilgan tahrirlar kuzatuv roʻyxatimda koʻrsatilmasin',
-'tog-ccmeonemails' => 'Boshqa ishtirokchilarga yozgan xatimning nusxasi oʻzimning e-pochtamga joʻnatilsin.',
+'tog-ccmeonemails' => 'Boshqa ishtirokchilarga yozgan xatimning nusxasi oʻzimga yuborilsin',
 'tog-diffonly' => 'Versiyalar taqqoslanayotganda, pastda sahifa matni koʻrsatilmasin',
 'tog-showhiddencats' => 'Yashirin turkumlarni koʻrsatish',
 'tog-noconvertlink' => "Sarlavhaga aylantirish dastagini o'chirib qo'yish",
-'tog-norollbackdiff' => 'Tahrir qaytarilganda, versiyalar taqqosini koʻrsatish kerak emas',
+'tog-norollbackdiff' => 'Tahrir qaytarilganda, versiyalar taqqosi koʻrsatilmasin',
+'tog-useeditwarning' => 'Kiritgan oʻzgarishlarimni saqlamay sahifadan chiqib ketayotganim haqida ogohlantirilsin',
 
 'underline-always' => 'Har doim',
 'underline-never' => 'Hech qachon',
@@ -361,8 +362,8 @@ $1',
 'badaccess-groups' => "So'ralgan amallarni kamida $1 {{PLURAL:$2|guruhi|guruhlari}} foydalanuvchilarigina amalga oshirishi mumkin.",
 
 'versionrequired' => '$1 versiyasidagi MediaWiki talab etiladi',
-'versionrequiredtext' => "Ushbu sahifani bilan ishlash uchun $1 versiyasidagi MediaWiki talab etiladi.
-[[Special:Version|Dasturiy ta'minot haqida axborot]]ni ko'ring.",
+'versionrequiredtext' => 'Bu sahifada ishlash uchun MediaWikining $1-versiyasi talab etiladi.
+[[Special:Version|Dasturiy taʼminot haqida axborot]]ni koʻring.',
 
 'ok' => 'OK',
 'retrievedfrom' => ' "$1" dan olindi',
@@ -429,9 +430,9 @@ $1',
 'actionthrottled' => "Tezlik bo'yicha cheklov",
 '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.',
@@ -450,7 +451,7 @@ Ushbu xabar tarjimasini qo'shish yoki o'zgartirish uchun, iltimos, MediaWikining
 {{SITENAME}} saytidan anonim holda foydalanishda davom etishindiz mumkin. Yoki siz yana hozirgi yoki boshqa foydalanuvchi nomi bilan qaytadan tizimga kirishingiz mumkin.
 Shuni e'tiborga olingki, ayrim sahifalar siz brauzeringiz keshini tozalamaguningizga qadar xuddi tizimga kirganingizdagidek ko'rinishda davom etaverishi mumkin.",
 'yourname' => 'Foydalanuvchi nomi',
-'yourpassword' => 'Maxfiy soʻz',
+'yourpassword' => 'Maxfiy soʻz:',
 'yourpasswordagain' => 'Maxfiy so‘zni qayta kiriting:',
 'remembermypassword' => 'Hisob ma’lumotlarim ushbu brauzerda eslab qolinsin (ko‘pi bilan $1 {{PLURAL:$1|kunga|kunga}})',
 'securelogin-stick-https' => "Kirgandan keyin HTTPS bo'yicha ulanishni davom ettirish",
@@ -485,7 +486,7 @@ Ism yozilishini tekshirib koʻring.',
 'wrongpasswordempty' => "Iltimos, bo'sh bo'lmagan maxfiy so'z kiriting.",
 'mailmypassword' => "Elektron pochta orqali yangi maxfiy so'zni jo'natish",
 'passwordremindertitle' => "{{SITENAME}} uchun vaqtinchalik yangi maxfiy so'z",
-'emailauthenticated' => 'Sizning e-mail manzilingiz $2, $3 da tasdiqlangan.',
+'emailauthenticated' => 'Sizning elektron pochta manzilingiz $2, $3 da tasdiqlangan.',
 'emailconfirmlink' => 'Sizning elektron pochta manzilingizni tasdiqlash',
 'emaildisabled' => 'Bu sayt elektron pochta xatlarini yubora olmaydi.',
 'accountcreated' => 'Hisob yozuvi yaratildi',
@@ -553,7 +554,7 @@ Vaqtinchalik maxfiy so'z: $2",
 'summary-preview' => "Tavsif shunday bo'ladi:",
 'subject-preview' => "Sarlavha shunday bo'ladi:",
 'blockedtitle' => 'Foydalanuvchi chetlashtirildi',
-'blockedtext' => "'''Siz (foydalanuvchi ismingiz yoki IP manzilingiz) tahrir qilishdan chetlashtirildingiz.'''
+'blockedtext' => "'''Siz (foydalanuvchi nomingiz yoki IP manzilingiz) tahrir qilishdan chetlashtirildingiz.'''
 
 Sizni $1 chetlashtirdi. Bunga sabab: ''$2''.
 
@@ -562,7 +563,7 @@ Sizni $1 chetlashtirdi. Bunga sabab: ''$2''.
 * Chetlashtirish maqsadi: $7
 
 Siz $1 yoki boshqa [[{{MediaWiki:Grouppage-sysop}}|administrator]] bilan bogʻlanib, arz qilishingiz mumkin.
-You cannot use the 'e-mail this user' feature unless a valid e-mail address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.
+Siz «foydalanuvchiga maktub» xizmatidan foydalana olmaysiz, agarda: a) shaxsiy moslamalaringizda haqiqiy e-pochta manzilingiz koʻrsatilmagan yoki tasdiqlanmagan boʻlsa, b) chetlatish shartlarida bu xizmat toʻsilgan boʻlsa.
 Sizning hozirgi IP manzilingiz - $3, chetlashtirish raqamingiz - #$5. Arizaga bularni ilova qilishingiz mumkin.",
 'blockednoreason' => "sabab ko'rsatilmadi",
 'whitelistedittext' => "Siz sahifalarni o'zgartirish uchun $1.",
@@ -710,7 +711,7 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 # Search results
 'searchresults' => 'Qidiruv natijalari',
 'searchresults-title' => '"$1" uchun qidiruv natijalari',
-'searchresulttext' => "{{SITENAME}}da qidirish haqida qo'shimcha ma'lumotga ega bo'lishini xoxlasangiz, [[{{MediaWiki:Helppage}}|{{SITENAME}}da qidiruv]] sahifasini o'qing.",
+'searchresulttext' => '{{SITENAME}}da qidirish haqida qoʻshimcha maʼlumot olish uchun [[{{MediaWiki:Helppage}}|yordam]] sahifasiga qarang.',
 'searchsubtitle' => '\'\'\'[[:$1]]\'\'\'ni qidirdingiz ([[Special:Prefixindex/$1|"$1" bilan boshlanadigan sahifalar]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1"ga bogʻlangan sahifalar]])',
 'searchsubtitleinvalid' => "'''$1'''ni qidirdingiz",
 'toomanymatches' => "Juda ko'p o'xshashliklar topildi, iltimos, boshqa so'rov bilan urinib ko'ring",
@@ -731,9 +732,9 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'searchmenu-prefix' => "[[Special:PrefixIndex/$1|Ushbu prefiks mavjud bo'lgan sahifalarni ko'rsatish]]",
 'searchprofile-articles' => 'Asosiy sahifalar',
 'searchprofile-project' => 'Yordam va loyiha sahifalari',
-'searchprofile-images' => 'Multimediya',
+'searchprofile-images' => 'Multimedia',
 'searchprofile-everything' => 'Har yerda',
-'searchprofile-advanced' => "Qo'shimcha",
+'searchprofile-advanced' => 'Kengaytirilgan',
 'searchprofile-articles-tooltip' => '$1da qidirish',
 'searchprofile-project-tooltip' => '$1da qidirish',
 'searchprofile-images-tooltip' => 'Fayllarni qidir',
@@ -770,7 +771,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',
@@ -788,7 +789,7 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'prefs-watchlist-edits-max' => 'Eng katta son: 1000',
 'prefs-misc' => 'Boshqa moslamalar',
 'prefs-resetpass' => 'Maxfiy soʻzni oʻzgartirish',
-'prefs-changeemail' => 'E-mail manzilingizni o‘zgartirish',
+'prefs-changeemail' => 'Elektron pochta manzilini oʻzgartirish',
 'prefs-email' => 'Elektron pochta moslamalari',
 'prefs-rendering' => 'Tashqi ko‘rinishi',
 'saveprefs' => 'Saqlash',
@@ -800,10 +801,12 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'columns' => 'Ustunlar soni:',
 'searchresultshead' => 'Qidiruv',
 'resultsperpage' => 'Sahifaga topilgan yozuvlar miqdori',
-'stub-threshold' => '<a href="#" class="stub">Tayyorlanmaga havolalar</a>ni rasmiylashtirish uchun boshlash ostonasi (baytlarda).',
+'stub-threshold' => '<a href="#" class="stub">Chala maqolalarga ishorat</a> keltirish uchun pastki chegara (baytlarda):',
 'stub-threshold-disabled' => "O'chirib qo'yilgan",
-'recentchangesdays-max' => 'Eng koʻpi $1 kun',
-'recentchangescount' => 'Sukut boʻyicha koʻrsatiladigan tahrirlar soni',
+'recentchangesdays' => 'Necha kunlik tahrirlar koʻrsatiladi:',
+'recentchangesdays-max' => 'Eng koʻpi — $1 kun',
+'recentchangescount' => 'Sukut boʻyicha koʻrsatiladigan tahrirlar soni:',
+'prefs-help-recentchangescount' => 'Yangi oʻzgarishlar, tarix va qaydlar uchun.',
 'savedprefs' => 'Sizning moslamalaringiz saqlandi.',
 'timezonelegend' => 'Vaqt mintaqangiz:',
 'localtime' => 'Mahalliy vaqt:',
@@ -826,38 +829,38 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'prefs-searchoptions' => 'Qidiruv',
 'prefs-namespaces' => 'Nomfazolar',
 'defaultns' => 'Aks holda quyidagi nomfazolardan qidirish:',
-'default' => "boshlang'ich",
+'default' => 'Sukut boʻyicha',
 'prefs-files' => 'Fayllar',
 'prefs-custom-css' => 'Shaxsiy CSS',
 'prefs-custom-js' => 'Shaxsiy JavaScript',
-'prefs-common-css-js' => "Barcha tashqi ko'rinishlar uchun umumiy CSS/JavaScript:",
+'prefs-common-css-js' => 'Umumiy CSS/JavaScript (barcha tashqi koʻrinishlar uchun):',
 'prefs-emailconfirm-label' => 'Elektron pochta manzilini tasdiqlash:',
 'prefs-textboxsize' => 'Tahrir oynasining oʻlchami',
 'youremail' => 'E-mail:',
 'username' => 'Foydalanuvchi nomi',
 'uid' => 'Identifikator:',
 'prefs-memberingroups' => 'Qaysi {{PLURAL:$1|guruh|guruhlar}} aʼzosi:',
-'prefs-registration' => 'Hisob ochilgan vaqt',
+'prefs-registration' => 'Hisob yaratilgan vaqt:',
 'yourrealname' => 'Haqiqiy ism *:',
 'yourlanguage' => 'Til:',
-'yourvariant' => 'Tarkib tili varianti',
-'prefs-help-variant' => "Viki sahifalari matnini tasvirlash uchun ma'qul ko'rilgan til varianti",
-'yournick' => 'Yangi imzo',
-'prefs-help-signature' => 'Munozara sahifalarida imzo "<nowiki>~~~~</nowiki>" orqali qoʻyiladi (u sizning imzoingiz va joriy vaqtga aylantiriladi).',
+'yourvariant' => 'Yozuv turi (lotin/kirill):',
+'prefs-help-variant' => 'Ushbu vikidagi sahifalar qaysi tilda va yozuvda koʻrsatilishi.',
+'yournick' => 'Yangi imzo:',
+'prefs-help-signature' => 'Munozara sahifalarida imzo "<nowiki>~~~~</nowiki>" orqali qoʻyiladi, u sizning imzoingiz va joriy vaqtga aylantiriladi.',
 'yourgender' => 'Jinsi:',
 'gender-unknown' => 'Koʻrsatilmagan',
 'gender-male' => 'Erkak',
 'gender-female' => 'Ayol',
-'prefs-help-gender' => "Ixtiyoriy: Foydalanuvching jinsiga bog'liq bo'lgan loyihaning ayrim xabarlarida foydalaniladi.
-Ushbu axborot ommaviy xususiyatga ega bo'ladi.",
+'prefs-help-gender' => 'Koʻrsatilishi majburiy emas: taʼminot xizmatining foydalanuvchi jinsiga qarab yuboradigan ayrim xabarlarida foydalaniladi.
+Bu maʼlumot hammaga koʻrsatiladi.',
 'email' => 'E-mail:',
 'prefs-help-realname' => "Haqiqiy ism (ixtiyoriy maydon).
 Agar siz uni ko'rsatsangiz, undan sahifa tahriri kim tomonidan kiritilganligini ko'rsatish uchun foydalaniladi.",
-'prefs-help-email' => "Elektron pochta manzilini ko'rsatish majburiy emas, lekin u siz maxfiy so'zni unutib qo'ysangiz kerak bo'lishi mumkin.",
-'prefs-help-email-others' => "U shuningdek, sizning elektron pochtangiz manzilini oshkora qilmasdan, boshqa ishtirokchilar bilan shaxsiy sahifangiz orqali bog'lanish imkonini ham beradi.",
+'prefs-help-email' => 'Elektron pochta manzilini koʻrsatish majburiy emas, lekin u siz maxfiy soʻzni unutib qoʻysangiz kerak boʻladi.',
+'prefs-help-email-others' => 'Shuningdek, u boshqa foydalanuvchilarga Siz bilan shaxsiy sahifangiz yoki munozara sahifangizdagi havola orqali bogʻlanish imkonini beradi. Bunda Siz bilan bogʻlanmoqchi boʻlgan foydalanuvchiga pochta manzilingiz koʻrsatilmaydi.',
 'prefs-help-email-required' => 'E-mail manzilni koʻrsatish shart emas',
 'prefs-info' => 'Asosiy maʼlumot',
-'prefs-i18n' => 'Internatsionallashtirish',
+'prefs-i18n' => 'Baynalmilallashtirish',
 'prefs-signature' => 'Imzo',
 'prefs-dateformat' => 'Sana formati',
 'prefs-timeoffset' => 'Vaqt farqi',
@@ -923,9 +926,9 @@ Agar siz uni ko'rsatsangiz, undan sahifa tahriri kim tomonidan kiritilganligini
 # Recent changes
 'nchanges' => "$1 {{PLURAL:$1|o'zgarish|o'zgarishlar}}",
 'recentchanges' => 'Yangi oʻzgarishlar',
-'recentchanges-legend' => 'Yangi tahrirlar moslamalari',
-'recentchanges-summary' => 'Bu sahifada siz oxirgi oʻzgarishlarni koʻrishingiz mumkin.',
-'recentchanges-feed-description' => "Vikida mazkur oqimdagi oxirgi o'zgarishlarni kuzatish",
+'recentchanges-legend' => 'Yangi oʻzgarishlar moslamalari',
+'recentchanges-summary' => 'Bu sahifada siz oxirgi oʻzgarishlarni koʻrishingiz mumkin',
+'recentchanges-feed-description' => 'Vikida mazkur oqimdagi oxirgi oʻzgarishlarni kuzatish',
 'recentchanges-label-newpage' => 'Bu tahrir orqali yangi sahifa yaratildi',
 'recentchanges-label-minor' => 'Bu kichik tahrir',
 'recentchanges-label-bot' => 'Bu tahrirni bot bajardi',
@@ -938,12 +941,12 @@ Agar siz uni ko'rsatsangiz, undan sahifa tahriri kim tomonidan kiritilganligini
 'rcshowhideliu' => 'Ro‘yxatdan o‘tgan foydalanuvchilar: $1 ta',
 'rcshowhideanons' => 'Anonim foydalanuvchilar: $1 ta',
 'rcshowhidepatr' => 'Tekshirilgan tahrirlarni $1',
-'rcshowhidemine' => "O'z tahrirlarimni $1",
+'rcshowhidemine' => 'Oʻz tahrirlarimni $1',
 'rclinks' => 'Oxirgi $2 kun ichida sodir boʻlgan $1 oʻzgarishlar koʻrsatildi.<br />$3',
 'diff' => 'farq',
 'hist' => 'tarix',
-'hide' => 'Yashirish',
-'show' => 'koʻrsatish',
+'hide' => 'Yashir',
+'show' => 'Koʻrsat',
 'minoreditletter' => 'k',
 'newpageletter' => 'Y',
 'boteditletter' => 'b',
@@ -1034,7 +1037,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',
 
@@ -1119,6 +1133,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,7 +1179,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Watchlist
 'watchlist' => 'Kuzatuv roʻyxatim',
 'mywatchlist' => 'Kuzatuv roʻyxatim',
-'watchlistfor2' => '$1 $2 uchun',
+'watchlistfor2' => '$1 uchun $2',
 'nowatchlist' => "Kuzatuv ro'yxatingizda hech narsa yo'q.",
 'watchnologin' => "Siz tizimda o'zingizni tanishtirmadingiz",
 'addwatch' => "Kuzatuv ro'yxatiga qo'shish",
@@ -1314,7 +1335,7 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 # Namespace form on various pages
 'namespace' => 'Nomfazo:',
 'invert' => 'Tanlash tartibini almashtirish',
-'namespace_association' => "Bog'liq nomfazo",
+'namespace_association' => 'Bogʻliq nomfazo',
 'blanknamespace' => '(asosiy)',
 
 # Contributions
@@ -1322,7 +1343,7 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 'contributions-title' => '{{GENDER:$1|Foydalanuvchi}} $1 hissasi',
 'mycontris' => 'Hissam',
 'contribsub2' => '$1 uchun ($2)',
-'nocontribs' => "Belgilangan shartlarga muvofiq o'zgarishlar topilmadi",
+'nocontribs' => 'Belgilangan shartlarga muvofiq oʻzgarishlar topilmadi',
 'uctop' => '(oxirgi)',
 'month' => 'Oydan (va avvalroq)',
 'year' => 'Yildan (va avvalroq)',
@@ -1338,7 +1359,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 +1436,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.',
@@ -1483,10 +1504,10 @@ Umumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumi
 'tooltip-pt-anonlogin' => "Bu majburiyat bo'lmasada, kirishingiz taklif qilinadi.",
 'tooltip-pt-logout' => 'Chiqish',
 'tooltip-ca-talk' => 'Sahifa matni borasida munozara',
-'tooltip-ca-edit' => "Siz bu sahifani tahrirlashingiz mumkin. Iltimos, saqlashdan oldim ko'rib chiqish tugmasidan foydalaning.",
+'tooltip-ca-edit' => 'Siz bu sahifani tahrirlashingiz mumkin. Iltimos, saqlashdan oldin koʻrib chiqish tugmasidan foydalaning',
 'tooltip-ca-addsection' => 'Yangi boʻlim ochish',
 'tooltip-ca-viewsource' => 'Bu sahifa himoyalangan. Siz uning manbasini koʻrishingiz mumkin.',
-'tooltip-ca-history' => 'Bu sahifaning oldingi versiyalari.',
+'tooltip-ca-history' => 'Bu sahifaning oʻzgarishlar tarixi',
 'tooltip-ca-protect' => 'Bu sahifani himoyalash',
 'tooltip-ca-unprotect' => "Ushbu sahifaning himoyasini o'zgaritish",
 'tooltip-ca-delete' => 'Ushbu sahifani o‘chirish',
@@ -1549,7 +1570,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',
 
@@ -1658,7 +1679,7 @@ Umumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumi
 'specialpages' => 'Maxsus sahifalar',
 
 # Special:Tags
-'tag-filter' => '[[Special:Tags|nishonlar]] filtri:',
+'tag-filter' => '[[Special:Tags|Nishonlar]] filtri:',
 
 # HTML forms
 'htmlform-reset' => 'Oʻzgarishlarni bekor qilish',
index c1070f0..7eb26fd 100644 (file)
@@ -570,10 +570,15 @@ Nó desmentegarte de personałixare łe [[Special:Preferences|prefarense de {{SI
 'yourname' => 'Nome utente:',
 'userlogin-yourname' => 'Nome utente',
 'userlogin-yourname-ph' => 'Inserissi el to nome utente',
+'createacct-helpusername-url' => '{{ns:Project}}:Politica_nome_utente',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(jùtame a sièliere)]]',
 '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',
@@ -597,13 +602,31 @@ 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?",
+'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-captcha-help-url' => '{{ns:Project}}:Dimanda na utensa',
+'createacct-imgcaptcha-help' => "No sito mia bon de védar l'imagine? [[{{MediaWiki:createacct-captcha-help-url}}|Dimanda na utensa]]",
+'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' => 'contributi',
+'createacct-benefit-body2' => 'pagine',
+'createacct-benefit-body3' => '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 +658,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,12 +707,14 @@ 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-text' => 'Conpleta sto moduło par resetar la to password.',
 'passwordreset-legend' => 'Rinposta ła password',
 'passwordreset-disabled' => 'Ła rinpostasion deła password xe stà dixabiłità so sto projeto wiki.',
+'passwordreset-emaildisabled' => 'Le funsionalità de posta eletrònega le xe stà disabilità su sta wiki.',
 'passwordreset-pretext' => '{{PLURAL:$1|| Inserisi una dełe porsion de dati cua soto}}',
 'passwordreset-username' => 'Nome utente:',
 'passwordreset-domain' => 'Dominio',
@@ -700,22 +727,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',
@@ -1182,7 +1207,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 +1227,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',
@@ -1343,6 +1369,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:',
@@ -1894,6 +1921,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 +2087,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.
@@ -2536,6 +2573,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 +2920,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 +3024,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:
 
@@ -3607,12 +3660,16 @@ 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à.',
+'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 +3761,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 +3770,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 +3787,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 24cbba7..a415fed 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Apple
  * @author Arisa
+ * @author Cheers!
  * @author DHN
  * @author Kaganer
  * @author Minh Nguyen
@@ -549,7 +550,7 @@ $1',
 'policy-url' => 'Project:Quy định và hướng dẫn',
 'portal' => 'Cộng đồng',
 'portal-url' => 'Project:Cộng đồng',
-'privacy' => 'Quy định quyền riêng tư',
+'privacy' => 'Quy định về quyền riêng tư',
 'privacypage' => 'Project:Quy định quyền riêng tư',
 
 'badaccess' => 'Lỗi về quyền truy cập',
@@ -710,9 +711,20 @@ 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',
+'createacct-helpusername-url' => '{{ns:Project}}:Quy định tên người dùng',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(giúp tôi chọn)]]',
 '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' => 'Đăng nhập bằng máy chủ 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 +737,39 @@ 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?',
+'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-captcha-help-url' => '{{ns:Project}}:Yêu cầu tạo tài khoản',
+'createacct-imgcaptcha-help' => 'Bạn không thấy hình ảnh? [[{{MediaWiki:createacct-captcha-help-url}}|Yêu cầu có tài khoả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' => 'lần sửa đổi',
+'createacct-benefit-body2' => 'trang nội dung',
+'createacct-benefit-body3' => '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 +797,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',
@@ -812,12 +845,14 @@ 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-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-emaildisabled' => 'Tính năng gửi thư điện tử không được kích hoạ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-username' => 'Tên người dùng:',
 'passwordreset-domain' => 'Tên miền:',
@@ -849,7 +884,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ử',
@@ -1491,6 +1526,7 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao c
 'userrights-notallowed' => 'Tài khoản của bạn không có quyền gán hoặc bãi miễn quyền cho thành viên.',
 'userrights-changeable-col' => 'Những nhóm bạn có thể thay đổi',
 'userrights-unchangeable-col' => 'Những nhóm bạn không thể thay đổi',
+'userrights-conflict' => 'Mâu thuẫn thay đổi sửa nhóm thành viên! Xin vui lòng áp dụng các thay đổi của bạn một lần nữa.',
 
 # Groups
 'group' => 'Nhóm:',
@@ -1812,7 +1848,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 +2260,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.
@@ -2783,7 +2828,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',
@@ -3203,11 +3248,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 +3275,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ể',
@@ -3942,12 +3999,16 @@ 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.',
+'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 +4099,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..cd5cb6f 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Altaileopard
+ * @author Matma Rex
  * @author Silvicola
  */
 
@@ -80,10 +81,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Dii andsôôl dr beoobachdâr ôôdsajchn',
 'tog-oldsig' => 'foorschau fon dr agduäln signaduur:',
 'tog-fancysig' => 'Signaduur is dhägsd in wighi-sindhags (alsâ ned audomaadisch â lingg)',
-'tog-externaleditor' => 'Schdandardwäässich an ägsdhärnân eedidhâr neemn (nôr for di sich ausghenn, dâdsuu
-mus mr ufm ajchnen rächnâr was ajrichdn gehnn)',
-'tog-externaldiff' => ' ägsdhärns Brogram dsum ôôdsjachn fon dâ wärsjoons-undârschiid neemn (nôr fir dii sich
-ausghenn, mr mus dâdsuu ufm ajchnen rächnâr was âjrichdn ghenn)',
 'tog-uselivepreview' => 'Schnäl-foorschau benudsn (brauchd JavaScript) (ärschd ân fârsuuch)',
 'tog-forceeditsummary' => 'Sich erinärn lasn, wemmâr ghâ dsusamnfasung gschriiwn had',
 'tog-watchlisthideown' => 'Ajchne bearbajdungn ned in dr beoobachdungs-lischdn uffiirn',
@@ -483,14 +480,6 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 'search-external' => 'Ägsdärne suach',
 'searchdisabled' => 'Diâ {{SITENAME}}-suâch ist ausgschald. Duu ghâusch so lang mid Google suâchn. Dengg drâu, des was mr dôô fir {{SITENAME}} find, ghâu iwârhoold saj.',
 
-# Quickbar
-'qbsettings' => 'Sajdn-lajsdn',
-'qbsettings-none' => 'Ghane',
-'qbsettings-fixedleft' => 'Lings, feschd',
-'qbsettings-fixedright' => 'Rächds, feschd',
-'qbsettings-floatingleft' => 'Lings, schwääbnd',
-'qbsettings-floatingright' => 'Rächds, schwääbnd',
-
 # Preferences page
 'preferences' => 'ajschdelunga',
 'mypreferences' => 'Maj ajschdelunga',
@@ -654,7 +643,7 @@ S'gajd awâr aa â [[Special:WhatLinksHere/$2|lisdn mid alâ fârwajs]].",
 # Special:ListGroupRights
 'listgrouprights-members' => '(Lisdn fon dâ midgliidâr)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Dem ôôgmeldn â iimejl schign',
 
 # Watchlist
@@ -876,23 +865,9 @@ Bidde gug's mi´m foorschau-gnobf ôô fôrm schbajchan",
 
 # Stylesheets
 'common.css' => '/* CSS hiir beâjflusd ale schelfn */',
-'standard.css' => "/* CSS hiir beâjflusd nôr dii Klassik-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an [[MediaWiki:Common.css]] was ändârn. */",
-'nostalgia.css' => "/* CSS hiir beâjflusd nôr dii Nostalgia-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
 'cologneblue.css' => "/* CSS hiir beâjflusd nôr dii Kölnisch-Blau-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
 'monobook.css' => "/* CSS hiir beâjflusd nôr dii Monobook-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
-'myskin.css' => "/* CSS hiir beâjflusd nôr dii MySkin-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
-'chick.css' => "/* CSS hiir beâjflusd nôr dii Küken-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
-'simple.css' => "/* CSS hiir beâjflusd nôr dii Simple-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
-'modern.css' => "/* CSS hiir beâjflusd nôr dii Modern-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */
-
-/* Dii glôôschrajwung im nawigadsjoonsberajch fârhindârd des: */
-.portlet h5,
-.portlet h6,
-#p-personal ul,
-#p-cactions li a,
-#preftoc a {
-     text-transform: none;
-}",
+'modern.css' => "/* CSS hiir beâjflusd nôr dii Modern-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
 'vector.css' => "/* CSS hiir beâjflusd nôr dii Vector-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
 'print.css' => '/* CSS hiir beâjflusd nôr dii drugausgaawe. */',
 'handheld.css' => '/* CSS hiir beâjflusd nôr dii handgerääde, jee nachdeem, welche schelfn in $wgHandheldStyle âjgeschdeld is. */',
index ec4deeb..6b460c0 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Iketsi
  * @author Kaganer
  * @author Malafaya
  * @author Reedy
@@ -141,8 +142,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Jonön numi gebanas galädöl',
 'tog-oldsig' => 'Dispenäd dabinöl:',
 'tog-fancysig' => 'Dispenäd balugik (nen yüms lü gebanapad)',
-'tog-externaleditor' => 'Gebön nomiko redakömi plödik (te pro jäfüdisevans; paramets patik paneodons su nünöm olik)',
-'tog-externaldiff' => 'Gebön nomiko difi plödik (te pro jäfüdisevans; paramets patik paneodons su nünöm olik)',
 'tog-showjumplinks' => 'Dälön lügolovi me yüms „lübunöl“',
 'tog-uselivepreview' => 'Gebön büologedi itjäfidik (JavaScript) (Sperimäntik)',
 'tog-forceeditsummary' => 'Sagön obe, ven redakaplän brefik vagon',
@@ -237,8 +236,8 @@ $messages = array(
 'newwindow' => '(maifikon in fenät nulik)',
 'cancel' => 'Stöpädön',
 'moredotdotdot' => 'Plu...',
-'mypage' => 'Pad obik',
-'mytalk' => 'Bespiks obik',
+'mypage' => 'Pad',
+'mytalk' => 'Bespiks',
 'anontalk' => 'Bespiks ela IP at',
 'navigation' => 'Nafam',
 'and' => '&#32;e',
@@ -408,9 +407,9 @@ Mögos i, das atos sinifon, das dabinon säkädil pö program fa {{SITENAME}} pa
 'dberrortext' => 'Süntagapök pö geb vüka at ejenon.
 Atos ba sinifön, das dabinon säkäd pö program.
 Steifül lätik ad gebön vüki äbinon:
-<blockquote><tt>$1</tt></blockquote>
-se dunod: „<tt>$2</tt>“.
-Nünodem ägesedon pökanuni: „<tt>$3: $4</tt>“.',
+<blockquote><code>$1</code></blockquote>
+se dunod: „<code>$2</code>“.
+Nünodem ägesedon pökanuni: „<samp>$3: $4</samp>“.',
 'dberrortextcl' => 'Süntagapök pö geb vüka at ejenon.
 Steifül lätik ad gebön vüki at äbinon:
 „$1“
@@ -912,7 +911,7 @@ Kontrololös, va votükam at okipon fovöfi padajenotema.',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Logön padis labü foyümot at]]',
 'searchprofile-articles' => 'Ninädapads',
 'searchprofile-project' => 'Yufa e Proyegapads',
-'searchprofile-images' => 'Ragivs',
+'searchprofile-images' => 'Mödamedäd',
 'searchprofile-everything' => 'Valikos',
 'searchprofile-advanced' => 'Paramets pluik',
 'searchprofile-articles-tooltip' => 'Sukön in $1',
@@ -930,7 +929,7 @@ Kontrololös, va votükam at okipon fovöfi padajenotema.',
 'search-interwiki-default' => 'Seks se $1:',
 'search-interwiki-more' => '(pluikos)',
 'search-relatedarticle' => 'Tefik',
-'mwsuggest-disable' => 'Nemögükön mobis ela AJAX',
+'mwsuggest-disable' => 'Nemögükön sukamobis',
 'searcheverything-enable' => 'Sukolöd in nemaspads valik',
 'searchrelated' => 'tefik',
 'searchall' => 'valik',
@@ -950,17 +949,9 @@ Kontrololös, va votükam at okipon fovöfi padajenotema.',
 'search-external' => 'Suk plödik',
 'searchdisabled' => 'Suk in {{SITENAME}} penemogükon. Vütimo kanol sukön yufü el Google. Demolös, das liseds onik tefü ninäd in {{SITENAME}} ba no binon anuik.',
 
-# Quickbar
-'qbsettings' => 'Stumem',
-'qbsettings-none' => 'Nonik',
-'qbsettings-fixedleft' => 'nedeto (fimiko)',
-'qbsettings-fixedright' => 'Deto (fimiko)',
-'qbsettings-floatingleft' => 'nedeto (vebölo)',
-'qbsettings-floatingright' => 'deto (vebölo)',
-
 # Preferences page
 'preferences' => 'Buükams',
-'mypreferences' => 'Buükams obik',
+'mypreferences' => 'Buükams',
 'prefs-edits' => 'Num redakamas:',
 'prefsnologin' => 'No enunädon oki',
 'prefsnologintext' => 'Nedol <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} nunädön oli]</span> büä kanol votükön gebanabuükamis.',
@@ -1017,9 +1008,9 @@ Kontrololös, va votükam at okipon fovöfi padajenotema.',
 'prefs-custom-css' => 'CSS nekösömik',
 'prefs-custom-js' => 'JavaScript nekösömik',
 'youremail' => 'Ladet leäktronik *:',
-'username' => 'Gebananem:',
+'username' => '{{GENDER:$1|Gebananem}}:',
 'uid' => 'Gebanadientif:',
-'prefs-memberingroups' => 'Liman {{PLURAL:$1|grupa|grupas}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Liman}} {{PLURAL:$1|grupa|grupas}}:',
 'yourrealname' => 'Nem jenöfik *:',
 'yourlanguage' => 'Pük:',
 'yournick' => 'Dispenäd nulik:',
@@ -1590,7 +1581,7 @@ Logolös i [[Special:WantedCategories|klads pevilöl]].',
 'sp-deletedcontributions-contribs' => 'keblünots',
 
 # Special:LinkSearch
-'linksearch' => 'Yüms plödik',
+'linksearch' => 'Suk yümas plödik',
 'linksearch-pat' => 'Sukapated:',
 'linksearch-ns' => 'Nemaspad:',
 'linksearch-ok' => 'Suk',
@@ -1651,8 +1642,8 @@ Ba dabinons [[{{MediaWiki:Listgrouprights-helppage}}|nüns pluik]] tefü gebanag
 'emailuserfooter' => 'Pened at pesedon fa geban: $1 gebane: $2 medü program: „sedön gebane penedi“ ela {{SITENAME}}.',
 
 # Watchlist
-'watchlist' => 'Galädalised obik',
-'mywatchlist' => 'Galädalised obik',
+'watchlist' => 'Galädalised',
+'mywatchlist' => 'Galädalised',
 'watchlistfor2' => 'Ela $1 $2',
 'nowatchlist' => 'Labol nosi in galädalised olik.',
 'watchlistanontext' => '$1 ad logön u redakön lienis galädaliseda olik',
@@ -1884,9 +1875,9 @@ $1',
 'blanknamespace' => '(Cifik)',
 
 # Contributions
-'contributions' => 'Gebanakeblünots',
+'contributions' => '{{GENDER:$1|Gebanakeblünots}}',
 'contributions-title' => 'Gebanakeblünots pro $1',
-'mycontris' => 'Keblünots obik',
+'mycontris' => 'Keblünots',
 'contribsub2' => 'Tefü $1 ($2)',
 'nocontribs' => 'Votükams nonik petuvons me paramets at.',
 'uctop' => '(lätik)',
@@ -1922,7 +1913,7 @@ $1',
 'whatlinkshere-hideredirs' => '$1 lüodükömis',
 'whatlinkshere-hidetrans' => '$1 ninükodis',
 'whatlinkshere-hidelinks' => '$1 yümis',
-'whatlinkshere-hideimages' => '$1 yümis magodas',
+'whatlinkshere-hideimages' => '$1 yümis ragivas',
 'whatlinkshere-filters' => 'Suls',
 
 # Block/unblock
@@ -2290,7 +2281,7 @@ Pad luveratiko ninädon yümi lü bevüresodatopäd plödik in blägalised.',
 'spam_blanking' => 'Moükam revidas valik (bi ninädons yüms lü $1)',
 
 # Info page
-'pageinfo-header-edits' => 'Redakams',
+'pageinfo-header-edits' => 'Jenotem redakamas',
 
 # Patrolling
 'markaspatrolleddiff' => 'Zepön',
@@ -2744,13 +2735,6 @@ Kanol i [[Special:EditWatchlist|gebön redakametodi kösömik]].',
 'version-software-product' => 'Prodäd',
 'version-software-version' => 'Fomam',
 
-# Special:FilePath
-'filepath' => 'Ragivaluveg',
-'filepath-page' => 'Ragiv:',
-'filepath-submit' => 'Gololöd',
-'filepath-summary' => 'Pad patik at tuvon luvegi lölöfik ragiva.
-Magods pajonons ma fomät gudikün, ragivasots votik pamaifükons stedöfo kobü programs onsik.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Sukön ragivis petelüköl',
 'fileduplicatesearch-summary' => 'Sukön ragivis petelüköl stabü völad kontrolasaedota onsik.',
index de0cfbf..744bf3d 100644 (file)
@@ -65,15 +65,13 @@ $messages = array(
 'tog-previewontop' => 'Näütäq proovikaehust inne, mitte perän toimõnduskasti',
 'tog-previewonfirst' => 'Näütäq edimädse toimõndusõ aigo proovikaehust',
 'tog-nocache' => 'Pästku-i lehekülgi võrgokaeja vaihõmällo',
-'tog-enotifwatchlistpages' => 'Saadaq mullõ e-kiri, ku muq perräkaetavat lehte muudõtas',
+'tog-enotifwatchlistpages' => 'Saadaq mullõ e-kiri, ku muq perräkaetavat lehte vai teedüstüt muudõtas',
 'tog-enotifusertalkpages' => 'Saadaq mullõ e-kiri, ku mu arotuslehte muudõtas',
-'tog-enotifminoredits' => 'Saadaq mullõ e-kiri ka väikeisi muutmiisi kotsilõ',
+'tog-enotifminoredits' => 'Saadaq mullõ e-kiri ka lehti ja failõ väikeisi muutmiisi kotsilõ',
 'tog-enotifrevealaddr' => 'Näütäq mu e-postiaadrõssit tõisilõ saadõtuin teedüssin',
 'tog-shownumberswatching' => "Näütäq, ku pall'o pruukjit taa lehe perrä kaes",
-'tog-oldsig' => 'Parhilladsõ alakirotusõ proomikaehus:',
+'tog-oldsig' => 'Parhillanõ alakirotus:',
 'tog-fancysig' => 'Pruugiq vikiteksti moodulist alakirotust (ilma automaatsõ lingildä)',
-'tog-externaleditor' => "Pruugiq vaikimiisi välist tekstitoimõndajat (õnnõ as'atundjilõ, nõud suq puutri ümbresäädmist, kaeq [//www.mediawiki.org/wiki/Manual:External_editors More information.])",
-'tog-externaldiff' => "Pruugiq vaikimiisi välist võrrõlusprogrammi (õnnõ as'atundjilõ, nõud su puutri ümbresäädmist, kaeq [//www.mediawiki.org/wiki/Manual:External_editors More information.])",
 'tog-showjumplinks' => 'Panõq lehe algustõ kipõqlingiq',
 'tog-uselivepreview' => 'Pruugiq kipõkaehust (JavaScript) (proomi)',
 'tog-forceeditsummary' => 'Annaq teedäq, ku olõ-i kirotõt kokkovõtõt',
@@ -90,7 +88,7 @@ $messages = array(
 
 'underline-always' => 'Kõgõ',
 'underline-never' => 'Ei kunagi',
-'underline-default' => 'Võrgokaeja perrä',
+'underline-default' => 'Kujondusõ vai võrgokaeja perrä',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Toimõndamiskotusõ kirätüüp:',
@@ -168,6 +166,7 @@ $messages = array(
 'listingcontinuesabbrev' => 'lätt edesi',
 'index-category' => 'Indeksiga leheq',
 'noindex-category' => 'Indeksildä leheq',
+'broken-file-category' => 'Katskiidsi pildilinkega leheküleq',
 
 'about' => 'Pääteedüs',
 'article' => 'Sisu',
@@ -814,14 +813,6 @@ otsisõna iin edejakku ''all:''. Ütest kimmäst nimeruumist otsmisõs pruugiq e
 'search-external' => 'Väline otsminõ',
 'searchdisabled' => "{{SITENAME}} otsminõ parhillaq ei tüütäq. Niikavva, ku otsminõ jälq tüüle saa, võit pruukiq otsmisõs alanolõvat Google'i otsikasti, a näide teedüs {{SITENAME}} sisust pruugi-i ollaq alasi kõgõ värskimb.",
 
-# Quickbar
-'qbsettings' => 'Kipõriba säädmine',
-'qbsettings-none' => 'Olõ-i',
-'qbsettings-fixedleft' => 'Kõgõ kural puul',
-'qbsettings-fixedright' => 'Kõgõ hüäl puul',
-'qbsettings-floatingleft' => 'Ujovahe kural puul',
-'qbsettings-floatingright' => 'Ujovahe hüäl puul',
-
 # Preferences page
 'preferences' => 'Säädmine',
 'mypreferences' => 'Säädmiseq',
@@ -1823,9 +1814,7 @@ Kokkovõttõria pääle või kirotaq tagasivõtmisõ põhjusõ.',
 'spam_blanking' => "Kõigin kujõn oll' linke lehele $1. Leht tühäs tett.",
 
 # Skin names
-'skinname-standard' => 'Array',
 'skinname-cologneblue' => 'Array',
-'skinname-myskin' => 'Array',
 
 # Patrolling
 'markaspatrolleddiff' => 'Märgiq ülekaetus',
@@ -2236,11 +2225,6 @@ Prooviq harilikku kaehust.',
 'version-version' => '(Kujo $1)',
 'version-software-version' => 'Kujo',
 
-# Special:FilePath
-'filepath' => 'Teedüstü aadrõs',
-'filepath-page' => 'Teedüstü:',
-'filepath-submit' => 'Aadrõs',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Teedüstünimi:',
 'fileduplicatesearch-submit' => 'Otsiq',
index cd26458..d8ff874 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)',
@@ -847,14 +845,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',
@@ -1213,7 +1203,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',
index 8a7c25b..54ab3d0 100644 (file)
@@ -224,10 +224,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ווייזן דעם נומער פון בלאט אויפֿפאסערס',
 'tog-oldsig' => 'איצטיגער אונטערשריפֿט:',
 'tog-fancysig' => 'באַהאַנדלן  אונטערשריפט אַלס וויקיטעקסט (אָן אויטאמאטישן לינק)',
-'tog-externaleditor' => 'ניצן א דרויסנדיגן רעדאקטירער גרונטלעך (נאר פֿאר מומחים, דאס פֿאדערט באזונדערע קאמפיוטער שטעלונגען).
-[//www.mediawiki.org/wiki/Manual:External_editors ווײַטערע אינפֿארמאַציע.]',
-'tog-externaldiff' => 'ניצן א דרויסנדיגן פֿאַרגלײַכער גרונטלעך (נאר פֿאר מומחים, דאס פֿאדערט באזונדערע קאמפיוטער שטעלונגען)
-[//www.mediawiki.org/wiki/Manual:External_editors ווײַטערע אינפֿארמאַציע.]',
 'tog-showjumplinks' => 'באמעגלעך צוטריט לינקס פון "שפרינג צו"',
 'tog-uselivepreview' => 'באנוצט זיך מיט לייוו פאראויסדיגע ווייזונג (JavaScript) (עקספירענמעטל)',
 'tog-forceeditsummary' => 'ווארן מיך ווען איך לייג א ליידיג קורץ ווארט ענדערונג',
@@ -241,6 +237,7 @@ $messages = array(
 'tog-diffonly' => 'ווייז נישט אינהאלט אונטער די דיפערענץ',
 'tog-showhiddencats' => 'ווײַז באהאלטענע קאטעגאריעס',
 'tog-norollbackdiff' => 'היפט איבער ווײַזן אונטערשייד נאכן אויספֿירן א צוריקדריי',
+'tog-useeditwarning' => 'שטעלן א ווארענונג ווען איך לאז איבער א רעדאקטירונג בלאט מיט נישט אויפגעהיטענע ענדערונגען',
 
 'underline-always' => 'אייביג',
 'underline-never' => 'קיינמאל',
@@ -614,9 +611,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,14 +635,33 @@ $2',
 'logout' => 'אַרױסלאָגירן',
 'userlogout' => 'אַרױסלאָגירן',
 'notloggedin' => 'נישט איינגעשריבן',
+'userlogin-noaccount' => 'איר האט נישט קיין קאנטע?',
+'userlogin-joinproject' => 'איינטרעטן ביי {{SITENAME}}',
 'nologin' => "איר האט נישט קיין קאנטע? '''$1'''.",
 'nologinlink' => 'שאַפֿן אַ קאנטע',
 'createaccount' => 'שאַפֿן אַ נײַע קאנטע',
 'gotaccount' => "האסטו שוין א קאנטע? '''$1'''.",
 'gotaccountlink' => 'אַרײַנלאגירן',
 'userlogin-resetlink' => 'פארגעסן אײַערע אַרײַנלאָגירן פרטים?',
+'helplogin-url' => 'Help:אריינלאגירן',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|הילף מיט אריינלאגירן]]',
+'createacct-join' => 'גיט ארײַן אײַער אינפֿארמאציע אונטן.',
+'createacct-emailrequired' => 'בליצפּאָסט אַדרעס',
+'createacct-emailoptional' => 'בליצפאסט אדרעס (אפציאנאל)',
+'createacct-email-ph' => 'קלאַפט ארײַן אײַער בליצפּאָסט אַדרעס',
 'createaccountmail' => 'ניצן א פראוויזאריש פאסווארט און שיקן צום ע-פאסט אדרעס געצייכנט אונטן',
+'createacct-realname' => 'עכטער נאמען (אפציאנאל)',
 'createaccountreason' => 'אורזאַך:',
+'createacct-reason' => 'אורזאך',
+'createacct-reason-ph' => 'פֿארוואס שאפֿט איר נאך א קאנטע',
+'createacct-captcha' => 'פארזיכערן קאנטראל',
+'createacct-captcha-help-url' => '{{ns:Project}}:בעטן א קאנטע',
+'createacct-imgcaptcha-help' => 'בילד נישט זעבאר? [[{{MediaWiki:createacct-captcha-help-url}}|Request an account]]',
+'createacct-imgcaptcha-ph' => 'קלאפט ארײַן דעם טעקסט איר זעט אויבן',
+'createacct-submit' => 'שאפֿט אײַער קאנטע',
+'createacct-benefit-heading' => '{{SITENAME}} איז געמאכט דורך מענטשן ווי איר.',
+'createacct-benefit-body1' => 'רעדאקטירונגען',
+'createacct-benefit-body2' => 'בלעטער',
 'badretype' => 'די פאסווערטער וואס איר האט אריינגעלייגט זענען נישט אייניג.',
 'userexists' => 'דער באַניצער נאָמען איז שוין געניצט.
 ביטע קלײַבט אױס אַן אַנדער נאָמען.',
@@ -737,6 +762,7 @@ $2',
 'passwordreset-text' => 'דערגאַנצט די פאָרעם צוריקצושטעלן אײַער פאַסווארט.',
 'passwordreset-legend' => 'צוריקשטעלן פאַסווארט',
 'passwordreset-disabled' => 'מען האט אומאַקטיוויטר צוריקשטעלן פאַסווערטער אויף דער וויקי.',
+'passwordreset-emaildisabled' => 'ע-פאסט דינסטן זענען געווארן אומאקטיווירט אויף דער דאזיקער וויקי.',
 'passwordreset-pretext' => '{{PLURAL:$1| | קלאַפט אַרײַן איינע פֿון די דאַטן אונטן}}',
 'passwordreset-username' => 'באַניצער נאָמען:',
 'passwordreset-domain' => 'דאמען:',
@@ -766,7 +792,7 @@ $2
 פראוויזארישער פּאַראָל: $2',
 'passwordreset-emailsent' => "מ'האט געשיקט א פאסווארט צוריקשטעלן ע-פּאָסט.",
 'passwordreset-emailsent-capture' => 'מען האט געשיקט א פאסווארט צוריקשטעלן בליצבריוו, וואס ווערט געוויזן אונטן.',
-'passwordreset-emailerror-capture' => 'מען האט געשאפן א פאסווארט צוריקשטעלן בליצבריוו, וואס ווערט געוויזן אונטן, אבער שיקן צום באניצער איז דורכגעפאלן: $1',
+'passwordreset-emailerror-capture' => 'מען האט געשאפן א פאסווארט צוריקשטעלן בליצבריוו, וואס ווערט געוויזן אונטן, אבער שיקן צום {{GENDER:$2|באניצער}}איז דורכגעפאלן: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'ענדערן ע-פּאָסט אַדרעס',
@@ -987,6 +1013,8 @@ $2
 'content-failed-to-parse' => 'פארזן $2 אינהאלט פאר $1 מאדעל דורכגעפאלן: $3',
 'invalid-content-data' => 'אומגילטיקע אינהאלט דאטן',
 'content-not-allowed-here' => '"$1" אינהאלט נישט דערלויבט אויף בלאט [[$2]]',
+'editwarning-warning' => 'איבערלאזן דעם בלאט קען גורם זײַן פֿארלירן אײַערע ענדערונגען.
+אויב איר זענט ארײַנלאגירט, קענט איר מבטל זײַן די דאזיגע ווארענונג אין דער "{{int:prefs-editing}}" אפטיילונג פון אײַערע פרעפערענצן.',
 
 # Content models
 'content-model-wikitext' => 'וויקיטעקסט',
@@ -1011,6 +1039,7 @@ $2
 'node-count-exceeded-warning' => 'קנופנצאל אויפן בלאט צו הויך',
 'expansion-depth-exceeded-category' => "בלעטער וואו מ'האט אריבערגעשטיגן די פארברייטערונג טיף",
 'expansion-depth-exceeded-warning' => 'בלאט גייט אריבער דער פארברייטערונג טיף',
+'parser-unstrip-loop-warning' => 'פעטליע געטראפֿן',
 'converter-manual-rule-error' => 'געטראפן א גרײַז אין האנטלעכן שפראך־קאנווערטירן כלל',
 
 # "Undo" feature
@@ -1269,15 +1298,6 @@ $1",
 צווישנצײַט קענט איר זוכן מיט גוגל.
 געב אכט אז ס'איז מעגלעך אַז זייער אינדעקס פֿון {{SITENAME}} אינהאַלט איז אפשר פֿאַרעלטערט.",
 
-# Quickbar
-'qbsettings' => 'גיכפאַס',
-'qbsettings-none' => 'גארנישט',
-'qbsettings-fixedleft' => 'קבוע לינקס',
-'qbsettings-fixedright' => 'קבוע רעכטס',
-'qbsettings-floatingleft' => 'שווימנדיג לינקס',
-'qbsettings-floatingright' => 'שווימנדיג רעכטס',
-'qbsettings-directionality' => 'פֿעסט, אפהענגיק אויף דער שריפֿט ריכטונג פֿון אײַער שפראַך.',
-
 # Preferences page
 'preferences' => 'פרעפֿערענצן',
 'mypreferences' => 'פּרעפֿערענצן',
@@ -1477,6 +1497,7 @@ $1",
 'right-block' => 'בלאקירן אַנדערע באַניצער פֿון רעדאַקטירן',
 'right-blockemail' => 'בלאקירן א באַניצער פֿון שיקן ע־פאסט',
 'right-hideuser' => 'בלאקירן באַניצער־נאָמען און פֿאַרבארגן אים',
+'right-ipblock-exempt' => 'ארומגיין IP בלאקן, אויטאבלאקן און גרייך־בלאקן',
 'right-unblockself' => 'זיך אליין אויפֿשפאַרן',
 'right-protect' => 'ענדערן שוץ ניוואען און רעדאַגירן געשיצטע בלעטער',
 'right-editprotected' => 'רעדאַגירן געשיצטע בלעטער (אָן קאַסקאַדן שוץ)',
@@ -1728,6 +1749,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 +1766,10 @@ $1",
 
 # Lock manager
 'lockmanager-notlocked' => 'מ\'קען נישט אויפֿשליסן "$1"; ער איז נישט פֿארשלאסן.',
+'lockmanager-fail-closelock' => 'נישט מעגלעך פארשפארן שלאס טעקע פאר "$1".',
 'lockmanager-fail-deletelock' => 'נישט מעגלעך אויסמעקן שלאס טעקע פאר "$1".',
+'lockmanager-fail-openlock' => 'נישט מעגלעך עפֿענען שלאס טעקע פאר "$1".',
+'lockmanager-fail-releaselock' => 'נישט מעגלעך באפֿרייען שלאס טעקע פאר "$1".',
 
 # ZipDirectoryReader
 'zip-file-open-error' => 'געטראפן א גרײַז ביים עפענען די טעקע פאר ZIP־קאנטראלירונג.',
@@ -1774,7 +1799,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>
@@ -2083,6 +2107,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' => "פֿאלגנד איז א רשימה פֿון באַניצער גרופעס דעפֿינירט אויף דער דאָזיקער וויקי, מיט זײַערע אַסאציאירטע צוטריט רעכטן.
@@ -3602,17 +3635,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 +3729,8 @@ $5
 'htmlform-submit' => 'אײַנגעבן',
 'htmlform-reset' => 'צוריקשטעלן ענדערונגען',
 'htmlform-selectorother-other' => 'אַנדער',
+'htmlform-no' => 'ניין',
+'htmlform-yes' => 'יא',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 מיט פולן-טעקסט זוכן שטיץ',
index 47d8d0f..a2481cc 100644 (file)
@@ -83,8 +83,6 @@ $messages = array(
 'tog-shownumberswatching' => "S'àfihàn iye àwọn oníṣe tí wọn tẹjú mọ́ọ",
 'tog-oldsig' => 'Ìtọwọ́bọ̀wé tówà:',
 'tog-fancysig' => 'Ṣe ìtọwọ́bọ̀wé bíi ìkọ wiki (láìní ìjápọ̀ fúnrararẹ̀)',
-'tog-externaleditor' => 'Lo aláàtúnṣe ọ̀tọ̀ látìbẹ̀rẹ̀ (fún àwọn tó mọ̀ nìkan, ìtò ọ̀tọ̀ọ̀tọ̀ pọndandan lórí kọ̀mpútà yín. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'Lo awoìyàtò ọ̀tọ̀ látìbẹ̀rẹ̀ (fún àwọn tó mọ̀ nìkan, ìtò ọ̀tọ̀ọ̀tọ̀ pọndandan lórí kọ̀mpútà yín. [//www.mediawiki.org/wiki/Manual:External_editors Ìfọ̀rọ̀tónilétí mìhínhìn.])',
 'tog-showjumplinks' => 'Ìgbàláyè "fò lọ sí" àwọn ìjápọ̀ ìṣeégbà',
 'tog-uselivepreview' => 'Ìlo àkọ́kọ́yẹ̀wò lẹ́ṣẹ̀kẹṣẹ̀ (JavaScript pọndandan) (aládànhánwò)',
 'tog-forceeditsummary' => 'Kìlọ̀ fún mi tí àkótán àtúnṣe bá jẹ́ òfo',
@@ -98,6 +96,7 @@ $messages = array(
 'tog-diffonly' => 'Kò gbọdọ̀ ṣàfihàn àkóónú ojúewé lábẹ́ àwọn ìyàtọ̀',
 'tog-showhiddencats' => "Ṣ'àfihàn àwọn ẹ̀ka pípamọ́",
 'tog-norollbackdiff' => 'Fo ìyàtọ̀ lẹ́yín síṣe ìyísẹ́yìn',
+'tog-useeditwarning' => 'Kìlọ̀ fún mi tí mo bá únkúrò ní ojúewé àtúnṣe láì tíì mupamọ́',
 
 'underline-always' => 'Nígbà gbogbo',
 'underline-never' => 'Rárá',
@@ -186,6 +185,7 @@ $messages = array(
 'newwindow' => '(yíò sí nínú fèrèsè tuntun)',
 'cancel' => 'Fagilé',
 'moredotdotdot' => 'Ẹ̀kúnrẹ́rẹ́...',
+'morenotlisted' => 'Àtòjọ kíkúnrẹ́rẹ́ kò sí...',
 'mypage' => 'Ojúewé',
 'mytalk' => 'Ọ̀rọ̀',
 'anontalk' => 'Ọ̀rọ̀ fún IP yí',
@@ -467,9 +467,20 @@ 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',
+'createacct-helpusername-url' => '{{ns:Project}}:Username_policy',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(ìrànlọ́wọ́ ìṣeàṣàyàn)]]',
 'yourpassword' => 'Ọ̀rọ̀ìpamọ́:',
+'userlogin-yourpassword' => 'Ọ̀rọ̀ìpamọ́',
+'userlogin-yourpassword-ph' => 'Ẹ kọ ọ̀rọ̀ìpamọ́ yín',
+'createacct-yourpassword-ph' => 'Ẹ kọ ọ̀rọ̀ìpamọ́',
 'yourpasswordagain' => 'Kọ ọ̀rọ̀ìpamọ́ lẹ́ẹ̀kansí:',
+'createacct-yourpasswordagain' => 'Ẹ ṣe ìfidájú ọ̀rọ̀ìpamọ́',
+'createacct-yourpasswordagain-ph' => 'Ẹ kọ ọ̀rọ̀ìpamọ́ lẹ́ẹ̀kan síi',
 'remembermypassword' => "Ṣè'rántí ìwọlé mi lórí kọ̀mpútà yìí (fún ó pẹ́ jù {{PLURAL:$1|ọjọ́|ọjọ́}} $1)",
+'userlogin-remembermypassword' => 'Ṣè rántí mi',
+'userlogin-signwithsecure' => 'Ẹ wọlé pẹ̀lú ẹ̀rọ-ìpèsè tó ní àbò',
 'securelogin-stick-https' => 'Ìwàní sísopọ̀ mọ́ HTTPS lẹ́yín ìwọlé',
 'yourdomainname' => 'Domain yín:',
 'password-change-forbidden' => 'Ẹ kò le ṣe ìyípadà ọ̀rọ̀ìpamọ́ lórí wiki yìí.',
@@ -482,18 +493,36 @@ Olùṣeàmójútó tó típa ṣe àlàyé yìí: "$3".',
 'logout' => 'Ìjáde',
 'userlogout' => 'Ìjáde',
 'notloggedin' => "Ẹ kò tí w'ọlé",
+'userlogin-noaccount' => 'Ṣé ẹ kò ní àkópamọ́?',
+'userlogin-joinproject' => 'Ẹ darapọ̀mọ́ {{SITENAME}}',
 'nologin' => "Ṣé ẹ fẹ́ wọlé? '''$1'''.",
 'nologinlink' => 'Ìforúkọsílẹ̀',
 'createaccount' => 'Ẹ fi orúkọ sílẹ̀',
 'gotaccount' => "Ṣé ẹ ti ní àpamọ́ tẹ́lẹ̀? '''$1'''.",
 'gotaccountlink' => "Ẹ w'ọlé",
 'userlogin-resetlink' => 'À bí ẹ gbàgbé ìwọlé yín?',
-'createaccountmail' => 'pẹ̀lú e-mail',
+'helplogin-url' => 'Help:Ìwolé',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ìrànlọ́wọ́ láti ìwọlé]]',
+'createacct-join' => 'Ẹ kọ ìsọ̀rọ̀nípa yín sísàlẹ̀',
+'createacct-emailrequired' => 'Àdírẹ̀sì email',
+'createacct-emailoptional' => 'Àdírẹ̀sì email (kò pọndandan)',
+'createacct-email-ph' => 'Ẹ kọ àdírẹ̀sì email yín',
+'createaccountmail' => 'Lo ọ̀rọ̀ìpamọ́ àrìnnàkò ìgbàdíẹ̀ ná, kí o sì fi ránsẹ́ sí àdírẹ̀sì email tó wà nísàlẹ̀',
+'createacct-realname' => 'Orúkọ yín gangan (kò pọndandan)',
 'createaccountreason' => 'Ìdíẹ̀:',
+'createacct-reason' => 'Ìdí',
+'createacct-captcha-help-url' => '{{ns:Project}}:Ẹ tọrọ àkópamọ́',
+'createacct-imgcaptcha-help' => 'Ṣé àwòrán kò hàn dáadáa sí yín? [[{{MediaWiki:createacct-captcha-help-url}}|Ẹ tọrọ àkópamọ́]]',
+'createacct-imgcaptcha-ph' => 'Ẹ kọ ìkọ̀rọ̀ tí ẹ rí lókè',
+'createacct-benefit-heading' => 'Àwọn ènìyàn bíi yín ni wọ́n dá {{SITENAME}}.',
+'createacct-benefit-body1' => 'àtúnṣe',
+'createacct-benefit-body2' => 'ojúewé',
+'createacct-benefit-body3' => 'olùkópa ní oṣù yìí',
 'badretype' => 'Àwọn ọ̀rọ̀ìpamọ́ tí ẹ kọ kò jọ ra wọn.',
 'userexists' => 'Orúkọ oníṣe tí ẹ mú wà lọ́wọ́ ẹlòmíràn.
 Ẹjọ̀wọ́ ẹ yan orúkọ mìíràn tó yàtọ̀.',
 'loginerror' => 'Àsìṣe ìwọlé',
+'createacct-error' => 'Àṣìṣe ìdá àkópamọ́',
 'createaccounterror' => 'Kò le dá àkópamọ́: $1',
 'nocookiesnew' => 'A ti dá àpamọ́ oníṣe, ṣugbọ́n ẹ kò tíì wọlé.
 {{SITENAME}} ún lo cookies láti gba àwọn oníṣe wọlé.
@@ -537,8 +566,8 @@ tí ẹ kò sì fẹ́ yípadà mọ́, ẹ mọ́ kọbiara sí ìránṣẹ́
 'blocked-mailpassword' => 'Àdírẹ́sì IP yín jẹ́ dídèlọ́nà láti ṣàtúnṣe, nípa báyìí kò ní ààyè láti lo ìfigbéṣe ìtúnwárí ọ̀rọ̀ìpamọ́ kó le dínà ìbàjẹ́.',
 'eauthentsent' => 'A ti fi e-mail ìmúdájú ránṣẹ́ sí àdírẹ́ẹ̀sì e-mail tí ẹ fi sílẹ̀.
 Kí á tó fi e-mail mìíràn ránṣẹ́ sí àkópamọ́ yìí, ẹ gbọ́dọ̀ tẹ̀lé àwọn ìlànà inú e-mail ọ̀ún, láti múdájú pé àkópamọ́ ọ̀ún jẹ́ ti yín lóòótọ́.',
-'throttled-mailpassword' => 'Aṣèránnilétí ọ̀rọ̀ìpamọ́ tilẹ̀ ti jẹ́ fífiránṣẹ́, láàrin {{PLURAL:$1|wákàtí kan|wákàtí $1}} ṣẹ́yìn.
-Láti dínà Ã¬bàjẹÌ\81, aṣèránnilétí ọ̀rọ̀ìpamọ́ kan péré ni yíò jẹ́ fífiránṣẹ́ láàrin {{PLURAL:$1|wákàtí kọ̀ọ̀kan|wákàtí $1}}.',
+'throttled-mailpassword' => 'Email ìtúntò ọ̀rọ̀ìpamọ́ kan tilẹ̀ ti jẹ́ fífiránṣẹ́, láàrin {{PLURAL:$1|wákàtí kan|wákàtí $1}} ṣẹ́yìn.
+Láti dínà Ã lòbàjẹÌ\81, email Ã¬túntò ọ̀rọ̀ìpamọ́ kan péré ni yíò jẹ́ fífiránṣẹ́ láàrin {{PLURAL:$1|wákàtí kọ̀ọ̀kan|wákàtí $1}}.',
 'mailerror' => 'Àsìṣe ìfiránṣẹ́: $1',
 'acct_creation_throttle_hit' => 'Àwọn aṣàbẹ̀wò sí wiki yìí tí wọ́n únlo àdírẹ́sì IP yín ti dá {{PLURAL:$1|àpamọ́ 1|àpamọ́ $1}} láàrin ọjọ́ tókọjá, èyí ni púpọ̀jùlọ tó jẹ́ gbígbà ní ààyè láàrin gbà àsìkò yìí.
 Nítorí èyí, àwọn aṣàbẹ̀wò tí wọ́n únlo àdírẹ́sì IP yìí kò le dá àpamọ́ báyìí.',
@@ -568,6 +597,7 @@ E-mail kankan kò ní jẹ́ fífiránṣẹ́ fún ìkankan nínú àwọn ìn
 # Email sending
 'php-mail-error-unknown' => 'Àsìṣe àìmọ̀ nínú ìgbéṣe mail() ti PHP',
 'user-mail-no-addy' => 'Ó fẹ́ fi e-mail ránṣẹ́ láìsí àdírẹ́sì e-mail.',
+'user-mail-no-body' => 'Ò fẹ́ fi email tí kò ní ọ̀rọ̀ kankan nínú ránsẹ́.',
 
 # Change password dialog
 'resetpass' => 'Ìyípadà ọ̀rọ̀ìpamọ́',
@@ -589,9 +619,10 @@ Láti parí ìmúwọlẹ́, ẹ gbọ́dọ̀ ṣètò ọ̀rọ̀ìpamọ́ tu
 
 # Special:PasswordReset
 'passwordreset' => 'Ìtúntò ọ̀rọ̀ìpamọ́',
-'passwordreset-text' => 'Ẹ parí fọ́ọ̀mù yìí láti gba e-mail aránlétí nípa àwọn ẹ̀kúnrẹ́rẹ́ àpamọ́ yín.',
+'passwordreset-text' => 'Ẹ parí fọ́ọ̀mù yìí láti ṣe ìtúntò ọ̀rọ̀ìpamọ́ yín.',
 'passwordreset-legend' => 'Ìtúntò ọ̀rọ̀ìpamọ́',
 'passwordreset-disabled' => 'Ìdálẹ́kun ìtúntò ọ̀rọ̀ìpamọ́ lórí wiki yìí.',
+'passwordreset-emaildisabled' => 'Ìdálẹ́kun lílo email lórí wiki yìí.',
 'passwordreset-pretext' => '{{PLURAL:$1||Ẹ kọ ìkan nínú àwọn wẹ́wẹ́ dátà ìsàlẹ̀}}',
 'passwordreset-username' => 'Orúkọ oníṣe:',
 'passwordreset-domain' => 'Àbùgbé:',
@@ -842,6 +873,8 @@ Kò ṣe àlàyé kankan.',
 'content-failed-to-parse' => 'Ìkùnà láti ṣàtúwò àkóónú $2 fún àfijúwe $1: $3',
 'invalid-content-data' => 'Àkóónú dátà tí kò yẹ',
 'content-not-allowed-here' => 'Àkóónú "$1" kò ní ìyọ̀nda lórí ojúewé [[$2]]',
+'editwarning-warning' => 'Kíkúrò ní ojúewé yìí yíò jẹ́ kí ẹ pòfo àwọn àtúnṣe tí ẹ ti ṣe.
+Tó bá jẹ́ pé ẹ ti wọlé, ẹ lè dẹ́kun ìkìlọ̀ yìí nínù abala "Àtúnṣe ṣíṣe" ti àwọn ìfẹ́ràn yín.',
 
 # Content models
 'content-model-wikitext' => 'ìkọ̀rọ̀ wiki',
@@ -1130,15 +1163,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 +1717,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>
@@ -3426,13 +3449,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..c96b9cd 100644 (file)
@@ -16,6 +16,7 @@
  * @author Waihorace
  * @author William915
  * @author Wong128hk
+ * @author Yfdyh000
  */
 
 $namespaceNames = array(
@@ -261,8 +262,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 +276,7 @@ $messages = array(
 'tog-showhiddencats' => '顯示隱藏類',
 'tog-noconvertlink' => '唔轉連結標題',
 'tog-norollbackdiff' => '進行反轉之後略過差異',
+'tog-useeditwarning' => '當我離開未保存好嘅修改嗰陣警告我',
 
 'underline-always' => '全部',
 'underline-never' => '永不',
@@ -826,7 +826,7 @@ $1',
 '''佢嘅內容重未儲存!'''",
 'userinvalidcssjstitle' => "'''警告:''' 無叫做 \"\$1\" 嘅畫面。請記住自訂介面的 .css 和 .js 頁面時應使用細楷,例如:{{ns:user}}:Foo/vector.css 而唔係 {{ns:user}}:Foo/Vector.css 。",
 'updated' => '(己更新)',
-'note' => "'''留意:'''",
+'note' => "'''留意'''",
 'previewnote' => "'''請記住呢個只係預覽。'''
 更改嘅内容重未儲存!",
 'previewconflict' => '呢個預覽係反映如果你選擇儲存嘅話,嘅上面嘅文字編輯區裏面嘅字會儲存落嚟。',
@@ -903,6 +903,8 @@ $1',
 'edit-no-change' => '你嘅編輯已經略過,因為文字無改過。',
 'edit-already-exists' => '唔可以開一新版。
 佢已經存在。',
+'editwarning-warning' => '離開呢一版會令到你嘅修改唔見咗。
+你可以響你嘅喜好設定嘅"{{int:prefs-editing}}"小節度停用呢個警告。',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => '警告: 呢一版有太多耗費嘅語法功能呼叫。
@@ -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' => '自訂喜好',
@@ -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>
@@ -2644,13 +2637,8 @@ $1',
 
 # Stylesheets
 'common.css' => '/* 響呢度放 CSS 碼來改成個網站嘅畫面 */',
-'standard.css' => '/* 響呢度放 CSS 碼去改用戶用嘅傳統畫面 */',
-'nostalgia.css' => '/* 響呢度放 CSS 碼去改用戶用嘅懷舊畫面 */',
 'cologneblue.css' => '/* 響呢度放 CSS 碼去改用戶用嘅科隆藍畫面 */',
 'monobook.css' => '/* 響呢度放 CSS 碼去改用戶用嘅 Monobook 畫面 */',
-'myskin.css' => '/* 響呢度放 CSS 碼去改用戶用嘅我嘅畫面 */',
-'chick.css' => '/* 響呢度放 CSS 碼去改用戶用嘅俏畫面 */',
-'simple.css' => '/* 響呢度放 CSS 碼去改用戶用嘅簡單畫面 */',
 'modern.css' => '/* 響呢度放 CSS 碼去改用戶用嘅摩登畫面 */',
 'vector.css' => '/* 響呢度放 CSS 碼去改用戶用嘅域達畫面 */',
 'print.css' => '/* 響呢度放 CSS 碼去改打印輸出 */',
@@ -2658,13 +2646,8 @@ $1',
 
 # 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 +2676,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 +2749,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' => '簡體',
@@ -3262,12 +3238,6 @@ MediaWiki是基於使用目的而加以發佈,但係就唔會負上任何嘅
 'version-software-product' => '產品',
 'version-software-version' => '版本',
 
-# Special:FilePath
-'filepath' => '檔案路徑',
-'filepath-page' => '檔名:',
-'filepath-submit' => '去',
-'filepath-summary' => '呢個特別頁拎一個檔案嘅完整路徑。圖像會以完整嘅解像度顯示,其它嘅檔案類型會以同佢哋關聯咗嘅程式啟動。',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => '㨂重覆檔案',
 'fileduplicatesearch-summary' => '用重覆檔案嘅切細值去搵個檔案係唔係重覆。',
index 915e905..c1f0035 100644 (file)
@@ -18,6 +18,7 @@
  * @author Chenzw
  * @author Chinalace
  * @author Cicku
+ * @author Cwek
  * @author Dimension
  * @author Dingyuang
  * @author Fantasticfears
@@ -31,6 +32,7 @@
  * @author Hydra
  * @author Hzy980512
  * @author Jding2010
+ * @author Jetlag
  * @author Jidanni
  * @author Jimmy xu wrk
  * @author Kaganer
@@ -50,6 +52,7 @@
  * @author Shirayuki
  * @author Shizhao
  * @author Simon Shek
+ * @author Slboat
  * @author Supaiku
  * @author Tommyang
  * @author Waihorace
@@ -377,7 +380,7 @@ $messages = array(
 'tog-enotifrevealaddr' => '在通知电子邮件中显示我的电子邮件地址',
 'tog-shownumberswatching' => '显示监视用户数',
 'tog-oldsig' => '当前签名:',
-'tog-fancysig' => '将签名以wiki文本对待(不产生自动链接)',
+'tog-fancysig' => '将签名视为wiki代码(不自动生成链接)',
 'tog-showjumplinks' => '启用“跳转到”访问链接',
 'tog-uselivepreview' => '使用实时预览(需要JavaScript)(实验功能)',
 'tog-forceeditsummary' => '未输入编辑摘要时提醒我',
@@ -517,7 +520,7 @@ $messages = array(
 
 'navigation-heading' => '导航菜单',
 'errorpagetitle' => '错误',
-'returnto' => '返回$1。',
+'returnto' => '返回$1。',
 'tagline' => '来自{{SITENAME}}',
 'help' => '帮助',
 'search' => '搜索',
@@ -594,10 +597,10 @@ $1',
 'helppage' => 'Help:目录',
 'mainpage' => '首页',
 'mainpage-description' => '首页',
-'policy-url' => 'Project:æ\94¿ç­\96',
+'policy-url' => 'Project:æ\96¹é\92\88',
 'portal' => '社区专页',
 'portal-url' => 'Project:社区专页',
-'privacy' => '隐私政策',
+'privacy' => 'é\9a\90ç§\81æ\9d\83æ\94¿ç­\96',
 'privacypage' => 'Project:隐私权政策',
 
 'badaccess' => '权限错误',
@@ -756,9 +759,20 @@ $2',
 'welcomeuser' => '欢迎,$1!',
 'welcomecreation-msg' => '你的账户已创建。请不要忘记更改你的[[Special:Preferences|{{SITENAME}}系统设置]]。',
 'yourname' => '用户名:',
+'userlogin-yourname' => '用户名',
+'userlogin-yourname-ph' => '输入您的用户名',
+'createacct-helpusername-url' => '{{ns:Project}}:用户名',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(帮我选择)]]',
 '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上更改密码。',
@@ -771,17 +785,38 @@ $2',
 'logout' => '退出',
 'userlogout' => '退出',
 'notloggedin' => '未登录',
+'userlogin-noaccount' => '还没有账号吗?',
+'userlogin-joinproject' => '加入{{SITENAME}}',
 'nologin' => '没有账户?$1。',
 'nologinlink' => '创建账户',
 'createaccount' => '创建账户',
 'gotaccount' => '已经拥有账户?请$1。',
 'gotaccountlink' => '登录',
 'userlogin-resetlink' => '忘记了你的登录信息?',
+'helplogin-url' => 'Help:登录',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|登录说明]]',
+'createacct-join' => '请在下面输入你的信息。',
+'createacct-emailrequired' => '电子邮件地址:',
+'createacct-emailoptional' => '电子邮件地址 (可选)',
+'createacct-email-ph' => '请输入您的电子邮件地址',
 'createaccountmail' => '使用一个临时的随机密码,并将它发送到以下指定的电子邮件地址',
+'createacct-realname' => '真实姓名 (可选)',
 'createaccountreason' => '原因:',
+'createacct-reason' => '原因',
+'createacct-reason-ph' => '为什么您要创建另一个帐户',
+'createacct-captcha' => '安全检查',
+'createacct-captcha-help-url' => '{{ns:Project}}:账号请求',
+'createacct-imgcaptcha-help' => '无法看到图像吗?[[{{MediaWiki:createacct-captcha-help-url}}|请求一个账户]]',
+'createacct-imgcaptcha-ph' => '输入您在上面看到的文本',
+'createacct-submit' => '创建您的账户',
+'createacct-benefit-heading' => '{{SITENAME}} 是由像你这样的人建立的。',
+'createacct-benefit-body1' => '编辑数',
+'createacct-benefit-body2' => '条目数',
+'createacct-benefit-body3' => '位最近贡献者',
 'badretype' => '您所输入的密码并不相同。',
 'userexists' => '用户名已存在。请使用其他名称。',
 'loginerror' => '登录错误',
+'createacct-error' => '帐户创建错误',
 'createaccounterror' => '无法建立账户:$1',
 'nocookiesnew' => '本用户账户已被创建,但登录失败。{{SITENAME}}使用cookie登录。你已停用cookie。请启用cookie,然后使用你的新用户名和密码登录。',
 'nocookieslogin' => '{{SITENAME}}使用cookie登录。你已停用cookie。请启用cookie后重试。',
@@ -856,12 +891,14 @@ $2',
 'resetpass-submit-cancel' => '取消',
 'resetpass-wrong-oldpass' => '临时密码或当前密码无效。您可能已经更改了您的密码,或者请求了新的临时密码。',
 'resetpass-temp-password' => '临时密码:',
+'resetpass-abort-generic' => '密码更改已被一个扩展插件中止。',
 
 # Special:PasswordReset
 'passwordreset' => '重置密码',
 'passwordreset-text' => '完成该表格以重设你的密码。',
 'passwordreset-legend' => '重置密码',
 'passwordreset-disabled' => '此wiki已经禁用密码重置。',
+'passwordreset-emaildisabled' => '此Wiki上无法使用邮件功能。',
 'passwordreset-pretext' => '{{PLURAL:$1||输入下面的数据项之一}}',
 'passwordreset-username' => '用户名:',
 'passwordreset-domain' => '域:',
@@ -883,7 +920,7 @@ $2
 临时密码:$2',
 'passwordreset-emailsent' => '密码重置邮件已发送。',
 'passwordreset-emailsent-capture' => '密码重设电子邮件已发送,并在下面显示。',
-'passwordreset-emailerror-capture' => '生成的密码重设电子邮件如下所示,但发送失败:$1',
+'passwordreset-emailerror-capture' => '重置密码邮件已生成,但是无法向{{GENDER:$2|下列用户}} 发送:$1',
 
 # Special:ChangeEmail
 'changeemail' => '更改电子邮件地址',
@@ -1335,6 +1372,7 @@ $1",
 'powersearch-togglenone' => '全不选',
 'search-external' => '外部搜索',
 'searchdisabled' => '{{SITENAME}}的搜索已被禁用。您可以暂时使用Google进行搜索,须注意他们索引的{{SITENAME}}内容可能会过时。',
+'search-error' => '搜索时发生错误:$1',
 
 # Preferences page
 'preferences' => '设置',
@@ -1473,6 +1511,7 @@ $1",
 'userrights-notallowed' => '你的账户没有权限添加或删除用户权限。',
 'userrights-changeable-col' => '你可以更改的用户组',
 'userrights-unchangeable-col' => '你不能更改的用户组',
+'userrights-conflict' => '用户权限冲突 !请重新应用您的更改。',
 
 # Groups
 'group' => '用户组:',
@@ -1636,7 +1675,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 "',
@@ -2053,7 +2092,7 @@ $1',
 'uncategorizedimages' => '未归类文件',
 'uncategorizedtemplates' => '未归类模板',
 'unusedcategories' => '未使用分类',
-'unusedimages' => '未使用图像',
+'unusedimages' => '未使用文件',
 'popularpages' => '热点页面',
 'wantedcategories' => '需要的分类',
 'wantedpages' => '待撰页面',
@@ -2176,6 +2215,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' => '以下面是一个在这个维基中所定义出来的用户权限列表,以及它们的访问权。
@@ -2278,8 +2326,8 @@ $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_body_intro_changed' => '{{SITENAME}}页面$1已于$PAGEEDITDATE被$2{{GENDER:$2|更改}},请浏览 $3 查看当前版本。',
+'enotif_lastvisited' => '请浏览 $1 查看你上次访问后的所有更改。',
 'enotif_lastdiff' => '请浏览$1查看该更改。',
 'enotif_anon_editor' => '匿名用户$1',
 'enotif_body' => '亲爱的$WATCHINGUSERNAME:
@@ -3129,11 +3177,25 @@ $1',
 'minutes' => '$1分',
 'hours' => '$1小时',
 'days' => '$1天',
+'weeks' => '$1周',
 'months' => '{{PLURAL:$1|$1个月}}',
 'years' => '{{PLURAL:$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' => '请按照下列格式编写:
 
@@ -3142,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' => '简体',
@@ -3780,11 +3840,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' => '本特殊页面返回文件的完整路径。图像以完整分辨率显示,其它文件类型以关联程序直接打开。',
+'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' => '搜索重复文件',
@@ -3875,6 +3940,9 @@ MediaWiki发表时预期有用,但对此'''无任何保证''',亦无隐含
 'htmlform-submit' => '提交',
 'htmlform-reset' => '撤销更改',
 'htmlform-selectorother-other' => '其他',
+'htmlform-no' => '否',
+'htmlform-yes' => '是',
+'htmlform-chosen-placeholder' => '选择选项',
 
 # SQLite database support
 'sqlite-has-fts' => '带全文搜索的版本$1',
@@ -3908,7 +3976,7 @@ MediaWiki发表时预期有用,但对此'''无任何保证''',亦无隐含
 '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 +3985,7 @@ MediaWiki发表时预期有用,但对此'''无任何保证''',亦无隐含
 'rightsnone' => '(无)',
 
 # Feedback
-'feedback-bugornote' => '如果你准备好详细描述一个技术问题,请[$1 报告bug]。或者你可以使用下面的简单表格。你的评论将被添加至页面“[$3 $2]”,附有你的用户名和使用的浏览器。',
+'feedback-bugornote' => '如果你准备好详细描述一个技术问题,请[$1 报告bug]。或者你可以使用下面的简单表格。你的评论将被添加至页面“[$3 $2]”,附有你的用户名。',
 'feedback-subject' => '主题:',
 'feedback-message' => '信息:',
 'feedback-cancel' => '取消',
index 7e3e306..d654694 100644 (file)
  * @author Andrew971218
  * @author Bencmq
  * @author Breawycker
+ * @author Danny0838
  * @author FireJackey
  * @author Frankou
+ * @author Gakmo
  * @author Gaoxuewei
  * @author Hakka
  * @author Horacewai2
@@ -27,6 +29,8 @@
  * @author Kuailong
  * @author Lauhenry
  * @author Liangent
+ * @author Liflon
+ * @author Littletung
  * @author Mark85296341
  * @author Oapbtommy
  * @author Pbdragonwang
@@ -266,37 +270,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 +309,7 @@ $messages = array(
 # Font style option in Special:Preferences
 'editfont-style' => '編輯區字型樣式:',
 'editfont-default' => '瀏覽器預設',
-'editfont-monospace' => '固定間距字型',
+'editfont-monospace' => '距字型',
 'editfont-sansserif' => '無襯線字型',
 'editfont-serif' => '襯線字型',
 
@@ -364,21 +368,21 @@ $messages = array(
 # 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,7 +392,7 @@ $messages = array(
 'morenotlisted' => '更多未列出的項目...',
 'mypage' => '頁面',
 'mytalk' => '討論',
-'anontalk' => 'IP的對話頁',
+'anontalk' => 'IP的對話頁',
 'navigation' => '導覽',
 'and' => '和',
 
@@ -475,19 +479,17 @@ $messages = array(
 'jumpto' => '跳轉到:',
 'jumptonavigation' => '導覽',
 'jumptosearch' => '搜尋',
-'view-pool-error' => '抱歉,現時伺服器已超出負荷。
-太多用戶正嘗試檢視此頁。
-請稍等一會後再次訪問此頁。
+'view-pool-error' => '抱歉,太多用戶正嘗試檢視此頁,使伺服器超出負荷。請稍候片刻再嘗試。
 
 $1',
-'pool-timeout' => '等待鎖死時超時',
+'pool-timeout' => '等待鎖定逾時',
 'pool-queuefull' => '請求池已滿',
 'pool-errorunknown' => '未知錯誤',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => '關於 {{SITENAME}}',
 'aboutpage' => 'Project:關於',
-'copyright' => '本站的全部文本內容在$1之條款下提供。',
+'copyright' => '本站內容以$1條款提供。',
 'copyrightpage' => '{{ns:project}}:版權訊息',
 'currentevents' => '新聞動態',
 'currentevents-url' => 'Project:新聞動態',
@@ -500,15 +502,15 @@ $1',
 'mainpage-description' => '首頁',
 'policy-url' => 'Project:方針',
 'portal' => '社群主頁',
-'portal-url' => 'Project:社主頁',
+'portal-url' => 'Project:社主頁',
 'privacy' => '隱私政策',
-'privacypage' => 'Project:é\9a±ç§\81æ¬\8aæ\94¿ç­\96',
+'privacypage' => 'Project:隱私政策',
 
 'badaccess' => '權限錯誤',
-'badaccess-group0' => '你所請求執行的操作被禁止。',
-'badaccess-groups' => '您剛才的請求只有{{PLURAL:$2|這個|這些}}用戶組的用戶才能使用:$1',
+'badaccess-group0' => '系統不允許您執行這項操作。',
+'badaccess-groups' => '您請求的操作只有{{PLURAL:$2|這個|這些}}用戶群組的用戶能使用:$1',
 
-'versionrequired' => '需要MediaWiki $1 版',
+'versionrequired' => '需要 MediaWiki $1 版',
 'versionrequiredtext' => '需要版本$1的 MediaWiki 才能使用此頁。
 參見[[Special:Version|版本頁]]。',
 
@@ -521,7 +523,7 @@ $1',
 'youhavenewmessagesmanyusers' => '你有來自多位用戶的$1( $2 )。',
 'newmessageslinkplural' => '{{PLURAL:$1|一項新訊息|新訊息}}',
 'newmessagesdifflinkplural' => '最新{{PLURAL:$1|更改|更改}}',
-'youhavenewmessagesmulti' => '您在 $1 有一條新訊息',
+'youhavenewmessagesmulti' => '您在 $1 有新訊息',
 'editsection' => '編輯',
 'editold' => '編輯',
 'viewsourceold' => '檢視原始碼',
@@ -668,9 +670,20 @@ $2',
 'welcomecreation-msg' => '您的賬號已經建立。
 不要忘記設置[[Special:Preferences|{{SITENAME}}的個人參數]]。',
 'yourname' => '用戶名:',
+'userlogin-yourname' => '用戶名',
+'userlogin-yourname-ph' => '輸入你的用戶名',
+'createacct-helpusername-url' => '{{ns:Project}}:用戶名方針',
+'createacct-helpusername-link' => '[[{{MediaWiki:createacct-helpusername-url}}|(幫我選擇)]]',
 '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 +696,38 @@ $2',
 'logout' => '登出',
 'userlogout' => '登出',
 'notloggedin' => '未登入',
+'userlogin-noaccount' => '沒有帳戶嗎?',
+'userlogin-joinproject' => '參與 {{SITENAME}}',
 'nologin' => '您還沒有帳號嗎?$1。',
-'nologinlink' => '建立新帳號',
-'createaccount' => '建立新帳號',
+'nologinlink' => '建立用戶',
+'createaccount' => '建立用戶',
 'gotaccount' => '已經擁有帳號?$1。',
 'gotaccountlink' => '登入',
 'userlogin-resetlink' => '忘記了你的登錄信息?',
+'helplogin-url' => 'Help:登入',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|登入説明]]',
+'createacct-join' => '輸入您的基本資料:',
+'createacct-emailrequired' => '電子郵件',
+'createacct-emailoptional' => '電子郵件(可選)',
+'createacct-email-ph' => '設置電郵地址',
 'createaccountmail' => '使用一個臨時的隨機密碼,並將它發送到以下指定的電子郵件地址',
+'createacct-realname' => '真實姓名(可選)',
 'createaccountreason' => '理由:',
+'createacct-reason' => '原因',
+'createacct-reason-ph' => '您為甚麼要創建另一個帳號',
+'createacct-captcha' => '安全驗證',
+'createacct-captcha-help-url' => '{{ns:Project}}:請求建立用戶',
+'createacct-imgcaptcha-help' => '無法看到圖像嗎?[[{{MediaWiki:createacct-captcha-help-url}}|請求建立用戶]]',
+'createacct-imgcaptcha-ph' => '輸入您在上面看到的字符',
+'createacct-submit' => '建立帳號',
+'createacct-benefit-heading' => '{{SITENAME}}是由像您一樣的人建立。',
+'createacct-benefit-body1' => '次編輯',
+'createacct-benefit-body2' => '頁頁面',
+'createacct-benefit-body3' => '位最近貢獻者',
 'badretype' => '您所輸入的密碼並不相同。',
 'userexists' => '!您所輸入的用戶名稱已經存在,請另選一個名稱。',
 'loginerror' => '登入錯誤',
+'createacct-error' => '帳戶創建錯誤',
 'createaccounterror' => '無法建立帳號:$1',
 'nocookiesnew' => '已成功建立新帳號!偵測到您已關閉 Cookies,請開啟它並登入。',
 'nocookieslogin' => '本站利用 Cookies 進行用戶登入,偵測到您已關閉 Cookies,請開啟它並重新登入。',
@@ -776,12 +810,14 @@ $2',
 'resetpass-wrong-oldpass' => '無效的臨時或現有的密碼。
 您可能已成功地更改了您的密碼,或者已經請求一個新的臨時密碼。',
 'resetpass-temp-password' => '臨時密碼:',
+'resetpass-abort-generic' => '擴充元件已中止了更改密碼操作。',
 
 # Special:PasswordReset
 'passwordreset' => '重新設定密碼',
 'passwordreset-text' => '完成此表格以重置您的密碼。',
 'passwordreset-legend' => '重設密碼',
 'passwordreset-disabled' => '此維基上已禁止了重設密碼。',
+'passwordreset-emaildisabled' => '電子郵件功能在此 wiki 上已禁用。',
 'passwordreset-pretext' => '{{PLURAL:$1||輸入下列其中一個}}',
 'passwordreset-username' => '用戶名:',
 'passwordreset-domain' => '域名:',
@@ -808,7 +844,7 @@ $2
 臨時密碼:$2',
 'passwordreset-emailsent' => '已發送重置密碼電郵。',
 'passwordreset-emailsent-capture' => '重置密碼電子郵件已發送,並在下面顯示。',
-'passwordreset-emailerror-capture' => '生成的重置密碼電子郵件如下所示,但發送失敗:$1',
+'passwordreset-emailerror-capture' => '生成的重置密碼電子郵件如下所示,但發送給{{GENDER:$2|用戶}}失敗:$1',
 
 # Special:ChangeEmail
 'changeemail' => '更改電郵地址',
@@ -1018,8 +1054,7 @@ $2
 '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語法',
@@ -1427,6 +1462,7 @@ $1",
 'userrights-notallowed' => '您的賬戶無權限來添加或刪除用戶權限。',
 'userrights-changeable-col' => '您可以更改的群組',
 'userrights-unchangeable-col' => '您不可以更改的群組',
+'userrights-conflict' => '使用者權限衝突!請重新套用您的更改。',
 
 # Groups
 'group' => '群組:',
@@ -2144,6 +2180,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 +2256,7 @@ Template:消除歧義',
 'watchnologin' => '未登入',
 'watchnologintext' => '您必須先[[Special:UserLogin|登入]],才能更改您的監視列表。',
 'addwatch' => '加至監視列表',
-'addedwatchtext' => '頁面「[[:$1]]」已加到您的[[Special:Watchlist|監視清單]]中。
-將來有關此頁面及其討論頁的任何修改將會在那裡列出。',
+'addedwatchtext' => '已將頁面「[[:$1]]」加入您的[[Special:Watchlist|監視列表]]。將來此頁面及其討論頁如有更動都會在那裡列出。',
 'removewatch' => '停止監視',
 'removedwatchtext' => '[[:$1]]已經從[[Special:Watchlist|您的監視頁面]]中移除。',
 'watch' => '監視',
@@ -2250,7 +2294,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 +2418,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 +2581,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 +2622,7 @@ $1',
 'ipblocklist-submit' => '搜尋',
 'ipblocklist-localblock' => '本地封鎖',
 'ipblocklist-otherblocks' => '其他{{PLURAL:$1|封鎖|封鎖}}',
-'infiniteblock' => '永久',
+'infiniteblock' => '無限期',
 'expiringblock' => '$1 $2 到期',
 'anononlyblock' => '僅限匿名用戶',
 'noautoblockblock' => '禁用自動查封',
@@ -3111,11 +3155,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 +3183,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' => '‪中文(简体)',
@@ -3758,11 +3814,16 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任
 'version-entrypoints-header-entrypoint' => '入口點',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => '檔案路徑',
-'filepath-page' => '檔案名:',
-'filepath-submit' => '前往',
-'filepath-summary' => '這個特殊頁面擷取一個檔案的完整路徑。圖片會以完整的解像度顯示,其它的檔案類型會以同它們已關聯程式啟動。',
+'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 +3917,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 08d8641..2162869 100644 (file)
@@ -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"
                        }
@@ -428,7 +428,7 @@ abstract class Maintenance {
                                "server name detection may fail in command line scripts.", false, true );
 
                # Save generic options to display them separately in help
-               $this->mGenericParameters = $this->mParams ;
+               $this->mGenericParameters = $this->mParams;
 
                # Script dependant options:
 
@@ -515,7 +515,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 +634,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 +712,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 +743,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 +766,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 +791,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 +807,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 +840,7 @@ abstract class Maintenance {
                $wgCommandLineMode = true;
 
                # Override $wgServer
-               if( $this->hasOption( 'server') ) {
+               if ( $this->hasOption( 'server' ) ) {
                        $wgServer = $this->getOption( 'server', $wgServer );
                }
 
@@ -906,7 +907,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";
@@ -1076,7 +1077,7 @@ abstract class Maintenance {
         * @param &$db DatabaseBase object
         */
        private function unlockSearchindex( &$db ) {
-               $db->unlockTables(  __CLASS__ . '::' . __METHOD__ );
+               $db->unlockTables( __CLASS__ . '::' . __METHOD__ );
        }
 
        /**
@@ -1190,7 +1191,9 @@ abstract class Maintenance {
                                        $st = fgets( STDIN, 1024 );
                                }
                        }
-                       if ( $st === false ) return false;
+                       if ( $st === false ) {
+                               return false;
+                       }
                        $resp = trim( $st );
                        return $resp;
                }
index e3dc488..bcd59f1 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;
@@ -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 eaac02c..547abab 100644 (file)
@@ -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;
@@ -611,17 +612,21 @@ class TextPassDumper extends BackupDumper {
 
        private function closeSpawn() {
                wfSuppressWarnings();
-               if ( $this->spawnRead )
+               if ( $this->spawnRead ) {
                        fclose( $this->spawnRead );
+               }
                $this->spawnRead = false;
-               if ( $this->spawnWrite )
+               if ( $this->spawnWrite ) {
                        fclose( $this->spawnWrite );
+               }
                $this->spawnWrite = false;
-               if ( $this->spawnErr )
+               if ( $this->spawnErr ) {
                        fclose( $this->spawnErr );
+               }
                $this->spawnErr = false;
-               if ( $this->spawnProc )
+               if ( $this->spawnProc ) {
                        pclose( $this->spawnProc );
+               }
                $this->spawnProc = false;
                wfRestoreWarnings();
        }
@@ -631,11 +636,15 @@ class TextPassDumper extends BackupDumper {
 
                $ok = fwrite( $this->spawnWrite, "$id\n" );
                // $this->progress( ">> $id" );
-               if ( !$ok ) return false;
+               if ( !$ok ) {
+                       return false;
+               }
 
                $ok = fflush( $this->spawnWrite );
                // $this->progress( ">> [flush]" );
-               if ( !$ok ) return false;
+               if ( !$ok ) {
+                       return false;
+               }
 
                // check that the text id they are sending is the one we asked for
                // this avoids out of sync revision text errors we have encountered in the past
@@ -649,18 +658,24 @@ class TextPassDumper extends BackupDumper {
 
                $len = fgets( $this->spawnRead );
                // $this->progress( "<< " . trim( $len ) );
-               if ( $len === false ) return false;
+               if ( $len === false ) {
+                       return false;
+               }
 
                $nbytes = intval( $len );
                // actual error, not zero-length text
-               if ( $nbytes < 0 ) return false;
+               if ( $nbytes < 0 ) {
+                       return false;
+               }
 
                $text = "";
 
                // Subprocess may not send everything at once, we have to loop.
                while ( $nbytes > strlen( $text ) ) {
                        $buffer = fread( $this->spawnRead, $nbytes - strlen( $text ) );
-                       if ( $buffer === false ) break;
+                       if ( $buffer === false ) {
+                               break;
+                       }
                        $text .= $buffer;
                }
 
index c06c2cd..9e56e1b 100644 (file)
@@ -28,7 +28,7 @@ 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 1e44e23..efb9471 100644 (file)
@@ -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' );
index dbc2e0d..87f14d0 100644 (file)
@@ -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' )
index c0a526b..58c87e5 100644 (file)
@@ -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 ),
index 2085da9..700ae1a 100644 (file)
@@ -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,7 +85,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" );
        }
 }
index 66f9e87..cbbd5d9 100644 (file)
@@ -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 );
index 441e8ae..4379b22 100644 (file)
@@ -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
index fbab6a3..c3458dc 100644 (file)
@@ -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;
index 1f3ac1c..b361117 100644 (file)
@@ -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 ) {
index 5f7b02e..4e0d0b0 100644 (file)
@@ -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" );
index f2c4ac5..fe422b3 100644 (file)
@@ -79,24 +79,28 @@ class CopyFileBackend extends Maintenance {
 
                        // 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 );
                        }
 
                        $batchPaths = array();
index 81fbbb3..5681d41 100644 (file)
@@ -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" );
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 4ab6d1d..7f6764b 100644 (file)
@@ -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;
index 38e6956..878da42 100644 (file)
@@ -31,8 +31,8 @@ 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( '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 lang-code (default: root page against content language)', false, true );
        }
 
@@ -96,10 +96,19 @@ class DeleteEqualMessages extends Maintenance {
                }
 
                $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{$equalPages} pages are equal to the default message ({$equalPagesTalks} talk pages).\n" );
 
                if ( !$doDelete ) {
-                       $this->output( "\nRun the script again with --delete to delete these pages" );
+                       $list = '';
+                       foreach ( $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 ( $equalPagesTalks !== 0 ) {
                                $this->output( " (include --delete-talk to also delete the talk pages)" );
                        }
@@ -117,25 +126,27 @@ class DeleteEqualMessages extends Maintenance {
                $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 ) {
                        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" );
        }
 }
 
index 3c8c5fd..4ac64ca 100644 (file)
@@ -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;
                }
index f0da9a8..1eb7262 100644 (file)
@@ -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,8 +84,9 @@ 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__ );
        }
 }
index da220d6..7d16f8a 100644 (file)
@@ -47,7 +47,9 @@ 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;
+                       }
                }
        }
 }
index 1d5070b..d277e57 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
@@ -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 15b0016..2e138e0 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;
 }
 
@@ -60,10 +60,15 @@ if ( isset( $_SERVER['MW_COMPILED'] ) ) {
        # Get the MWInit class
        require_once( "$IP/includes/Init.php" );
        require_once( "$IP/includes/AutoLoader.php" );
+       # Stub the profiler
+       require_once( "$IP/includes/profiler/Profiler.php" );
 }
 
-# Stub the profiler
-require_once( MWInit::compiledPath( 'includes/profiler/Profiler.php' ) );
+# Start the profiler
+$wgProfiler = array();
+if ( file_exists( "$IP/StartProfiler.php" ) ) {
+       require( "$IP/StartProfiler.php" );
+}
 
 // Some other requires
 if ( !defined( 'MW_COMPILED' ) ) {
@@ -95,8 +100,9 @@ if ( $maintenance->getDbType() === Maintenance::DB_ADMIN &&
 }
 
 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
index c9546c6..bd7e464 100644 (file)
@@ -27,7 +27,7 @@
 
 $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' );
@@ -45,7 +45,7 @@ if ( isset( $options['pagelist'] ) ) {
        chdir( $olddir );
        if ( $pages === false ) {
                echo( "Unable to open file {$options['pagelist']}\n" );
-               die(1);
+               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 9e61bd4..3937751 100644 (file)
@@ -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)
@@ -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;
index 7dfbec1..7760beb 100644 (file)
@@ -69,8 +69,9 @@ 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" );
+               }
        }
 }
 
index 1eecfe4..1ddb9ad 100644 (file)
@@ -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__ );
 
index a705bcc..8c46d69 100644 (file)
@@ -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 );
                }
index 008d768..4be9f21 100644 (file)
@@ -79,7 +79,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 +106,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 +115,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 +124,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 +133,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,7 +142,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( $ops5 ) . " files in $e ms.\n" );
        }
index ab7603d..2e8622b 100644 (file)
@@ -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__ );
index 4c03980..b3d8174 100644 (file)
@@ -657,6 +657,7 @@ class wikiFuzz {
                        "}}",
                        "{{INT:googlesearch|",
                        "}}",
+                        "{{ROOTPAGENAME}}",
                        "{{BASEPAGENAME}}",
                        "{{CONTENTLANGUAGE}}",
                        "{{PAGESINNAMESPACE:}}",
index adea97e..b356d18 100644 (file)
@@ -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 );
+               }
        }
 
        /**
index 83b5b02..53ea597 100644 (file)
@@ -53,7 +53,7 @@ class GetConfiguration extends Maintenance {
                }
 
                $out = null;
-               switch( $this->getOption( 'format' ) ) {
+               switch ( $this->getOption( 'format' ) ) {
                        case 'PHP':
                                $out = serialize( $res );
                                break;
index 72b1d48..68be9f1 100644 (file)
@@ -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 ) {
index 9553a1f..beadb90 100644 (file)
@@ -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,7 +259,7 @@ 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' ) ) {
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 9d9a77d..7b340cc 100644 (file)
@@ -185,10 +185,11 @@ if ( $count > 0 ) {
                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 );
@@ -227,7 +228,16 @@ if ( $count > 0 ) {
                if ( isset( $options['dry'] ) ) {
                        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. (" .
                                        $archive->getWikiText() .
@@ -244,7 +254,7 @@ if ( $count > 0 ) {
 
                if ( isset( $options['dry'] ) ) {
                        echo( "done.\n" );
-               } elseif ( $image->recordUpload2( $archive->value, $summary, $commentText, false, $timestamp ) ) {
+               } elseif ( $image->recordUpload2( $archive->value, $summary, $commentText, $props, $timestamp ) ) {
                        # We're done!
                        echo( "done.\n" );
 
@@ -273,7 +283,7 @@ if ( $count > 0 ) {
 
                                        $cascade = false;
                                        $restrictions = array();
-                                       foreach( $title->getRestrictionTypes() as $type ) {
+                                       foreach ( $title->getRestrictionTypes() as $type ) {
                                                $restrictions[$type] = $protectLevel;
                                        }
 
@@ -304,8 +314,9 @@ if ( $count > 0 ) {
        foreach ( array( 'count' => 'Found', 'limit' => 'Limit', 'ignored' => 'Ignored',
                'added' => 'Added', 'skipped' => 'Skipped', 'overwritten' => 'Overwritten',
                'failed' => 'Failed' ) as $var => $desc ) {
-               if ( $$var > 0 )
+               if ( $$var > 0 ) {
                        echo( "{$desc}: {$$var}\n" );
+               }
        }
 
 } else {
index 1990659..84556b2 100644 (file)
@@ -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();
index 242358b..0b1ab5a 100644 (file)
@@ -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 ) );
                }
index c29c91c..68e1fb2 100644 (file)
@@ -9,9 +9,11 @@
                                        "mw.Map",
                                        "mw.Message",
                                        "mw.loader",
+                                       "mw.log",
                                        "mw.html",
                                        "mw.html.Cdata",
-                                       "mw.html.Raw"
+                                       "mw.html.Raw",
+                                       "mw.hook"
                                ]
                        },
                        {
@@ -20,7 +22,7 @@
                                        "mw.Title",
                                        "mw.notification",
                                        "mw.util",
-                                       "mw.plugin.notify"
+                                       "mw.plugin.*"
                                ]
                        },
                        {
index e932b5c..4ad75f0 100644 (file)
@@ -9,6 +9,7 @@
        "--": [
                "./external.js",
                "../../resources/mediawiki/mediawiki.js",
+               "../../resources/mediawiki/mediawiki.log.js",
                "../../resources/mediawiki/mediawiki.util.js",
                "../../resources/mediawiki/mediawiki.Title.js",
                "../../resources/mediawiki/mediawiki.notify.js",
index 1a2e121..caffce9 100644 (file)
@@ -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,8 +67,8 @@ class JSParseHelper extends Maintenance {
                        $this->output( "$filename OK\n" );
                }
 
-               if ($this->errs > 0) {
-                       exit(1);
+               if ( $this->errs > 0 ) {
+                       exit( 1 );
                }
        }
 }
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 6abf7b4..55e34be 100644 (file)
@@ -82,12 +82,14 @@ if ( $run ) {
        }
        include( $messagesFile );
        $messageExist = isset( $messages );
-       if ( $messageExist )
+       if ( $messageExist ) {
                $wgMessages[$langCode] = $messages;
+       }
        include( $messagesFileC );
        $messageCExist = isset( $messages );
-       if ( $messageCExist )
+       if ( $messageCExist ) {
                $wgMessages[$langCodeC] = $messages;
+       }
        $count = 0;
 
        if ( ( $messageExist ) && ( $messageCExist ) ) {
@@ -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 3fa8ede..9e583e7 100644 (file)
@@ -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'] ) ) {
@@ -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 ad29efb..dcace15 100644 (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();
index dcd9b9b..9fbc0bc 100644 (file)
@@ -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..9e629b4 100644 (file)
@@ -188,6 +188,7 @@ $wgIgnoredMessages = array(
        'fewestrevisions-summary',
        'upload-summary',
        'wantedtemplates-summary',
+       'activeusers-summary',
        'search-summary',
        'editpage-head-copy-warn',
        'editpage-tos-summary',
@@ -247,6 +248,14 @@ $wgIgnoredMessages = array(
        'ipb-default-expiry',
        'pageinfo-header',
        'pageinfo-footer',
+       'createacct-benefit-head1',
+       'createacct-benefit-icon1',
+       'createacct-benefit-head2',
+       'createacct-benefit-icon2',
+       'createacct-benefit-head3',
+       'createacct-benefit-icon3',
+       'today-at',
+       'redirect-text',
 );
 
 /** Optional messages, which may be translated only if changed in the target language. */
index b7ad695..a8b682b 100644 (file)
@@ -431,10 +431,15 @@ $wgMessageStructure = array(
                'yourname',
                'userlogin-yourname',
                'userlogin-yourname-ph',
+               'createacct-helpusername-url',
+               'createacct-helpusername-link',
                'yourpassword',
                'userlogin-yourpassword',
                'userlogin-yourpassword-ph',
+               'createacct-yourpassword-ph',
                'yourpasswordagain',
+               'createacct-yourpasswordagain',
+               'createacct-yourpasswordagain-ph',
                'remembermypassword',
                'userlogin-remembermypassword',
                'userlogin-signwithsecure',
@@ -461,11 +466,34 @@ $wgMessageStructure = array(
                'userlogin-resetlink',
                '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-captcha-help-url',
+               '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,6 +569,7 @@ $wgMessageStructure = array(
                'resetpass-submit-cancel',
                'resetpass-wrong-oldpass',
                'resetpass-temp-password',
+               'resetpass-abort-generic',
        ),
        'passwordreset' => array(
                'passwordreset',
@@ -1104,6 +1133,7 @@ $wgMessageStructure = array(
                'userrights-changeable-col',
                'userrights-unchangeable-col',
                'userrights-irreversible-marker',
+               'userrights-conflict',
        ),
        'group' => array(
                'group',
@@ -1847,6 +1877,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',
@@ -2479,7 +2520,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',
@@ -2808,11 +2849,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 +3224,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 +3652,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 +3749,7 @@ $wgMessageStructure = array(
                'htmlform-selectorother-other',
                'htmlform-no',
                'htmlform-yes',
+               'htmlform-chosen-placeholder',
        ),
        'sqlite' => array(
                'sqlite-has-fts',
@@ -3931,6 +3995,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 +4036,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',
@@ -4058,7 +4122,6 @@ Variants for Chinese language",
        'signatures'            => 'Signatures',
        'CoreParserFunctions'   => 'Core parser functions',
        'version'               => 'Special:Version',
-       'filepath'              => 'Special:FilePath',
        'fileduplicatesearch'   => 'Special:FileDuplicateSearch',
        'special-specialpages'  => 'Special:SpecialPages',
        'special-blank'         => 'Special:BlankPage',
index ba50322..4eab666 100644 (file)
@@ -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 17e1b2e..973e9c4 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";
                                }
                        }
@@ -117,12 +120,12 @@ $messages = array(
 
                # 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) ) {
+                       } 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;
                        } 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..4bed0d4 100644 (file)
@@ -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..91a106b 100644 (file)
@@ -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 {
index fbba977..06cdfb0 100644 (file)
@@ -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;
                                }
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..8aac4b3 100644 (file)
@@ -61,7 +61,7 @@ $doxygenTemplate = $mwPath . 'maintenance/Doxyfile';
 $doxygenInputFilter = "php {$mwPath}maintenance/mwdoc-filter.php";
 
 /** where Phpdoc should output documentation */
-$doxyOutput = $mwPath . 'docs' . DIRECTORY_SEPARATOR ;
+$doxyOutput = $mwPath . 'docs' . DIRECTORY_SEPARATOR;
 
 $doxyVersion = 'master';
 
@@ -122,14 +122,14 @@ function generateConfigFile( $doxygenTemplate, $outputDirectory, $stripFromPath,
        // Replace template placeholders by correct values.
        $replacements = array(
                '{{OUTPUT_DIRECTORY}}' => $outputDirectory,
-               '{{STRIP_FROM_PATH}}'  => $stripFromPath,
-               '{{CURRENT_VERSION}}'  => $currentVersion,
-               '{{INPUT}}'            => $input,
-               '{{EXCLUDE}}'          => $exclude,
+               '{{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,
+               '{{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-' );
@@ -145,13 +145,23 @@ function generateConfigFile( $doxygenTemplate, $outputDirectory, $stripFromPath,
 unset( $file );
 
 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;
+       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++;
@@ -159,7 +169,9 @@ if ( is_array( $argv ) ) {
                                $file = $argv[$i];
                        }
                        break;
-               case '--no-extensions': $input = 6; break;
+               case '--no-extensions':
+                       $input = 6;
+                       break;
                case '--output':
                        $i++;
                        if ( isset( $argv[$i] ) ) {
@@ -198,7 +210,7 @@ Other options:
 
 
 END;
-                       exit(0);
+                       exit( 0 );
                        break;
                }
        }
@@ -217,8 +229,7 @@ Several documentation possibilities:
  5 : only a given file
  6 : all but the extensions directory
 OPTIONS;
-       while ( !is_numeric( $input ) )
-       {
+       while ( !is_numeric( $input ) ) {
                $input = readaline( "\nEnter your choice [0]:" );
                if ( $input == '' ) {
                        $input = 0;
@@ -227,11 +238,21 @@ OPTIONS;
 }
 
 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 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" );
index 6067a82..c111b3b 100644 (file)
@@ -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" );
index c471a44..e18f362 100644 (file)
@@ -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__ );
index 89dffe0..bca3237 100644 (file)
@@ -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" );
index a46c5e1..8f16597 100644 (file)
@@ -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;
                                                }
                                        }
index c5bf569..0f6f365 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);
@@ -703,7 +703,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..bae0b88 100644 (file)
@@ -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 );
index 8ca9fbb..d017c0e 100644 (file)
@@ -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 );
        }
 
index 27e692d..3a02d71 100644 (file)
@@ -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 ) );
index 99d8155..c372891 100644 (file)
@@ -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 );
index e81d4ff..c9b7b99 100644 (file)
@@ -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 ),
index 1572869..58f4407 100644 (file)
@@ -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 );
index 113eef4..dfe905e 100644 (file)
@@ -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__
                        );
index bb3d68b..3e46205 100644 (file)
@@ -86,9 +86,8 @@ 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() );
                }
        }
 }
index 49c7aee..0a1a9f6 100644 (file)
@@ -29,7 +29,7 @@ class PPFuzzTester {
        public $hairs = array(
                '[[', ']]', '{{', '{{', '}}', '}}', '{{{', '}}}',
                '<', '>', '<nowiki', '<gallery', '</nowiki>', '</gallery>', '<nOwIkI>', '</NoWiKi>',
-               '<!--' , '-->',
+               '<!--', '-->',
                "\n==", "==\n",
                '|', '=', "\n", ' ', "\t", "\x7f",
                '~~', '~~~', '~~~~', 'subst:',
index ff13bd6..8f4caa8 100644 (file)
@@ -67,7 +67,7 @@ class Protect extends Maintenance {
                }
 
                $restrictions = array();
-               foreach( $t->getRestrictionTypes() as $type ) {
+               foreach ( $t->getRestrictionTypes() as $type ) {
                        $restrictions[$type] = $protection;
                }
 
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 cd62716..c6a6e29 100644 (file)
@@ -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 ) {
index 0945c9d..52e7fec 100644 (file)
@@ -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();
                }
@@ -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();
index 2d79f36..b55a779 100644 (file)
@@ -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' ) ) {
index 3165b97..f3a42c4 100644 (file)
@@ -153,8 +153,9 @@ class RebuildFileCache extends Maintenance {
                $this->output( "Done!\n" );
 
                // Remove these to be safe
-               if ( isset( $wgTitle ) )
+               if ( isset( $wgTitle ) ) {
                        unset( $wgTitle );
+               }
        }
 }
 
index db77564..81e8904 100644 (file)
@@ -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
index a70e591..dfaae24 100644 (file)
@@ -45,8 +45,9 @@ 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" );
                }
        }
index ea2051e..9ca6ab6 100644 (file)
@@ -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__
index 534b7ca..8ff2b7b 100644 (file)
@@ -147,7 +147,7 @@ class RebuildTextIndex extends Maintenance {
                $searchindex = $this->db->tableName( 'searchindex' );
                $this->output( "\nRebuild the index...\n" );
                $sql = "ALTER TABLE $searchindex ADD FULLTEXT si_title (si_title), " .
-                 "ADD FULLTEXT si_text (si_text)";
+                       "ADD FULLTEXT si_text (si_text)";
                $this->db->query( $sql, __METHOD__ );
        }
 
index 55f5b4a..a1e7b18 100644 (file)
@@ -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 );
index 7b25566..e3820f0 100644 (file)
@@ -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;
index 2ba2b3d..2039a21 100644 (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" );
        }
 
index e113916..9b1b6e7 100644 (file)
@@ -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;
index 66d8028..1f48ffe 100644 (file)
@@ -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 );
@@ -94,6 +95,7 @@ class RunJobs extends Maintenance {
 
                                // Run the job...
                                $t = microtime( true );
+                               wfProfileIn( __METHOD__ . '-' . get_class( $job ) );
                                try {
                                        $status = $job->run();
                                        $error = $job->getLastError();
@@ -101,6 +103,7 @@ class RunJobs extends Maintenance {
                                        $status = false;
                                        $error = get_class( $e ) . ': ' . $e->getMessage();
                                }
+                               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
index 831746d..e7ddfa8 100644 (file)
@@ -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();
index dbbdab9..11f3a43 100644 (file)
@@ -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
index 1169990..66de5b1 100644 (file)
@@ -70,9 +70,9 @@ class MwSql extends Maintenance {
 
                $wholeLine = '';
                $newPrompt = '> ';
-               $prompt    = $newPrompt;
+               $prompt = $newPrompt;
                while ( ( $line = Maintenance::readconsole( $prompt ) ) !== false ) {
-                       if( !$line ) {
+                       if ( !$line ) {
                                # User simply pressed return key
                                continue;
                        }
@@ -91,12 +91,12 @@ class MwSql extends Maintenance {
                                readline_add_history( $wholeLine . $dbw->getDelimiter() );
                                readline_write_history( $historyFile );
                        }
-                       try{
+                       try {
                                $res = $dbw->query( $wholeLine );
                                $this->sqlPrintResult( $res, $dbw );
-                               $prompt    = $newPrompt;
+                               $prompt = $newPrompt;
                                $wholeLine = '';
-                       } catch (DBQueryError $e) {
+                       } catch ( DBQueryError $e ) {
                                $doDie = ! Maintenance::posix_isatty( 0 );
                                $this->error( $e, $doDie );
                        }
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 fd9393f..632e04a 100644 (file)
@@ -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 b0cbf28..a3a2a4c 100644 (file)
@@ -115,7 +115,7 @@ class CompressOld extends Maintenance {
                do {
                        $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;
@@ -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,14 +351,15 @@ 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();
                                                        $dbw->update( 'text',
@@ -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
index 39f08f9..3fffb82 100644 (file)
@@ -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" );
index 030a147..2a6d017 100644 (file)
@@ -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 158019b..e5d755e 100644 (file)
@@ -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" );
index f69a9b0..e225ebb 100644 (file)
@@ -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();
                }
 
index ac78484..1030338 100644 (file)
@@ -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 );
index f92f67a..90a0cd0 100644 (file)
@@ -100,7 +100,7 @@ class UpdateSpecialPages extends Maintenance {
                        }
 
                        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..." );
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..ddbda49 100644 (file)
@@ -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 7e1e3a3..0d8b330 100644 (file)
@@ -20,7 +20,7 @@
  * @file
  */
 
-if( !defined( 'MEDIAWIKI' ) ) {
+if ( !defined( 'MEDIAWIKI' ) ) {
        die( 'Not an entry point.' );
 }
 
@@ -141,6 +141,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' ),
@@ -636,6 +640,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',
@@ -902,7 +907,7 @@ return array(
        ),
        'mediawiki.special.preferences' => array(
                'scripts' => 'resources/mediawiki.special/mediawiki.special.preferences.js',
-               'styles'  => 'resources/mediawiki.special/mediawiki.special.preferences.css',
+               'styles' => 'resources/mediawiki.special/mediawiki.special.preferences.css',
        ),
        'mediawiki.special.recentchanges' => array(
                'scripts' => 'resources/mediawiki.special/mediawiki.special.recentchanges.js',
@@ -944,6 +949,22 @@ return array(
                ),
                'position' => 'top',
        ),
+       'mediawiki.special.createaccount.vform' => array(
+               'styles' => array(
+                       'resources/mediawiki.special/mediawiki.special.vforms.css',
+                       'resources/mediawiki.special/mediawiki.special.createAccount.vform.css',
+               ),
+               'position' => 'top',
+       ),
+       'mediawiki.special.createaccount.vform.js' => array(
+               'scripts' => 'resources/mediawiki.special/mediawiki.special.createAccount.vform.js',
+               'messages' => array(
+                       'createacct-captcha',
+                       'createacct-imgcaptcha-ph'
+               ),
+               'dependencies' => 'mediawiki.jqueryMsg',
+               'position' => 'top',
+       ),
        'mediawiki.special.javaScriptTest' => array(
                'scripts' => 'resources/mediawiki.special/mediawiki.special.javaScriptTest.js',
                'messages' => array_merge( Skin::getSkinNameMessages(), array(
diff --git a/resources/jquery.chosen/LICENSE b/resources/jquery.chosen/LICENSE
new file mode 100644 (file)
index 0000000..0675dc5
--- /dev/null
@@ -0,0 +1,24 @@
+# Chosen, a Select Box Enhancer for jQuery and Protoype
+## by Patrick Filler for [Harvest](http://getharvest.com)
+
+Available for use under the [MIT License](http://en.wikipedia.org/wiki/MIT_License)
+
+Copyright (c) 2011-2013 by Harvest
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/resources/jquery.chosen/chosen-sprite.png b/resources/jquery.chosen/chosen-sprite.png
new file mode 100644 (file)
index 0000000..3611ae4
Binary files /dev/null and b/resources/jquery.chosen/chosen-sprite.png differ
diff --git a/resources/jquery.chosen/chosen-sprite@2x.png b/resources/jquery.chosen/chosen-sprite@2x.png
new file mode 100644 (file)
index 0000000..ffe4d7d
Binary files /dev/null and b/resources/jquery.chosen/chosen-sprite@2x.png differ
diff --git a/resources/jquery.chosen/chosen.css b/resources/jquery.chosen/chosen.css
new file mode 100644 (file)
index 0000000..17793ed
--- /dev/null
@@ -0,0 +1,440 @@
+/* @group Base */
+.chzn-container {
+  font-size: 13px;
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+  zoom: 1;
+  *display: inline;
+}
+.chzn-container .chzn-drop {
+  background: #fff;
+  border: 1px solid #aaa;
+  border-top: 0;
+  position: absolute;
+  top: 100%;
+  left: -9999px;
+  -webkit-box-shadow: 0 4px 5px rgba(0,0,0,.15);
+  -moz-box-shadow   : 0 4px 5px rgba(0,0,0,.15);
+  box-shadow        : 0 4px 5px rgba(0,0,0,.15);
+  z-index: 1010;
+  width: 100%;
+  -moz-box-sizing   : border-box;
+  -ms-box-sizing    : border-box;
+  -webkit-box-sizing: border-box;
+  -khtml-box-sizing : border-box;
+  box-sizing        : border-box;
+}
+
+.chzn-container.chzn-with-drop .chzn-drop {
+  left: 0;
+}
+
+/* @end */
+
+/* @group Single Chosen */
+.chzn-container-single .chzn-single {
+  background-color: #ffffff;
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0 );   
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4));
+  background-image: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+  background-image: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+  background-image: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+  background-image: linear-gradient(#ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); 
+  -webkit-border-radius: 5px;
+  -moz-border-radius   : 5px;
+  border-radius        : 5px;
+  -moz-background-clip   : padding;
+  -webkit-background-clip: padding-box;
+  background-clip        : padding-box;
+  border: 1px solid #aaaaaa;
+  -webkit-box-shadow: 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
+  -moz-box-shadow   : 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
+  box-shadow        : 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
+  display: block;
+  overflow: hidden;
+  white-space: nowrap;
+  position: relative;
+  height: 23px;
+  line-height: 24px;
+  padding: 0 0 0 8px;
+  color: #444444;
+  text-decoration: none;
+}
+.chzn-container-single .chzn-default {
+  color: #999;
+}
+.chzn-container-single .chzn-single span {
+  margin-right: 26px;
+  display: block;
+  overflow: hidden;
+  white-space: nowrap;
+  -o-text-overflow: ellipsis;
+  -ms-text-overflow: ellipsis;
+  text-overflow: ellipsis;
+}
+.chzn-container-single .chzn-single abbr {
+  display: block;
+  position: absolute;
+  right: 26px;
+  top: 6px;
+  width: 12px;
+  height: 12px;
+  font-size: 1px;
+  background: url('chosen-sprite.png') -42px 1px no-repeat;
+}
+.chzn-container-single .chzn-single abbr:hover {
+  background-position: -42px -10px;
+}
+.chzn-container-single.chzn-disabled .chzn-single abbr:hover {
+  background-position: -42px -10px;
+}
+.chzn-container-single .chzn-single div {
+  position: absolute;
+  right: 0;
+  top: 0;
+  display: block;
+  height: 100%;
+  width: 18px;
+}
+.chzn-container-single .chzn-single div b {
+  background: url('chosen-sprite.png') no-repeat 0px 2px;
+  display: block;
+  width: 100%;
+  height: 100%;
+}
+.chzn-container-single .chzn-search {
+  padding: 3px 4px;
+  position: relative;
+  margin: 0;
+  white-space: nowrap;
+  z-index: 1010;
+}
+.chzn-container-single .chzn-search input {
+  background: #fff url('chosen-sprite.png') no-repeat 100% -20px;
+  background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-gradient(linear, 0 0, 0 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
+  background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background: url('chosen-sprite.png') no-repeat 100% -20px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background: url('chosen-sprite.png') no-repeat 100% -20px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background: url('chosen-sprite.png') no-repeat 100% -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);
+  margin: 1px 0;
+  padding: 4px 20px 4px 5px;
+  outline: 0;
+  border: 1px solid #aaa;
+  font-family: sans-serif;
+  font-size: 1em;
+  width: 100%;
+  -moz-box-sizing   : border-box;
+  -ms-box-sizing    : border-box;
+  -webkit-box-sizing: border-box;
+  -khtml-box-sizing : border-box;
+  box-sizing        : border-box;
+}
+.chzn-container-single .chzn-drop {
+  margin-top: -1px;
+  -webkit-border-radius: 0 0 4px 4px;
+  -moz-border-radius   : 0 0 4px 4px;
+  border-radius        : 0 0 4px 4px;
+  -moz-background-clip   : padding;
+  -webkit-background-clip: padding-box;
+  background-clip        : padding-box;
+}
+.chzn-container-single-nosearch .chzn-search {
+  position: absolute;
+  left: -9999px;
+}
+/* @end */
+
+/* @group Multi Chosen */
+.chzn-container-multi .chzn-choices {
+  background-color: #fff;
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background-image: -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background-image: -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background-image: linear-gradient(#eeeeee 1%, #ffffff 15%);
+  border: 1px solid #aaa;
+  margin: 0;
+  padding: 0;
+  cursor: text;
+  overflow: hidden;
+  height: auto !important;
+  height: 1%;
+  position: relative;
+  width: 100%;
+  -moz-box-sizing   : border-box;
+  -ms-box-sizing    : border-box;
+  -webkit-box-sizing: border-box;
+  -khtml-box-sizing : border-box;
+  box-sizing        : border-box;
+}
+.chzn-container-multi .chzn-choices li {
+  float: left;
+  list-style: none;
+}
+.chzn-container-multi .chzn-choices .search-field {
+  white-space: nowrap;
+  margin: 0;
+  padding: 0;
+}
+.chzn-container-multi .chzn-choices .search-field input {
+  color: #666;
+  background: transparent !important;
+  border: 0 !important;
+  font-family: sans-serif;
+  font-size: 100%;
+  height: 15px;
+  padding: 5px;
+  margin: 1px 0;
+  outline: 0;
+  -webkit-box-shadow: none;
+  -moz-box-shadow   : none;
+  box-shadow        : none;
+}
+.chzn-container-multi .chzn-choices .search-field .default {
+  color: #999;
+}
+.chzn-container-multi .chzn-choices .search-choice {
+  -webkit-border-radius: 3px;
+  -moz-border-radius   : 3px;
+  border-radius        : 3px;
+  -moz-background-clip   : padding;
+  -webkit-background-clip: padding-box;
+  background-clip        : padding-box;
+  background-color: #e4e4e4;
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0 ); 
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
+  background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); 
+  -webkit-box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
+  -moz-box-shadow   : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
+  box-shadow        : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
+  color: #333;
+  border: 1px solid #aaaaaa;
+  line-height: 13px;
+  padding: 3px 20px 3px 5px;
+  margin: 3px 0 3px 5px;
+  position: relative;
+  cursor: default;
+}
+.chzn-container-multi .chzn-choices .search-choice.search-choice-disabled {
+  background-color: #e4e4e4;
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0 );
+  background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
+  background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: -ms-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  color: #666;
+  border: 1px solid #cccccc;
+  padding-right: 5px;
+}
+.chzn-container-multi .chzn-choices .search-choice-focus {
+  background: #d4d4d4;
+}
+.chzn-container-multi .chzn-choices .search-choice .search-choice-close {
+  display: block;
+  position: absolute;
+  right: 3px;
+  top: 4px;
+  width: 12px;
+  height: 12px;
+  font-size: 1px;
+  background: url('chosen-sprite.png') -42px 1px no-repeat;
+}
+.chzn-container-multi .chzn-choices .search-choice .search-choice-close:hover {
+  background-position: -42px -10px;
+}
+.chzn-container-multi .chzn-choices .search-choice-focus .search-choice-close {
+  background-position: -42px -10px;
+}
+/* @end */
+
+/* @group Results */
+.chzn-container .chzn-results {
+  margin: 0 4px 4px 0;
+  max-height: 240px;
+  padding: 0 0 0 4px;
+  position: relative;
+  overflow-x: hidden;
+  overflow-y: auto;
+  -webkit-overflow-scrolling: touch;
+}
+.chzn-container-multi .chzn-results {
+  margin: 0;
+  padding: 0;
+}
+.chzn-container .chzn-results li {
+  display: none;
+  line-height: 15px;
+  padding: 5px 6px;
+  margin: 0;
+  list-style: none;
+}
+.chzn-container .chzn-results .active-result {
+  cursor: pointer;
+  display: list-item;
+}
+.chzn-container .chzn-results .highlighted {
+  background-color: #3875d7;
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3875d7', endColorstr='#2a62bc', GradientType=0 );  
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc));
+  background-image: -webkit-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
+  background-image: -moz-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
+  background-image: -o-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
+  background-image: linear-gradient(#3875d7 20%, #2a62bc 90%);
+  color: #fff;
+}
+.chzn-container .chzn-results li em {
+  background: #feffde;
+  font-style: normal;
+}
+.chzn-container .chzn-results .highlighted em {
+  background: transparent;
+}
+.chzn-container .chzn-results .no-results {
+  background: #f4f4f4;
+  display: list-item;
+}
+.chzn-container .chzn-results .group-result {
+  cursor: default;
+  color: #999;
+  font-weight: bold;
+}
+.chzn-container .chzn-results .group-option {
+  padding-left: 15px;
+}
+.chzn-container-multi .chzn-drop .result-selected {
+  display: none;
+}
+.chzn-container .chzn-results-scroll {
+  background: white;
+  margin: 0 4px;
+  position: absolute;
+  text-align: center;
+  width: 321px; /* This should by dynamic with js */
+  z-index: 1;
+}
+.chzn-container .chzn-results-scroll span {
+  display: inline-block;
+  height: 17px;
+  text-indent: -5000px;
+  width: 9px;
+}
+.chzn-container .chzn-results-scroll-down {
+  bottom: 0;
+}
+.chzn-container .chzn-results-scroll-down span {
+  background: url('chosen-sprite.png') no-repeat -4px -3px;
+}
+.chzn-container .chzn-results-scroll-up span {
+  background: url('chosen-sprite.png') no-repeat -22px -3px;
+}
+/* @end */
+
+/* @group Active  */
+.chzn-container-active .chzn-single {
+  -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
+  -moz-box-shadow   : 0 0 5px rgba(0,0,0,.3);
+  box-shadow        : 0 0 5px rgba(0,0,0,.3);
+  border: 1px solid #5897fb;
+}
+.chzn-container-active.chzn-with-drop .chzn-single {
+  border: 1px solid #aaa;
+  -webkit-box-shadow: 0 1px 0 #fff inset;
+  -moz-box-shadow   : 0 1px 0 #fff inset;
+  box-shadow        : 0 1px 0 #fff inset;
+  background-color: #eee;
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0 );
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #eeeeee), color-stop(80%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
+  background-image: -moz-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
+  background-image: -o-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
+  background-image: linear-gradient(#eeeeee 20%, #ffffff 80%);
+  -webkit-border-bottom-left-radius : 0;
+  -webkit-border-bottom-right-radius: 0;
+  -moz-border-radius-bottomleft : 0;
+  -moz-border-radius-bottomright: 0;
+  border-bottom-left-radius : 0;
+  border-bottom-right-radius: 0;
+}
+.chzn-container-active.chzn-with-drop .chzn-single div {
+  background: transparent;
+  border-left: none;
+}
+.chzn-container-active.chzn-with-drop .chzn-single div b {
+  background-position: -18px 2px;
+}
+.chzn-container-active .chzn-choices {
+  -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
+  -moz-box-shadow   : 0 0 5px rgba(0,0,0,.3);
+  box-shadow        : 0 0 5px rgba(0,0,0,.3);
+  border: 1px solid #5897fb;
+}
+.chzn-container-active .chzn-choices .search-field input {
+  color: #111 !important;
+}
+/* @end */
+
+/* @group Disabled Support */
+.chzn-disabled {
+  cursor: default;
+  opacity:0.5 !important;
+}
+.chzn-disabled .chzn-single {
+  cursor: default;
+}
+.chzn-disabled .chzn-choices .search-choice .search-choice-close {
+  cursor: default;
+}
+
+/* @group Right to Left */
+.chzn-rtl { text-align: right; }
+.chzn-rtl .chzn-single { padding: 0 8px 0 0; overflow: visible; }
+.chzn-rtl .chzn-single span { margin-left: 26px; margin-right: 0; direction: rtl; }
+
+.chzn-rtl .chzn-single div { left: 3px; right: auto; }
+.chzn-rtl .chzn-single abbr {
+  left: 26px;
+  right: auto;
+}
+.chzn-rtl .chzn-choices .search-field input { direction: rtl; }
+.chzn-rtl .chzn-choices li { float: right; }
+.chzn-rtl .chzn-choices .search-choice { padding: 3px 5px 3px 19px; margin: 3px 5px 3px 0; }
+.chzn-rtl .chzn-choices .search-choice .search-choice-close { left: 4px; right: auto; }
+.chzn-rtl .chzn-search { left: 9999px; }
+.chzn-rtl.chzn-with-drop .chzn-search { left: 0px; }
+.chzn-rtl .chzn-drop { left: 9999px; }
+.chzn-rtl.chzn-container-single .chzn-results { margin: 0 0 4px 4px; padding: 0 4px 0 0; }
+.chzn-rtl .chzn-results .group-option { padding-left: 0; padding-right: 15px; }
+.chzn-rtl.chzn-container-active.chzn-with-drop .chzn-single div { border-right: none; }
+.chzn-rtl .chzn-search input {
+  background: #fff url('chosen-sprite.png') no-repeat -30px -20px;
+  background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-gradient(linear, 0 0, 0 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
+  background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);  
+  background: url('chosen-sprite.png') no-repeat -30px -20px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background: url('chosen-sprite.png') no-repeat -30px -20px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background: url('chosen-sprite.png') no-repeat -30px -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);
+  padding: 4px 5px 4px 20px;
+  direction: rtl;
+}
+.chzn-container-single.chzn-rtl .chzn-single div b {
+  background-position: 6px 2px;
+}
+.chzn-container-single.chzn-rtl.chzn-with-drop .chzn-single div b {
+  background-position: -12px 2px;
+}
+/* @end */
+
+/* @group Retina compatibility */
+@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 144dpi)  {
+  .chzn-rtl .chzn-search input, .chzn-container-single .chzn-single abbr, .chzn-container-single .chzn-single div b, .chzn-container-single .chzn-search input, .chzn-container-multi .chzn-choices .search-choice .search-choice-close, .chzn-container .chzn-results-scroll-down span, .chzn-container .chzn-results-scroll-up span {
+      background-image: url('chosen-sprite@2x.png') !important;
+      background-repeat: no-repeat !important;
+      background-size: 52px 37px !important;
+  }
+}
+/* @end */
diff --git a/resources/jquery.chosen/chosen.jquery.js b/resources/jquery.chosen/chosen.jquery.js
new file mode 100644 (file)
index 0000000..a240ebd
--- /dev/null
@@ -0,0 +1,1103 @@
+// Chosen, a Select Box Enhancer for jQuery and Protoype
+// by Patrick Filler for Harvest, http://getharvest.com
+//
+// Version 0.9.14
+// Full source at https://github.com/harvesthq/chosen
+// Copyright (c) 2011 Harvest http://getharvest.com
+
+// MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
+// This file is generated by `cake build`, do not edit it by hand.
+(function() {
+  var SelectParser;
+
+  SelectParser = (function() {
+
+    function SelectParser() {
+      this.options_index = 0;
+      this.parsed = [];
+    }
+
+    SelectParser.prototype.add_node = function(child) {
+      if (child.nodeName.toUpperCase() === "OPTGROUP") {
+        return this.add_group(child);
+      } else {
+        return this.add_option(child);
+      }
+    };
+
+    SelectParser.prototype.add_group = function(group) {
+      var group_position, option, _i, _len, _ref, _results;
+      group_position = this.parsed.length;
+      this.parsed.push({
+        array_index: group_position,
+        group: true,
+        label: group.label,
+        children: 0,
+        disabled: group.disabled
+      });
+      _ref = group.childNodes;
+      _results = [];
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        option = _ref[_i];
+        _results.push(this.add_option(option, group_position, group.disabled));
+      }
+      return _results;
+    };
+
+    SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
+      if (option.nodeName.toUpperCase() === "OPTION") {
+        if (option.text !== "") {
+          if (group_position != null) {
+            this.parsed[group_position].children += 1;
+          }
+          this.parsed.push({
+            array_index: this.parsed.length,
+            options_index: this.options_index,
+            value: option.value,
+            text: option.text,
+            html: option.innerHTML,
+            selected: option.selected,
+            disabled: group_disabled === true ? group_disabled : option.disabled,
+            group_array_index: group_position,
+            classes: option.className,
+            style: option.style.cssText
+          });
+        } else {
+          this.parsed.push({
+            array_index: this.parsed.length,
+            options_index: this.options_index,
+            empty: true
+          });
+        }
+        return this.options_index += 1;
+      }
+    };
+
+    return SelectParser;
+
+  })();
+
+  SelectParser.select_to_array = function(select) {
+    var child, parser, _i, _len, _ref;
+    parser = new SelectParser();
+    _ref = select.childNodes;
+    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+      child = _ref[_i];
+      parser.add_node(child);
+    }
+    return parser.parsed;
+  };
+
+  this.SelectParser = SelectParser;
+
+}).call(this);
+
+/*
+Chosen source: generate output using 'cake build'
+Copyright (c) 2011 by Harvest
+*/
+
+
+(function() {
+  var AbstractChosen, root;
+
+  root = this;
+
+  AbstractChosen = (function() {
+
+    function AbstractChosen(form_field, options) {
+      this.form_field = form_field;
+      this.options = options != null ? options : {};
+      if (!AbstractChosen.browser_is_supported()) {
+        return;
+      }
+      this.is_multiple = this.form_field.multiple;
+      this.set_default_text();
+      this.set_default_values();
+      this.setup();
+      this.set_up_html();
+      this.register_observers();
+      this.finish_setup();
+    }
+
+    AbstractChosen.prototype.set_default_values = function() {
+      var _this = this;
+      this.click_test_action = function(evt) {
+        return _this.test_active_click(evt);
+      };
+      this.activate_action = function(evt) {
+        return _this.activate_field(evt);
+      };
+      this.active_field = false;
+      this.mouse_on_container = false;
+      this.results_showing = false;
+      this.result_highlighted = null;
+      this.result_single_selected = null;
+      this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false;
+      this.disable_search_threshold = this.options.disable_search_threshold || 0;
+      this.disable_search = this.options.disable_search || false;
+      this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true;
+      this.search_contains = this.options.search_contains || false;
+      this.choices = 0;
+      this.single_backstroke_delete = this.options.single_backstroke_delete || false;
+      this.max_selected_options = this.options.max_selected_options || Infinity;
+      return this.inherit_select_classes = this.options.inherit_select_classes || false;
+    };
+
+    AbstractChosen.prototype.set_default_text = function() {
+      if (this.form_field.getAttribute("data-placeholder")) {
+        this.default_text = this.form_field.getAttribute("data-placeholder");
+      } else if (this.is_multiple) {
+        this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || AbstractChosen.default_multiple_text;
+      } else {
+        this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || AbstractChosen.default_single_text;
+      }
+      return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || this.options.no_results_text || AbstractChosen.default_no_result_text;
+    };
+
+    AbstractChosen.prototype.mouse_enter = function() {
+      return this.mouse_on_container = true;
+    };
+
+    AbstractChosen.prototype.mouse_leave = function() {
+      return this.mouse_on_container = false;
+    };
+
+    AbstractChosen.prototype.input_focus = function(evt) {
+      var _this = this;
+      if (this.is_multiple) {
+        if (!this.active_field) {
+          return setTimeout((function() {
+            return _this.container_mousedown();
+          }), 50);
+        }
+      } else {
+        if (!this.active_field) {
+          return this.activate_field();
+        }
+      }
+    };
+
+    AbstractChosen.prototype.input_blur = function(evt) {
+      var _this = this;
+      if (!this.mouse_on_container) {
+        this.active_field = false;
+        return setTimeout((function() {
+          return _this.blur_test();
+        }), 100);
+      }
+    };
+
+    AbstractChosen.prototype.result_add_option = function(option) {
+      var classes, style;
+      if (!option.disabled) {
+        option.dom_id = this.container_id + "_o_" + option.array_index;
+        classes = option.selected && this.is_multiple ? [] : ["active-result"];
+        if (option.selected) {
+          classes.push("result-selected");
+        }
+        if (option.group_array_index != null) {
+          classes.push("group-option");
+        }
+        if (option.classes !== "") {
+          classes.push(option.classes);
+        }
+        style = option.style.cssText !== "" ? " style=\"" + option.style + "\"" : "";
+        return '<li id="' + option.dom_id + '" class="' + classes.join(' ') + '"' + style + '>' + option.html + '</li>';
+      } else {
+        return "";
+      }
+    };
+
+    AbstractChosen.prototype.results_update_field = function() {
+      this.set_default_text();
+      if (!this.is_multiple) {
+        this.results_reset_cleanup();
+      }
+      this.result_clear_highlight();
+      this.result_single_selected = null;
+      return this.results_build();
+    };
+
+    AbstractChosen.prototype.results_toggle = function() {
+      if (this.results_showing) {
+        return this.results_hide();
+      } else {
+        return this.results_show();
+      }
+    };
+
+    AbstractChosen.prototype.results_search = function(evt) {
+      if (this.results_showing) {
+        return this.winnow_results();
+      } else {
+        return this.results_show();
+      }
+    };
+
+    AbstractChosen.prototype.choices_click = function(evt) {
+      evt.preventDefault();
+      if (!this.results_showing) {
+        return this.results_show();
+      }
+    };
+
+    AbstractChosen.prototype.keyup_checker = function(evt) {
+      var stroke, _ref;
+      stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
+      this.search_field_scale();
+      switch (stroke) {
+        case 8:
+          if (this.is_multiple && this.backstroke_length < 1 && this.choices > 0) {
+            return this.keydown_backstroke();
+          } else if (!this.pending_backstroke) {
+            this.result_clear_highlight();
+            return this.results_search();
+          }
+          break;
+        case 13:
+          evt.preventDefault();
+          if (this.results_showing) {
+            return this.result_select(evt);
+          }
+          break;
+        case 27:
+          if (this.results_showing) {
+            this.results_hide();
+          }
+          return true;
+        case 9:
+        case 38:
+        case 40:
+        case 16:
+        case 91:
+        case 17:
+          break;
+        default:
+          return this.results_search();
+      }
+    };
+
+    AbstractChosen.prototype.generate_field_id = function() {
+      var new_id;
+      new_id = this.generate_random_id();
+      this.form_field.id = new_id;
+      return new_id;
+    };
+
+    AbstractChosen.prototype.generate_random_char = function() {
+      var chars, newchar, rand;
+      chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+      rand = Math.floor(Math.random() * chars.length);
+      return newchar = chars.substring(rand, rand + 1);
+    };
+
+    AbstractChosen.prototype.container_width = function() {
+      var width;
+      if (this.options.width != null) {
+        return this.options.width;
+      }
+      width = window.getComputedStyle != null ? parseFloat(window.getComputedStyle(this.form_field).getPropertyValue('width')) : (typeof jQuery !== "undefined" && jQuery !== null) && (this.form_field_jq != null) ? this.form_field_jq.outerWidth() : this.form_field.getWidth();
+      return width + "px";
+    };
+
+    AbstractChosen.browser_is_supported = function() {
+      var _ref;
+      if (window.navigator.appName === "Microsoft Internet Explorer") {
+        return (null !== (_ref = document.documentMode) && _ref >= 8);
+      }
+      return true;
+    };
+
+    AbstractChosen.default_multiple_text = "Select Some Options";
+
+    AbstractChosen.default_single_text = "Select an Option";
+
+    AbstractChosen.default_no_result_text = "No results match";
+
+    return AbstractChosen;
+
+  })();
+
+  root.AbstractChosen = AbstractChosen;
+
+}).call(this);
+
+/*
+Chosen source: generate output using 'cake build'
+Copyright (c) 2011 by Harvest
+*/
+
+
+(function() {
+  var $, Chosen, root,
+    __hasProp = {}.hasOwnProperty,
+    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
+
+  root = this;
+
+  $ = jQuery;
+
+  $.fn.extend({
+    chosen: function(options) {
+      if (!AbstractChosen.browser_is_supported()) {
+        return this;
+      }
+      return this.each(function(input_field) {
+        var $this;
+        $this = $(this);
+        if (!$this.hasClass("chzn-done")) {
+          return $this.data('chosen', new Chosen(this, options));
+        }
+      });
+    }
+  });
+
+  Chosen = (function(_super) {
+
+    __extends(Chosen, _super);
+
+    function Chosen() {
+      return Chosen.__super__.constructor.apply(this, arguments);
+    }
+
+    Chosen.prototype.setup = function() {
+      this.form_field_jq = $(this.form_field);
+      this.current_selectedIndex = this.form_field.selectedIndex;
+      return this.is_rtl = this.form_field_jq.hasClass("chzn-rtl");
+    };
+
+    Chosen.prototype.finish_setup = function() {
+      return this.form_field_jq.addClass("chzn-done");
+    };
+
+    Chosen.prototype.set_up_html = function() {
+      var container_classes, container_props;
+      this.container_id = this.form_field.id.length ? this.form_field.id.replace(/[^\w]/g, '_') : this.generate_field_id();
+      this.container_id += "_chzn";
+      container_classes = ["chzn-container"];
+      container_classes.push("chzn-container-" + (this.is_multiple ? "multi" : "single"));
+      if (this.inherit_select_classes && this.form_field.className) {
+        container_classes.push(this.form_field.className);
+      }
+      if (this.is_rtl) {
+        container_classes.push("chzn-rtl");
+      }
+      container_props = {
+        'id': this.container_id,
+        'class': container_classes.join(' '),
+        'style': "width: " + (this.container_width()) + ";",
+        'title': this.form_field.title
+      };
+      this.container = $("<div />", container_props);
+      if (this.is_multiple) {
+        this.container.html('<ul class="chzn-choices"><li class="search-field"><input type="text" value="' + this.default_text + '" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chzn-drop"><ul class="chzn-results"></ul></div>');
+      } else {
+        this.container.html('<a href="javascript:void(0)" class="chzn-single chzn-default" tabindex="-1"><span>' + this.default_text + '</span><div><b></b></div></a><div class="chzn-drop"><div class="chzn-search"><input type="text" autocomplete="off" /></div><ul class="chzn-results"></ul></div>');
+      }
+      this.form_field_jq.hide().after(this.container);
+      this.dropdown = this.container.find('div.chzn-drop').first();
+      this.search_field = this.container.find('input').first();
+      this.search_results = this.container.find('ul.chzn-results').first();
+      this.search_field_scale();
+      this.search_no_results = this.container.find('li.no-results').first();
+      if (this.is_multiple) {
+        this.search_choices = this.container.find('ul.chzn-choices').first();
+        this.search_container = this.container.find('li.search-field').first();
+      } else {
+        this.search_container = this.container.find('div.chzn-search').first();
+        this.selected_item = this.container.find('.chzn-single').first();
+      }
+      this.results_build();
+      this.set_tab_index();
+      this.set_label_behavior();
+      return this.form_field_jq.trigger("liszt:ready", {
+        chosen: this
+      });
+    };
+
+    Chosen.prototype.register_observers = function() {
+      var _this = this;
+      this.container.mousedown(function(evt) {
+        _this.container_mousedown(evt);
+      });
+      this.container.mouseup(function(evt) {
+        _this.container_mouseup(evt);
+      });
+      this.container.mouseenter(function(evt) {
+        _this.mouse_enter(evt);
+      });
+      this.container.mouseleave(function(evt) {
+        _this.mouse_leave(evt);
+      });
+      this.search_results.mouseup(function(evt) {
+        _this.search_results_mouseup(evt);
+      });
+      this.search_results.mouseover(function(evt) {
+        _this.search_results_mouseover(evt);
+      });
+      this.search_results.mouseout(function(evt) {
+        _this.search_results_mouseout(evt);
+      });
+      this.search_results.bind('mousewheel DOMMouseScroll', function(evt) {
+        _this.search_results_mousewheel(evt);
+      });
+      this.form_field_jq.bind("liszt:updated", function(evt) {
+        _this.results_update_field(evt);
+      });
+      this.form_field_jq.bind("liszt:activate", function(evt) {
+        _this.activate_field(evt);
+      });
+      this.form_field_jq.bind("liszt:open", function(evt) {
+        _this.container_mousedown(evt);
+      });
+      this.search_field.blur(function(evt) {
+        _this.input_blur(evt);
+      });
+      this.search_field.keyup(function(evt) {
+        _this.keyup_checker(evt);
+      });
+      this.search_field.keydown(function(evt) {
+        _this.keydown_checker(evt);
+      });
+      this.search_field.focus(function(evt) {
+        _this.input_focus(evt);
+      });
+      if (this.is_multiple) {
+        return this.search_choices.click(function(evt) {
+          _this.choices_click(evt);
+        });
+      } else {
+        return this.container.click(function(evt) {
+          evt.preventDefault();
+        });
+      }
+    };
+
+    Chosen.prototype.search_field_disabled = function() {
+      this.is_disabled = this.form_field_jq[0].disabled;
+      if (this.is_disabled) {
+        this.container.addClass('chzn-disabled');
+        this.search_field[0].disabled = true;
+        if (!this.is_multiple) {
+          this.selected_item.unbind("focus", this.activate_action);
+        }
+        return this.close_field();
+      } else {
+        this.container.removeClass('chzn-disabled');
+        this.search_field[0].disabled = false;
+        if (!this.is_multiple) {
+          return this.selected_item.bind("focus", this.activate_action);
+        }
+      }
+    };
+
+    Chosen.prototype.container_mousedown = function(evt) {
+      if (!this.is_disabled) {
+        if (evt && evt.type === "mousedown" && !this.results_showing) {
+          evt.preventDefault();
+        }
+        if (!((evt != null) && ($(evt.target)).hasClass("search-choice-close"))) {
+          if (!this.active_field) {
+            if (this.is_multiple) {
+              this.search_field.val("");
+            }
+            $(document).click(this.click_test_action);
+            this.results_show();
+          } else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents("a.chzn-single").length)) {
+            evt.preventDefault();
+            this.results_toggle();
+          }
+          return this.activate_field();
+        }
+      }
+    };
+
+    Chosen.prototype.container_mouseup = function(evt) {
+      if (evt.target.nodeName === "ABBR" && !this.is_disabled) {
+        return this.results_reset(evt);
+      }
+    };
+
+    Chosen.prototype.search_results_mousewheel = function(evt) {
+      var delta, _ref, _ref1;
+      delta = -((_ref = evt.originalEvent) != null ? _ref.wheelDelta : void 0) || ((_ref1 = evt.originialEvent) != null ? _ref1.detail : void 0);
+      if (delta != null) {
+        evt.preventDefault();
+        if (evt.type === 'DOMMouseScroll') {
+          delta = delta * 40;
+        }
+        return this.search_results.scrollTop(delta + this.search_results.scrollTop());
+      }
+    };
+
+    Chosen.prototype.blur_test = function(evt) {
+      if (!this.active_field && this.container.hasClass("chzn-container-active")) {
+        return this.close_field();
+      }
+    };
+
+    Chosen.prototype.close_field = function() {
+      $(document).unbind("click", this.click_test_action);
+      this.active_field = false;
+      this.results_hide();
+      this.container.removeClass("chzn-container-active");
+      this.winnow_results_clear();
+      this.clear_backstroke();
+      this.show_search_field_default();
+      return this.search_field_scale();
+    };
+
+    Chosen.prototype.activate_field = function() {
+      this.container.addClass("chzn-container-active");
+      this.active_field = true;
+      this.search_field.val(this.search_field.val());
+      return this.search_field.focus();
+    };
+
+    Chosen.prototype.test_active_click = function(evt) {
+      if ($(evt.target).parents('#' + this.container_id).length) {
+        return this.active_field = true;
+      } else {
+        return this.close_field();
+      }
+    };
+
+    Chosen.prototype.results_build = function() {
+      var content, data, _i, _len, _ref;
+      this.parsing = true;
+      this.results_data = root.SelectParser.select_to_array(this.form_field);
+      if (this.is_multiple && this.choices > 0) {
+        this.search_choices.find("li.search-choice").remove();
+        this.choices = 0;
+      } else if (!this.is_multiple) {
+        this.selected_item.addClass("chzn-default").find("span").text(this.default_text);
+        if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) {
+          this.container.addClass("chzn-container-single-nosearch");
+        } else {
+          this.container.removeClass("chzn-container-single-nosearch");
+        }
+      }
+      content = '';
+      _ref = this.results_data;
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        data = _ref[_i];
+        if (data.group) {
+          content += this.result_add_group(data);
+        } else if (!data.empty) {
+          content += this.result_add_option(data);
+          if (data.selected && this.is_multiple) {
+            this.choice_build(data);
+          } else if (data.selected && !this.is_multiple) {
+            this.selected_item.removeClass("chzn-default").find("span").text(data.text);
+            if (this.allow_single_deselect) {
+              this.single_deselect_control_build();
+            }
+          }
+        }
+      }
+      this.search_field_disabled();
+      this.show_search_field_default();
+      this.search_field_scale();
+      this.search_results.html(content);
+      return this.parsing = false;
+    };
+
+    Chosen.prototype.result_add_group = function(group) {
+      if (!group.disabled) {
+        group.dom_id = this.container_id + "_g_" + group.array_index;
+        return '<li id="' + group.dom_id + '" class="group-result">' + $("<div />").text(group.label).html() + '</li>';
+      } else {
+        return "";
+      }
+    };
+
+    Chosen.prototype.result_do_highlight = function(el) {
+      var high_bottom, high_top, maxHeight, visible_bottom, visible_top;
+      if (el.length) {
+        this.result_clear_highlight();
+        this.result_highlight = el;
+        this.result_highlight.addClass("highlighted");
+        maxHeight = parseInt(this.search_results.css("maxHeight"), 10);
+        visible_top = this.search_results.scrollTop();
+        visible_bottom = maxHeight + visible_top;
+        high_top = this.result_highlight.position().top + this.search_results.scrollTop();
+        high_bottom = high_top + this.result_highlight.outerHeight();
+        if (high_bottom >= visible_bottom) {
+          return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0);
+        } else if (high_top < visible_top) {
+          return this.search_results.scrollTop(high_top);
+        }
+      }
+    };
+
+    Chosen.prototype.result_clear_highlight = function() {
+      if (this.result_highlight) {
+        this.result_highlight.removeClass("highlighted");
+      }
+      return this.result_highlight = null;
+    };
+
+    Chosen.prototype.results_show = function() {
+      if (this.result_single_selected != null) {
+        this.result_do_highlight(this.result_single_selected);
+      } else if (this.is_multiple && this.max_selected_options <= this.choices) {
+        this.form_field_jq.trigger("liszt:maxselected", {
+          chosen: this
+        });
+        return false;
+      }
+      this.container.addClass("chzn-with-drop");
+      this.form_field_jq.trigger("liszt:showing_dropdown", {
+        chosen: this
+      });
+      this.results_showing = true;
+      this.search_field.focus();
+      this.search_field.val(this.search_field.val());
+      return this.winnow_results();
+    };
+
+    Chosen.prototype.results_hide = function() {
+      this.result_clear_highlight();
+      this.container.removeClass("chzn-with-drop");
+      this.form_field_jq.trigger("liszt:hiding_dropdown", {
+        chosen: this
+      });
+      return this.results_showing = false;
+    };
+
+    Chosen.prototype.set_tab_index = function(el) {
+      var ti;
+      if (this.form_field_jq.attr("tabindex")) {
+        ti = this.form_field_jq.attr("tabindex");
+        this.form_field_jq.attr("tabindex", -1);
+        return this.search_field.attr("tabindex", ti);
+      }
+    };
+
+    Chosen.prototype.set_label_behavior = function() {
+      var _this = this;
+      this.form_field_label = this.form_field_jq.parents("label");
+      if (!this.form_field_label.length && this.form_field.id.length) {
+        this.form_field_label = $("label[for=" + this.form_field.id + "]");
+      }
+      if (this.form_field_label.length > 0) {
+        return this.form_field_label.click(function(evt) {
+          if (_this.is_multiple) {
+            return _this.container_mousedown(evt);
+          } else {
+            return _this.activate_field();
+          }
+        });
+      }
+    };
+
+    Chosen.prototype.show_search_field_default = function() {
+      if (this.is_multiple && this.choices < 1 && !this.active_field) {
+        this.search_field.val(this.default_text);
+        return this.search_field.addClass("default");
+      } else {
+        this.search_field.val("");
+        return this.search_field.removeClass("default");
+      }
+    };
+
+    Chosen.prototype.search_results_mouseup = function(evt) {
+      var target;
+      target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
+      if (target.length) {
+        this.result_highlight = target;
+        this.result_select(evt);
+        return this.search_field.focus();
+      }
+    };
+
+    Chosen.prototype.search_results_mouseover = function(evt) {
+      var target;
+      target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
+      if (target) {
+        return this.result_do_highlight(target);
+      }
+    };
+
+    Chosen.prototype.search_results_mouseout = function(evt) {
+      if ($(evt.target).hasClass("active-result" || $(evt.target).parents('.active-result').first())) {
+        return this.result_clear_highlight();
+      }
+    };
+
+    Chosen.prototype.choice_build = function(item) {
+      var choice_id, html, link,
+        _this = this;
+      if (this.is_multiple && this.max_selected_options <= this.choices) {
+        this.form_field_jq.trigger("liszt:maxselected", {
+          chosen: this
+        });
+        return false;
+      }
+      choice_id = this.container_id + "_c_" + item.array_index;
+      this.choices += 1;
+      if (item.disabled) {
+        html = '<li class="search-choice search-choice-disabled" id="' + choice_id + '"><span>' + item.html + '</span></li>';
+      } else {
+        html = '<li class="search-choice" id="' + choice_id + '"><span>' + item.html + '</span><a href="javascript:void(0)" class="search-choice-close" rel="' + item.array_index + '"></a></li>';
+      }
+      this.search_container.before(html);
+      link = $('#' + choice_id).find("a").first();
+      return link.click(function(evt) {
+        return _this.choice_destroy_link_click(evt);
+      });
+    };
+
+    Chosen.prototype.choice_destroy_link_click = function(evt) {
+      evt.preventDefault();
+      evt.stopPropagation();
+      if (!this.is_disabled) {
+        return this.choice_destroy($(evt.target));
+      }
+    };
+
+    Chosen.prototype.choice_destroy = function(link) {
+      if (this.result_deselect(link.attr("rel"))) {
+        this.choices -= 1;
+        this.show_search_field_default();
+        if (this.is_multiple && this.choices > 0 && this.search_field.val().length < 1) {
+          this.results_hide();
+        }
+        link.parents('li').first().remove();
+        return this.search_field_scale();
+      }
+    };
+
+    Chosen.prototype.results_reset = function() {
+      this.form_field.options[0].selected = true;
+      this.selected_item.find("span").text(this.default_text);
+      if (!this.is_multiple) {
+        this.selected_item.addClass("chzn-default");
+      }
+      this.show_search_field_default();
+      this.results_reset_cleanup();
+      this.form_field_jq.trigger("change");
+      if (this.active_field) {
+        return this.results_hide();
+      }
+    };
+
+    Chosen.prototype.results_reset_cleanup = function() {
+      this.current_selectedIndex = this.form_field.selectedIndex;
+      return this.selected_item.find("abbr").remove();
+    };
+
+    Chosen.prototype.result_select = function(evt) {
+      var high, high_id, item, position;
+      if (this.result_highlight) {
+        high = this.result_highlight;
+        high_id = high.attr("id");
+        this.result_clear_highlight();
+        if (this.is_multiple) {
+          this.result_deactivate(high);
+        } else {
+          this.search_results.find(".result-selected").removeClass("result-selected");
+          this.result_single_selected = high;
+          this.selected_item.removeClass("chzn-default");
+        }
+        high.addClass("result-selected");
+        position = high_id.substr(high_id.lastIndexOf("_") + 1);
+        item = this.results_data[position];
+        item.selected = true;
+        this.form_field.options[item.options_index].selected = true;
+        if (this.is_multiple) {
+          this.choice_build(item);
+        } else {
+          this.selected_item.find("span").first().text(item.text);
+          if (this.allow_single_deselect) {
+            this.single_deselect_control_build();
+          }
+        }
+        if (!((evt.metaKey || evt.ctrlKey) && this.is_multiple)) {
+          this.results_hide();
+        }
+        this.search_field.val("");
+        if (this.is_multiple || this.form_field.selectedIndex !== this.current_selectedIndex) {
+          this.form_field_jq.trigger("change", {
+            'selected': this.form_field.options[item.options_index].value
+          });
+        }
+        this.current_selectedIndex = this.form_field.selectedIndex;
+        return this.search_field_scale();
+      }
+    };
+
+    Chosen.prototype.result_activate = function(el) {
+      return el.addClass("active-result");
+    };
+
+    Chosen.prototype.result_deactivate = function(el) {
+      return el.removeClass("active-result");
+    };
+
+    Chosen.prototype.result_deselect = function(pos) {
+      var result, result_data;
+      result_data = this.results_data[pos];
+      if (!this.form_field.options[result_data.options_index].disabled) {
+        result_data.selected = false;
+        this.form_field.options[result_data.options_index].selected = false;
+        result = $("#" + this.container_id + "_o_" + pos);
+        result.removeClass("result-selected").addClass("active-result").show();
+        this.result_clear_highlight();
+        this.winnow_results();
+        this.form_field_jq.trigger("change", {
+          deselected: this.form_field.options[result_data.options_index].value
+        });
+        this.search_field_scale();
+        return true;
+      } else {
+        return false;
+      }
+    };
+
+    Chosen.prototype.single_deselect_control_build = function() {
+      if (this.allow_single_deselect && this.selected_item.find("abbr").length < 1) {
+        return this.selected_item.find("span").first().after("<abbr class=\"search-choice-close\"></abbr>");
+      }
+    };
+
+    Chosen.prototype.winnow_results = function() {
+      var found, option, part, parts, regex, regexAnchor, result, result_id, results, searchText, startpos, text, zregex, _i, _j, _len, _len1, _ref;
+      this.no_results_clear();
+      results = 0;
+      searchText = this.search_field.val() === this.default_text ? "" : $('<div/>').text($.trim(this.search_field.val())).html();
+      regexAnchor = this.search_contains ? "" : "^";
+      regex = new RegExp(regexAnchor + searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
+      zregex = new RegExp(searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
+      _ref = this.results_data;
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        option = _ref[_i];
+        if (!option.disabled && !option.empty) {
+          if (option.group) {
+            $('#' + option.dom_id).css('display', 'none');
+          } else if (!(this.is_multiple && option.selected)) {
+            found = false;
+            result_id = option.dom_id;
+            result = $("#" + result_id);
+            if (regex.test(option.html)) {
+              found = true;
+              results += 1;
+            } else if (this.enable_split_word_search && (option.html.indexOf(" ") >= 0 || option.html.indexOf("[") === 0)) {
+              parts = option.html.replace(/\[|\]/g, "").split(" ");
+              if (parts.length) {
+                for (_j = 0, _len1 = parts.length; _j < _len1; _j++) {
+                  part = parts[_j];
+                  if (regex.test(part)) {
+                    found = true;
+                    results += 1;
+                  }
+                }
+              }
+            }
+            if (found) {
+              if (searchText.length) {
+                startpos = option.html.search(zregex);
+                text = option.html.substr(0, startpos + searchText.length) + '</em>' + option.html.substr(startpos + searchText.length);
+                text = text.substr(0, startpos) + '<em>' + text.substr(startpos);
+              } else {
+                text = option.html;
+              }
+              result.html(text);
+              this.result_activate(result);
+              if (option.group_array_index != null) {
+                $("#" + this.results_data[option.group_array_index].dom_id).css('display', 'list-item');
+              }
+            } else {
+              if (this.result_highlight && result_id === this.result_highlight.attr('id')) {
+                this.result_clear_highlight();
+              }
+              this.result_deactivate(result);
+            }
+          }
+        }
+      }
+      if (results < 1 && searchText.length) {
+        return this.no_results(searchText);
+      } else {
+        return this.winnow_results_set_highlight();
+      }
+    };
+
+    Chosen.prototype.winnow_results_clear = function() {
+      var li, lis, _i, _len, _results;
+      this.search_field.val("");
+      lis = this.search_results.find("li");
+      _results = [];
+      for (_i = 0, _len = lis.length; _i < _len; _i++) {
+        li = lis[_i];
+        li = $(li);
+        if (li.hasClass("group-result")) {
+          _results.push(li.css('display', 'auto'));
+        } else if (!this.is_multiple || !li.hasClass("result-selected")) {
+          _results.push(this.result_activate(li));
+        } else {
+          _results.push(void 0);
+        }
+      }
+      return _results;
+    };
+
+    Chosen.prototype.winnow_results_set_highlight = function() {
+      var do_high, selected_results;
+      if (!this.result_highlight) {
+        selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : [];
+        do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first();
+        if (do_high != null) {
+          return this.result_do_highlight(do_high);
+        }
+      }
+    };
+
+    Chosen.prototype.no_results = function(terms) {
+      var no_results_html;
+      no_results_html = $('<li class="no-results">' + this.results_none_found + ' "<span></span>"</li>');
+      no_results_html.find("span").first().html(terms);
+      return this.search_results.append(no_results_html);
+    };
+
+    Chosen.prototype.no_results_clear = function() {
+      return this.search_results.find(".no-results").remove();
+    };
+
+    Chosen.prototype.keydown_arrow = function() {
+      var first_active, next_sib;
+      if (!this.result_highlight) {
+        first_active = this.search_results.find("li.active-result").first();
+        if (first_active) {
+          this.result_do_highlight($(first_active));
+        }
+      } else if (this.results_showing) {
+        next_sib = this.result_highlight.nextAll("li.active-result").first();
+        if (next_sib) {
+          this.result_do_highlight(next_sib);
+        }
+      }
+      if (!this.results_showing) {
+        return this.results_show();
+      }
+    };
+
+    Chosen.prototype.keyup_arrow = function() {
+      var prev_sibs;
+      if (!this.results_showing && !this.is_multiple) {
+        return this.results_show();
+      } else if (this.result_highlight) {
+        prev_sibs = this.result_highlight.prevAll("li.active-result");
+        if (prev_sibs.length) {
+          return this.result_do_highlight(prev_sibs.first());
+        } else {
+          if (this.choices > 0) {
+            this.results_hide();
+          }
+          return this.result_clear_highlight();
+        }
+      }
+    };
+
+    Chosen.prototype.keydown_backstroke = function() {
+      var next_available_destroy;
+      if (this.pending_backstroke) {
+        this.choice_destroy(this.pending_backstroke.find("a").first());
+        return this.clear_backstroke();
+      } else {
+        next_available_destroy = this.search_container.siblings("li.search-choice").last();
+        if (next_available_destroy.length && !next_available_destroy.hasClass("search-choice-disabled")) {
+          this.pending_backstroke = next_available_destroy;
+          if (this.single_backstroke_delete) {
+            return this.keydown_backstroke();
+          } else {
+            return this.pending_backstroke.addClass("search-choice-focus");
+          }
+        }
+      }
+    };
+
+    Chosen.prototype.clear_backstroke = function() {
+      if (this.pending_backstroke) {
+        this.pending_backstroke.removeClass("search-choice-focus");
+      }
+      return this.pending_backstroke = null;
+    };
+
+    Chosen.prototype.keydown_checker = function(evt) {
+      var stroke, _ref;
+      stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
+      this.search_field_scale();
+      if (stroke !== 8 && this.pending_backstroke) {
+        this.clear_backstroke();
+      }
+      switch (stroke) {
+        case 8:
+          this.backstroke_length = this.search_field.val().length;
+          break;
+        case 9:
+          if (this.results_showing && !this.is_multiple) {
+            this.result_select(evt);
+          }
+          this.mouse_on_container = false;
+          break;
+        case 13:
+          evt.preventDefault();
+          break;
+        case 38:
+          evt.preventDefault();
+          this.keyup_arrow();
+          break;
+        case 40:
+          this.keydown_arrow();
+          break;
+      }
+    };
+
+    Chosen.prototype.search_field_scale = function() {
+      var div, h, style, style_block, styles, w, _i, _len;
+      if (this.is_multiple) {
+        h = 0;
+        w = 0;
+        style_block = "position:absolute; left: -1000px; top: -1000px; display:none;";
+        styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing'];
+        for (_i = 0, _len = styles.length; _i < _len; _i++) {
+          style = styles[_i];
+          style_block += style + ":" + this.search_field.css(style) + ";";
+        }
+        div = $('<div />', {
+          'style': style_block
+        });
+        div.text(this.search_field.val());
+        $('body').append(div);
+        w = div.width() + 25;
+        div.remove();
+        if (!this.f_width) {
+          this.f_width = this.container.outerWidth();
+        }
+        if (w > this.f_width - 10) {
+          w = this.f_width - 10;
+        }
+        return this.search_field.css({
+          'width': w + 'px'
+        });
+      }
+    };
+
+    Chosen.prototype.generate_random_id = function() {
+      var string;
+      string = "sel" + this.generate_random_char() + this.generate_random_char() + this.generate_random_char();
+      while ($("#" + string).length > 0) {
+        string += this.generate_random_char();
+      }
+      return string;
+    };
+
+    return Chosen;
+
+  })(AbstractChosen);
+
+  root.Chosen = Chosen;
+
+}).call(this);
diff --git a/resources/jquery.ui/themes/vector/images/button-blue-hover-large.png b/resources/jquery.ui/themes/vector/images/button-blue-hover-large.png
deleted file mode 100644 (file)
index 8f7cf74..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-blue-hover-large.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-blue-hover.png b/resources/jquery.ui/themes/vector/images/button-blue-hover.png
deleted file mode 100644 (file)
index 1fc2816..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-blue-hover.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-blue-large.png b/resources/jquery.ui/themes/vector/images/button-blue-large.png
deleted file mode 100644 (file)
index 22ee5e5..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-blue-large.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-blue.png b/resources/jquery.ui/themes/vector/images/button-blue.png
deleted file mode 100644 (file)
index 2e6d121..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-blue.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-disabled-blue.png b/resources/jquery.ui/themes/vector/images/button-disabled-blue.png
deleted file mode 100644 (file)
index 28eb1fc..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-disabled-blue.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-disabled-green.png b/resources/jquery.ui/themes/vector/images/button-disabled-green.png
deleted file mode 100644 (file)
index 0e29d85..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-disabled-green.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-disabled-red.png b/resources/jquery.ui/themes/vector/images/button-disabled-red.png
deleted file mode 100644 (file)
index ede6998..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-disabled-red.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-disabled.png b/resources/jquery.ui/themes/vector/images/button-disabled.png
deleted file mode 100644 (file)
index e4e4ec1..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-disabled.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-down-blue.png b/resources/jquery.ui/themes/vector/images/button-down-blue.png
deleted file mode 100644 (file)
index 766e574..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-down-blue.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-down-green.png b/resources/jquery.ui/themes/vector/images/button-down-green.png
deleted file mode 100644 (file)
index 90969c3..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-down-green.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-down-red.png b/resources/jquery.ui/themes/vector/images/button-down-red.png
deleted file mode 100644 (file)
index f625729..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-down-red.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-down.png b/resources/jquery.ui/themes/vector/images/button-down.png
deleted file mode 100644 (file)
index c646757..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-down.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-green-hover-large.png b/resources/jquery.ui/themes/vector/images/button-green-hover-large.png
deleted file mode 100644 (file)
index dd8851e..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-green-hover-large.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-green-hover.png b/resources/jquery.ui/themes/vector/images/button-green-hover.png
deleted file mode 100644 (file)
index 19c3991..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-green-hover.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-green-large.png b/resources/jquery.ui/themes/vector/images/button-green-large.png
deleted file mode 100644 (file)
index a8e830e..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-green-large.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-green.png b/resources/jquery.ui/themes/vector/images/button-green.png
deleted file mode 100644 (file)
index 54c418e..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-green.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-large-disabled-green.png b/resources/jquery.ui/themes/vector/images/button-large-disabled-green.png
deleted file mode 100644 (file)
index f76f7b0..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-large-disabled-green.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-large-off-green.png b/resources/jquery.ui/themes/vector/images/button-large-off-green.png
deleted file mode 100644 (file)
index f997431..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-large-off-green.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-off-blue.png b/resources/jquery.ui/themes/vector/images/button-off-blue.png
deleted file mode 100644 (file)
index 82dedb5..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-off-blue.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-off-green.png b/resources/jquery.ui/themes/vector/images/button-off-green.png
deleted file mode 100644 (file)
index 109907f..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-off-green.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-off-red.png b/resources/jquery.ui/themes/vector/images/button-off-red.png
deleted file mode 100644 (file)
index 5a85b8a..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-off-red.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-off.png b/resources/jquery.ui/themes/vector/images/button-off.png
deleted file mode 100644 (file)
index cc5eb11..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-off.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-orange-hover-large.png b/resources/jquery.ui/themes/vector/images/button-orange-hover-large.png
deleted file mode 100644 (file)
index 6f0dbd5..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-orange-hover-large.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-orange-hover.png b/resources/jquery.ui/themes/vector/images/button-orange-hover.png
deleted file mode 100644 (file)
index a1077c5..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-orange-hover.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-orange-large.png b/resources/jquery.ui/themes/vector/images/button-orange-large.png
deleted file mode 100644 (file)
index 3d7f37f..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-orange-large.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-orange.png b/resources/jquery.ui/themes/vector/images/button-orange.png
deleted file mode 100644 (file)
index 02347cf..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-orange.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-over-blue.png b/resources/jquery.ui/themes/vector/images/button-over-blue.png
deleted file mode 100644 (file)
index 9edb7aa..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-over-blue.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-over-green.png b/resources/jquery.ui/themes/vector/images/button-over-green.png
deleted file mode 100644 (file)
index 47a0b1b..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-over-green.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-over-red.png b/resources/jquery.ui/themes/vector/images/button-over-red.png
deleted file mode 100644 (file)
index a244536..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-over-red.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-over.png b/resources/jquery.ui/themes/vector/images/button-over.png
deleted file mode 100644 (file)
index 558f1f8..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-over.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-red-hover-large.png b/resources/jquery.ui/themes/vector/images/button-red-hover-large.png
deleted file mode 100644 (file)
index 11ccef0..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-red-hover-large.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-red-hover.png b/resources/jquery.ui/themes/vector/images/button-red-hover.png
deleted file mode 100644 (file)
index 55a6174..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-red-hover.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-red-large.png b/resources/jquery.ui/themes/vector/images/button-red-large.png
deleted file mode 100644 (file)
index 8d089ef..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-red-large.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-red.png b/resources/jquery.ui/themes/vector/images/button-red.png
deleted file mode 100644 (file)
index 7a292fc..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-red.png and /dev/null differ
old mode 100644 (file)
new mode 100755 (executable)
index a6a1b54..9314ef6
@@ -29,6 +29,7 @@ button.ui-button-icons-only {
 .ui-button .ui-button-text {
        display: block;
        line-height: 1.4;
+       text-shadow: 0 1px 1px #fff;
 }
 .ui-button-text-only .ui-button-text {
        padding: 0.3em 1em 0.25em 1em;
@@ -98,17 +99,21 @@ button.ui-button::-moz-focus-inner {
        border: 0;
        padding: 0; /* reset extra padding in Firefox */
 }
-
-body .ui-button {
-       margin: 0.5em 0 0.5em 0.4em;
-       border: 1px solid #a6a6a6 !important;
+/* Disables the annoying dashed border Firefox puts on active buttons */
+body button.ui-button::-moz-focus-inner {
+       border: 0;
+}
+/* Give large buttons some extra padding */
+body .ui-button-large {
+       padding: 5px;
+}
+/* Use white icons for colored buttons */
+.ui-button-green .ui-icon,
+.ui-button-blue .ui-icon,
+.ui-button-red .ui-icon,
+.ui-button-orange .ui-icon {
        /* @embed */
-       background: #f2f2f2 url(images/button-off.png) repeat-x scroll 50% 100% !important;
-       cursor: pointer;
-       font-size: 1em;
-       line-height: 1.4em;
-       width: auto;
-       overflow: visible;
+       background-image: url(images/ui-icons_ffffff_256x240.png) !important;
 }
 
 /* Corner radius */
@@ -124,6 +129,7 @@ body .ui-button {
 }
 .ui-button.ui-corner-all,
 .ui-button.ui-corner-top,
+
 .ui-button.ui-corner-right,
 .ui-button.ui-corner-tr {
        -moz-border-radius-topright: 4px;
@@ -147,145 +153,230 @@ body .ui-button {
        border-bottom-right-radius: 4px;
 }
 
+body .ui-button {
+       color: #2779aa;
+       margin: 0.5em 0 0.5em 0.4em;
+       border: 1px solid #aaa !important;
+       background: #f0f0f0 !important;
+       background: -moz-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #fff 0%, #ddd 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#dddddd', GradientType=0); /* IE6-8 */
+       cursor: pointer;
+       font-size: 1em;
+       line-height: 1.4em;
+       width: auto;
+       overflow: visible;
+       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.2);
+       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.2);
+       box-shadow: 0 1px 3px rgba(0,0,0,.2);
+}
 body .ui-button:hover {
-       border-color: #6e7273;
-       /* @embed */
-       background: #e1e1e1 url(images/button-over.png) repeat-x scroll 50% 100% !important;
+       color: #2779aa;
+       border-color: #bbb !important;
+       background: #fff !important;
+       background: -moz-linear-gradient(top, #fff 0%, #eee 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #fff 0%, #eee 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #fff 0%, #eee 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #fff 0%, #eee 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #fff 0%, #eee 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0); /* IE6-8 */
+       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.1);
+       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.1);
+       box-shadow: 0 1px 3px rgba(0,0,0,.1);
 }
 body .ui-button:active,
 body .ui-button:focus {
-       border-color: #707271;
-       /* @embed */
-       background: #bfbfbf url(images/button-down.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.disabled {
-       color: #7f7f7f;
-       border-color: #cccccc;
-       /* @embed */
-       background: #f2f2f2 url(images/button-disabled.png) repeat-x scroll 50% 100% !important;
-}
-/* Disables the annoying dashed border Firefox puts on active buttons */
-body button.ui-button::-moz-focus-inner {
-       border: 0;
-}
-/* Give large buttons some extra padding */
-body .ui-button-large {
-       padding: 5px;
-}
-/* Use white icons for colored buttons */
-.ui-button-green .ui-icon, .ui-button-blue .ui-icon, .ui-button-red .ui-icon, .ui-button-orange .ui-icon {
-       /* @embed */
-       background-image: url(images/ui-icons_ffffff_256x240.png) !important;
+       border-color: #8ad !important;
+       -webkit-box-shadow: 0 0 1px 1px rgba(167,215,249,.5);
+       -moz-box-shadow: 0 0 1px 1px rgba(167,215,249,.5);
+       box-shadow: 0 0 1px 1px rgba(167,215,249,.5);
+}
+body .ui-button:active {
+       background: #e0e0e0 !important;
+       background: -moz-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #f0f0f0 0%, #d0d0d0 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f0f0f0', endColorstr='#d0d0d0', GradientType=0); /* IE6-8 */
 }
 
 /* Green buttons */
-
+body .ui-button-green,
+body .ui-button-green .ui-button-text {
+       color: white;
+       text-shadow: 0 -1px 1px #072;
+}
 body .ui-button.ui-button-green {
-       color: white !important;
-       border-color: #97af7e !important;
-       /* @embed */
-       background: #3cb677 url(images/button-green.png) repeat-x scroll 50% 100% !important;
+       border-color: #294 !important;
+       background: #295 !important;
+       background: -moz-linear-gradient(top, #3c8 0%, #295 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #3c8 0%, #295 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #3c8 0%, #295 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #3c8 0%, #295 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #3c8 0%, #295 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33cc88', endColorstr='#229955', GradientType=0); /* IE6-8 */
+       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.3);
+       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.3);
+       box-shadow: 0 1px 3px rgba(0,0,0,.3);
 }
 body .ui-button.ui-button-green:hover {
-       border-color: #778e61 !important;
-       /* @embed */
-       background: #339b65 url(images/button-green-hover.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-green.ui-button-large {
-       /* @embed */
-       background: #3cb677 url(images/button-green-large.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-green.ui-button-large:hover {
-       /* @embed */
-       background: #339b65 url(images/button-green-hover-large.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-green.disabled {
-       filter:alpha(opacity=50);
-       -moz-opacity:0.50;
-       -khtml-opacity: 0.50;
-       opacity: 0.50;
+       background: #33a055 !important;
+       background: -moz-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #44d388 0%, #33a055 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#44d388', endColorstr='#33a055', GradientType=0); /* IE6-8 */
+       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.25);
+       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.25);
+       box-shadow: 0 1px 3px rgba(0,0,0,.25);
+}
+body .ui-button.ui-button-green:active,
+body .ui-button.ui-button-green:focus {
+       border-color: #172 !important;
+       -webkit-box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+       -moz-box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+       box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+}
+body .ui-button.ui-button-green:active {
+       background: #338855 !important;
+       background: -moz-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #30c080 0%, #338855 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#30c080', endColorstr='#338855', GradientType=0); /* IE6-8 */
 }
 
 /* Blue buttons */
-
+body .ui-button-blue,
+body .ui-button-blue .ui-button-text {
+       color: white;
+       text-shadow: 0 -1px 1px #037;
+}
 body .ui-button.ui-button-blue {
-       color: white !important;
-       border-color: #628acb !important;
-       /* @embed */
-       background: #3365ba url(images/button-blue.png) repeat-x scroll 50% 100% !important;
+       border-color: #468 !important;
+       background: #36b !important;
+       background: -moz-linear-gradient(top, #48e 0%, #36b 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #48e 0%, #36b 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #48e 0%, #36b 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #48e 0%, #36b 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #48e 0%, #36b 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4488ee', endColorstr='#3366bb', GradientType=0); /* IE6-8 */
+       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.35);
+       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.35);
+       box-shadow: 0 1px 3px rgba(0,0,0,.35);
 }
 body .ui-button.ui-button-blue:hover {
-       border-color: #5375ad !important;
-       /* @embed */
-       background: #2b569e url(images/button-blue-hover.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-blue.ui-button-large {
-       /* @embed */
-       background: #3365ba url(images/button-blue-large.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-blue.ui-button-large:hover {
-       /* @embed */
-       background: #2b569e url(images/button-blue-hover-large.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-blue.disabled {
-       filter:alpha(opacity=50);
-       -moz-opacity:0.50;
-       -khtml-opacity: 0.50;
-       opacity: 0.50;
+       background: #36c !important;
+       background: -moz-linear-gradient(top, #59e 0%, #36c 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #59e 0%, #36c 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #59e 0%, #36c 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #59e 0%, #36c 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #59e 0%, #36c 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5599ee', endColorstr='#3366cc', GradientType=0); /* IE6-8 */
+}
+body .ui-button.ui-button-blue:active,
+body .ui-button.ui-button-blue:focus {
+       border-color: #357 !important;
+       -webkit-box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+       -moz-box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+       box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+}
+body .ui-button.ui-button-blue:active {
+       background: #3060a0 !important;
+       background: -moz-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #4080e0 0%, #3060a0 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4080e0', endColorstr='#3060a0', GradientType=0); /* IE6-8 */
 }
 
 /* Red buttons */
-
+body .ui-button-red,
+body .ui-button-red .ui-button-text {
+       color: white;
+       text-shadow: 0 -1px 1px #700;
+}
 body .ui-button.ui-button-red {
-       color: white !important;
-       border-color: #af977e !important;
-       /* @embed */
-       background: #cb0000 url(images/button-red.png) repeat-x scroll 50% 100% !important;
+       border-color: #944 !important;
+       background: #a22 !important;
+       background: -moz-linear-gradient(top, #d44 0%, #a22 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #d44 0%, #a22 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #d44 0%, #a22 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #d44 0%, #a22 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #d44 0%, #a22 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#dd4444', endColorstr='#aa2222', GradientType=0); /* IE6-8 */
+       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.35);
+       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.35);
+       box-shadow: 0 1px 3px rgba(0,0,0,.35);
 }
 body .ui-button.ui-button-red:hover {
-       border-color: #8e7761 !important;
-       /* @embed */
-       background: #ad0000 url(images/button-red-hover.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-red.ui-button-large {
-       /* @embed */
-       background: #cb0000 url(images/button-red.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-red.ui-button-large:hover {
-       /* @embed */
-       background: #ad0000 url(images/button-red-hover.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-red.disabled {
-       filter:alpha(opacity=50);
-       -moz-opacity:0.50;
-       -khtml-opacity: 0.50;
-       opacity: 0.50;
+       border-color: #a44 !important;
+       background: #b03333 !important;
+       background: -moz-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #ee4646 0%, #b03333 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee4646', endColorstr='#b03333', GradientType=0); /* IE6-8 */
+       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.3);
+       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.3);
+       box-shadow: 0 1px 3px rgba(0,0,0,.3);
+}
+body .ui-button.ui-button-red:active,
+body .ui-button.ui-button-red:focus {
+       border-color: #747 !important;
+       -webkit-box-shadow: 0 0 2px 2px rgba(167,215,249,.7);
+       -moz-box-shadow: 0 0 2px 2px rgba(167,215,249,.7);
+       box-shadow: 0 0 2px 2px rgba(167,215,249,.7);
+}
+body .ui-button.ui-button-red:active {
+       background: #952020 !important;
+       background: -moz-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #d04545 0%, #952020 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#d04545', endColorstr='#952020', GradientType=0); /* IE6-8 */
 }
 
-/* Orange buttons */
-
-body .ui-button.ui-button-orange {
-       color: white !important;
-       border-color: #f3a863 !important;
-       /* @embed */
-       background: #f07f14 url(images/button-orange.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-orange:hover {
-       border-color: #ce9055 !important;
-       /* @embed */
-       background: #cc6c11 url(images/button-orange-hover.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-orange.ui-button-large {
-       /* @embed */
-       background: #f07f14 url(images/button-orange-large.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-orange.ui-button-large:hover {
-       /* @embed */
-       background: #cc6c11 url(images/button-orange-hover-large.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-orange.disabled {
-       filter:alpha(opacity=50);
-       -moz-opacity:0.50;
-       -khtml-opacity: 0.50;
-       opacity: 0.50;
-}
+/* Disabled buttons */
+body .ui-button-green.disabled,
+body .ui-button-green.disabled:hover,
+body .ui-button-green.disabled:active,
+body .ui-button-green.disabled:focus,
+body .ui-button-blue.disabled,
+body .ui-button-blue.disabled:hover,
+body .ui-button-blue.disabled:active,
+body .ui-button-blue.disabled:focus,
+body .ui-button-red.disabled,
+body .ui-button-red.disabled:hover,
+body .ui-button-red.disabled:active,
+body .ui-button-red.disabled:focus,
+body .ui-button.disabled,
+body .ui-button.disabled:hover {
+       color: #aaa;
+       border-color: #ccc !important;
+       background: #eee !important;
+       background: -moz-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #f6f6f6 0%, #eee 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f6f6f6', endColorstr='#eeeeee', GradientType=0); /* IE6-8 */
+       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,0);
+       -moz-box-shadow: 0 1px 3px rgba(0,0,0,0);
+       box-shadow: 0 1px 3px rgba(0,0,0,0);
+}
+body .ui-button-green.disabled .ui-button-text,
+body .ui-button-blue.disabled .ui-button-text,
+body .ui-button-red.disabled .ui-button-text {
+       color: #aaa;
+       text-shadow: 0 1px 1px #fff;
+}
\ No newline at end of file
index d961bf3..c706bb9 100644 (file)
@@ -8,6 +8,7 @@
        font-size: 12px;
        line-height: 12px;
        background-color: #d2d2d2;
+       cursor: pointer;
 }
 
 .mw-badge-content {
 }
 
 .mw-badge-inline {
-       display: inline-block;
        margin-left: 3px;
+       display: inline-block;
+       /* Hack for IE6 and IE7 (bug 47926) */
+       zoom: 1;
+       *display: inline;
+
 }
 .mw-badge-overlay {
        position: absolute;
index f07f1b7..e1a07b6 100644 (file)
         * @param {jQuery.Event|null} e either the event or null if unavailable
         * @param {Object|undefined} options
         */
-       function togglingHandler( $toggle, $collapsible, event, options ) {
+       function togglingHandler( $toggle, $collapsible, e, options ) {
                var wasCollapsed, $textContainer, collapseText, expandText;
 
-               if ( event ) {
+               if ( options === undefined ) {
+                       options = {};
+               }
+
+               if ( e ) {
                        // Don't fire if a link was clicked, if requested  (for premade togglers by default)
-                       if ( options.linksPassthru && $.nodeName( event.target, 'a' ) ) {
-                               return true;
+                       if ( options.linksPassthru && $.nodeName( e.target, 'a' ) ) {
+                               return;
                        } else {
-                               event.preventDefault();
-                               event.stopPropagation();
+                               e.preventDefault();
+                               e.stopPropagation();
                        }
                }
 
         */
        function toggleLinkPremade( $that, e, options ) {
                var $collapsible = $that.eq( 0 ).closest( '.mw-collapsible' );
-               options = $.extend( { toggleClasses: true }, options );
+               options = $.extend( { toggleClasses: true, linksPassthru: true }, options );
                togglingHandler( $that, $collapsible, e, options );
        }
 
         * @param {jQuery} $collapsible
         */
        function toggleLinkCustom( $that, e, options, $collapsible ) {
-               options = $.extend( { linksPassthru: true }, options );
                togglingHandler( $that, $collapsible, e, options );
        }
 
index e08c9aa..a552237 100644 (file)
                ts.dateRegex[0] = new RegExp( /^\s*(\d{1,2})[\,\.\-\/'\s]{1,2}(\d{1,2})[\,\.\-\/'\s]{1,2}(\d{2,4})\s*?/i);
 
                // Written Month name, dmy
-               ts.dateRegex[1] = new RegExp( '^\\s*(\\d{1,2})[\\,\\.\\-\\/\'\\s]*(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]*(\\d{2,4})\\s*$', 'i' );
+               ts.dateRegex[1] = new RegExp( '^\\s*(\\d{1,2})[\\,\\.\\-\\/\'\\s]+(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]+(\\d{2,4})\\s*$', 'i' );
 
                // Written Month name, mdy
-               ts.dateRegex[2] = new RegExp( '^\\s*(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]*(\\d{1,2})[\\,\\.\\-\\/\'\\s]*(\\d{2,4})\\s*$', 'i' );
+               ts.dateRegex[2] = new RegExp( '^\\s*(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]+(\\d{1,2})[\\,\\.\\-\\/\'\\s]+(\\d{2,4})\\s*$', 'i' );
 
        }
 
index 2835c9c..fc1b18d 100644 (file)
                        }
                }() );
 
-               $( 'textarea, input:text' ).focus( function () {
-                       currentFocused = $(this);
-               });
+               // Apply to dynamically created textboxes as well as normal ones
+               $( document ).on( 'focus', 'textarea, input:text', function () {
+                       currentFocused = $( this );
+               } );
 
                // HACK: make currentFocused work with the usability iframe
                // With proper focus detection support (HTML 5!) this'll be much cleaner
index 61d9d15..0e85fd9 100644 (file)
@@ -8,7 +8,7 @@ jQuery( function ( $ ) {
        // Don't use the ":has:(.editsection a)" selector because it performs very bad.
        // http://jsperf.com/jq-1-7-2-vs-jq-1-8-1-performance-of-mw-has/2
        $( document ).on( 'contextmenu', 'h1, h2, h3, h4, h5, h6', function ( e ) {
-               var $edit = $( this ).find( '.editsection a' );
+               var $edit = $( this ).find( '.mw-editsection a, .editsection a' );
                if ( !$edit.length ) {
                        return;
                }
index 467a555..ea9c67a 100644 (file)
Binary files a/resources/mediawiki.special/images/arrow-collapsed-ltr.png and b/resources/mediawiki.special/images/arrow-collapsed-ltr.png differ
index 2246254..081d3a8 100644 (file)
Binary files a/resources/mediawiki.special/images/arrow-collapsed-rtl.png and b/resources/mediawiki.special/images/arrow-collapsed-rtl.png differ
index 58a9fc6..fa4bf26 100644 (file)
Binary files a/resources/mediawiki.special/images/arrow-expanded.png and b/resources/mediawiki.special/images/arrow-expanded.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..62b37f9
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..263832b
Binary files /dev/null and b/resources/mediawiki.special/images/icon-edits.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..0389c84
Binary files /dev/null and b/resources/mediawiki.special/images/icon-pages.png differ
index fcdeba1..ab57314 100644 (file)
@@ -51,12 +51,12 @@ table.mw-enhanced-rc td.mw-enhanced-rc-nested {
 
 .mw-enhancedchanges-arrow.mw-collapsible-toggle-collapsed {
        /* @embed */
-       background: url(images/arrow-collapsed-ltr.png) no-repeat left center;
+       background: url(images/arrow-collapsed-ltr.png) no-repeat left bottom;
 }
 
 .mw-enhancedchanges-arrow.mw-collapsible-toggle-expanded {
        /* @embed */
-       background: url(images/arrow-expanded.png) no-repeat left center;
+       background: url(images/arrow-expanded.png) no-repeat left bottom;
 }
 
 .mw-changeslist-line-watched .mw-title {
diff --git a/resources/mediawiki.special/mediawiki.special.createAccount.vform.css b/resources/mediawiki.special/mediawiki.special.createAccount.vform.css
new file mode 100644 (file)
index 0000000..a1d78a2
--- /dev/null
@@ -0,0 +1,98 @@
+/* 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-image-container {
+       background-color: #fff;
+       min-height: 95px;
+}
+
+.mw-createacct-captcha-assisted {
+       display: block;
+       margin-top: 0.5em;
+}
+
+.mw-createacct-captcha-and-reload {
+       border: 1px solid #c9c9c9;
+       display: table-cell;
+       width: 270px;
+       background-color: #FFF;
+}
+
+.mw-createacct-captcha-and-reload .confirmedit-captcha-reload {
+       display: block;
+       float: right;
+}
+
+/* Benefits column CSS to the right (if it fits) of the form. */
+.mw-ui-container #userloginForm {
+       float: left;
+}
+
+div.mw-createacct-benefits-container {
+       float: left
+}
+
+div.mw-createacct-benefits-container h2 {
+       margin-bottom: 30px;
+}
+
+div.mw-benefits-icon {
+       display: inline-block;
+       padding: 0;
+       float: left;
+       width: 80px;
+       height: 75px;
+       margin-right: 15px;
+       border: 0;
+}
+
+.mw-benefits-icon.icon-edits {
+       /* @embed */
+       background: url(images/icon-edits.png) no-repeat right;
+}
+
+.mw-benefits-icon.icon-pages {
+       /* @embed */
+       background: url(images/icon-pages.png) no-repeat right;
+}
+
+.mw-benefits-icon.icon-contributors {
+       /* @embed */
+       background: url(images/icon-contributors.png) no-repeat right;
+}
+
+/* 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;
+}
+
+div.mw-number-text {
+       display: block;
+       font-size: 1.2em;
+       color: #444;
+       margin-top: 1em;
+       text-align: center;
+}
diff --git a/resources/mediawiki.special/mediawiki.special.createAccount.vform.js b/resources/mediawiki.special/mediawiki.special.createAccount.vform.js
new file mode 100644 (file)
index 0000000..11084fe
--- /dev/null
@@ -0,0 +1,75 @@
+/**
+ * JavaScript for Create account form (Special:UserLogin?type=signup).
+ */
+( function ( mw, $ ) {
+
+       $( document ).ready( function( $ ) {
+               var $content = $( '#mw-content-text' ),
+                       $submit = $content.find( '#wpCreateaccount' ),
+                       tabIndex,
+                       $captchaStuff,
+                       helpMsg = mw.config.get( 'wgCreateacctImgcaptchaHelp' ),
+                       captchaImage;
+
+               /*
+                * 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 image has this class in the ConfirmEdit extension
+                       // after 2013-04-18.
+                       captchaImage = $captchaStuff.find( 'img.fancycaptcha-image' );
+                       if ( captchaImage.length !== 1 ) {
+                               return;
+                       }
+
+                       $captchaStuff.remove();
+
+                       // Insert another div before the submit button.
+                       $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">',
+                                               '<div class="mw-createacct-captcha-image-container">',
+                                                       '<img id="mw-createacct-captcha" alt="PLACEHOLDER">',
+                                               '</div>',
+                                       '</div>',
+                                       '<input id="wpCaptchaWord" name="wpCaptchaWord" type="text" placeholder="' +
+                                               mw.message( 'createacct-imgcaptcha-ph' ).escaped() +
+                                               '" tabindex="' + tabIndex + '" autocapitalize="off" autocorrect="off">',
+                                       '<small class="mw-createacct-captcha-assisted">' + helpMsg + '</small>',
+                               '</div>',
+                       '</div>'
+                                       ].join( '' )
+                               );
+
+                       // Replace the placeholder img with the img from the old CAPTCHA.
+                       captchaImage.replaceAll( $content.find( '#mw-createacct-captcha' ) );
+
+                       // Append CAPTCHA reload, if any.
+                       $( '.mw-createacct-captcha-and-reload' ).append( $captchaStuff.find( '.confirmedit-captcha-reload' ) );
+
+                       // Find the input field, add the text (if any) of the existing CAPTCHA
+                       // field (although usually it's blanked out on every redisplay),
+                       // and after it move over the hidden field that tells the CAPTCHA
+                       // what to do.
+                       $content.find( '#wpCaptchaWord' )
+                               .val( $captchaStuff.find( '#wpCaptchaWord' ).val() )
+                               .after( $captchaStuff.find( '#wpCaptchaId' ) );
+               }
+
+       });
+
+}( mediaWiki, jQuery ) );
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..0f8d420 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;
   width: auto;
 .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;
 }
 /* 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..9826526 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;
   width: auto;
 .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;
 }
 /* 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 83bf2e3..87529b4 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' } );
+                       }
+               } );
+       }
+
+}( mediaWiki, jQuery ) );
index 6c7e697..d199132 100644 (file)
@@ -267,10 +267,17 @@ var mw = ( function ( $, undefined ) {
                /* Public Members */
 
                /**
-                * Dummy function which in debug mode can be replaced with a function that
-                * emulates console.log in console-less environments.
+                * Dummy placeholder for {@link mw.log}
+                * @method
                 */
-               log: function () { },
+               log: ( function () {
+                       var log = function () {};
+                       log.warn = function () {};
+                       log.deprecate = function ( obj, key, val ) {
+                               obj[key] = val;
+                       };
+                       return log;
+               }() ),
 
                // Make the Map constructor publicly available.
                Map: Map,
@@ -294,8 +301,6 @@ var mw = ( function ( $, undefined ) {
                 */
                libs: {},
 
-               /* Extension points */
-
                /**
                 * @property
                 */
@@ -1734,7 +1739,82 @@ var mw = ( function ( $, undefined ) {
                user: {
                        options: new Map(),
                        tokens: new Map()
-               }
+               },
+
+               /**
+                * Registry and firing of events.
+                *
+                * MediaWiki has various interface components that are extended, enhanced
+                * or manipulated in some other way by extensions, gadgets and even
+                * in core itself.
+                *
+                * This framework helps streamlining the timing of when these other
+                * code paths fire their plugins (instead of using document-ready,
+                * which can and should be limited to firing only once).
+                *
+                * Features like navigating to other wiki pages, previewing an edit
+                * and editing itself – without a refresh – can then retrigger these
+                * hooks accordingly to ensure everything still works as expected.
+                *
+                * Example usage:
+                *
+                *     mw.hook( 'wikipage.content' ).add( fn ).remove( fn );
+                *     mw.hook( 'wikipage.content' ).fire( $content );
+                *
+                * Handlers can be added and fired for arbitrary event names at any time. The same
+                * event can be fired multiple times. The last run of an event is memorized
+                * (similar to `$(document).ready` and `$.Deferred().done`).
+                * This means if an event is fired, and a handler added afterwards, the added
+                * function will be fired right away with the last given event data.
+                *
+                * Like Deferreds and Promises, the mw.hook object is both detachable and chainable.
+                * Thus allowing flexible use and optimal maintainability and authority control.
+                * You can pass around the `add` and/or `fire` method to another piece of code
+                * without it having to know the event name (or `mw.hook` for that matter).
+                *
+                *     var h = mw.hook( 'bar.ready' );
+                *     new mw.Foo( .. ).fetch( { callback: h.fire } );
+                *
+                * @class mw.hook
+                */
+               hook: ( function () {
+                       var lists = {};
+
+                       /**
+                        * @method hook
+                        * @member mw
+                        * @param {string} name Name of hook.
+                        * @return {mw.hook}
+                        */
+                       return function ( name ) {
+                               var list = lists[name] || ( lists[name] = $.Callbacks( 'memory' ) );
+
+                               return {
+                                       /**
+                                        * Register a hook handler
+                                        * @param {Function...} handler Function to bind.
+                                        * @chainable
+                                        */
+                                       add: list.add,
+
+                                       /**
+                                        * Unregister a hook handler
+                                        * @param {Function...} handler Function to unbind.
+                                        * @chainable
+                                        */
+                                       remove: list.remove,
+
+                                       /**
+                                        * Run a hook.
+                                        * @param {Mixed...} data
+                                        * @chainable
+                                        */
+                                       fire: function () {
+                                               return list.fireWith( null, slice.call( arguments ) );
+                                       }
+                               };
+                       };
+               }() )
        };
 
 }( jQuery ) );
index ee08b12..75e4c96 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * Logger for MediaWiki javascript.
  * Implements the stub left by the main 'mediawiki' module.
  *
@@ -8,16 +8,21 @@
 
 ( function ( mw, $ ) {
 
+       /**
+        * @class mw.log
+        * @singleton
+        */
+
        /**
         * Logs a message to the console.
         *
         * In the case the browser does not have a console API, a console is created on-the-fly by appending
-        * a <div id="mw-log-console"> element to the bottom of the body and then appending this and future
+        * a `<div id="mw-log-console">` element to the bottom of the body and then appending this and future
         * messages to that, instead of the console.
         *
-        * @param {String} First in list of variadic messages to output to console.
+        * @param {string...} msg Messages to output to console.
         */
-       mw.log = function ( /* logmsg, logmsg, */ ) {
+       mw.log = function () {
                // Turn arguments into an array
                var     args = Array.prototype.slice.call( arguments ),
                        // Allow log messages to use a configured prefix to identify the source window (ie. frame)
@@ -54,7 +59,7 @@
                                hovzer.update();
                        }
                        $log.append(
-                               $( '<div></div>' )
+                               $( '<div>' )
                                        .css( {
                                                borderBottom: 'solid 1px #DDDDDD',
                                                fontSize: 'small',
                } );
        };
 
+       /**
+        * Write a message the console's warning channel.
+        * Also logs a stacktrace for easier debugging.
+        * Each action is silently ignored if the browser doesn't support it.
+        *
+        * @param {string...} msg Messages to output to console
+        */
+       mw.log.warn = function () {
+               var console = window.console;
+               if ( console && console.warn ) {
+                       console.warn.apply( console, arguments );
+                       if ( console.trace ) {
+                               console.trace();
+                       }
+               }
+       };
+
+       /**
+        * Create a property in a host object that, when accessed, will produce
+        * a deprecation warning in the console with backtrace.
+        *
+        * @param {Object} obj Host object of deprecated property
+        * @param {string} key Name of property to create in `obj`
+        * @param {Mixed} val The value this property should return when accessed
+        * @param {string} [msg] Optional text to include in the deprecation message.
+        */
+       mw.log.deprecate = !Object.defineProperty ? function ( obj, key, val ) {
+               obj[key] = val;
+       } : function ( obj, key, val, msg ) {
+               msg = 'MWDeprecationWarning: Use of "' + key + '" property is deprecated.' +
+                       ( msg ? ( ' ' + msg ) : '' );
+               try {
+                       Object.defineProperty( obj, key, {
+                               configurable: true,
+                               enumerable: true,
+                               get: function () {
+                                       mw.log.warn( msg );
+                                       return val;
+                               },
+                               set: function ( newVal ) {
+                                       mw.log.warn( msg );
+                                       val = newVal;
+                               }
+                       } );
+               } catch ( err ) {
+                       // IE8 can throw on Object.defineProperty
+                       obj[key] = val;
+               }
+       };
+
 }( mediaWiki, jQuery ) );
index 2bc7cea..00e74c5 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',
                        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..9fd2e5e 100644 (file)
                };
 
                /**
-                * 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();
+                       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();
                };
 
                /**
index 1bd7430..bd8e596 100644 (file)
                                return util.$content;
                        } )();
 
+                       mw.hook( 'wikipage.content' ).fire( util.$content );
+
                        // Table of contents toggle
                        $tocTitle = $( '#toctitle' );
                        $tocToggleLink = $( '#togglelink' );
                /**
                 * @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 ) {
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 c5f9389..3ada578 100644 (file)
@@ -22,7 +22,7 @@
  * @ingroup Skins
  */
 
-if( !defined( 'MEDIAWIKI' ) ) {
+if ( !defined( 'MEDIAWIKI' ) ) {
        die( -1 );
 }
 
@@ -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',
@@ -532,17 +532,17 @@ class CologneBlueTemplate extends BaseTemplate {
 
                $search = $this->getSkin()->getRequest()->getText( 'search' );
                $action = $this->data['searchaction'];
-               $s = "<form id=\"searchform-" . htmlspecialchars($which) . "\" method=\"get\" class=\"inline\" action=\"$action\">";
-               if( $which == 'footer' ) {
+               $s = "<form id=\"searchform-" . htmlspecialchars( $which ) . "\" method=\"get\" class=\"inline\" action=\"$action\">";
+               if ( $which == 'footer' ) {
                        $s .= wfMessage( 'qbfind' )->text() . ": ";
                }
 
                $s .= "<input type='text' class=\"mw-searchInput\" name=\"search\" size=\"14\" value=\""
                        . htmlspecialchars( substr( $search, 0, 256 ) ) . "\" />"
-                       . ($which == 'footer' ? " " : "<br />")
+                       . ( $which == 'footer' ? " " : "<br />" )
                        . "<input type='submit' class=\"searchButton\" name=\"go\" value=\"" . wfMessage( 'searcharticle' )->escaped() . "\" />";
 
-               if( $wgUseTwoButtonsSearchForm ) {
+               if ( $wgUseTwoButtonsSearchForm ) {
                        $s .= " <input type='submit' class=\"searchButton\" name=\"fulltext\" value=\"" . wfMessage( 'searchbutton' )->escaped() . "\" />\n";
                } else {
                        $s .= '<div><a href="' . $action . '" rel="search">' . wfMessage( 'powersearch-legend' )->escaped() . "</a></div>\n";
index 9dbefb1..52f9fa2 100644 (file)
@@ -22,8 +22,9 @@
  * @ingroup Skins
  */
 
-if( !defined( 'MEDIAWIKI' ) )
+if ( !defined( 'MEDIAWIKI' ) ) {
        die( -1 );
+}
 
 /**
  * Inherit main code from SkinTemplate, set the CSS and template filter.
@@ -39,7 +40,7 @@ class SkinModern extends SkinTemplate {
         */
        function setupSkinUserCss( OutputPage $out ) {
                parent::setupSkinUserCss( $out );
-               $out->addModuleStyles ('skins.modern');
+               $out->addModuleStyles( 'skins.modern' );
        }
 }
 
@@ -68,7 +69,7 @@ class ModernTemplate extends MonoBookTemplate {
        <div id="mw_header"><h1 id="firstHeading" lang="<?php
                $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getCode();
                $this->html( 'pageLanguage' );
-       ?>"><span dir="auto"><?php $this->html('title') ?></span></h1></div>
+       ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1></div>
 
        <div id="mw_main">
        <div id="mw_contentwrapper">
@@ -82,30 +83,30 @@ class ModernTemplate extends MonoBookTemplate {
             for the margins -->
        <div id="mw_contentholder" class="mw-body">
                <div class='mw-topboxes'>
-                       <div id="mw-js-message" style="display:none;"<?php $this->html('userlangattributes')?>></div>
-                       <div class="mw-topbox" id="siteSub"><?php $this->msg('tagline') ?></div>
-                       <?php if($this->data['newtalk'] ) {
-                               ?><div class="usermessage mw-topbox"><?php $this->html('newtalk')  ?></div>
+                       <div id="mw-js-message" style="display:none;"<?php $this->html( 'userlangattributes' ) ?>></div>
+                       <div class="mw-topbox" id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
+                       <?php if ( $this->data['newtalk'] ) {
+                               ?><div class="usermessage mw-topbox"><?php $this->html( 'newtalk' ) ?></div>
                        <?php } ?>
-                       <?php if($this->data['sitenotice']) {
-                               ?><div class="mw-topbox" id="siteNotice"><?php $this->html('sitenotice') ?></div>
+                       <?php if ( $this->data['sitenotice'] ) {
+                               ?><div class="mw-topbox" id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div>
                        <?php } ?>
                </div>
 
-               <div id="contentSub"<?php $this->html('userlangattributes') ?>><?php $this->html('subtitle') ?></div>
+               <div id="contentSub"<?php $this->html( 'userlangattributes' ) ?>><?php $this->html( 'subtitle' ) ?></div>
 
-               <?php if($this->data['undelete']) { ?><div id="contentSub2"><?php     $this->html('undelete') ?></div><?php } ?>
-               <?php if($this->data['showjumplinks']) { ?><div id="jump-to-nav"><?php $this->msg('jumpto') ?> <a href="#mw_portlets"><?php $this->msg('jumptonavigation') ?></a><?php $this->msg( 'comma-separator' ) ?><a href="#searchInput"><?php $this->msg('jumptosearch') ?></a></div><?php } ?>
+               <?php if ( $this->data['undelete'] ) { ?><div id="contentSub2"><?php $this->html( 'undelete' ) ?></div><?php } ?>
+               <?php if ( $this->data['showjumplinks'] ) { ?><div id="jump-to-nav"><?php $this->msg( 'jumpto' ) ?> <a href="#mw_portlets"><?php $this->msg( 'jumptonavigation' ) ?></a><?php $this->msg( 'comma-separator' ) ?><a href="#searchInput"><?php $this->msg( 'jumptosearch' ) ?></a></div><?php } ?>
 
-               <?php $this->html('bodytext') ?>
+               <?php $this->html( 'bodytext' ) ?>
                <div class='mw_clear'></div>
-               <?php if($this->data['catlinks']) { $this->html('catlinks'); } ?>
-               <?php $this->html ('dataAfterContent') ?>
+               <?php if ( $this->data['catlinks'] ) { $this->html( 'catlinks' ); } ?>
+               <?php $this->html( 'dataAfterContent' ) ?>
        </div><!-- mw_contentholder -->
        </div><!-- mw_content -->
        </div><!-- mw_contentwrapper -->
 
-       <div id="mw_portlets"<?php $this->html("userlangattributes") ?>>
+       <div id="mw_portlets"<?php $this->html( "userlangattributes" ) ?>>
        <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
 
        <!-- portlets -->
@@ -120,11 +121,11 @@ class ModernTemplate extends MonoBookTemplate {
 
        <!-- personal portlet -->
        <div class="portlet" id="p-personal" role="navigation">
-               <h3><?php $this->msg('personaltools') ?></h3>
+               <h3><?php $this->msg( 'personaltools' ) ?></h3>
                <div class="pBody">
                        <ul>
-<?php          foreach($this->getPersonalTools() as $key => $item) { ?>
-                               <?php echo $this->makeListItem($key, $item); ?>
+<?php          foreach ( $this->getPersonalTools() as $key => $item ) { ?>
+                               <?php echo $this->makeListItem( $key, $item ); ?>
 
 <?php          } ?>
                        </ul>
@@ -133,19 +134,19 @@ class ModernTemplate extends MonoBookTemplate {
 
 
        <!-- footer -->
-       <div id="footer" role="contentinfo"<?php $this->html('userlangattributes') ?>>
+       <div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
                        <ul id="f-list">
 <?php
-               foreach( $this->getFooterLinks("flat") as $aLink ) {
-                       if( isset( $this->data[$aLink] ) && $this->data[$aLink] ) {
-?>                             <li id="<?php echo$aLink?>"><?php $this->html($aLink) ?></li>
+               foreach ( $this->getFooterLinks( "flat" ) as $aLink ) {
+                       if ( isset( $this->data[$aLink] ) && $this->data[$aLink] ) {
+?>                             <li id="<?php echo $aLink ?>"><?php $this->html( $aLink ) ?></li>
 <?php          }
                }
 ?>
                        </ul>
 <?php
-               foreach ( $this->getFooterIcons("nocopyright") as $blockName => $footerIcons ) { ?>
-                       <div id="mw_<?php echo htmlspecialchars($blockName); ?>">
+               foreach ( $this->getFooterIcons( "nocopyright" ) as $blockName => $footerIcons ) { ?>
+                       <div id="mw_<?php echo htmlspecialchars( $blockName ); ?>">
 <?php
                        foreach ( $footerIcons as $icon ) { ?>
                                <?php echo $this->getSkin()->makeFooterIcon( $icon, 'withoutImage' ); ?>
index ecbcd70..aeeb0f8 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.
@@ -48,7 +49,7 @@ class SkinMonoBook extends SkinTemplate {
                $out->addModuleStyles( 'skins.monobook' );
 
                // Ugh. Can't do this properly because $wgHandheldStyle may be a URL
-               if( $wgHandheldStyle ) {
+               if ( $wgHandheldStyle ) {
                        // Currently in testing... try 'chick/main.css'
                        $out->addStyle( $wgHandheldStyle, 'handheld' );
                }
@@ -82,39 +83,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 +126,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 +139,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 +158,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 +182,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();
@@ -212,12 +220,12 @@ echo $footerEnd;
                                <?php echo $this->makeSearchInput( array( "id" => "searchInput" ) ); ?>
 
                                <?php echo $this->makeSearchButton( "go", array( "id" => "searchGoButton", "class" => "searchButton" ) );
-                               if ( $wgUseTwoButtonsSearchForm ): ?>&#160;
+                               if ( $wgUseTwoButtonsSearchForm ) { ?>&#160;
                                <?php echo $this->makeSearchButton( "fulltext", array( "id" => "mw-searchButton", "class" => "searchButton" ) );
-                               else: ?>
+                               } else { ?>
 
                                <div><a href="<?php $this->text( 'searchaction' ) ?>" rel="search"><?php $this->msg( 'powersearch-legend' ) ?></a></div><?php
-                               endif; ?>
+                               } ?>
 
                        </form>
                </div>
@@ -235,7 +243,7 @@ echo $footerEnd;
                <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 );
                                } ?>
@@ -269,13 +277,13 @@ 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>
                <div class="pBody">
                        <ul>
-<?php          foreach( $this->data['language_urls'] as $key => $langlink ) { ?>
+<?php          foreach ( $this->data['language_urls'] as $key => $langlink ) { ?>
                                <?php echo $this->makeListItem( $key, $langlink ); ?>
 
 <?php          } ?>
@@ -298,13 +306,14 @@ 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                  foreach ( $cont as $key => $val ) { ?>
                                <?php echo $this->makeListItem( $key, $val ); ?>
 
 <?php                  } ?>
index d0f9995..d477c65 100644 (file)
@@ -23,7 +23,7 @@
  * @ingroup Skins
  */
 
-if( !defined( 'MEDIAWIKI' ) ) {
+if ( !defined( 'MEDIAWIKI' ) ) {
        die( -1 );
 }
 
@@ -155,81 +155,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 +210,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 +263,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 +282,6 @@ class VectorTemplate extends BaseTemplate {
                                        $this->renderPortal( $name, $content );
                                break;
                        }
-                       echo "\n<!-- /{$name} -->\n";
                }
        }
 
@@ -332,29 +295,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 +343,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 +380,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 +410,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 +428,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 +451,6 @@ class VectorTemplate extends BaseTemplate {
 
                                break;
                        }
-                       echo "\n<!-- /{$name} -->\n";
                }
        }
 }
index 2fa0cba..a1e809d 100644 (file)
@@ -116,13 +116,13 @@ h4 .editsection {
        font-size: 86%;
        font-weight: normal; }
 h5 {
-       font-size: 100%;
+       font-size: 105%;
 }
 h5 .editsection {
        font-weight: normal;
 }
 h6 {
-       font-size: 80%;
+       font-size: 100%;
 }
 h6 .editsection {
        font-size: 125%;
index 0229744..9ea89d9 100644 (file)
@@ -111,6 +111,7 @@ div#jump-to-nav,
 div.top,
 div#column-one,
 #colophon,
+.mw-editsection,
 .editsection,
 .toctoggle,
 .tochidden,
@@ -352,7 +353,7 @@ a.sortheader {
 .wikitable, .thumb, img {
        page-break-inside: avoid;
 }
-h2, h3, h4, h5, h6, h7 {
+h2, h3, h4, h5, h6 {
        page-break-after: avoid;
 }
 p {
index ec9e861..833ece2 100644 (file)
@@ -11,8 +11,9 @@
 h1 { font-size: 2em; }
 h2 { font-size: 1.5em; }
 h3 { font-size: 1.17em; }
-h5 { font-size: .83em; }
-h6 { font-size: .75em; }
+h4 { font-size: 1.11em; }
+h5 { font-size: 1.05em; }
+h6 { font-size: 1em; }
 h1, h2, h3, h4, h5, h6 {
        font-weight: bolder;
 }
@@ -455,4 +456,4 @@ html > body.rtl div#bodyContent ul#filetoc {
        display: block;
 }
 
-/* RTL specific CSS ends here **/
\ No newline at end of file
+/* RTL specific CSS ends here **/
index 6e1c94f..26a7781 100644 (file)
@@ -1092,9 +1092,36 @@ table.floatleft {
        z-index: 99;
 }
 
-.editsection, .toctoggle {
+.mw-editsection, .editsection, .toctoggle {
        -moz-user-select: none;
        -webkit-user-select: none;
        -ms-user-select: none;
        user-select: none;
 }
+
+/* Display editsection links smaller and next to headings */
+.mw-editsection {
+       font-size: small;
+       font-weight: normal;
+       margin-left: 1em;
+       vertical-align: baseline;
+       /* Reset line-height; headings tend to have it set to larger values */
+       line-height: 1em;
+       /* As .mw-editsection is a <span> (inline element), it is treated as part */
+       /* of the heading content when selecting text by multiple clicks and thus */
+       /* selected together with heading content, despite the user-select: none; */
+       /* rule set above. This enforces non-selection without changing the look. */
+       display: inline-block;
+}
+
+/* Correct directionality when page dir is different from site/user dir */
+/* @noflip */
+.mw-content-ltr .mw-editsection,
+.mw-content-rtl .mw-content-ltr .mw-editsection {
+       margin-left: 1em;
+}
+/* @noflip */
+.mw-content-rtl .mw-editsection,
+.mw-content-ltr .mw-content-rtl .mw-editsection {
+       margin-right: 1em;
+}
index c2c00db..65042ef 100644 (file)
@@ -113,20 +113,6 @@ 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 ) {
index 95fcfef..f5650b5 100644 (file)
@@ -32,6 +32,7 @@ a.stub {
 #logo,
 #footer,
 #siteNotice,
+.mw-editsection,
 .editsection,
 .toctoggle {
        display: none;
index 8278410..6e0f8b3 100644 (file)
@@ -3,6 +3,7 @@
 #p-personal,
 #jump-to-nav,
 #footer,
+.mw-editsection,
 span.editsection,
 .noprint {
        display: none;
diff --git a/skins/monobook/FF2Fixes.css b/skins/monobook/FF2Fixes.css
deleted file mode 100644 (file)
index c8b65f5..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-.rtl .external, a.feedlink {
-       padding: 0 !important;
-       background: none !important;
-}
diff --git a/skins/monobook/Opera6Fixes.css b/skins/monobook/Opera6Fixes.css
deleted file mode 100644 (file)
index 77dec09..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-/* opera 6 fixes */
-div#column-one {
-       position: relative;
-       max-width: 11.7em;
-}
-#p-personal {
-       width: 45em;
-       margin-left: 8.6em;
-       right: 0;
-}
-#bodyContent a.external {
-       background: url(external.png) center right no-repeat;
-       padding-right: 13px;
-}
-
-.rtl a.feedlink {
-       background-position: right;
-       padding-right: 0;
-       padding-left: 16px;
-}
diff --git a/skins/monobook/Opera7Fixes.css b/skins/monobook/Opera7Fixes.css
deleted file mode 100644 (file)
index 1dcba7c..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/* small tweaks for opera seven */
-#p-cactions {
-       margin-top: .1em;
-}
-#p-cactions li a {
-       top: 2px;
-}
-#bodyContent a.external {
-       background: url(external.png) center right no-repeat;
-       padding-right: 13px;
-}
-.rtl #bodyContent a.external {
-       background-image: url(external-rtl.png);
-       padding-right: 13px;
-}
-
-.rtl a.feedlink {
-       background-position: right;
-       padding-right: 0;
-       padding-left: 16px;
-}
diff --git a/skins/monobook/Opera9Fixes.css b/skins/monobook/Opera9Fixes.css
deleted file mode 100644 (file)
index 9c312a8..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-.rtl #bodyContent a.external {
-       background-image: url(external-rtl.png);
-       padding-right: 13px;
-       padding-left: 0;
-}
-
-.rtl a.feedlink {
-       background-position: right;
-       padding-right: 0;
-       padding-left: 16px;
-}
index 147cd15..e8c851f 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;
 }
index 6acc994..dc4267f 100644 (file)
@@ -789,7 +789,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 b7320cb..976831e 100644 (file)
@@ -85,7 +85,7 @@ class SeleniumTester extends Maintenance {
 
        protected function startServer() {
                if ( $this->seleniumServerExecPath == '' ) {
-                       die ( "The selenium server exec path is not set in " .
+                       die( "The selenium server exec path is not set in " .
                                "selenium_settings.ini. Cannot start server \n" .
                                "as requested - terminating RunSeleniumTests\n" );
                }
@@ -96,7 +96,7 @@ class SeleniumTester extends Maintenance {
                        case 'started':
                                break;
                        case 'failed':
-                               die ( "Unable to start the Selenium Server - " .
+                               die( "Unable to start the Selenium Server - " .
                                        "terminating RunSeleniumTests\n" );
                        case 'running':
                                echo ( "Warning: The Selenium Server is " .
@@ -108,7 +108,7 @@ class SeleniumTester extends Maintenance {
        }
 
        protected function stopServer() {
-               if ( !isset ( $this->serverManager ) ) {
+               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 " .
index 4341891..ca92fe3 100644 (file)
@@ -30,6 +30,7 @@ $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",
 
@@ -47,6 +48,7 @@ $wgAutoloadClasses += array(
 
        //db
        'ORMTableTest' => "$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",
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..a0ede09 100644 (file)
@@ -518,18 +518,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;
                }
        }
@@ -1095,10 +1100,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 +1117,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 +1174,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..cb3a4ae 100644 (file)
@@ -3665,7 +3665,7 @@ Table with empty line following the start tag
 !! test
 Table attributes with empty value
 !! options
-disabled
+parsoid
 !! input
 {|
 | style=| hello
@@ -3751,7 +3751,6 @@ parsoid
 <table>
 <tbody>
 <tr>
-<td></td>
 <td>foo</td></tr></tbody></table>
 !! end
 
@@ -3970,6 +3969,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 +4257,48 @@ 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-centric test: Whitespace in ext- and wiki-links should be preserved
 !! input
@@ -4467,7 +4535,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 +4781,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 +4798,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 +4815,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 +4904,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>
 
@@ -5916,8 +5984,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 +6011,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 +6173,19 @@ bar <div>baz</div>
 
 !!end
 
+!!test
+Templates: P-wrapping: 1d. Template preceded by comment-only line
+!!options
+parsoid
+!!input
+<!-- foo -->
+{{echo|Bar}}
+!!result
+<!-- foo -->
+<p>Bar
+</p>
+!!end
+
 !!test
 Templates: Inline Text: 1. Multiple tmeplate uses
 !!input
@@ -6489,7 +6570,7 @@ 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
 !!input
 {{echo_with_span|''a}}{{echo_with_span|b''c''d}}{{echo_with_span|''e}}
 !!result
@@ -6500,7 +6581,7 @@ disabled
 Templates: Ugly nesting: 3. Quotes opened/closed across templates (echo_with_div)
 (PHP parser generates misnested html)
 !! options
-disabled
+parsoid
 !!input
 {{echo_with_div|''a}}{{echo_with_div|b''c''d}}{{echo_with_div|''e}}
 !!result
@@ -8017,13 +8098,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 +8143,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 +8198,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 +8240,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 +8276,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 +8306,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 +8321,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 +8332,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 +8352,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 +8366,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 +8376,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 +8398,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 +8422,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 +8461,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 +8495,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 +8532,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 +8633,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 +8646,7 @@ disabled
 !! test
 div with braces in attribute value
 !! options
-disabled
+parsoid
 !! input
 <div title="{}">Foo</div>
 !! result
@@ -8582,7 +8663,7 @@ disabled
 !! test
 div with empty attribute value, no space before equals
 !! options
-disabled
+parsoid
 !! input
 <div class=>HTML rocks</div>
 !! result
@@ -9743,7 +9824,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 +9839,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 +11037,8 @@ Say the magic word
 * {{BASEPAGENAME}}
 * {{SUBPAGENAME}}
 * {{SUBPAGENAMEE}}
+* {{ROOTPAGENAME}}
+* {{ROOTPAGENAMEE}}
 * {{BASEPAGENAME}}
 * {{BASEPAGENAMEE}}
 * {{TALKPAGENAME}}
@@ -10976,6 +11059,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 +11636,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 +11667,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 +11779,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 +11828,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 +12030,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 +12143,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 +12371,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 +12383,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 +12395,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
 
@@ -13085,7 +13215,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 +13232,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 +13249,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 +13266,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 +13285,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 +13305,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 +13324,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 +13352,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 +13373,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 +13475,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
 
@@ -13505,7 +13635,7 @@ HttP://MediaWiki.Org/
 !!test
 1. SOL-sensitive wikitext tokens as template-args
 !!options
-disabled
+parsoid
 !!input
 {{echo|*a}}
 {{echo|#a}}
@@ -13518,12 +13648,15 @@ disabled
 !!end
 
 #### The following section of tests are primarily to test
-#### wikitext escaping capabilities of Parsoid.
-#### A lot of the tests are disabled for the PHP parser either
-#### because of minor newline diffs or other reasons.
-#### As Parsoid serializer can handle newlines and other HTML
-#### more robustly, some of these tests might get reenabled
-#### for the PHP parser.
+#### wikitext escaping capabilities of Parsoid.  Given that
+#### escaping can be done any number of ways, the wikitext (input)
+#### is always adjusted to reflect how Parsoid adds nowiki
+#### escape tags.
+####
+#### We are marking several tests as parsoid-only since the
+#### HTML in the result section is different from what the
+#### PHP parser generates for it.
+
 
 #### --------------- Headings ---------------
 #### 0. Unnested
@@ -13536,12 +13669,20 @@ disabled
 #### ----------------------------------------
 !! test
 Headings: 0. Unnested
+!! options
+parsoid
 !! input
 <nowiki>=foo=</nowiki>
 
-<nowiki>=foo</nowiki>''a''=
+<nowiki> =foo= </nowiki>
+<!--cmt-->
+<nowiki>=foo=</nowiki>
+
+=foo''a''<nowiki>=</nowiki>
 !! result
 <p>=foo=
+</p><p> =foo= 
+</p><p><!--cmt-->=foo=
 </p><p>=foo<i>a</i>=
 </p>
 !!end
@@ -13549,7 +13690,7 @@ Headings: 0. Unnested
 !! test
 Headings: 1. Nested inside html
 !! options
-disabled
+parsoid
 !! input
 =<nowiki>=foo=</nowiki>=
 ==<nowiki>=foo=</nowiki>==
@@ -13569,7 +13710,7 @@ disabled
 !! test
 Headings: 2. Outside heading nest on a single line <h1>foo</h1>*bar
 !! options
-disabled
+parsoid
 !! input
 =foo=
 <nowiki>*bar</nowiki>
@@ -13586,44 +13727,64 @@ 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>
 !!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>
+
+!!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>
@@ -13636,11 +13797,13 @@ disabled
 !! test
 Headings: 6. Heading chars in SOL context
 !! options
-disabled
+parsoid
 !! input
 <!--cmt--><nowiki>=h1=</nowiki>
+<!--cmt--><nowiki> =h1= </nowiki>
 !! result
 <p><!--cmt-->=h1=
+<!--cmt--> =h1= 
 </p>
 !!end
 
@@ -13746,7 +13909,7 @@ Lists: 3. Only bullets at start of text should be escaped
 !! test
 Lists: 4. No escapes needed
 !! options
-disabled
+parsoid
 !! input
 *foo*bar
 
@@ -13771,9 +13934,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,13 +13950,15 @@ 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
@@ -13817,14 +13984,11 @@ 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=
@@ -13891,7 +14055,7 @@ Tables: 1d. No escaping needed
 !! test
 Tables: 2a. Nested in td
 !! options
-disabled
+parsoid
 !! input
 {|
 |<nowiki>foo|bar</nowiki>
@@ -13906,7 +14070,7 @@ disabled
 !! test
 Tables: 2b. Nested in td
 !! options
-disabled
+parsoid
 !! input
 {|
 |<nowiki>foo||bar</nowiki>
@@ -13923,7 +14087,7 @@ disabled
 !! test
 Tables: 2c. Nested in td -- no escaping needed
 !! options
-disabled
+parsoid
 !! input
 {|
 |foo!!bar
@@ -13938,7 +14102,7 @@ disabled
 !! test
 Tables: 3a. Nested in th
 !! options
-disabled
+parsoid
 !! input
 {|
 !foo!bar
@@ -13953,7 +14117,7 @@ disabled
 !! test
 Tables: 3b. Nested in th
 !! options
-disabled
+parsoid
 !! input
 {|
 !<nowiki>foo!!bar</nowiki>
@@ -13968,10 +14132,10 @@ disabled
 !! test
 Tables: 3c. Nested in th -- no escaping needed
 !! options
-disabled
+parsoid
 !! input
 {|
-!foo||bar
+!<nowiki>foo||bar</nowiki>
 |}
 !! result
 <table>
@@ -13983,7 +14147,7 @@ disabled
 !! test
 Tables: 4a. Escape -
 !! options
-disabled
+parsoid
 !! input
 {|
 |-
@@ -14001,7 +14165,7 @@ disabled
 !! test
 Tables: 4b. Escape +
 !! options
-disabled
+parsoid
 !! input
 {|
 |-
@@ -14019,7 +14183,7 @@ disabled
 !! test
 Tables: 4c. No escaping needed
 !! options
-disabled
+parsoid
 !! input
 {|
 |-
@@ -14036,8 +14200,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
@@ -14063,7 +14235,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 +14245,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 +14265,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 +14285,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 +14297,7 @@ disabled
 !! test
 Links 5. ExtLinks: No escapes needed
 !! options
-disabled
+parsoid
 !! input
 [http://google.com [google]
 !! result
@@ -14191,9 +14369,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>
@@ -14209,7 +14387,7 @@ bar <span><nowiki>[[foo]]</nowiki></span>
 !! test
 1. Leading space in SOL context should be escaped
 !! options
-disabled
+parsoid
 !! input
 <nowiki> foo</nowiki>
 <!--cmt--><nowiki> foo</nowiki>
@@ -14227,7 +14405,7 @@ disabled
 !! test
 1. a tags
 !! options
-disabled
+parsoid
 !! input
 <a href="http://google.com">google</a>
 !! result
@@ -14267,8 +14445,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,7 +14479,7 @@ a>b
 !! test
 Tag names followed by punctuation should not be recognized as tags
 !! options
-disabled
+parsoid
 !! input
 <s.ome> text
 !! result
@@ -14505,7 +14683,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 +14715,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
 !!input
 {|
 |-
@@ -14551,11 +14748,35 @@ disabled parsoid
 <table>
 <tbody>
 <tr>
-<td></td></tr>
+</tr>
 <tr>
 <td>foo</td></tr></tbody></table>
 !!end
 
+## PHP and parsoid output differ for this, and since this is primarily
+## for testing Parsoid's serializer, marking this Parsoid only
+!!test
+Empty TR followed by mixed-ws-comment line should RT correctly
+!!options
+parsoid
+!!input
+{|
+|-
+ <!--c-->
+|-
+<!--c--> <!--d-->
+|}
+!!result
+<table>
+<tbody>
+<tr>
+<td> <!--c--></td></tr>
+<tr>
+<td><!--c--> <!--d--></td></tr>
+</table>
+
+!!end
+
 !!test
 Multi-line image caption generated by templates with/without trailing newlines
 !!options
@@ -14569,6 +14790,21 @@ 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></span>
+</p>
+!!end
+
 TODO:
 more images
 more tables
index 804a30c..2e5cd53 100644 (file)
@@ -90,5 +90,5 @@ if ( isset( $options['fuzz'] ) ) {
        $tester->fuzzTest( $files );
 } else {
        $ok = $tester->runTestsFromFiles( $files );
-       exit ( $ok ? 0 : 1 );
+       exit( $ok ? 0 : 1 );
 }
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..b9117fd 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 ) {
@@ -97,5 +96,4 @@ Database options:
 
 EOT;
        }
-
 }
index ecc8ad1..440f866 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;
        }
 
@@ -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,6 +841,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                        ) {
 
                                $wikitextNS = $ns;
+
                                return $wikitextNS;
                        }
                }
@@ -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 );
        }
-
 }
index 01caf8f..3978b8d 100644 (file)
@@ -11,7 +11,7 @@ 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
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 02546fa..32fc2c5 100644 (file)
@@ -59,7 +59,7 @@ class BlockTest extends MediaWikiLangTestCase {
         * 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 );
@@ -72,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" );
-
        }
 
        /**
@@ -82,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()" );
-
        }
 
        /**
@@ -133,7 +131,6 @@ class BlockTest extends MediaWikiLangTestCase {
                $u->addToDatabase();
                unset( $u );
 
-
                // Sanity check
                $this->assertNull(
                        Block::newFromTarget( $username ),
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..f1004fb 100644 (file)
@@ -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();
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' ),
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..4e010d4 100644 (file)
@@ -432,6 +432,7 @@ class HtmlTest extends MediaWikiTestCase {
                foreach ( $types as $type ) {
                        $cases[] = array( $type );
                }
+
                return $cases;
        }
 
@@ -596,6 +597,7 @@ class HtmlTest extends MediaWikiTestCase {
                                isset( $case[3] ) ? $case[3] : ''
                        );
                }
+
                return $ret;
        }
 
@@ -610,5 +612,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..ae551c0 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' ),
                ) );
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 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..b909f26 100644 (file)
@@ -77,6 +77,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..56967de 100644 (file)
@@ -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..68db9ad 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;
        }
 
@@ -84,7 +86,8 @@ class ResourceLoaderTest extends MediaWikiTestCase {
 
 /* Stubs */
 
-class ResourceLoaderTestModule extends ResourceLoaderModule {}
+class ResourceLoaderTestModule extends ResourceLoaderModule {
+}
 
 /* Hooks */
 global $wgHooks;
index 39673c0..968aaba 100644 (file)
@@ -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..c84f10c 100644 (file)
@@ -148,7 +148,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' ),
@@ -246,5 +245,4 @@ class SanitizerTest extends MediaWikiTestCase {
                        $message
                );
        }
-
 }
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..b8b0391 100644 (file)
@@ -66,7 +66,6 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
 
                        $this->user = $this->userUser;
                }
-
        }
 
        function setUserPerm( $perm ) {
@@ -317,7 +316,6 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                                $this->title->userCan( $action, $this->user, true ) );
                        $this->assertEquals( $check[$action][3],
                                $this->title->quickUserCan( $action, $this->user ) );
-
                        # count( User::getGroupsWithPermissions( $action ) ) < 1
                }
        }
@@ -538,7 +536,6 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                        $this->title->userCan( 'edit', $this->user ) );
                $this->assertEquals( array(),
                        $this->title->getUserPermissionsErrors( 'edit', $this->user ) );
-
        }
 
        function testActionPermissions() {
@@ -562,7 +559,6 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                $this->assertEquals( true,
                        $this->title->userCan( 'create', $this->user ) );
 
-
                $this->setUserPerm( array( 'createpage' ) );
                $this->assertEquals( array( array( 'titleprotected', 'Useruser', 'test' ) ),
                        $this->title->getUserPermissionsErrors( 'create', $this->user ) );
@@ -605,7 +601,6 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                        $this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
                $this->assertEquals( false,
                        $this->title->userCan( 'move-target', $this->user ) );
-
        }
 
        function testUserBlock() {
@@ -648,13 +643,13 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                global $wgLocalTZoffset;
                $wgLocalTZoffset = -60;
                $this->user->mBlockedby = $this->user->getName();
-               $this->user->mBlock = new Block( '127.0.8.1', 0, 1, 'no reason given', $now, 0, 10 );
+               $this->user->mBlock = new Block( '127.0.8.1', 0, $this->user->getId(),
+                       'no reason given', $now, 0, 10 );
                $this->assertEquals( array( array( 'blockedtext',
                                '[[User:Useruser|Useruser]]', 'no reason given', '127.0.0.1',
                                'Useruser', null, '23:00, 31 December 1969', '127.0.8.1',
                                $wgLang->timeanddate( wfTimestamp( TS_MW, $now ), true ) ) ),
                        $this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
-
                # $action != 'read' && $action != 'createaccount' && $user->isBlockedFrom( $this )
                #   $user->blockedFor() == ''
                #   $user->mBlock->mExpiry == 'infinity'
index 970862b..33bd8d6 100644 (file)
@@ -197,6 +197,7 @@ class TitleTest extends MediaWikiTestCase {
                foreach ( $errors as $error ) {
                        $result[] = $error[0];
                }
+
                return $result;
        }
 
index 4bb6daa..f829509 100644 (file)
@@ -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;
        }
 
@@ -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 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..c418a87 100644 (file)
@@ -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..1b815ac 100644 (file)
@@ -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 );
        }
 
@@ -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 e0a84e1..7f32e5f 100644 (file)
@@ -68,6 +68,7 @@ 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 );
@@ -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' );
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..d712bc0 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;
        }
 
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..6632edd 100644 (file)
@@ -269,5 +269,4 @@ class JavaScriptContentTest extends TextContentTest {
                        array( new JavaScriptContent( "hallo" ), new JavaScriptContent( "HALLO" ), false ),
                );
        }
-
 }
index 4fc2d51..28c006c 100644 (file)
@@ -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 0979243..965a5f3 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,405 @@ 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 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 +508,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 +543,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..815edd2 100644 (file)
@@ -9,6 +9,7 @@ class MockDatabaseSqlite extends DatabaseSqliteStandalone {
 
        function query( $sql, $fname = '', $tempIgnore = false ) {
                $this->lastQuery = $sql;
+
                return true;
        }
 
@@ -327,6 +328,7 @@ 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;
        }
 
@@ -348,6 +350,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                }
                $list = array_flip( $list );
                sort( $list );
+
                return $list;
        }
 
@@ -359,6 +362,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                        $cols[$col->name] = $col;
                }
                ksort( $cols );
+
                return $cols;
        }
 
@@ -376,6 +380,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..57df08e
--- /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;
+       }
+
+       static 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..4a1b7ea 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..0d6e4d5 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 ),
@@ -2188,12 +2195,15 @@ class FileBackendTest extends MediaWikiTestCase {
        // test helper wrapper for backend prepare() function
        private function create( array $params ) {
                $params['op'] = 'create';
+
                return $this->backend->doQuickOperations( array( $params ) );
        }
 
        function tearDownFiles() {
                foreach ( $this->filesToPrune as $file ) {
-                       @unlink( $file );
+                       if ( is_file( $file ) ) {
+                               unlink( $file );
+                       }
                }
                $containers = array( 'unittest-cont1', 'unittest-cont2' );
                foreach ( $containers as $container ) {
index 7cc25b1..033ae0b 100644 (file)
@@ -1,26 +1,25 @@
 <?php
 
 class FileRepoTest extends MediaWikiTestCase {
-
        /**
         * @expectedException MWException
         */
        function testFileRepoConstructionOptionCanNotBeNull() {
-               $f = new FileRepo();
+               new FileRepo();
        }
 
        /**
         * @expectedException MWException
         */
        function testFileRepoConstructionOptionCanNotBeAnEmptyArray() {
-               $f = new FileRepo( array() );
+               new FileRepo( array() );
        }
 
        /**
         * @expectedException MWException
         */
        function testFileRepoConstructionOptionNeedNameKey() {
-               $f = new FileRepo( array(
+               new FileRepo( array(
                        'backend' => 'foobar'
                ) );
        }
@@ -29,7 +28,7 @@ class FileRepoTest extends MediaWikiTestCase {
         * @expectedException MWException
         */
        function testFileRepoConstructionOptionNeedBackendKey() {
-               $f = new FileRepo( array(
+               new FileRepo( array(
                        'name' => 'foobar'
                ) );
        }
index a89ef98..71a585e 100644 (file)
@@ -69,6 +69,7 @@ class StoreBatchTest extends MediaWikiTestCase {
                $result = $this->repo->store( $srcPath, 'temp', $dstRel, $flags );
                $result->value = $this->repo->getVirtualUrl( 'temp' ) . '/' . $dstUrlRel;
                $this->createdFiles[] = $result->value;
+
                return $result;
        }
 
index 820f8c5..787b431 100644 (file)
@@ -46,7 +46,8 @@ 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?)
                }
        }
 
@@ -109,7 +110,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)" );
 
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 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..3e39675 100644 (file)
@@ -65,6 +65,7 @@ class XMPTest extends MediaWikiTestCase {
                        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..3939c4f 100644 (file)
@@ -16,19 +16,32 @@ class MediaWikiParserTest {
 
                $suite = new PHPUnit_Framework_TestSuite;
 
-               foreach ( $wgParserTestFiles as $filename ) {
-                       $testsName = basename( $filename, '.txt' );
+               foreach ( $wgParserTestFiles as $fileName ) {
+                       $testsName = basename( $fileName, '.txt' );
+                       $escapedFileName = strtr( $fileName, array( "'" => "\\'", '\\' => '\\\\' ) );
                        /* This used to be ucfirst( basename( dirname( $filename ) ) )
                         * and then was ucfirst( basename( $filename, '.txt' )
                         * but that didn't work with names like foo.tests.txt
                         */
-                       $className = str_replace( '.', '_', ucfirst( $testsName ) );
+                       $parserTestClassName = str_replace( '.', '_', ucfirst( $testsName ) );
+                       $parserTestClassDefinition = <<<EOT
+/**
+ * @group Database
+ * @group Parser
+ * @group ParserTests
+ * @group ParserTests_$parserTestClassName
+ */
+class $parserTestClassName extends NewParserTest {
+       protected \$file = '$escapedFileName';
+}
+EOT;
 
-                       eval( "/** @group Database\n@group Parser\n*/ class $className extends NewParserTest { protected \$file = '" . strtr( $filename, array( "'" => "\\'", '\\' => '\\\\' ) ) . "'; } " );
+                       eval( $parserTestClassDefinition );
 
-                       $parserTester = new $className( $testsName );
+                       $parserTester = new $parserTestClassName( $testsName );
                        $suite->addTestSuite( new ReflectionClass ( $parserTester ) );
                }
+
                return $suite;
        }
 }
index 77311b9..3449cc7 100644 (file)
@@ -19,7 +19,6 @@ class NewParserTest extends MediaWikiTestCase {
        public $runParsoid = false;
        public $regex = '';
        public $showProgress = true;
-       public $savedInitialGlobals = array();
        public $savedWeirdGlobals = array();
        public $savedGlobals = array();
        public $hooks = array();
@@ -33,7 +32,7 @@ class NewParserTest extends MediaWikiTestCase {
        protected $file = false;
 
        protected function setUp() {
-               global $wgNamespaceProtection, $wgNamespaceAliases;
+               global $wgNamespaceAliases;
                global $wgHooks, $IP;
 
                parent::setUp();
@@ -52,11 +51,17 @@ 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['wgActionPaths'] = array();
+               $tmpGlobals['wgVariantArticlePath'] = false;
+               $tmpGlobals['wgExtensionAssetsPath'] = '/extensions';
                $tmpGlobals['wgStyleSheetPath'] = '/skins';
                $tmpGlobals['wgStylePath'] = '/skins';
+               $tmpGlobals['wgEnableUploads'] = true;
                $tmpGlobals['wgThumbnailScriptPath'] = false;
                $tmpGlobals['wgLocalFileRepo'] = array(
                        'class' => 'LocalRepo',
@@ -67,51 +72,62 @@ 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['wgHtml5'] = true;
+               $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['wgGroupPermissions'] = array(
+                       '*' => array(
+                               'createaccount' => true,
+                               'read' => true,
+                               'edit' => true,
+                               'createpage' => true,
+                               'createtalk' => true,
+               ) );
+               $tmpGlobals['wgNamespaceProtection'] = array( NS_MEDIAWIKI => 'editinterface' );
+               $tmpGlobals['wgMemc'] = new EmptyBagOStuff;
                $tmpGlobals['messageMemc'] = wfGetMessageCacheStorage();
                $tmpGlobals['parserMemc'] = wfGetParserCacheStorage();
 
-               // $tmpGlobals['wgContLang'] = new StubContLang;
-               $tmpGlobals['wgUser'] = new User;
-               $context = new RequestContext();
-               $tmpGlobals['wgLang'] = $context->getLanguage();
-               $tmpGlobals['wgOut'] = $context->getOutput();
                $tmpGlobals['wgParser'] = new StubObject( 'wgParser', $GLOBALS['wgParserConf']['class'], array( $GLOBALS['wgParserConf'] ) );
-               $tmpGlobals['wgRequest'] = $context->getRequest();
 
                if ( $GLOBALS['wgStyleDirectory'] === false ) {
                        $tmpGlobals['wgStyleDirectory'] = "$IP/skins";
                }
 
+               $tmpHooks = $wgHooks;
+               $tmpHooks['ParserTestParser'][] = 'ParserTestParserHook::setup';
+               $tmpHooks['ParserGetVariableValueTs'][] = 'ParserTest::getFakeTimestamp';
+               $tmpGlobals['wgHooks'] = $tmpHooks;
 
-               foreach ( $tmpGlobals as $var => $val ) {
-                       if ( array_key_exists( $var, $GLOBALS ) ) {
-                               $this->savedInitialGlobals[$var] = $GLOBALS[$var];
-                       }
+               $this->setMwGlobals( $tmpGlobals );
 
-                       $GLOBALS[$var] = $val;
-               }
-
-               $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'];
 
@@ -174,9 +190,6 @@ class NewParserTest extends MediaWikiTestCase {
                        __METHOD__
                );
 
-               # Reinitialise the LocalisationCache to match the database state
-               Language::getLocalisationCache()->unloadAll();
-
                # Clear the message cache
                MessageCache::singleton()->clear();
 
@@ -300,12 +313,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 +322,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 +348,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,20 +365,6 @@ 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();
                RepoGroup::destroySingleton();
                FileBackendGroup::destroySingleton();
@@ -432,6 +402,7 @@ class NewParserTest extends MediaWikiTestCase {
                // wfDebug( "Creating upload directory $dir\n" );
                if ( file_exists( $dir ) ) {
                        wfDebug( "Already exists!\n" );
+
                        return $dir;
                }
 
@@ -543,6 +514,7 @@ class NewParserTest extends MediaWikiTestCase {
                        global $wgParserTestFiles;
                        $this->file = $wgParserTestFiles[0];
                }
+
                return new TestFileIterator( $this->file, $this );
        }
 
@@ -717,7 +689,6 @@ class NewParserTest extends MediaWikiTestCase {
                        }
 
                        $id++;
-
                }
        }
 
@@ -911,6 +882,7 @@ class NewParserTest extends MediaWikiTestCase {
                                }
                        }
                }
+
                return $opts;
        }
 
@@ -922,6 +894,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..47c47f6 100644 (file)
@@ -87,6 +87,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                # sort them numerically so we will compare simply that we received
                # the expected matches.
                sort( $matches );
+
                return $matches;
        }
 
@@ -172,5 +173,4 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                        $this->fetchIds( $this->search->searchTitle( 'smithee' ) ),
                        "Title power search failed" );
        }
-
 }
index 7d867bc..d19cdd0 100644 (file)
@@ -28,6 +28,7 @@ class SearchUpdateTest extends MediaWikiTestCase {
        function update( $text, $title = 'Test', $id = 1 ) {
                $u = new SearchUpdate( $id, $title, $text );
                $u->doUpdate();
+
                return array( MockSearch::$title, MockSearch::$text );
        }
 
index 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() );
        }
-
 }
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>"
                );
-
        }
 }
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;
        }
 
-
        /**
         *
         */
index b809d32..94c78dc 100644 (file)
@@ -130,15 +130,15 @@ class UploadTest extends MediaWikiTestCase {
 }
 
 class UploadTestHandler extends UploadBase {
-       public function initializeFromRequest( &$request ) {}
+       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 d5dbfb2..54f7753 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() {
@@ -499,6 +497,30 @@ class LanguageTest extends LanguageClassesTestCase {
                );
        }
 
+       /**
+        * 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
         */
index 464a310..6358ac0 100644 (file)
@@ -56,5 +56,4 @@ class LanguageTrTest 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..7fe48dd 100644 (file)
@@ -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..535e61e 100644 (file)
@@ -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" );
        }
-
-
 }
index 2a1ebc3..b425d86 100755 (executable)
@@ -89,7 +89,6 @@ class PHPUnitMaintClass extends Maintenance {
                        unset( $_SERVER['argv'][$key] ); // the option
                        unset( $_SERVER['argv'][$key + 1] ); // its value
                        $_SERVER['argv'] = array_values( $_SERVER['argv'] );
-
                }
        }
 
index 71b8c67..3af805a 100644 (file)
@@ -91,7 +91,7 @@ class ResourcesTest extends MediaWikiTestCase {
                                $property = $reflectedModule->getProperty( $propName );
                                $property->setAccessible( true );
                                $lists = $property->getValue( $module );
-                               foreach ( $lists as $group => $list ) {
+                               foreach ( $lists as $list ) {
                                        foreach ( $list as $key => $value ) {
                                                // We need the same filter as for 'lists',
                                                // due to 'skinStyles'.
@@ -116,7 +116,6 @@ class ResourcesTest extends MediaWikiTestCase {
                                        $file,
                                );
                        }
-
                }
 
                // Restore settings
@@ -124,5 +123,4 @@ class ResourcesTest extends MediaWikiTestCase {
 
                return $cases;
        }
-
 }
index 876876b..850d39c 100644 (file)
@@ -100,7 +100,6 @@ class SideBarTest extends MediaWikiLangTestCase {
 ** http://valid.no.desc.org/
 '
                );
-
        }
 
        /**
index 3200e0b..b1496a9 100644 (file)
@@ -57,7 +57,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 +184,7 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
 
                if ( file_exists( $dir ) ) {
                        wfDebug( "Already exists!\n" );
+
                        return $dir;
                }
 
@@ -202,6 +202,7 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
                // the UploadFromUrlTest class
                class_exists( 'UploadFromUrlTest' );
                $suite = new UploadFromUrlTestSuite( 'UploadFromUrlTest' );
+
                return $suite;
        }
 }
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 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 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.
index 2803ff2..1237bb5 100644 (file)
@@ -105,8 +105,6 @@ class AddContentToNewPageTestCase extends SeleniumTestCase {
 
        // Add level 2 headline and verify output in the preview
        public function testAddLevel2HeadLine() {
-               $blnElementPresent = false;
-               $blnTextPresent = false;
                $this->getExistingPage();
                $this->clickEditLink();
                $this->loadWikiEditor();
index 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" );
                                }